xstate 5.0.0-beta.48 → 5.0.0-beta.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/actions/dist/xstate-actions.cjs.js +2 -2
  2. package/actions/dist/xstate-actions.development.cjs.js +2 -2
  3. package/actions/dist/xstate-actions.development.esm.js +2 -2
  4. package/actions/dist/xstate-actions.esm.js +2 -2
  5. package/actions/dist/xstate-actions.umd.min.js +1 -1
  6. package/actions/dist/xstate-actions.umd.min.js.map +1 -1
  7. package/actors/dist/xstate-actors.cjs.js +53 -74
  8. package/actors/dist/xstate-actors.development.cjs.js +53 -74
  9. package/actors/dist/xstate-actors.development.esm.js +53 -74
  10. package/actors/dist/xstate-actors.esm.js +53 -74
  11. package/actors/dist/xstate-actors.umd.min.js +1 -1
  12. package/actors/dist/xstate-actors.umd.min.js.map +1 -1
  13. package/dist/declarations/src/State.d.ts +20 -17
  14. package/dist/declarations/src/StateMachine.d.ts +13 -14
  15. package/dist/declarations/src/actors/callback.d.ts +6 -9
  16. package/dist/declarations/src/actors/index.d.ts +3 -3
  17. package/dist/declarations/src/actors/observable.d.ts +5 -5
  18. package/dist/declarations/src/actors/promise.d.ts +6 -6
  19. package/dist/declarations/src/actors/transition.d.ts +3 -3
  20. package/dist/declarations/src/createMachine.d.ts +17 -2
  21. package/dist/declarations/src/interpreter.d.ts +2 -2
  22. package/dist/declarations/src/setup.d.ts +19 -3
  23. package/dist/declarations/src/stateUtils.d.ts +1 -1
  24. package/dist/declarations/src/types.d.ts +19 -13
  25. package/dist/declarations/src/utils.d.ts +0 -1
  26. package/dist/{raise-84fd7a92.esm.js → raise-32ec7226.esm.js} +94 -33
  27. package/dist/{raise-286581d5.development.esm.js → raise-6c05c91b.development.esm.js} +94 -33
  28. package/dist/{raise-cd0dde81.cjs.js → raise-8176cd35.cjs.js} +93 -33
  29. package/dist/{raise-0eafc1df.development.cjs.js → raise-dc9c2c58.development.cjs.js} +93 -33
  30. package/dist/{send-f0a3179c.development.esm.js → send-2b001f05.development.esm.js} +2 -7
  31. package/dist/{send-355ba004.cjs.js → send-7f3db830.cjs.js} +2 -7
  32. package/dist/{send-ae491737.esm.js → send-88351a33.esm.js} +2 -7
  33. package/dist/{send-32a63473.development.cjs.js → send-df1c8ef2.development.cjs.js} +2 -7
  34. package/dist/xstate.cjs.js +11 -20
  35. package/dist/xstate.development.cjs.js +11 -20
  36. package/dist/xstate.development.esm.js +13 -22
  37. package/dist/xstate.esm.js +13 -22
  38. package/dist/xstate.umd.min.js +1 -1
  39. package/dist/xstate.umd.min.js.map +1 -1
  40. package/guards/dist/xstate-guards.cjs.js +1 -1
  41. package/guards/dist/xstate-guards.development.cjs.js +1 -1
  42. package/guards/dist/xstate-guards.development.esm.js +1 -1
  43. package/guards/dist/xstate-guards.esm.js +1 -1
  44. package/guards/dist/xstate-guards.umd.min.js.map +1 -1
  45. package/package.json +1 -1
