xstate
Version:
Finite State Machines and Statecharts for the Modern Web.
960 lines • 57.5 kB
TypeScript
import { Clock, Interpreter } from './interpreter';
import { Model } from './model.types';
import { State } from './State';
import { StateNode } from './StateNode';
import { MarkAllImplementationsAsProvided, TypegenDisabled, ResolveTypegenMeta, TypegenConstraint, AreAllImplementationsAssumedToBeProvided, TypegenEnabled } from './typegenTypes';
export declare type AnyFunction = (...args: any[]) => any;
declare type ReturnTypeOrValue<T> = T extends AnyFunction ? ReturnType<T> : T;
export declare type IsNever<T> = [T] extends [never] ? true : false;
export declare type Compute<A extends any> = {
[K in keyof A]: A[K];
} & unknown;
export declare type Prop<T, K> = K extends keyof T ? T[K] : never;
export declare type Values<T> = T[keyof T];
export declare type Merge<M, N> = Omit<M, keyof N> & N;
export declare type IndexByType<T extends {
type: string;
}> = {
[K in T['type']]: T extends any ? (K extends T['type'] ? T : never) : never;
};
export declare type Equals<A1 extends any, A2 extends any> = (<A>() => A extends A2 ? true : false) extends <A>() => A extends A1 ? true : false ? true : false;
export declare type IsAny<T> = Equals<T, any>;
export declare type Cast<A, B> = A extends B ? A : B;
export declare type NoInfer<T> = [T][T extends any ? 0 : any];
export declare type LowInfer<T> = T & {};
export declare type EventType = string;
export declare type ActionType = string;
export declare type MetaObject = Record<string, any>;
/**
* The full definition of an event, with a string `type`.
*/
export interface EventObject {
/**
* The type of event that is sent.
*/
type: string;
}
export interface AnyEventObject extends EventObject {
[key: string]: any;
}
export interface BaseActionObject {
/**
* The type of action that is executed.
*/
type: string;
[other: string]: any;
[notAnArrayLike: number]: never;
}
/**
* The full definition of an action, with a string `type` and an
* `exec` implementation function.
*/
export interface ActionObject<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent, TAction extends BaseActionObject = BaseActionObject> {
type: string;
/**
* The implementation for executing the action.
*/
exec?: ActionFunction<TContext, TExpressionEvent, BaseActionObject, TEvent> | undefined;
/** @deprecated an internal signature that doesn't exist at runtime. Its existence helps TS to choose a better code path in the inference algorithm */
(arg: TContext, ev: TExpressionEvent, meta: ActionMeta<TContext, TEvent, TAction>): void;
}
export declare type DefaultContext = Record<string, any> | undefined;
export declare type EventData = Record<string, any> & {
type?: never;
};
/**
* The specified string event types or the specified event objects.
*/
export declare type Event<TEvent extends EventObject> = TEvent['type'] | TEvent;
export interface ActionMeta<TContext, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject> extends StateMeta<TContext, TEvent> {
action: TAction;
_event: SCXML.Event<TEvent>;
}
export interface AssignMeta<TContext, TEvent extends EventObject> {
state?: State<TContext, TEvent>;
action: AssignAction<TContext, TEvent>;
_event: SCXML.Event<TEvent>;
}
export declare type ActionFunction<TContext, TExpressionEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject, TEvent extends EventObject = TExpressionEvent> = {
bivarianceHack(context: TContext, event: TExpressionEvent, meta: ActionMeta<TContext, TEvent, TAction>): void;
}['bivarianceHack'];
export interface ChooseCondition<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> {
cond?: Condition<TContext, TExpressionEvent>;
actions: Actions<TContext, TExpressionEvent, TEvent>;
}
export declare type Action<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> = ActionType | BaseActionObject | ActionObject<TContext, TExpressionEvent, TEvent> | ActionFunction<TContext, TExpressionEvent, BaseActionObject, TEvent>;
/**
* Extracts action objects that have no extra properties.
*/
declare type SimpleActionsOf<T extends BaseActionObject> = ActionObject<any, any> extends T ? T : ExtractWithSimpleSupport<T>;
/**
* Events that do not require payload
*/
export declare type SimpleEventsOf<TEvent extends EventObject> = ExtractWithSimpleSupport<TEvent>;
export declare type BaseAction<TContext, TExpressionEvent extends EventObject, TAction extends BaseActionObject, TEvent extends EventObject = TExpressionEvent> = SimpleActionsOf<TAction>['type'] | TAction | RaiseAction<TContext, TExpressionEvent, TEvent> | SendAction<TContext, TExpressionEvent, TEvent> | AssignAction<TContext, TExpressionEvent, TEvent> | LogAction<TContext, TExpressionEvent, TEvent> | CancelAction<TContext, TExpressionEvent, TEvent> | StopAction<TContext, TExpressionEvent, TEvent> | ChooseAction<TContext, TExpressionEvent, TEvent> | PureAction<TContext, TExpressionEvent, TEvent> | ActionFunction<TContext, TExpressionEvent, TAction, TEvent>;
export declare type BaseActions<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject, TAction extends BaseActionObject> = SingleOrArray<BaseAction<TContext, TExpressionEvent, TAction, TEvent>>;
export declare type Actions<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> = SingleOrArray<Action<TContext, TExpressionEvent, TEvent>>;
export declare type StateKey = string | AnyState;
export interface StateValueMap {
[key: string]: StateValue;
}
/**
* The string or object representing the state value relative to the parent state node.
*
* - For a child atomic state node, this is a string, e.g., `"pending"`.
* - For complex state nodes, this is an object, e.g., `{ success: "someChildState" }`.
*/
export declare type StateValue = string | StateValueMap;
export interface HistoryValue {
states: Record<string, HistoryValue | undefined>;
current: StateValue | undefined;
}
export declare type ConditionPredicate<TContext, TEvent extends EventObject> = (context: TContext, event: TEvent, meta: GuardMeta<TContext, TEvent>) => boolean;
export declare type DefaultGuardType = 'xstate.guard';
export interface GuardPredicate<TContext, TEvent extends EventObject> {
type: DefaultGuardType;
name: string | undefined;
predicate: ConditionPredicate<TContext, TEvent>;
}
export declare type Guard<TContext, TEvent extends EventObject> = GuardPredicate<TContext, TEvent> | (Record<string, any> & {
type: string;
});
export interface GuardMeta<TContext, TEvent extends EventObject> extends StateMeta<TContext, TEvent> {
cond: Guard<TContext, TEvent>;
}
export declare type Condition<TContext, TEvent extends EventObject> = string | ConditionPredicate<TContext, TEvent> | Guard<TContext, TEvent>;
export declare type TransitionTarget<TContext, TEvent extends EventObject> = SingleOrArray<string | StateNode<TContext, any, TEvent>>;
export declare type TransitionTargets<TContext> = Array<string | StateNode<TContext, any>>;
export interface TransitionConfig<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> {
cond?: Condition<TContext, TExpressionEvent>;
actions?: BaseActions<TContext, TExpressionEvent, TEvent, BaseActionObject>;
in?: StateValue;
internal?: boolean;
target?: TransitionTarget<TContext, TEvent> | undefined;
meta?: Record<string, any>;
description?: string;
}
export interface TargetTransitionConfig<TContext, TEvent extends EventObject> extends TransitionConfig<TContext, TEvent> {
target: TransitionTarget<TContext, TEvent>;
}
export declare type ConditionalTransitionConfig<TContext, TEvent extends EventObject = EventObject> = Array<TransitionConfig<TContext, TEvent>>;
export declare type Transition<TContext, TEvent extends EventObject = EventObject> = string | TransitionConfig<TContext, TEvent> | ConditionalTransitionConfig<TContext, TEvent>;
export declare type DisposeActivityFunction = () => void;
export declare type ActivityConfig<TContext, TEvent extends EventObject> = (ctx: TContext, activity: ActivityDefinition<TContext, TEvent>) => DisposeActivityFunction | void;
export declare type Activity<TContext, TEvent extends EventObject> = string | ActivityDefinition<TContext, TEvent>;
export interface ActivityDefinition<TContext, TEvent extends EventObject> extends ActionObject<TContext, TEvent> {
id: string;
type: string;
}
export declare type Sender<TEvent extends EventObject> = (event: Event<TEvent>) => void;
declare type ExcludeType<A> = {
[K in Exclude<keyof A, 'type'>]: A[K];
};
declare type ExtractExtraParameters<A, T> = A extends {
type: T;
} ? ExcludeType<A> : never;
declare type ExtractWithSimpleSupport<T extends {
type: string;
}> = T extends any ? {
type: T['type'];
} extends T ? T : never : never;
declare type NeverIfEmpty<T> = {} extends T ? never : T;
export interface PayloadSender<TEvent extends EventObject> {
/**
* Send an event object or just the event type, if the event has no other payload
*/
(event: TEvent | ExtractWithSimpleSupport<TEvent>['type']): void;
/**
* Send an event type and its payload
*/
<K extends TEvent['type']>(eventType: K, payload: NeverIfEmpty<ExtractExtraParameters<TEvent, K>>): void;
}
export declare type Receiver<TEvent extends EventObject> = (listener: {
bivarianceHack(event: TEvent): void;
}['bivarianceHack']) => void;
export declare type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEvent extends EventObject = AnyEventObject> = (callback: Sender<TSentEvent>, onReceive: Receiver<TEvent>) => (() => void) | Promise<any> | void;
export interface InvokeMeta {
data: any;
src: InvokeSourceDefinition;
meta?: MetaObject;
}
/**
* Returns either a Promises or a callback handler (for streams of events) given the
* machine's current `context` and `event` that invoked the service.
*
* For Promises, the only events emitted to the parent will be:
* - `done.invoke.<id>` with the `data` containing the resolved payload when the promise resolves, or:
* - `error.platform.<id>` with the `data` containing the caught error, and `src` containing the service `id`.
*
* For callback handlers, the `callback` will be provided, which will send events to the parent service.
*
* @param context The current machine `context`
* @param event The event that invoked the service
*/
export declare type InvokeCreator<TContext, TSourceEvent extends EventObject, TFinalContext = any, TInputEvent extends EventObject = any, // keeping a slot for it here, but it's actually not used right now to ensure that the communication contract between actors is satisfied
TOutputEvent extends EventObject = TSourceEvent> = (context: TContext, event: TSourceEvent, meta: InvokeMeta) => PromiseLike<TFinalContext> | StateMachine<TFinalContext, any, any, any, any, any, any> | Subscribable<EventObject> | InvokeCallback<TInputEvent, TOutputEvent> | Behavior<any>;
export interface InvokeDefinition<TContext, TEvent extends EventObject> extends ActivityDefinition<TContext, TEvent> {
/**
* The source of the machine to be invoked, or the machine itself.
*/
src: string | InvokeSourceDefinition;
/**
* If `true`, events sent to the parent service will be forwarded to the invoked service.
*
* Default: `false`
*/
autoForward?: boolean;
/**
* @deprecated
*
* Use `autoForward` property instead of `forward`. Support for `forward` will get removed in the future.
*/
forward?: boolean;
/**
* Data from the parent machine's context to set as the (partial or full) context
* for the invoked child machine.
*
* Data should be mapped to match the child machine's context shape.
*/
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
meta?: MetaObject;
}
export interface Delay {
id: string;
/**
* The time to delay the event, in milliseconds.
*/
delay: number;
}
export declare type DelayedTransitions<TContext, TEvent extends EventObject> = Record<string | number, string | SingleOrArray<TransitionConfig<TContext, TEvent>>> | Array<TransitionConfig<TContext, TEvent> & {
delay: number | string | Expr<TContext, TEvent, number>;
}>;
export declare type StateTypes = 'atomic' | 'compound' | 'parallel' | 'final' | 'history' | string;
export declare type SingleOrArray<T> = T[] | T;
export declare type StateNodesConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> = {
[K in keyof TStateSchema['states']]: StateNode<TContext, TStateSchema['states'][K] & {}, TEvent>;
};
export declare type StatesConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject> = {
[K in keyof TStateSchema['states']]: StateNodeConfig<TContext, TStateSchema['states'][K] & {}, TEvent, TAction>;
};
export declare type StatesDefinition<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> = {
[K in keyof TStateSchema['states']]: StateNodeDefinition<TContext, TStateSchema['states'][K] & {}, TEvent>;
};
export declare type TransitionConfigTarget<TContext, TEvent extends EventObject> = string | undefined | StateNode<TContext, any, TEvent>;
export declare type TransitionConfigOrTarget<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> = SingleOrArray<TransitionConfigTarget<TContext, TEvent> | TransitionConfig<TContext, TExpressionEvent, TEvent>>;
export declare type TransitionsConfigMap<TContext, TEvent extends EventObject> = {
[K in TEvent['type'] | '' | '*']?: K extends '' | '*' ? TransitionConfigOrTarget<TContext, TEvent> : TransitionConfigOrTarget<TContext, ExtractEvent<TEvent, K>, TEvent>;
};
declare type TransitionsConfigArray<TContext, TEvent extends EventObject> = Array<(TEvent extends EventObject ? TransitionConfig<TContext, TEvent> & {
event: TEvent['type'];
} : never) | (TransitionConfig<TContext, TEvent> & {
event: '';
}) | (TransitionConfig<TContext, TEvent> & {
event: '*';
})>;
export declare type TransitionsConfig<TContext, TEvent extends EventObject> = TransitionsConfigMap<TContext, TEvent> | TransitionsConfigArray<TContext, TEvent>;
export interface InvokeSourceDefinition {
[key: string]: any;
type: string;
}
export interface InvokeConfig<TContext, TEvent extends EventObject> {
/**
* The unique identifier for the invoked machine. If not specified, this
* will be the machine's own `id`, or the URL (from `src`).
*/
id?: string;
/**
* The source of the machine to be invoked, or the machine itself.
*/
src: string | InvokeSourceDefinition | AnyStateMachine | InvokeCreator<TContext, TEvent, any>;
/**
* If `true`, events sent to the parent service will be forwarded to the invoked service.
*
* Default: `false`
*/
autoForward?: boolean;
/**
* @deprecated
*
* Use `autoForward` property instead of `forward`. Support for `forward` will get removed in the future.
*/
forward?: boolean;
/**
* Data from the parent machine's context to set as the (partial or full) context
* for the invoked child machine.
*
* Data should be mapped to match the child machine's context shape.
*/
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
/**
* The transition to take upon the invoked child machine reaching its final top-level state.
*/
onDone?: string | SingleOrArray<TransitionConfigOrTarget<TContext, DoneInvokeEvent<any>>>;
/**
* The transition to take upon the invoked child machine sending an error event.
*/
onError?: string | SingleOrArray<TransitionConfigOrTarget<TContext, DoneInvokeEvent<any>>>;
/**
* Meta data related to this invocation
*/
meta?: MetaObject;
}
export interface StateNodeConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject> {
/**
* The relative key of the state node, which represents its location in the overall state value.
* This is automatically determined by the configuration shape via the key where it was defined.
*/
key?: string;
/**
* The initial state node key.
*/
initial?: keyof TStateSchema['states'] | undefined;
/**
* @deprecated
*/
parallel?: boolean | undefined;
/**
* The type of this state node:
*
* - `'atomic'` - no child state nodes
* - `'compound'` - nested child state nodes (XOR)
* - `'parallel'` - orthogonal nested child state nodes (AND)
* - `'history'` - history state node
* - `'final'` - final state node
*/
type?: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';
/**
* Indicates whether the state node is a history state node, and what
* type of history:
* shallow, deep, true (shallow), false (none), undefined (none)
*/
history?: 'shallow' | 'deep' | boolean | undefined;
/**
* The mapping of state node keys to their state node configurations (recursive).
*/
states?: StatesConfig<TContext, TStateSchema, TEvent, TAction> | undefined;
/**
* The services to invoke upon entering this state node. These services will be stopped upon exiting this state node.
*/
invoke?: SingleOrArray<InvokeConfig<TContext, TEvent> | AnyStateMachine>;
/**
* The mapping of event types to their potential transition(s).
*/
on?: TransitionsConfig<TContext, TEvent>;
/**
* The action(s) to be executed upon entering the state node.
*
* @deprecated Use `entry` instead.
*/
onEntry?: Actions<TContext, TEvent>;
/**
* The action(s) to be executed upon entering the state node.
*/
entry?: BaseActions<TContext, TEvent, TEvent, TAction>;
/**
* The action(s) to be executed upon exiting the state node.
*
* @deprecated Use `exit` instead.
*/
onExit?: Actions<TContext, TEvent>;
/**
* The action(s) to be executed upon exiting the state node.
*/
exit?: BaseActions<TContext, TEvent, TEvent, TAction>;
/**
* The potential transition(s) to be taken upon reaching a final child state node.
*
* This is equivalent to defining a `[done(id)]` transition on this state node's `on` property.
*/
onDone?: string | SingleOrArray<TransitionConfig<TContext, DoneEventObject>> | undefined;
/**
* The mapping (or array) of delays (in milliseconds) to their potential transition(s).
* The delayed transitions are taken after the specified delay in an interpreter.
*/
after?: DelayedTransitions<TContext, TEvent>;
/**
* An eventless transition that is always taken when this state node is active.
* Equivalent to a transition specified as an empty `''`' string in the `on` property.
*/
always?: TransitionConfigOrTarget<TContext, TEvent>;
/**
* The activities to be started upon entering the state node,
* and stopped upon exiting the state node.
*
* @deprecated Use `invoke` instead.
*/
activities?: SingleOrArray<Activity<TContext, TEvent>>;
/**
* @private
*/
parent?: StateNode<TContext, any, TEvent>;
strict?: boolean | undefined;
/**
* The meta data associated with this state node, which will be returned in State instances.
*/
meta?: TStateSchema extends {
meta: infer D;
} ? D : any;
/**
* The data sent with the "done.state._id_" event if this is a final state node.
*
* The data will be evaluated with the current `context` and placed on the `.data` property
* of the event.
*/
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
/**
* The unique ID of the state node, which can be referenced as a transition target via the
* `#id` syntax.
*/
id?: string | undefined;
/**
* The string delimiter for serializing the path to a string. The default is "."
*/
delimiter?: string;
/**
* The order this state node appears. Corresponds to the implicit SCXML document order.
*/
order?: number;
/**
* The tags for this state node, which are accumulated into the `state.tags` property.
*/
tags?: SingleOrArray<string>;
/**
* Whether actions should be called in order.
* When `false` (default), `assign(...)` actions are prioritized before other actions.
*
* @default false
*/
preserveActionOrder?: boolean;
/**
* Whether XState calls actions with the event directly responsible for the related transition.
*
* @default false
*/
predictableActionArguments?: boolean;
/**
* A text description of the state node
*/
description?: string;
}
export interface StateNodeDefinition<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> {
id: string;
version: string | undefined;
key: string;
context: TContext;
type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';
initial: StateNodeConfig<TContext, TStateSchema, TEvent>['initial'];
history: boolean | 'shallow' | 'deep' | undefined;
states: StatesDefinition<TContext, TStateSchema, TEvent>;
on: TransitionDefinitionMap<TContext, TEvent>;
transitions: Array<TransitionDefinition<TContext, TEvent>>;
entry: Array<ActionObject<TContext, TEvent>>;
exit: Array<ActionObject<TContext, TEvent>>;
/**
* @deprecated
*/
activities: Array<ActivityDefinition<TContext, TEvent>>;
meta: any;
order: number;
data?: FinalStateNodeConfig<TContext, TEvent>['data'];
invoke: Array<InvokeDefinition<TContext, TEvent>>;
description?: string;
tags: string[];
}
export declare type AnyStateNodeDefinition = StateNodeDefinition<any, any, any>;
export declare type AnyState = State<any, any, any, any, any>;
export declare type AnyStateMachine = StateMachine<any, any, any, any, any, any, any>;
export interface AtomicStateNodeConfig<TContext, TEvent extends EventObject> extends StateNodeConfig<TContext, StateSchema, TEvent> {
initial?: undefined;
parallel?: false | undefined;
states?: undefined;
onDone?: undefined;
}
export interface HistoryStateNodeConfig<TContext, TEvent extends EventObject> extends AtomicStateNodeConfig<TContext, TEvent> {
history: 'shallow' | 'deep' | true;
target: StateValue | undefined;
}
export interface FinalStateNodeConfig<TContext, TEvent extends EventObject> extends AtomicStateNodeConfig<TContext, TEvent> {
type: 'final';
/**
* The data to be sent with the "done.state.<id>" event. The data can be
* static or dynamic (based on assigners).
*/
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
}
export declare type SimpleOrStateNodeConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> = AtomicStateNodeConfig<TContext, TEvent> | StateNodeConfig<TContext, TStateSchema, TEvent>;
export declare type ActionFunctionMap<TContext, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject> = {
[K in TAction['type']]?: ActionObject<TContext, TEvent> | ActionFunction<TContext, TEvent, TAction extends {
type: K;
} ? TAction : never>;
};
export declare type DelayFunctionMap<TContext, TEvent extends EventObject> = Record<string, DelayConfig<TContext, TEvent>>;
export declare type ServiceConfig<TContext, TEvent extends EventObject = AnyEventObject> = string | AnyStateMachine | InvokeCreator<TContext, TEvent>;
export declare type DelayConfig<TContext, TEvent extends EventObject> = number | DelayExpr<TContext, TEvent>;
declare type MachineOptionsActions<TContext, TResolvedTypesMeta, TEventsCausingActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingActions'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, TIndexedActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedActions'>> = {
[K in keyof TEventsCausingActions]?: ActionObject<TContext, Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>, Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>, Cast<Prop<TIndexedActions, K>, BaseActionObject>> | ActionFunction<TContext, Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>, Cast<Prop<TIndexedActions, K>, BaseActionObject>, Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>>;
};
declare type MachineOptionsDelays<TContext, TResolvedTypesMeta, TEventsCausingDelays = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingDelays'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>> = {
[K in keyof TEventsCausingDelays]?: DelayConfig<TContext, Cast<Prop<TIndexedEvents, TEventsCausingDelays[K]>, EventObject>>;
};
declare type MachineOptionsGuards<TContext, TResolvedTypesMeta, TEventsCausingGuards = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingGuards'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>> = {
[K in keyof TEventsCausingGuards]?: ConditionPredicate<TContext, Cast<Prop<TIndexedEvents, TEventsCausingGuards[K]>, EventObject>>;
};
declare type MachineOptionsServices<TContext, TResolvedTypesMeta, TEventsCausingServices = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingServices'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, TInvokeSrcNameMap = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'invokeSrcNameMap'>> = {
[K in keyof TEventsCausingServices]?: AnyStateMachine | InvokeCreator<TContext, Cast<Prop<TIndexedEvents, TEventsCausingServices[K]>, EventObject>, Prop<Prop<TIndexedEvents, Prop<TInvokeSrcNameMap, K>>, 'data'>, EventObject, Cast<TIndexedEvents[keyof TIndexedEvents], EventObject>>;
};
declare type MakeKeysRequired<T extends string> = {
[K in T]: unknown;
};
declare type MaybeMakeMissingImplementationsRequired<TImplementationType, TMissingImplementationsForType, TRequireMissingImplementations> = TRequireMissingImplementations extends true ? IsNever<TMissingImplementationsForType> extends true ? {} : {
[K in Cast<TImplementationType, string>]: MakeKeysRequired<Cast<TMissingImplementationsForType, string>>;
} : {};
declare type GenerateActionsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> = MaybeMakeMissingImplementationsRequired<'actions', Prop<TMissingImplementations, 'actions'>, TRequireMissingImplementations> & {
actions?: MachineOptionsActions<TContext, TResolvedTypesMeta>;
};
declare type GenerateDelaysConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> = MaybeMakeMissingImplementationsRequired<'delays', Prop<TMissingImplementations, 'delays'>, TRequireMissingImplementations> & {
delays?: MachineOptionsDelays<TContext, TResolvedTypesMeta>;
};
declare type GenerateGuardsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> = MaybeMakeMissingImplementationsRequired<'guards', Prop<TMissingImplementations, 'guards'>, TRequireMissingImplementations> & {
guards?: MachineOptionsGuards<TContext, TResolvedTypesMeta>;
};
declare type GenerateServicesConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> = MaybeMakeMissingImplementationsRequired<'services', Prop<TMissingImplementations, 'services'>, TRequireMissingImplementations> & {
services?: MachineOptionsServices<TContext, TResolvedTypesMeta>;
};
export declare type InternalMachineOptions<TContext, TEvent extends EventObject, TResolvedTypesMeta, TRequireMissingImplementations extends boolean = false, TMissingImplementations = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'missingImplementations'>> = GenerateActionsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateDelaysConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateGuardsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateServicesConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & {
/**
* @deprecated Use `services` instead.
*/
activities?: Record<string, ActivityConfig<TContext, TEvent>>;
};
export declare type MachineOptions<TContext, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject, TServiceMap extends ServiceMap = ServiceMap, TTypesMeta extends TypegenConstraint = TypegenDisabled> = InternalMachineOptions<TContext, TEvent, ResolveTypegenMeta<TTypesMeta, TEvent, TAction, TServiceMap>>;
export interface MachineConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject, TServiceMap extends ServiceMap = ServiceMap, TTypesMeta = TypegenDisabled> extends StateNodeConfig<NoInfer<TContext>, TStateSchema, NoInfer<TEvent>, TAction> {
/**
* The initial context (extended state)
*/
context?: LowInfer<TContext | (() => TContext)>;
/**
* The machine's own version.
*/
version?: string;
schema?: MachineSchema<TContext, TEvent, TServiceMap>;
tsTypes?: TTypesMeta;
}
export declare type ServiceMap = Record<string, {
data: any;
}>;
export interface MachineSchema<TContext, TEvent extends EventObject, TServiceMap extends ServiceMap = ServiceMap> {
context?: TContext;
events?: TEvent;
actions?: {
type: string;
[key: string]: any;
};
guards?: {
type: string;
[key: string]: any;
};
services?: TServiceMap;
}
export interface StandardMachineConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> extends StateNodeConfig<TContext, TStateSchema, TEvent> {
}
export interface ParallelMachineConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> extends StateNodeConfig<TContext, TStateSchema, TEvent> {
initial?: undefined;
type?: 'parallel';
}
export interface EntryExitEffectMap<TContext, TEvent extends EventObject> {
entry: Array<ActionObject<TContext, TEvent>>;
exit: Array<ActionObject<TContext, TEvent>>;
}
export interface HistoryStateNode<TContext> extends StateNode<TContext> {
history: 'shallow' | 'deep';
target: StateValue | undefined;
}
/** @ts-ignore TS complains about withConfig & withContext not being compatible here when extending StateNode */
export interface StateMachine<TContext, TStateSchema extends StateSchema, TEvent extends EventObject, TTypestate extends Typestate<TContext> = {
value: any;
context: TContext;
}, TAction extends BaseActionObject = BaseActionObject, TServiceMap extends ServiceMap = ServiceMap, TResolvedTypesMeta = ResolveTypegenMeta<TypegenDisabled, NoInfer<TEvent>, TAction, TServiceMap>> extends StateNode<TContext, TStateSchema, TEvent, TTypestate, TServiceMap, TResolvedTypesMeta> {
id: string;
states: StateNode<TContext, TStateSchema, TEvent, TTypestate, TServiceMap, TResolvedTypesMeta>['states'];
withConfig(options: InternalMachineOptions<TContext, TEvent, TResolvedTypesMeta, true>, context?: TContext | (() => TContext)): StateMachine<TContext, TStateSchema, TEvent, TTypestate, TAction, TServiceMap, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta>;
withContext(context: TContext | (() => TContext)): StateMachine<TContext, TStateSchema, TEvent, TTypestate, TAction, TServiceMap, TResolvedTypesMeta>;
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
__TContext: TContext;
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
__TStateSchema: TStateSchema;
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
__TEvent: TEvent;
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
__TTypestate: TTypestate;
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
__TAction: TAction;
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
__TServiceMap: TServiceMap;
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
__TResolvedTypesMeta: TResolvedTypesMeta;
}
export declare type StateFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = T extends AnyStateMachine ? ReturnType<T['transition']> : T extends (...args: any[]) => AnyStateMachine ? ReturnType<ReturnType<T>['transition']> : never;
export interface ActionMap<TContext, TEvent extends EventObject> {
onEntry: Array<Action<TContext, TEvent>>;
actions: Array<Action<TContext, TEvent>>;
onExit: Array<Action<TContext, TEvent>>;
}
export interface EntryExitStates<TContext> {
entry: Set<StateNode<TContext>>;
exit: Set<StateNode<TContext>>;
}
export interface EntryExitStateArrays<TContext> {
entry: Array<StateNode<TContext>>;
exit: Array<StateNode<TContext>>;
}
export interface ActivityMap {
[activityKey: string]: ActivityDefinition<any, any> | false;
}
export interface StateTransition<TContext, TEvent extends EventObject> {
transitions: Array<TransitionDefinition<TContext, TEvent>>;
configuration: Array<StateNode<TContext, any, TEvent, any, any, any>>;
exitSet: Array<StateNode<TContext, any, TEvent, any, any, any>>;
/**
* The source state that preceded the transition.
*/
source: State<TContext, any, any, any, any> | undefined;
actions: Array<ActionObject<TContext, TEvent>>;
}
export interface TransitionData<TContext, TEvent extends EventObject> {
value: StateValue | undefined;
actions: ActionMap<TContext, TEvent>;
activities?: ActivityMap;
}
export declare enum ActionTypes {
Start = "xstate.start",
Stop = "xstate.stop",
Raise = "xstate.raise",
Send = "xstate.send",
Cancel = "xstate.cancel",
NullEvent = "",
Assign = "xstate.assign",
After = "xstate.after",
DoneState = "done.state",
DoneInvoke = "done.invoke",
Log = "xstate.log",
Init = "xstate.init",
Invoke = "xstate.invoke",
ErrorExecution = "error.execution",
ErrorCommunication = "error.communication",
ErrorPlatform = "error.platform",
ErrorCustom = "xstate.error",
Update = "xstate.update",
Pure = "xstate.pure",
Choose = "xstate.choose"
}
export interface RaiseAction<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends ActionObject<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Raise;
event: TEvent | SendExpr<TContext, TExpressionEvent, TEvent>;
delay: number | string | undefined | DelayExpr<TContext, TExpressionEvent>;
id: string | number | undefined;
}
export interface RaiseActionObject<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends RaiseAction<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Raise;
_event: SCXML.Event<TEvent>;
delay: number | undefined;
id: string | number | undefined;
}
export interface DoneInvokeEvent<TData> extends EventObject {
data: TData;
}
export interface ErrorExecutionEvent extends EventObject {
src: string;
type: ActionTypes.ErrorExecution;
data: any;
}
export interface ErrorPlatformEvent extends EventObject {
data: any;
}
export interface DoneEventObject extends EventObject {
data?: any;
toString(): string;
}
export interface UpdateObject extends EventObject {
id: string | number;
state: AnyState;
}
export declare type DoneEvent = DoneEventObject & string;
export interface NullEvent {
type: ActionTypes.NullEvent;
}
export interface ActivityActionObject<TContext, TEvent extends EventObject> extends ActionObject<TContext, TEvent> {
type: ActionTypes.Start | ActionTypes.Stop;
activity: ActivityDefinition<TContext, TEvent> | undefined;
exec: ActionFunction<TContext, TEvent> | undefined;
}
export interface InvokeActionObject<TContext, TEvent extends EventObject> extends ActivityActionObject<TContext, TEvent> {
activity: InvokeDefinition<TContext, TEvent>;
}
export declare type DelayExpr<TContext, TEvent extends EventObject> = ExprWithMeta<TContext, TEvent, number>;
export declare type LogExpr<TContext, TEvent extends EventObject> = ExprWithMeta<TContext, TEvent, any>;
export interface LogAction<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends ActionObject<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Log;
label: string | undefined;
expr: string | LogExpr<TContext, TExpressionEvent>;
}
export interface LogActionObject<TContext, TEvent extends EventObject> extends LogAction<TContext, TEvent> {
value: any;
}
export interface SendAction<TContext, TEvent extends EventObject, TSentEvent extends EventObject> extends ActionObject<TContext, TEvent, TSentEvent> {
type: ActionTypes.Send;
to: string | number | ActorRef<any> | ExprWithMeta<TContext, TEvent, string | number | ActorRef<any>> | undefined;
event: TSentEvent | SendExpr<TContext, TEvent, TSentEvent>;
delay?: number | string | DelayExpr<TContext, TEvent>;
id: string | number;
}
export interface SendActionObject<TContext, TEvent extends EventObject, TSentEvent extends EventObject = AnyEventObject> extends SendAction<TContext, TEvent, TSentEvent> {
to: string | number | ActorRef<any> | undefined;
_event: SCXML.Event<TSentEvent>;
event: TSentEvent;
delay?: number;
id: string | number;
}
export interface StopAction<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends ActionObject<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Stop;
activity: string | {
id: string;
} | Expr<TContext, TExpressionEvent, string | {
id: string;
}>;
}
export interface StopActionObject {
type: ActionTypes.Stop;
activity: {
id: string;
};
}
export declare type Expr<TContext, TEvent extends EventObject, T> = (context: TContext, event: TEvent) => T;
export declare type ExprWithMeta<TContext, TEvent extends EventObject, T> = (context: TContext, event: TEvent, meta: SCXMLEventMeta<TEvent>) => T;
export declare type SendExpr<TContext, TEvent extends EventObject, TSentEvent extends EventObject = AnyEventObject> = ExprWithMeta<TContext, TEvent, TSentEvent>;
export declare enum SpecialTargets {
Parent = "#_parent",
Internal = "#_internal"
}
export interface SendActionOptions<TContext, TEvent extends EventObject> extends RaiseActionOptions<TContext, TEvent> {
to?: string | ActorRef<any> | ExprWithMeta<TContext, TEvent, string | ActorRef<any>>;
}
export interface RaiseActionOptions<TContext, TEvent extends EventObject> {
id?: string | number;
delay?: number | string | DelayExpr<TContext, TEvent>;
}
export interface CancelAction<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends ActionObject<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Cancel;
sendId: string | number;
}
export declare type Assigner<TContext, TEvent extends EventObject> = (context: TContext, event: TEvent, meta: AssignMeta<TContext, TEvent>) => Partial<TContext>;
export declare type PartialAssigner<TContext, TEvent extends EventObject, TKey extends keyof TContext> = (context: TContext, event: TEvent, meta: AssignMeta<TContext, TEvent>) => TContext[TKey];
export declare type PropertyAssigner<TContext, TEvent extends EventObject> = {
[K in keyof TContext]?: PartialAssigner<TContext, TEvent, K> | TContext[K];
};
export declare type Mapper<TContext, TEvent extends EventObject, TParams extends {}> = (context: TContext, event: TEvent) => TParams;
export declare type PropertyMapper<TContext, TEvent extends EventObject, TParams extends {}> = {
[K in keyof TParams]?: ((context: TContext, event: TEvent) => TParams[K]) | TParams[K];
};
export interface AnyAssignAction<TContext, TEvent extends EventObject> extends ActionObject<TContext, TEvent> {
type: ActionTypes.Assign;
assignment: any;
}
export interface AssignAction<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends ActionObject<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Assign;
assignment: Assigner<TContext, TExpressionEvent> | PropertyAssigner<TContext, TExpressionEvent>;
}
export interface PureAction<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends ActionObject<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Pure;
get: (context: TContext, event: TEvent) => SingleOrArray<ActionObject<TContext, TEvent> | ActionObject<TContext, TEvent>['type']> | undefined;
}
export interface ChooseAction<TContext, TExpressionEvent extends EventObject, TEvent extends EventObject = TExpressionEvent> extends ActionObject<TContext, TExpressionEvent, TEvent> {
type: ActionTypes.Choose;
conds: Array<ChooseCondition<TContext, TEvent>>;
}
export interface TransitionDefinition<TContext, TEvent extends EventObject> extends Omit<TransitionConfig<TContext, TEvent, any>, 'actions'> {
target: Array<StateNode<TContext, any, TEvent>> | undefined;
source: StateNode<TContext, any, TEvent>;
actions: Array<ActionObject<TContext, TEvent>>;
cond?: Guard<TContext, TEvent>;
eventType: TEvent['type'] | NullEvent['type'] | '*';
toJSON: () => {
target: string[] | undefined;
source: string;
actions: Array<ActionObject<TContext, TEvent>>;
cond?: Guard<TContext, TEvent>;
eventType: TEvent['type'] | NullEvent['type'] | '*';
meta?: Record<string, any>;
};
}
export declare type TransitionDefinitionMap<TContext, TEvent extends EventObject> = {
[K in TEvent['type'] | NullEvent['type'] | '*']: Array<TransitionDefinition<TContext, K extends TEvent['type'] ? Extract<TEvent, {
type: K;
}> : EventObject>>;
};
export interface DelayedTransitionDefinition<TContext, TEvent extends EventObject> extends TransitionDefinition<TContext, TEvent> {
delay: number | string | DelayExpr<TContext, TEvent>;
}
export interface Edge<TContext, TEvent extends EventObject, TEventType extends TEvent['type'] = string> {
event: TEventType;
source: StateNode<TContext, any, TEvent>;
target: StateNode<TContext, any, TEvent>;
cond?: Condition<TContext, TEvent & {
type: TEventType;
}>;
actions: Array<Action<TContext, TEvent>>;
meta?: MetaObject;
transition: TransitionDefinition<TContext, TEvent>;
}
export interface NodesAndEdges<TContext, TEvent extends EventObject> {
nodes: StateNode[];
edges: Array<Edge<TContext, TEvent, TEvent['type']>>;
}
export interface Segment<TContext, TEvent extends EventObject> {
/**
* From state.
*/
state: State<TContext, TEvent>;
/**
* Event from state.
*/
event: TEvent;
}
export interface PathItem<TContext, TEvent extends EventObject> {
state: State<TContext, TEvent>;
path: Array<Segment<TContext, TEvent>>;
weight?: number;
}
export interface PathMap<TContext, TEvent extends EventObject> {
[key: string]: PathItem<TContext, TEvent>;
}
export interface PathsItem<TContext, TEvent extends EventObject> {
state: State<TContext, TEvent>;
paths: Array<Array<Segment<TContext, TEvent>>>;
}
export interface PathsMap<TContext, TEvent extends EventObject> {
[key: string]: PathsItem<TContext, TEvent>;
}
export interface TransitionMap {
state: StateValue | undefined;
}
export interface AdjacencyMap {
[stateId: string]: Record<string, TransitionMap>;
}
export interface ValueAdjacencyMap<TContext, TEvent extends EventObject> {
[stateId: string]: Record<string, State<TContext, TEvent>>;
}
export interface SCXMLEventMeta<TEvent extends EventObject> {
_event: SCXML.Event<TEvent>;
}
export interface StateMeta<TContext, TEvent extends EventObject> {
state: State<TContext, TEvent, any, any, any>;
_event: SCXML.Event<TEvent>;
}
export interface Typestate<TContext> {
value: StateValue;
context: TContext;
}
export interface StateLike<TContext> {
value: StateValue;
context: TContext;
event: EventObject;
_event: SCXML.Event<EventObject>;
}
export interface StateConfig<TContext, TEvent extends EventObject> {
value: StateValue;
context: TContext;
_event: SCXML.Event<TEvent>;
_sessionid: string | null;
historyValue?: HistoryValue | undefined;
history?: State<TContext, TEvent, any, any, any>;
actions?: Array<ActionObject<TContext, TEvent>>;
/**
* @deprecated
*/
activities?: ActivityMap;
meta?: any;
/**
* @deprecated
*/
events?: TEvent[];
configuration: Array<StateNode<TContext, any, TEvent>>;
transitions: Array<TransitionDefinition<TContext, TEvent>>;
children: Record<string, ActorRef<any>>;
done?: boolean;
tags?: Set<string>;
machine?: StateMachine<TContext, any, TEvent, any, any, any, any>;
}
export declare type AnyStateConfig = StateConfig<any, AnyEventObject>;
export interface StateSchema<TC = any> {
meta?: any;
context?: Partial<TC>;
states?: {
[key: string]: StateSchema<TC>;
};
}
export interface InterpreterOptions {
/**
* Whether state actions should be executed immediately upon transition. Defaults to `true`.
*/
execute?: boolean;
clock?: Clock;
logger?: (...args: any[]) => void;
parent?: AnyInterpreter;
/**
* If `true`, defers processing of sent events until the service
* is initialized (`.start()`). Otherwise, an error will be thrown
* for events sent to an uninitialized service.
*
* Default: `true`
*/
deferEvents?: boolean;
/**
* The custom `id` for referencing this service.
*/
id?: string;
/**
* If `true`, states and events will be logged to Redux DevTools.
*
* Default: `false`
*/
devTools?: boolean | object;
}
export declare namespace SCXML {
interface Event<TEvent extends EventObject> {
/**
* This is a character string giving the name of the event.
* The SCXML Processor must set the name field to the name of this event.
* It is what is matched against the 'event' attribute of <transition>.
* Note that transitions can do additional tests by using the value of this field
* inside boolean expressions in the 'cond' attribute.
*/
name: string;
/**
* This field describes the event type.
* The SCXML Processor must set it to: "platform" (for events raised by the platform itself, such as error events),
* "internal" (for events raised by <raise> and <send> with target '_internal')
* or "external" (for all other events).
*/
type: 'platform' | 'internal' | 'external';
/**
* If the sending entity has specified a value for this, the Processor must set this field to that value
* (see C Event I/O Processors for details).
* Otherwise, in the case of error events triggered by a failed attempt to send an event,
* the Processor must set this field to the send id of the triggering <send> element.
* Otherwise it must leave it blank.
*/
sendid?: string;
/**
* This is a URI, equivalent to the 'target' attribute on the <send> element.
* For external events, the SCXML Processor should set this field to a value which,
* when used as the value of 'target', will allow the receiver of the event to <send>
* a response back to the originating entity via the Event I/O Processor specified in 'origintype'.
* For internal and platform events, the Processor must leave this field blank.
*/
origin?: string;
/**
* This is equivalent to the 'type' field on the <send> element.
* For external events, the SCXML Processor should set this field to a value which,
* when used as the value of 'type', will allow the receiver of the event to <send>
* a response back to the originating entity at the URI specifie