import type { Checksum, StringKeys, UnknownRecord } from './core-types'; /** * TODO: 18.08.2024 - This file needs a restructuring: * - there are too many types, many of them aren't used or are intersecting with others * - others are just confusing and create more issues in understanding (AnyAction vs GenericAction - which one is what???) * - others are remnants of long past times (e..g all of the action with collection map and generic actions can be removed I believe) */ export type BaseAction = TPayload extends undefined ? { type: TType; } : { type: TType; payload: TPayload; }; export type PrivateAction = BaseAction & { isPrivate: true; }; export type PublicAction = BaseAction & { isPrivate?: false; }; export type MasterAction = (PrivateAction & { _isMaster: true; }) | (PublicAction & { _isMaster: true; }); export type Action = PublicAction | PrivateAction | MasterAction; export type AnyMasterAction = MasterAction; export type ActionWithAnyPayload = Action; export type ActionsCollectionMapBase = UnknownRecord; export type AnyPublicAction = PublicAction; export type AnyPrivateAction = PrivateAction; export type AnyActionOf = StringKeys> = Action; export type AnyPrivateActionOf = Extract, { isPrivate: true; }>; export type AnyPublicActionOf = Exclude, AnyPrivateActionOf>; export type GenericPrivateAction = PrivateAction; export type GenericPublicAction = PublicAction; export type GenericMasterAction = MasterAction; export type GenericAction = GenericPrivateAction | GenericPublicAction | GenericMasterAction; export type AnyAction = Action | GenericAction; export type UnknownAction = Action; export type GenericActionOrActionTuple = GenericPublicAction | [GenericPrivateAction, GenericPublicAction]; export type CheckedAction, ActionCollectionMap extends ActionsCollectionMapBase> = { action: ActionOrActionTuple; checksum: Checksum; }; export type GenericCheckedAction = { action: GenericActionOrActionTuple; checksum: Checksum; }; export type AnyCheckedAction = { action: AnyActionOrActionTuple; checksum: Checksum; }; export type ToCheckedAction = { action: TAction; checksum: Checksum; }; export type ToPrivateAction = A & { isPrivate: true; }; export type ToPublicAction = A & { isPrivate?: false; }; export type ToMasterAction = A & { _isMaster: true; }; export type CheckedReconciliatoryActions = { actions: ToPublicAction[]; finalChecksum: Checksum; }; export type AnyActionTuple = [AnyPrivateAction, AnyPublicAction]; export type ActionOrActionTuple, ActionCollectionMap extends ActionsCollectionMapBase> = Action | [ privateAction: PrivateAction, publicAction: PublicAction ]; export type AnyActionOrActionTuple = AnyPublicAction | AnyActionTuple; export type AnyActionOrActionTupleOf = StringKeys> = Action | [ PrivateAction, PublicAction ]; export type ActionOrActionTupleFromAction = ToPublicAction | ActionTupleFrom; export type ActionFromActionCreator> = Action[0]>; export type ActionCreatorsMapBase = { [k in string]: ReturnType; }; export type ActionTupleFrom = [ ToPrivateAction, ToPublicAction ]; /** * Minimal (type-only) action factory * @example * const clearTodos = action('[Todo] truncate'); */ export declare function createAction(type: TType): Action; /** * Action with non-error payload factory * @example * const addTodo = ({ name, completed = false }: Todo) => action('[Todo] add', { name, completed }); */ export declare function createAction(type: TType, payload: TPayload): Action; export type ExactActionCreator(...args: any[]) => Action> = TCallable & { type: TType extends AnyAction ? TType['type'] : TType; toString(): TType extends AnyAction ? TType['type'] : TType; }; export type ActionCreator = { (...args: any[]): T extends string ? Action : T; type: T extends AnyAction ? T['type'] : T; toString(): T extends AnyAction ? T['type'] : T; }; export type Executor(...args: any[]) => Action> = (resolve: (payload?: Payload) => Action) => TCallable; /** * Flux standard action creator factory * @example * createActionCreator('[Todo] truncate'); * @example * createActionCreator( * '[Todo] fetch rejected', * resolve => (error: Error) => resolve(error) * ); * @example * createActionCreator( * '[Todo] fetch rejected', * resolve => (error: Error, meta?: { status: number }) => resolve(error, meta) * ) * @example * createActionCreator( * '[Todo] add', * resolve => (name: string, completed = false) => resolve({ name, completed }) * ) * @example * createActionCreator( * '[Todo] add', * resolve => (name: string, completed = false) => resolve({ name, completed }, 'Meta data of all todos') * ) * */ export declare function createActionCreator(type: TType): ExactActionCreator Action>; export declare function createActionCreator(...args: any[]) => Action>(type: TType, executor: Executor): ExactActionCreator; export declare const isAction: (a: ActionOrActionTupleFromAction | AnyAction) => a is AnyAction; export declare const isMasterAction: (a: ActionOrActionTupleFromAction | AnyAction) => a is AnyMasterAction; export declare const toMasterAction: (action: TAction) => ToMasterAction; export declare const toMasterActionFromActionOrTuple: (actionOrActionTuple: ActionOrActionTupleFromAction) => ActionOrActionTupleFromAction>;