1 | import { Action as ReduxAction, Reducer as ReduxReducer, Dispatch as ReduxDispatch, ReducersMapObject, Middleware, StoreEnhancer, StoreCreator, Store as ReduxStore, ActionCreator } from 'redux';
|
2 | declare type CheckIfParameterOptional<P> = P extends [unknown, ...unknown[]] ? false : true;
|
3 | declare type Without<FirstType, SecondType> = {
|
4 | [KeyType in Exclude<keyof FirstType, keyof SecondType>]: never;
|
5 | };
|
6 | export declare type MergeExclusive<FirstType, SecondType> = FirstType | SecondType extends object ? (Without<FirstType, SecondType> & SecondType) | (Without<SecondType, FirstType> & FirstType) : FirstType | SecondType;
|
7 | export interface Action<TPayload = any, TMeta = any> extends ReduxAction<string> {
|
8 | payload?: TPayload;
|
9 | meta?: TMeta;
|
10 | }
|
11 | export declare type Reducer<TState = any> = (state: TState, payload?: Action['payload'], meta?: Action['meta']) => TState | void;
|
12 | export interface Models<TModels extends Models<TModels>> {
|
13 | [key: string]: Model<TModels>;
|
14 | }
|
15 | export interface NamedModel<TModels extends Models<TModels>, TState = any, TBaseState = TState> extends Model<TModels, TState, TBaseState> {
|
16 | name: string;
|
17 | reducers: ModelReducers<TState>;
|
18 | }
|
19 | export 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 | }
|
26 | export declare type ModelReducers<TState = any> = {
|
27 | [key: string]: Reducer<TState>;
|
28 | };
|
29 | export interface ModelEffects<TModels extends Models<TModels>> {
|
30 | [key: string]: ModelEffect<TModels>;
|
31 | }
|
32 | export declare type ModelEffectThisTyped = {
|
33 | [key: string]: (payload?: any, meta?: any) => Action<any, any>;
|
34 | };
|
35 | export declare type ModelEffect<TModels extends Models<TModels>> = (this: ModelEffectThisTyped, payload: Action['payload'], rootState: RematchRootState<TModels>, meta: Action['meta']) => any;
|
36 | export declare type ModelEffectsCreator<TModels extends Models<TModels>> = (dispatch: RematchDispatch<TModels>) => ModelEffects<TModels>;
|
37 | export interface PluginConfig<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TExposedModels = Partial<TExtraModels>> {
|
38 | models?: TExposedModels;
|
39 | redux?: InitConfigRedux;
|
40 | }
|
41 | export 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 | }
|
45 | export 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 | }
|
52 | export declare type ModelHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (model: NamedModel<TModels>, rematch: RematchStore<TModels, TExtraModels>) => void;
|
53 | export declare type ReducerHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (reducer: ReduxReducer, modelName: string, rematch: RematchBag<TModels, TExtraModels>) => ReduxReducer | void;
|
54 | export declare type RootReducerHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (reducer: ReduxReducer, rematch: RematchBag<TModels, TExtraModels>) => ReduxReducer | void;
|
55 | export declare type StoreCreatedHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (store: RematchStore<TModels, TExtraModels>, rematch: RematchBag<TModels, TExtraModels>) => RematchStore<TModels, TExtraModels> | void;
|
56 | export declare type MiddlewareCreator<TModels extends Models<TModels>, TExtraModels extends Models<TModels> = Record<string, never>> = (rematch: RematchBag<TModels, TExtraModels>) => Middleware;
|
57 | export declare type ObjectNotAFunction = {
|
58 | [k: string]: any;
|
59 | } & ({
|
60 | bind?: never;
|
61 | } | {
|
62 | call?: never;
|
63 | });
|
64 | export declare type PluginExposed<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = {
|
65 | [key: string]: ExposedFunction<TModels, TExtraModels> | ObjectNotAFunction;
|
66 | };
|
67 | export declare type ExposedFunction<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (rematch: RematchStore<TModels, TExtraModels>, ...args: any) => any;
|
68 | export 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 | }
|
74 | export 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 | }
|
80 | export 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 | }
|
86 | export 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 | }
|
97 | export interface ConfigRedux<TRootState = any> extends InitConfigRedux<TRootState> {
|
98 | reducers: ModelReducers<TRootState>;
|
99 | enhancers: StoreEnhancer[];
|
100 | middlewares: Middleware[];
|
101 | rootReducers: ReducersMapObject<TRootState, Action>;
|
102 | }
|
103 | export 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 | }
|
109 | export declare type RematchRootState<TModels extends Models<TModels>, TExtraModels extends Models<TModels> = Record<string, never>> = ExtractRematchStateFromModels<TModels, TExtraModels>;
|
110 | export 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 | };
|
115 | export declare type RematchDispatch<TModels extends Models<TModels>> = ReduxDispatch & ExtractRematchDispatchersFromModels<TModels>;
|
116 | export declare type ExtractRematchDispatchersFromModels<TModels extends Models<TModels>> = {
|
117 | [modelKey in keyof TModels]: TModels[modelKey] extends Model<TModels> ? ModelDispatcher<TModels[modelKey], TModels> : never;
|
118 | };
|
119 | export declare type ModelDispatcher<TModel extends Model<TModels>, TModels extends Models<TModels>> = MergeExclusive<ExtractRematchDispatchersFromEffects<TModel['effects'], TModels>, ExtractRematchDispatchersFromReducers<TModel['state'], TModel['reducers'], TModels>>;
|
120 | export declare type ReturnOfDispatcher<IsEffect extends boolean, TReturn = any, TPayload = void, TMeta = void> = IsEffect extends true ? TReturn : Action<TPayload, TMeta>;
|
121 | export 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 | };
|
134 | declare 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;
|
135 | export declare type ExtractRematchDispatchersFromReducers<TState, TReducers extends Model<TModels, TState>['reducers'], TModels extends Models<TModels>> = {
|
136 | [reducerKey in keyof TReducers]: ExtractRematchDispatcherFromReducer<TState, TReducers[reducerKey]>;
|
137 | };
|
138 | export 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;
|
139 | export 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;
|
140 | export declare type ExtractRematchDispatchersFromEffectsObject<TEffects extends ModelEffects<TModels>, TModels extends Models<TModels>> = {
|
141 | [effectKey in keyof TEffects]: ExtractRematchDispatcherFromEffect<TEffects[effectKey], TModels>;
|
142 | };
|
143 | declare 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;
|
149 | export 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;
|
150 | export 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 | }
|
195 | export 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 | }
|
213 | declare module 'redux' {
|
214 | interface Dispatch<A extends Action = AnyAction> {
|
215 | [modelName: string]: any;
|
216 | }
|
217 | }
|
218 | declare 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 | }
|
226 | declare global {
|
227 | interface Window {
|
228 | __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: any;
|
229 | }
|
230 | }
|
231 | export {};
|
232 |
|
\ | No newline at end of file |