@@ -1,15 +1,13 @@
1
- import { ActorLogic, EventObject, AnyActorSystem, AnyEventObject, ActorSystem, ActorRefFrom, Snapshot } from "../types.js";
2
- type CallbackSnapshot<TInput, TEvent> = Snapshot<undefined> & {
1
+ import { ActorLogic, EventObject, AnyActorSystem, AnyEventObject, ActorSystem, ActorRefFrom, Snapshot, NonReducibleUnknown } from "../types.js";
2
+ export type CallbackSnapshot<TInput> = Snapshot<undefined> & {
3
3
  input: TInput;
4
- _receivers: Set<(e: TEvent) => void>;
5
- _dispose: (() => void) | void;
6
4
  };
7
- export type CallbackActorLogic<TEvent extends EventObject, TInput = unknown> = ActorLogic<CallbackSnapshot<TInput, TEvent>, TEvent, TInput, ActorSystem<any>>;
8
- export type CallbackActorRef<TEvent extends EventObject, TInput = unknown> = ActorRefFrom<CallbackActorLogic<TEvent, TInput>>;
5
+ export type CallbackActorLogic<TEvent extends EventObject, TInput = NonReducibleUnknown> = ActorLogic<CallbackSnapshot<TInput>, TEvent, TInput, ActorSystem<any>>;
6
+ export type CallbackActorRef<TEvent extends EventObject, TInput = NonReducibleUnknown> = ActorRefFrom<CallbackActorLogic<TEvent, TInput>>;
9
7
  export type Receiver<TEvent extends EventObject> = (listener: {
10
8
  bivarianceHack(event: TEvent): void;
11
9
  }['bivarianceHack']) => void;
12
- export type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEvent extends EventObject = AnyEventObject, TInput = unknown> = ({ input, system, self, sendBack, receive }: {
10
+ export type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEvent extends EventObject = AnyEventObject, TInput = NonReducibleUnknown> = ({ input, system, self, sendBack, receive }: {
13
11
  /**
14
12
  * Data that was provided to the callback actor
15
13
  * @see {@link https://stately.ai/docs/input | Input docs}
@@ -90,5 +88,4 @@ export type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEve
90
88
  * });
91
89
  * ```
92
90
  */
93
- export declare function fromCallback<TEvent extends EventObject, TInput = unknown>(invokeCallback: InvokeCallback<TEvent, AnyEventObject, TInput>): CallbackActorLogic<TEvent, TInput>;
94
- export {};
91
+ export declare function fromCallback<TEvent extends EventObject, TInput = NonReducibleUnknown>(invokeCallback: InvokeCallback<TEvent, AnyEventObject, TInput>): CallbackActorLogic<TEvent, TInput>;
@@ -1,6 +1,6 @@
1
1
  import type { ActorRef, AnyEventObject, Snapshot } from "../types.js";
2
- export { fromCallback, type CallbackActorLogic } from "./callback.js";
3
- export { fromEventObservable, fromObservable, type ObservableActorLogic } from "./observable.js";
4
- export { fromPromise, type PromiseActorLogic } from "./promise.js";
2
+ export { fromCallback, type CallbackActorLogic, type CallbackSnapshot } from "./callback.js";
3
+ export { fromEventObservable, fromObservable, type ObservableActorLogic, type ObservableSnapshot } from "./observable.js";
4
+ export { fromPromise, type PromiseActorLogic, type PromiseSnapshot } from "./promise.js";
5
5
  export { fromTransition, type TransitionActorLogic, type TransitionSnapshot } from "./transition.js";
6
6
  export declare function createEmptyActor(): ActorRef<AnyEventObject, Snapshot<undefined>>;
@@ -1,10 +1,10 @@
1
- import { Subscribable, ActorLogic, EventObject, Subscription, AnyActorSystem, ActorRefFrom, Snapshot } from "../types.js";
2
- export type ObservableSnapshot<TContext, TInput> = Snapshot<undefined> & {
1
+ import { Subscribable, ActorLogic, EventObject, Subscription, AnyActorSystem, ActorRefFrom, Snapshot, NonReducibleUnknown } from "../types.js";
2
+ export type ObservableSnapshot<TContext, TInput extends NonReducibleUnknown> = Snapshot<undefined> & {
3
3
  context: TContext | undefined;
4
4
  input: TInput | undefined;
5
5
  _subscription: Subscription | undefined;
6
6
  };
7
- export type ObservableActorLogic<TContext, TInput> = ActorLogic<ObservableSnapshot<TContext, TInput>, {
7
+ export type ObservableActorLogic<TContext, TInput extends NonReducibleUnknown> = ActorLogic<ObservableSnapshot<TContext, TInput>, {
8
8
  type: string;
9
9
  [k: string]: unknown;
10
10
  }, TInput, AnyActorSystem>;
@@ -49,7 +49,7 @@ export type ObservableActorRef<TContext> = ActorRefFrom<ObservableActorLogic<TCo
49
49
  * @see {@link https://rxjs.dev} for documentation on RxJS Observable and observable creators.
50
50
  * @see {@link Subscribable} interface in XState, which is based on and compatible with RxJS Observable.
51
51
  */
52
- export declare function fromObservable<TContext, TInput>(observableCreator: ({ input, system }: {
52
+ export declare function fromObservable<TContext, TInput extends NonReducibleUnknown>(observableCreator: ({ input, system }: {
53
53
  input: TInput;
54
54
  system: AnyActorSystem;
55
55
  self: ObservableActorRef<TContext>;
@@ -98,7 +98,7 @@ export declare function fromObservable<TContext, TInput>(observableCreator: ({ i
98
98
  * canvasActor.start();
99
99
  * ```
100
100
  */
101
- export declare function fromEventObservable<T extends EventObject, TInput>(lazyObservable: ({ input, system }: {
101
+ export declare function fromEventObservable<T extends EventObject, TInput extends NonReducibleUnknown>(lazyObservable: ({ input, system }: {
102
102
  input: TInput;
103
103
  system: AnyActorSystem;
104
104
  self: ObservableActorRef<T>;
@@ -1,15 +1,15 @@
1
- import { ActorLogic, ActorRefFrom, ActorSystem, AnyActorSystem, Snapshot } from "../types.js";
2
1
  import { XSTATE_STOP } from "../constants.js";
2
+ import { ActorLogic, ActorRefFrom, ActorSystem, AnyActorSystem, NonReducibleUnknown, Snapshot } from "../types.js";
3
3
  export type PromiseSnapshot<TOutput, TInput> = Snapshot<TOutput> & {
4
4
  input: TInput | undefined;
5
5
  };
6
- declare const resolveEventType = "$$xstate.resolve";
7
- declare const rejectEventType = "$$xstate.reject";
6
+ declare const XSTATE_PROMISE_RESOLVE = "xstate.promise.resolve";
7
+ declare const XSTATE_PROMISE_REJECT = "xstate.promise.reject";
8
8
  export type PromiseActorEvents<T> = {
9
- type: typeof resolveEventType;
9
+ type: typeof XSTATE_PROMISE_RESOLVE;
10
10
  data: T;
11
11
  } | {
12
- type: typeof rejectEventType;
12
+ type: typeof XSTATE_PROMISE_REJECT;
13
13
  data: any;
14
14
  } | {
15
15
  type: typeof XSTATE_STOP;
@@ -64,7 +64,7 @@ export type PromiseActorRef<TOutput> = ActorRefFrom<PromiseActorLogic<TOutput, u
64
64
  * // }
65
65
  * ```
66
66
  */
67
- export declare function fromPromise<TOutput, TInput = unknown>(promiseCreator: ({ input, system }: {
67
+ export declare function fromPromise<TOutput, TInput = NonReducibleUnknown>(promiseCreator: ({ input, system }: {
68
68
  /**
69
69
  * Data that was provided to the promise actor
70
70
  */
@@ -1,8 +1,8 @@
1
- import { ActorLogic, ActorScope, ActorSystem, EventObject, ActorRefFrom, AnyActorSystem, Snapshot } from "../types.js";
1
+ import { ActorLogic, ActorScope, ActorSystem, EventObject, ActorRefFrom, AnyActorSystem, Snapshot, NonReducibleUnknown } from "../types.js";
2
2
  export type TransitionSnapshot<TContext> = Snapshot<undefined> & {
3
3
  context: TContext;
4
4
  };
5
- export type TransitionActorLogic<TContext, TEvent extends EventObject, TInput> = ActorLogic<TransitionSnapshot<TContext>, TEvent, TInput, AnyActorSystem>;
5
+ export type TransitionActorLogic<TContext, TEvent extends EventObject, TInput extends NonReducibleUnknown> = ActorLogic<TransitionSnapshot<TContext>, TEvent, TInput, AnyActorSystem>;
6
6
  export type TransitionActorRef<TContext, TEvent extends EventObject> = ActorRefFrom<TransitionActorLogic<TransitionSnapshot<TContext>, TEvent, unknown>>;
7
7
  /**
8
8
  * Returns actor logic given a transition function and its initial state.
@@ -62,7 +62,7 @@ export type TransitionActorRef<TContext, TEvent extends EventObject> = ActorRefF
62
62
  * // }
63
63
  * ```
64
64
  */
65
- export declare function fromTransition<TContext, TEvent extends EventObject, TSystem extends ActorSystem<any>, TInput>(transition: (state: TContext, event: TEvent, actorScope: ActorScope<TransitionSnapshot<TContext>, TEvent, TSystem>) => TContext, initialContext: TContext | (({ input, self }: {
65
+ export declare function fromTransition<TContext, TEvent extends EventObject, TSystem extends ActorSystem<any>, TInput extends NonReducibleUnknown>(transition: (state: TContext, event: TEvent, actorScope: ActorScope<TransitionSnapshot<TContext>, TEvent, TSystem>) => TContext, initialContext: TContext | (({ input, self }: {
66
66
  input: TInput;
67
67
  self: TransitionActorRef<TContext, TEvent>;
68
68
  }) => TContext)): TransitionActorLogic<TContext, TEvent, TInput>;
@@ -1,5 +1,20 @@
1
1
  import { StateMachine } from "./StateMachine.js";
2
2
  import { ResolveTypegenMeta, TypegenConstraint, TypegenDisabled } from "./typegenTypes.js";
3
- import { AnyActorRef, AnyEventObject, Cast, InternalMachineImplementations, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, Prop, ProvidedActor, ToChildren } from "./types.js";
3
+ import { AnyActorRef, AnyEventObject, Cast, InternalMachineImplementations, IsNever, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, Prop, ProvidedActor, StateValue, ToChildren } from "./types.js";
4
+ type TestValue = string | {
5
+ [k: string]: TestValue | undefined;
6
+ };
7
+ type _GroupTestValues<TTestValue extends string | TestValue> = TTestValue extends string ? TTestValue extends `${string}.${string}` ? [never, never] : [TTestValue, never] : [never, TTestValue];
8
+ type GroupTestValues<TTestValue extends string | TestValue> = {
9
+ leafCandidates: _GroupTestValues<TTestValue>[0];
10
+ nonLeaf: _GroupTestValues<TTestValue>[1];
11
+ };
12
+ type FilterLeafValues<TLeafCandidate extends string, TNonLeaf extends {
13
+ [k: string]: TestValue | undefined;
14
+ }> = IsNever<TNonLeaf> extends true ? TLeafCandidate : TLeafCandidate extends string ? TLeafCandidate extends keyof TNonLeaf ? never : TLeafCandidate : never;
15
+ type ToStateValue<TTestValue extends string | TestValue> = FilterLeafValues<GroupTestValues<TTestValue>['leafCandidates'], GroupTestValues<TTestValue>['nonLeaf']> | (IsNever<GroupTestValues<TTestValue>['nonLeaf']> extends false ? {
16
+ [K in keyof GroupTestValues<TTestValue>['nonLeaf']]: ToStateValue<NonNullable<GroupTestValues<TTestValue>['nonLeaf'][K]>>;
17
+ } : never);
4
18
  export declare function createMachine<TContext extends MachineContext, TEvent extends AnyEventObject, // TODO: consider using a stricter `EventObject` here
5
- TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string, TTag extends string, TInput, TOutput extends NonReducibleUnknown, TTypesMeta extends TypegenConstraint = TypegenDisabled>(config: MachineConfig<TContext, TEvent, TActor, TAction, TGuard, TDelay, TTag, TInput, TOutput, TTypesMeta>, implementations?: InternalMachineImplementations<TContext, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>): StateMachine<TContext, TEvent, Cast<ToChildren<TActor>, Record<string, AnyActorRef | undefined>>, TActor, TAction, TGuard, TDelay, Prop<ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>['resolved'], 'tags'> & string, TInput, TOutput, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>;
19
+ TActor extends ProvidedActor, TAction extends ParameterizedObject, TGuard extends ParameterizedObject, TDelay extends string, TTag extends string, TInput, TOutput extends NonReducibleUnknown, TTypesMeta extends TypegenConstraint = TypegenDisabled>(config: MachineConfig<TContext, TEvent, TActor, TAction, TGuard, TDelay, TTag, TInput, TOutput, TTypesMeta>, implementations?: InternalMachineImplementations<TContext, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>): StateMachine<TContext, TEvent, Cast<ToChildren<TActor>, Record<string, AnyActorRef | undefined>>, TActor, TAction, TGuard, TDelay, 'matchesStates' extends keyof TTypesMeta ? ToStateValue<Cast<TTypesMeta['matchesStates'], TestValue>> : StateValue, Prop<ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>['resolved'], 'tags'> & string, TInput, TOutput, ResolveTypegenMeta<TTypesMeta, TEvent, TActor, TAction, TGuard, TDelay, TTag>>;
20
+ export {};
@@ -124,6 +124,7 @@ export declare class Actor<TLogic extends AnyActorLogic> implements ActorRef<Eve
124
124
  */
125
125
  stop(): this;
126
126
  private _complete;
127
+ private _reportError;
127
128
  private _error;
128
129
  private _stopProcedure;
129
130
  /**
@@ -199,8 +200,7 @@ export declare class Actor<TLogic extends AnyActorLogic> implements ActorRef<Eve
199
200
  * @param logic - The actor logic to create an actor from. For a state machine actor logic creator, see {@link createMachine}. Other actor logic creators include {@link fromCallback}, {@link fromEventObservable}, {@link fromObservable}, {@link fromPromise}, and {@link fromTransition}.
200
201
  * @param options - Actor options
201
202
  */
202
- export declare function createActor<TLogic extends AnyActorLogic>(logic: TLogic, options?: ActorOptions<TLogic>): Actor<TLogic>;
203
- export declare function createActor<TMachine extends AnyStateMachine>(machine: AreAllImplementationsAssumedToBeProvided<TMachine['__TResolvedTypesMeta']> extends true ? TMachine : MissingImplementationsError<TMachine['__TResolvedTypesMeta']>, options?: ActorOptions<TMachine>): Actor<TMachine>;
203
+ export declare function createActor<TLogic extends AnyActorLogic>(logic: TLogic extends AnyStateMachine ? AreAllImplementationsAssumedToBeProvided<TLogic['__TResolvedTypesMeta']> extends true ? TLogic : MissingImplementationsError<TLogic['__TResolvedTypesMeta']> : TLogic, options?: ActorOptions<TLogic>): Actor<TLogic>;
204
204
  /**
205
205
  * Creates a new Interpreter instance for the given machine with the provided options, if any.
206
206
  *
@@ -1,7 +1,7 @@
1
1
  import { StateMachine } from "./StateMachine.js";
2
2
  import { GuardPredicate } from "./guards.js";
3
3
  import { ResolveTypegenMeta, TypegenDisabled } from "./typegenTypes.js";
4
- import { ActionFunction, AnyActorLogic, AnyActorRef, AnyEventObject, Cast, DelayConfig, Invert, IsNever, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, SetupTypes, ToChildren, Values } from "./types.js";
4
+ import { ActionFunction, AnyActorLogic, AnyActorRef, AnyEventObject, Cast, ConditionalRequired, DelayConfig, Invert, IsNever, MachineConfig, MachineContext, NonReducibleUnknown, ParameterizedObject, SetupTypes, StateSchema, ToChildren, UnknownActorLogic, Values } from "./types.js";
5
5
  type ToParameterizedObject<TParameterizedMap extends Record<string, ParameterizedObject['params'] | undefined>> = Values<{
6
6
  [K in keyof TParameterizedMap & string]: {
7
7
  type: K;
@@ -16,8 +16,24 @@ type ToProvidedActor<TChildrenMap extends Record<string, string>, TActors extend
16
16
  id: IsNever<TChildrenMap> extends true ? string | undefined : K extends keyof Invert<TChildrenMap> ? Invert<TChildrenMap>[K] : string | undefined;
17
17
  };
18
18
  }>;
19
+ type _GroupStateKeys<T extends StateSchema, S extends keyof T['states']> = S extends any ? T['states'][S] extends {
20
+ type: 'history';
21
+ } ? [never, never] : T extends {
22
+ type: 'parallel';
23
+ } ? [S, never] : 'states' extends keyof T['states'][S] ? [S, never] : [never, S] : never;
24
+ type GroupStateKeys<T extends StateSchema, S extends keyof T['states']> = {
25
+ nonLeaf: _GroupStateKeys<T, S & string>[0];
26
+ leaf: _GroupStateKeys<T, S & string>[1];
27
+ };
28
+ type ToStateValue<T extends StateSchema> = T extends {
29
+ states: Record<infer S, any>;
30
+ } ? IsNever<S> extends true ? {} : GroupStateKeys<T, S>['leaf'] | (IsNever<GroupStateKeys<T, S>['nonLeaf']> extends false ? ConditionalRequired<{
31
+ [K in GroupStateKeys<T, S>['nonLeaf']]?: ToStateValue<T['states'][K]>;
32
+ }, T extends {
33
+ type: 'parallel';
34
+ } ? true : false> : never) : {};
19
35
  export declare function setup<TContext extends MachineContext, TEvent extends AnyEventObject, // TODO: consider using a stricter `EventObject` here
20
- TActors extends Record<Values<TChildrenMap>, AnyActorLogic>, TActions extends Record<string, ParameterizedObject['params'] | undefined>, TGuards extends Record<string, ParameterizedObject['params'] | undefined>, TDelay extends string, TTag extends string, TInput, TOutput extends NonReducibleUnknown, TChildrenMap extends Record<string, string> = never>({ actors, actions, guards, delays }: {
36
+ TActors extends Record<Values<TChildrenMap>, UnknownActorLogic>, TActions extends Record<string, ParameterizedObject['params'] | undefined>, TGuards extends Record<string, ParameterizedObject['params'] | undefined>, TDelay extends string, TTag extends string, TInput, TOutput extends NonReducibleUnknown, TChildrenMap extends Record<string, string> = never>({ actors, actions, guards, delays }: {
21
37
  types?: SetupTypes<TContext, TEvent, TChildrenMap, TTag, TInput, TOutput>;
22
38
  actors?: TActors;
23
39
  actions?: {
@@ -30,6 +46,6 @@ TActors extends Record<Values<TChildrenMap>, AnyActorLogic>, TActions extends Re
30
46
  [K in TDelay]: DelayConfig<TContext, TEvent, ToParameterizedObject<TActions>['params'], TEvent>;
31
47
  };
32
48
  }): {
33
- createMachine: <const TConfig extends MachineConfig<TContext, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>>(config: TConfig) => StateMachine<TContext, TEvent, Cast<ToChildren<ToProvidedActor<TChildrenMap, TActors>>, Record<string, AnyActorRef | undefined>>, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>;
49
+ createMachine: <const TConfig extends MachineConfig<TContext, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>>(config: TConfig) => StateMachine<TContext, TEvent, Cast<ToChildren<ToProvidedActor<TChildrenMap, TActors>>, Record<string, AnyActorRef | undefined>>, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, ToStateValue<TConfig>, TTag, TInput, TOutput, ResolveTypegenMeta<TypegenDisabled, TEvent, ToProvidedActor<TChildrenMap, TActors>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TTag>>;
34
50
  };
35
51
  export {};
@@ -40,7 +40,7 @@ export declare function getStateNodes<TContext extends MachineContext, TEvent ex
40
40
  export declare function transitionAtomicNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: string, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
41
41
  export declare function transitionCompoundNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValueMap, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
42
42
  export declare function transitionParallelNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValueMap, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
43
- export declare function transitionNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValue, state: MachineSnapshot<TContext, TEvent, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
43
+ export declare function transitionNode<TContext extends MachineContext, TEvent extends EventObject>(stateNode: AnyStateNode, stateValue: StateValue, state: MachineSnapshot<TContext, TEvent, any, any, any, any, any>, event: TEvent): Array<TransitionDefinition<TContext, TEvent>> | undefined;
44
44
  export declare function removeConflictingTransitions(enabledTransitions: Array<AnyTransitionDefinition>, stateNodeSet: Set<AnyStateNode>, historyValue: AnyHistoryValue): Array<AnyTransitionDefinition>;
45
45
  /**
46
46
  * https://www.w3.org/TR/scxml/#microstepProcedure
@@ -81,13 +81,13 @@ export interface UnifiedArg<TContext extends MachineContext, TExpressionEvent ex
81
81
  context: TContext;
82
82
  event: TExpressionEvent;
83
83
  self: ActorRef<TEvent, MachineSnapshot<TContext, TEvent, Record<string, AnyActorRef | undefined>, // TODO: this should be replaced with `TChildren`
84
- string, unknown>>;
84
+ StateValue, string, unknown>>;
85
85
  system: ActorSystem<any>;
86
86
  }
87
87
  export type MachineContext = Record<string, any>;
88
88
  export interface ActionArgs<TContext extends MachineContext, TExpressionEvent extends EventObject, TEvent extends EventObject> extends UnifiedArg<TContext, TExpressionEvent, TEvent> {
89
89
  }
90
- export type InputFrom<T extends AnyActorLogic> = T extends StateMachine<infer _TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TInput : T extends ActorLogic<infer _TSnapshot, infer _TEvent, infer TInput, infer _TSystem> ? TInput : never;
90
+ export type InputFrom<T extends AnyActorLogic> = T extends StateMachine<infer _TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TInput : T extends ActorLogic<infer _TSnapshot, infer _TEvent, infer TInput, infer _TSystem> ? TInput : never;
91
91
  export type OutputFrom<T extends AnyActorLogic> = T extends ActorLogic<infer TSnapshot, infer _TEvent, infer _TInput, infer _TSystem> ? (TSnapshot & {
92
92
  status: 'done';
93
93
  })['output'] : never;
@@ -349,7 +349,7 @@ export interface StateMachineDefinition<TContext extends MachineContext, TEvent
349
349
  }
350
350
  export type AnyStateNode = StateNode<any, any>;
351
351
  export type AnyStateNodeDefinition = StateNodeDefinition<any, any>;
352
- export type AnyMachineSnapshot = MachineSnapshot<any, any, any, any, any, any>;
352
+ export type AnyMachineSnapshot = MachineSnapshot<any, any, any, any, any, any, any>;
353
353
  /** @deprecated use `AnyMachineSnapshot` instead */
354
354
  export type AnyState = AnyMachineSnapshot;
355
355
  export type AnyStateMachine = StateMachine<any, // context
@@ -359,6 +359,7 @@ any, // actor
359
359
  any, // action
360
360
  any, // guard
361
361
  any, // delay
362
+ any, // state value
362
363
  any, // tag
363
364
  any, // input
364
365
  any, // output
@@ -521,7 +522,7 @@ export type Mapper<TContext extends MachineContext, TExpressionEvent extends Eve
521
522
  context: TContext;
522
523
  event: TExpressionEvent;
523
524
  self: ActorRef<TEvent, MachineSnapshot<TContext, TEvent, Record<string, AnyActorRef>, // TODO: this should be replaced with `TChildren`
524
- string, unknown>>;
525
+ StateValue, string, unknown>>;
525
526
  }) => TResult;
526
527
  export interface TransitionDefinition<TContext extends MachineContext, TEvent extends EventObject> extends Omit<TransitionConfig<TContext, TEvent, TEvent, TODO, TODO, TODO, TODO>, 'target' | 'guard'> {
527
528
  target: ReadonlyArray<StateNode<TContext, TEvent>> | undefined;
@@ -735,7 +736,7 @@ export interface ActorRef<TEvent extends EventObject, TSnapshot extends Snapshot
735
736
  id: string;
736
737
  sessionId: string;
737
738
  send: (event: TEvent) => void;
738
- start?: () => void;
739
+ start: () => void;
739
740
  getSnapshot: () => TSnapshot;
740
741
  getPersistedState: () => Snapshot<unknown>;
741
742
  stop: () => void;
@@ -746,13 +747,13 @@ export interface ActorRef<TEvent extends EventObject, TSnapshot extends Snapshot
746
747
  }
747
748
  export type AnyActorRef = ActorRef<any, any>;
748
749
  export type ActorLogicFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<any, any, any, any, any, any, any, any, any, any, any> ? R : R extends Promise<infer U> ? PromiseActorLogic<U> : never : never;
749
- export type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer _TInput, infer TOutput, infer TResolvedTypesMeta> ? ActorRef<TEvent, MachineSnapshot<TContext, TEvent, TChildren, TTag, TOutput, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta>> : R extends Promise<infer U> ? ActorRefFrom<PromiseActorLogic<U>> : R extends ActorLogic<infer TSnapshot, infer TEvent, infer _TInput, infer _TSystem> ? ActorRef<TEvent, TSnapshot> : never : never;
750
+ export type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TStateValue, infer TTag, infer _TInput, infer TOutput, infer TResolvedTypesMeta> ? ActorRef<TEvent, MachineSnapshot<TContext, TEvent, TChildren, TStateValue, TTag, TOutput, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta>> : R extends Promise<infer U> ? ActorRefFrom<PromiseActorLogic<U>> : R extends ActorLogic<infer TSnapshot, infer TEvent, infer _TInput, infer _TSystem> ? ActorRef<TEvent, TSnapshot> : never : never;
750
751
  export type DevToolsAdapter = (service: AnyActor) => void;
751
752
  /**
752
753
  * @deprecated Use `Actor<T>` instead.
753
754
  */
754
- export type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TTag, infer TInput, infer TOutput, infer TResolvedTypesMeta> ? Actor<ActorLogic<MachineSnapshot<TContext, TEvent, TChildren, TTag, TOutput, TResolvedTypesMeta>, TEvent, TInput, ActorSystem<any>>> : never;
755
- export type MachineImplementationsFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine), TRequireMissingImplementations extends boolean = false> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer TResolvedTypesMeta> ? InternalMachineImplementations<TContext, TResolvedTypesMeta, TRequireMissingImplementations> : never;
755
+ export type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TEvent, infer TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer TStateValue, infer TTag, infer TInput, infer TOutput, infer TResolvedTypesMeta> ? Actor<ActorLogic<MachineSnapshot<TContext, TEvent, TChildren, TStateValue, TTag, TOutput, TResolvedTypesMeta>, TEvent, TInput, ActorSystem<any>>> : never;
756
+ export type MachineImplementationsFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine), TRequireMissingImplementations extends boolean = false> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer _TInput, infer _TOutput, infer TResolvedTypesMeta> ? InternalMachineImplementations<TContext, TResolvedTypesMeta, TRequireMissingImplementations> : never;
756
757
  export type __ResolvedTypesMetaFrom<T> = T extends StateMachine<any, // context
757
758
  any, // event
758
759
  any, // children
@@ -799,7 +800,7 @@ export type Snapshot<TOutput> = {
799
800
  * @template TInput - The type of the input.
800
801
  * @template TSystem - The type of the actor system.
801
802
  */
802
- export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TInput = unknown, TSystem extends ActorSystem<any> = ActorSystem<any>> {
803
+ export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends EventObject, TInput = NonReducibleUnknown, TSystem extends ActorSystem<any> = ActorSystem<any>> {
803
804
  /** The initial setup/configuration used to create the actor logic. */
804
805
  config?: unknown;
805
806
  /**
@@ -810,7 +811,7 @@ export interface ActorLogic<TSnapshot extends Snapshot<unknown>, TEvent extends
810
811
  * @param ctx - The actor scope.
811
812
  * @returns The new state.
812
813
  */
813
- transition: (state: TSnapshot, message: TEvent, ctx: ActorScope<TSnapshot, TEvent, TSystem>) => TSnapshot;
814
+ transition: (snapshot: TSnapshot, message: TEvent, ctx: ActorScope<TSnapshot, TEvent, TSystem>) => TSnapshot;
814
815
  /**
815
816
  * Called to provide the initial state of the actor.
816
817
  * @param actorScope - The actor scope.
@@ -844,11 +845,13 @@ export type AnyActorLogic = ActorLogic<any, // snapshot
844
845
  any, // event
845
846
  any, // input
846
847
  any>;
847
- export type SnapshotFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends ActorRef<infer _, infer TSnapshot> ? TSnapshot : R extends Actor<infer TLogic> ? SnapshotFrom<TLogic> : R extends StateMachine<infer _TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? StateFrom<R> : R extends ActorLogic<any, any, any, any> ? ReturnType<R['transition']> : R extends ActorScope<infer TSnapshot, infer _, infer __> ? TSnapshot : never : never;
848
+ export type UnknownActorLogic = ActorLogic<any, // this is invariant and it's hard to figure out a better default than `any`
849
+ EventObject, NonReducibleUnknown, ActorSystem<any>>;
850
+ export type SnapshotFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends ActorRef<infer _, infer TSnapshot> ? TSnapshot : R extends Actor<infer TLogic> ? SnapshotFrom<TLogic> : R extends ActorLogic<infer _, infer __, infer ___, infer ____> ? ReturnType<R['transition']> : R extends ActorScope<infer TSnapshot, infer _, infer __> ? TSnapshot : never : never;
848
851
  export type EventFromLogic<TLogic extends ActorLogic<any, any, any, any>> = TLogic extends ActorLogic<infer _, infer TEvent, infer __, infer _____> ? TEvent : never;
849
- type ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer _TContext, infer TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends MachineSnapshot<infer _TContext, infer TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends ActorRef<infer TEvent, infer _> ? TEvent : never : never;
852
+ type ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer _TContext, infer TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer _TInput, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends MachineSnapshot<infer _TContext, infer TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TEvent : R extends ActorRef<infer TEvent, infer _> ? TEvent : never : never;
850
853
  export type EventFrom<T, K extends Prop<TEvent, 'type'> = never, TEvent extends EventObject = ResolveEventType<T>> = IsNever<K> extends true ? TEvent : ExtractEvent<TEvent, K>;
851
- export type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : R extends MachineSnapshot<infer TContext, infer _TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TContext : R extends Actor<infer TActorLogic> ? TActorLogic extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : never : never : never;
854
+ export type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TStateValue, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : R extends MachineSnapshot<infer TContext, infer _TEvent, infer _TChildren, infer _TTag, infer _TOutput, infer _TResolvedTypesMeta> ? TContext : R extends Actor<infer TActorLogic> ? TActorLogic extends StateMachine<infer TContext, infer _TEvent, infer _TChildren, infer _TActor, infer _TAction, infer _TGuard, infer _TDelay, infer _TTag, infer _TInput, infer _TOutput, infer _TTypesMeta> ? TContext : never : never : never;
852
855
  export type InferEvent<E extends EventObject> = {
853
856
  [T in E['type']]: {
854
857
  type: T;
@@ -878,4 +881,7 @@ export type ToChildren<TActor extends ProvidedActor> = string extends TActor['sr
878
881
  };
879
882
  exclude: {};
880
883
  }[undefined extends TActor['id'] ? 'include' : string extends TActor['id'] ? 'include' : 'exclude']>;
884
+ export type StateSchema = {
885
+ states?: Record<string, StateSchema>;
886
+ };
881
887
  export {};
@@ -21,7 +21,6 @@ export declare function mapFilterValues<T, P>(collection: {
21
21
  */
22
22
  export declare function path<T extends Record<string, any>>(props: string[]): any;
23
23
  export declare function toStatePaths(stateValue: StateValue | undefined): string[][];
24
- export declare function flatten<T>(array: Array<T | T[]>): T[];
25
24
  export declare function toArrayStrict<T>(value: readonly T[] | T): readonly T[];
26
25
  export declare function toArray<T>(value: readonly T[] | T | undefined): readonly T[];
27
26
  export declare function resolveOutput<TContext extends MachineContext, TExpressionEvent extends EventObject>(mapper: Mapper<TContext, TExpressionEvent, unknown, EventObject> | NonReducibleUnknown, context: TContext, event: TExpressionEvent, self: AnyActorRef): unknown;
@@ -248,9 +248,6 @@ function mapValues(collection, iteratee) {
248
248
  }
249
249
  return result;
250
250
  }
251
- function flatten(array) {
252
- return [].concat(...array);
253
- }
254
251
  function toArrayStrict(value) {
255
252
  if (isArray(value)) {
256
253
  return value;
@@ -317,7 +314,7 @@ function resolveReferencedActor(machine, src) {
317
314
  return machine.implementations.actors[src];
318
315
  }
319
316
  function getAllOwnEventDescriptors(snapshot) {
320
- return [...new Set(flatten([...snapshot._nodes.map(sn => sn.ownEvents)]))];
317
+ return [...new Set([...snapshot._nodes.flatMap(sn => sn.ownEvents)])];
321
318
  }
322
319
 
323
320
  const $$ACTOR_TYPE = 1;
@@ -452,7 +449,18 @@ class Actor {
452
449
  }
453
450
  }
454
451
  _initState(persistedState) {
455
- this._state = persistedState ? this.logic.restoreState ? this.logic.restoreState(persistedState, this._actorScope) : persistedState : this.logic.getInitialState(this._actorScope, this.options?.input);
452
+ try {
453
+ this._state = persistedState ? this.logic.restoreState ? this.logic.restoreState(persistedState, this._actorScope) : persistedState : this.logic.getInitialState(this._actorScope, this.options?.input);
454
+ } catch (err) {
455
+ // if we get here then it means that we assign a value to this._state that is not of the correct type
456
+ // we can't get the true `TSnapshot & { status: 'error'; }`, it's impossible
457
+ // so right now this is a lie of sorts
458
+ this._state = {
459
+ status: 'error',
460
+ output: undefined,
461
+ error: err
462
+ };
463
+ }
456
464
  }
457
465
  update(snapshot, event) {
458
466
  // Update state
@@ -461,17 +469,46 @@ class Actor {
461
469
  // Execute deferred effects
462
470
  let deferredFn;
463
471
  while (deferredFn = this._deferred.shift()) {
464
- deferredFn();
465
- }
466
- for (const observer of this.observers) {
467
472
  try {
468
- observer.next?.(snapshot);
473
+ deferredFn();
469
474
  } catch (err) {
470
- reportUnhandledError(err);
475
+ // this error can only be caught when executing *initial* actions
476
+ // it's the only time when we call actions provided by the user through those deferreds
477
+ // when the actor is already running we always execute them synchronously while transitioning
478
+ // no "builtin deferred" should actually throw an error since they are either safe
479
+ // or the control flow is passed through the mailbox and errors should be caught by the `_process` used by the mailbox
480
+ this._deferred.length = 0;
481
+ this._state = {
482
+ ...snapshot,
483
+ status: 'error',
484
+ error: err
485
+ };
471
486
  }
472
487
  }
473
488
  switch (this._state.status) {
489
+ case 'active':
490
+ for (const observer of this.observers) {
491
+ try {
492
+ observer.next?.(snapshot);
493
+ } catch (err) {
494
+ reportUnhandledError(err);
495
+ }
496
+ }
497
+ break;
474
498
  case 'done':
499
+ // next observers are meant to be notified about done snapshots
500
+ // this can be seen as something that is different from how observable work
501
+ // but with observables `complete` callback is called without any arguments
502
+ // it's more ergonomic for XState to treat a done snapshot as a "next" value
503
+ // and the completion event as something that is separate,
504
+ // something that merely follows emitting that done snapshot
505
+ for (const observer of this.observers) {
506
+ try {
507
+ observer.next?.(snapshot);
508
+ } catch (err) {
509
+ reportUnhandledError(err);
510
+ }
511
+ }
475
512
  this._stopProcedure();
476
513
  this._complete();
477
514
  this._doneEvent = createDoneActorEvent(this.id, this._state.output);
@@ -480,11 +517,7 @@ class Actor {
480
517
  }
481
518
  break;
482
519
  case 'error':
483
- this._stopProcedure();
484
520
  this._error(this._state.error);
485
- if (this._parent) {
486
- this.system._relay(this, this._parent, createErrorActorEvent(this.id, this._state.error));
487
- }
488
521
  break;
489
522
  }
490
523
  this.system._sendInspectionEvent({
@@ -574,7 +607,7 @@ class Actor {
574
607
  this.subscribe({
575
608
  next: snapshot => {
576
609
  if (snapshot.status === 'active') {
577
- this._parent.send({
610
+ this.system._relay(this, this._parent, {
578
611
  type: `xstate.snapshot.${this.id}`,
579
612
  snapshot
580
613
  });
@@ -603,18 +636,22 @@ class Actor {
603
636
  // a state machine can be "done" upon initialization (it could reach a final state using initial microsteps)
604
637
  // we still need to complete observers, flush deferreds etc
605
638
  this.update(this._state, initEvent);
606
- // fallthrough
607
- case 'error':
608
639
  // TODO: rethink cleanup of observers, mailbox, etc
609
640
  return this;
641
+ case 'error':
642
+ this._error(this._state.error);
643
+ return this;
610
644
  }
611
645
  if (this.logic.start) {
612
646
  try {
613
647
  this.logic.start(this._state, this._actorScope);
614
648
  } catch (err) {
615
- this._stopProcedure();
649
+ this._state = {
650
+ ...this._state,
651
+ status: 'error',
652
+ error: err
653
+ };
616
654
  this._error(err);
617
- this._parent?.send(createErrorActorEvent(this.id, err));
618
655
  return this;
619
656
  }
620
657
  }
@@ -630,7 +667,6 @@ class Actor {
630
667
  return this;
631
668
  }
632
669
  _process(event) {
633
- // TODO: reexamine what happens when an action (or a guard or smth) throws
634
670
  let nextState;
635
671
  let caughtError;
636
672
  try {
@@ -645,9 +681,12 @@ class Actor {
645
681
  const {
646
682
  err
647
683
  } = caughtError;
648
- this._stopProcedure();
684
+ this._state = {
685
+ ...this._state,
686
+ status: 'error',
687
+ error: err
688
+ };
649
689
  this._error(err);
650
- this._parent?.send(createErrorActorEvent(this.id, err));
651
690
  return;
652
691
  }
653
692
  this.update(nextState, event);
@@ -690,7 +729,7 @@ class Actor {
690
729
  }
691
730
  this.observers.clear();
692
731
  }
693
- _error(err) {
732
+ _reportError(err) {
694
733
  if (!this.observers.size) {
695
734
  if (!this._parent) {
696
735
  reportUnhandledError(err);
@@ -712,6 +751,18 @@ class Actor {
712
751
  reportUnhandledError(err);
713
752
  }
714
753
  }
754
+ _error(err) {
755
+ this._stopProcedure();
756
+ this._reportError(err);
757
+ if (this._parent) {
758
+ this.system._relay(this, this._parent, createErrorActorEvent(this.id, err));
759
+ }
760
+ }
761
+ // TODO: atm children don't belong entirely to the actor so
762
+ // in a way - it's not even super aware of them
763
+ // so we can't stop them from here but we really should!
764
+ // right now, they are being stopped within the machine's transition
765
+ // but that could throw and leave us with "orphaned" active actors
715
766
  _stopProcedure() {
716
767
  if (this._processingStatus !== ProcessingStatus.Running) {
717
768
  // Actor already stopped; do nothing
@@ -957,12 +1008,7 @@ function executeSpawn(actorScope, {
957
1008
  if (actorRef._processingStatus === ProcessingStatus.Stopped) {
958
1009
  return;
959
1010
  }
960
- try {
961
- actorRef.start?.();
962
- } catch (err) {
963
- actorScope.self.send(createErrorActorEvent(id, err));
964
- return;
965
- }
1011
+ actorRef.start();
966
1012
  });
967
1013
  }
968
1014
  function spawnChild(...[src, {
@@ -2017,7 +2063,23 @@ function macrostep(state, event, actorScope, internalQueue = []) {
2017
2063
  // Assume the state is at rest (no raised events)
2018
2064
  // Determine the next state based on the next microstep
2019
2065
  if (nextEvent.type !== XSTATE_INIT) {
2020
- const transitions = selectTransitions(nextEvent, nextState);
2066
+ const currentEvent = nextEvent;
2067
+ const isErr = isErrorActorEvent(currentEvent);
2068
+ const transitions = selectTransitions(currentEvent, nextState);
2069
+ if (isErr && !transitions.length) {
2070
+ // TODO: we should likely only allow transitions selected by very explicit descriptors
2071
+ // `*` shouldn't be matched, likely `xstate.error.*` shouldnt be either
2072
+ // similarly `xstate.error.actor.*` and `xstate.error.actor.todo.*` have to be considered too
2073
+ nextState = cloneMachineSnapshot(state, {
2074
+ status: 'error',
2075
+ error: currentEvent.data
2076
+ });
2077
+ states.push(nextState);
2078
+ return {
2079
+ state: nextState,
2080
+ microstates: states
2081
+ };
2082
+ }
2021
2083
  nextState = microstep(transitions, state, actorScope, nextEvent, false, internalQueue);
2022
2084
  states.push(nextState);
2023
2085
  }
@@ -2131,10 +2193,9 @@ function createMachineSnapshot(config, machine) {
2131
2193
  context: config.context,
2132
2194
  _nodes: config._nodes,
2133
2195
  value: getStateValue(machine.root, config._nodes),
2134
- tags: new Set(flatten(config._nodes.map(sn => sn.tags))),
2196
+ tags: new Set(config._nodes.flatMap(sn => sn.tags)),
2135
2197
  children: config.children,
2136
2198
  historyValue: config.historyValue || {},
2137
- // this one is generic in the target and it's hard to create a matching non-generic source signature
2138
2199
  matches: machineSnapshotMatches,
2139
2200
  hasTag: machineSnapshotHasTag,
2140
2201
  can: machineSnapshotCan,
@@ -2258,4 +2319,4 @@ function raise(eventOrExpr, options) {
2258
2319
  return raise;
2259
2320
  }
2260
2321
 
2261
- export { $$ACTOR_TYPE as $, getPersistedState as A, resolveReferencedActor as B, createActor as C, Actor as D, interpret as E, isMachineSnapshot as F, matchesState as G, pathToStateValue as H, toObserver as I, and as J, not as K, or as L, stateIn as M, NULL_EVENT as N, cancel as O, raise as P, stop as Q, stopChild as R, STATE_DELIMITER as S, spawnChild as T, ProcessingStatus as U, createErrorActorEvent as V, XSTATE_ERROR as W, XSTATE_STOP as X, toTransitionConfigArray as a, formatTransition as b, createInvokeId as c, formatInitialTransition as d, evaluateGuard as e, formatTransitions as f, getDelayedTransitions as g, getCandidates as h, getAllStateNodes as i, getStateNodes as j, createMachineSnapshot as k, isInFinalState as l, mapValues as m, isErrorActorEvent as n, getAllOwnEventDescriptors as o, cloneMachineSnapshot as p, macrostep as q, resolveStateValue as r, transitionNode as s, toArray as t, resolveActionsAndContext as u, createInitEvent as v, microstep as w, getInitialStateNodes as x, isStateId as y, getStateNodeByPath as z };
2322
+ export { $$ACTOR_TYPE as $, Actor as A, interpret as B, isMachineSnapshot as C, matchesState as D, pathToStateValue as E, toObserver as F, getAllOwnEventDescriptors as G, and as H, not as I, or as J, stateIn as K, cancel as L, raise as M, NULL_EVENT as N, stop as O, stopChild as P, spawnChild as Q, ProcessingStatus as R, STATE_DELIMITER as S, cloneMachineSnapshot as T, XSTATE_ERROR as U, createErrorActorEvent as V, XSTATE_STOP as X, toTransitionConfigArray as a, formatTransition as b, createInvokeId as c, formatInitialTransition as d, evaluateGuard as e, formatTransitions as f, getDelayedTransitions as g, getCandidates as h, getAllStateNodes as i, getStateNodes as j, createMachineSnapshot as k, isInFinalState as l, mapValues as m, macrostep as n, transitionNode as o, resolveActionsAndContext as p, createInitEvent as q, resolveStateValue as r, microstep as s, toArray as t, getInitialStateNodes as u, isStateId as v, getStateNodeByPath as w, getPersistedState as x, resolveReferencedActor as y, createActor as z };