xstate 4.31.0 → 4.33.0

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.
@@ -1,8 +1,11 @@
1
- import { AnyFunction, AssignAction, Assigner, BaseActionObject, Compute, EventObject, ExtractEvent, MachineConfig, Prop, PropertyAssigner, StateMachine, InternalMachineOptions, ServiceMap } from './types';
1
+ import { AnyFunction, AssignAction, Assigner, BaseActionObject, Compute, EventObject, MachineConfig, Prop, PropertyAssigner, StateMachine, InternalMachineOptions, ServiceMap } from './types';
2
2
  import { ResolveTypegenMeta, TypegenConstraint, TypegenDisabled } from './typegenTypes';
3
+ declare type SimplisticExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends {
4
+ type: TEventType;
5
+ } ? TEvent : never;
3
6
  export interface Model<TContext, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject, TModelCreators = void> {
4
7
  initialContext: TContext;
5
- assign: <TEventType extends TEvent['type'] = TEvent['type']>(assigner: Assigner<TContext, ExtractEvent<TEvent, TEventType>> | PropertyAssigner<TContext, ExtractEvent<TEvent, TEventType>>, eventType?: TEventType) => AssignAction<TContext, ExtractEvent<TEvent, TEventType>>;
8
+ assign: <TEventType extends TEvent['type'] = TEvent['type']>(assigner: Assigner<TContext, SimplisticExtractEvent<TEvent, TEventType>> | PropertyAssigner<TContext, SimplisticExtractEvent<TEvent, TEventType>>, eventType?: TEventType) => AssignAction<TContext, SimplisticExtractEvent<TEvent, TEventType>>;
6
9
  events: Prop<TModelCreators, 'events'>;
7
10
  actions: Prop<TModelCreators, 'actions'>;
8
11
  reset: () => AssignAction<TContext, any>;
@@ -49,4 +52,5 @@ export interface FinalModelCreators<Self> {
49
52
  export declare type UnionFromCreatorsReturnTypes<TCreators> = {
50
53
  [K in keyof TCreators]: TCreators[K] extends AnyFunction ? ReturnType<TCreators[K]> : never;
51
54
  }[keyof TCreators];
55
+ export {};
52
56
  //# sourceMappingURL=model.types.d.ts.map
@@ -3,6 +3,7 @@ import { StateNode } from './StateNode';
3
3
  declare type Configuration<TC, TE extends EventObject> = Iterable<StateNode<TC, any, TE>>;
4
4
  declare type AdjList<TC, TE extends EventObject> = Map<StateNode<TC, any, TE>, Array<StateNode<TC, any, TE>>>;
5
5
  export declare const isLeafNode: (stateNode: StateNode<any, any, any, any, any, any>) => boolean;
6
+ export declare function getAllChildren<TC, TE extends EventObject>(stateNode: StateNode<TC, any, TE>): Array<StateNode<TC, any, TE>>;
6
7
  export declare function getChildren<TC, TE extends EventObject>(stateNode: StateNode<TC, any, TE>): Array<StateNode<TC, any, TE>>;
7
8
  export declare function getAllStateNodes<TC, TE extends EventObject>(stateNode: StateNode<TC, any, TE, any, any, any>): Array<StateNode<TC, any, TE, any, any, any>>;
8
9
  export declare function getConfiguration<TC, TE extends EventObject>(prevStateNodes: Iterable<StateNode<TC, any, TE, any, any, any>>, stateNodes: Iterable<StateNode<TC, any, TE, any, any, any>>): Set<StateNode<TC, any, TE, any, any, any>>;
package/es/stateUtils.js CHANGED
@@ -4,10 +4,13 @@ import { flatten } from './utils.js';
4
4
  var isLeafNode = function (stateNode) {
5
5
  return stateNode.type === 'atomic' || stateNode.type === 'final';
6
6
  };
7
- function getChildren(stateNode) {
7
+ function getAllChildren(stateNode) {
8
8
  return Object.keys(stateNode.states).map(function (key) {
9
9
  return stateNode.states[key];
10
- }).filter(function (sn) {
10
+ });
11
+ }
12
+ function getChildren(stateNode) {
13
+ return getAllChildren(stateNode).filter(function (sn) {
11
14
  return sn.type !== 'history';
12
15
  });
13
16
  }
@@ -256,4 +259,4 @@ function getTagsFromConfiguration(configuration) {
256
259
  })));
257
260
  }
258
261
 
259
- export { getAdjList, getAllStateNodes, getChildren, getConfiguration, getMeta, getTagsFromConfiguration, getValue, has, isInFinalState, isLeafNode, nextEvents };
262
+ export { getAdjList, getAllChildren, getAllStateNodes, getChildren, getConfiguration, getMeta, getTagsFromConfiguration, getValue, has, isInFinalState, isLeafNode, nextEvents };
@@ -113,18 +113,21 @@ declare type AllowAllEvents = {
113
113
  };
114
114
  export interface ResolveTypegenMeta<TTypesMeta extends TypegenConstraint, TEvent extends EventObject, TAction extends BaseActionObject, TServiceMap extends ServiceMap> {
115
115
  '@@xstate/typegen': TTypesMeta['@@xstate/typegen'];
116
- resolved: TTypesMeta extends TypegenEnabled ? TTypesMeta & {
117
- indexedActions: IndexByType<TAction>;
118
- indexedEvents: MergeWithInternalEvents<IndexByType<(string extends TEvent['type'] ? never : TEvent) | GenerateServiceEvents<TServiceMap, Prop<TTypesMeta, 'invokeSrcNameMap'>>>, Prop<TTypesMeta, 'internalEvents'>>;
119
- } : TypegenDisabled & AllImplementationsProvided & AllowAllEvents & {
120
- indexedActions: IndexByType<TAction>;
121
- indexedEvents: Record<string, TEvent> & {
122
- __XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__: {
123
- data: any;
116
+ resolved: {
117
+ enabled: TTypesMeta & {
118
+ indexedActions: IndexByType<TAction>;
119
+ indexedEvents: MergeWithInternalEvents<IndexByType<(string extends TEvent['type'] ? never : TEvent) | GenerateServiceEvents<TServiceMap, Prop<TTypesMeta, 'invokeSrcNameMap'>>>, Prop<TTypesMeta, 'internalEvents'>>;
120
+ };
121
+ disabled: TypegenDisabled & AllImplementationsProvided & AllowAllEvents & {
122
+ indexedActions: IndexByType<TAction>;
123
+ indexedEvents: Record<string, TEvent> & {
124
+ __XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__: {
125
+ data: any;
126
+ };
124
127
  };
128
+ invokeSrcNameMap: Record<string, '__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__'>;
125
129
  };
126
- invokeSrcNameMap: Record<string, '__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__'>;
127
- };
130
+ }[IsNever<TTypesMeta> extends true ? 'disabled' : TTypesMeta extends TypegenEnabled ? 'enabled' : 'disabled'];
128
131
  }
129
132
  export {};
130
133
  //# sourceMappingURL=typegenTypes.d.ts.map
package/es/types.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Clock, Interpreter } from './interpreter';
2
2
  import { Model } from './model.types';
3
3
  import { State } from './State';
4
4
  import { StateNode } from './StateNode';
5
- import { MarkAllImplementationsAsProvided, TypegenDisabled, ResolveTypegenMeta, TypegenConstraint, AreAllImplementationsAssumedToBeProvided } from './typegenTypes';
5
+ import { MarkAllImplementationsAsProvided, TypegenDisabled, ResolveTypegenMeta, TypegenConstraint, AreAllImplementationsAssumedToBeProvided, TypegenEnabled } from './typegenTypes';
6
6
  export declare type AnyFunction = (...args: any[]) => any;
7
7
  declare type ReturnTypeOrValue<T> = T extends AnyFunction ? ReturnType<T> : T;
8
8
  export declare type IsNever<T> = [T] extends [never] ? true : false;
@@ -15,9 +15,7 @@ export declare type Merge<M, N> = Omit<M, keyof N> & N;
15
15
  export declare type IndexByType<T extends {
16
16
  type: string;
17
17
  }> = {
18
- [K in T['type']]: Extract<T, {
19
- type: K;
20
- }>;
18
+ [K in T['type']]: T extends any ? (K extends T['type'] ? T : never) : never;
21
19
  };
22
20
  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;
23
21
  export declare type IsAny<T> = Equals<T, any>;
@@ -241,13 +239,7 @@ export declare type StatesDefinition<TContext, TStateSchema extends StateSchema,
241
239
  export declare type TransitionConfigTarget<TContext, TEvent extends EventObject> = string | undefined | StateNode<TContext, any, TEvent>;
242
240
  export declare type TransitionConfigOrTarget<TContext, TEvent extends EventObject> = SingleOrArray<TransitionConfigTarget<TContext, TEvent> | TransitionConfig<TContext, TEvent>>;
243
241
  export declare type TransitionsConfigMap<TContext, TEvent extends EventObject> = {
244
- [K in TEvent['type']]?: TransitionConfigOrTarget<TContext, TEvent extends {
245
- type: K;
246
- } ? TEvent : never>;
247
- } & {
248
- ''?: TransitionConfigOrTarget<TContext, TEvent>;
249
- } & {
250
- '*'?: TransitionConfigOrTarget<TContext, TEvent>;
242
+ [K in TEvent['type'] | '' | '*']?: K extends '' | '*' ? TransitionConfigOrTarget<TContext, TEvent> : TransitionConfigOrTarget<TContext, ExtractEvent<TEvent, K>>;
251
243
  };
252
244
  declare type TransitionsConfigArray<TContext, TEvent extends EventObject> = Array<(TEvent extends EventObject ? TransitionConfig<TContext, TEvent> & {
253
245
  event: TEvent['type'];
@@ -430,6 +422,12 @@ export interface StateNodeConfig<TContext, TStateSchema extends StateSchema, TEv
430
422
  * @default false
431
423
  */
432
424
  preserveActionOrder?: boolean;
425
+ /**
426
+ * Whether XState calls actions with the event directly responsible for the related transition.
427
+ *
428
+ * @default false
429
+ */
430
+ predictableActionArguments?: boolean;
433
431
  /**
434
432
  * A text description of the state node
435
433
  */
@@ -864,6 +862,9 @@ export interface StateConfig<TContext, TEvent extends EventObject> {
864
862
  */
865
863
  activities?: ActivityMap;
866
864
  meta?: any;
865
+ /**
866
+ * @deprecated
867
+ */
867
868
  events?: TEvent[];
868
869
  configuration: Array<StateNode<TContext, any, TEvent>>;
869
870
  transitions: Array<TransitionDefinition<TContext, TEvent>>;
@@ -988,9 +989,7 @@ export interface Subscribable<T> extends InteropSubscribable<T> {
988
989
  subscribe(next: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
989
990
  }
990
991
  export declare type Spawnable = AnyStateMachine | PromiseLike<any> | InvokeCallback | InteropObservable<any> | Subscribable<any> | Behavior<any>;
991
- export declare type ExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends {
992
- type: TEventType;
993
- } ? TEvent : never;
992
+ export declare type ExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends any ? TEventType extends TEvent['type'] ? TEvent : never : never;
994
993
  export interface BaseActorRef<TEvent extends EventObject> {
995
994
  send: (event: TEvent) => void;
996
995
  }
@@ -1001,6 +1000,7 @@ export interface ActorRef<TEvent extends EventObject, TEmitted = any> extends Su
1001
1000
  stop?: () => void;
1002
1001
  toJSON?: () => any;
1003
1002
  }
1003
+ export declare type AnyActorRef = ActorRef<any, any>;
1004
1004
  /**
1005
1005
  * @deprecated Use `ActorRef` instead.
1006
1006
  */
@@ -1027,11 +1027,15 @@ export interface Behavior<TEvent extends EventObject, TEmitted = any> {
1027
1027
  initialState: TEmitted;
1028
1028
  start?: (actorCtx: ActorContext<TEvent, TEmitted>) => TEmitted;
1029
1029
  }
1030
- export declare type EmittedFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends ActorRef<infer _, infer TEmitted> ? TEmitted : R extends Behavior<infer _, infer TEmitted> ? TEmitted : R extends ActorContext<infer _, infer TEmitted> ? TEmitted : never : never;
1030
+ export declare type EmittedFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends Interpreter<infer _, infer __, infer ___, infer ____, infer _____> ? R['initialState'] : R extends ActorRef<infer _, infer TEmitted> ? TEmitted : R extends Behavior<infer _, infer TEmitted> ? TEmitted : R extends ActorContext<infer _, infer TEmitted> ? TEmitted : never : never;
1031
1031
  declare type ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer _, infer __, infer TEvent, infer ___, infer ____, infer _____, infer ______> ? TEvent : R extends Model<infer _, infer TEvent, infer __, infer ___> ? TEvent : R extends State<infer _, infer TEvent, infer __, infer ___, infer ____> ? TEvent : R extends Interpreter<infer _, infer __, infer TEvent, infer ___, infer ____> ? TEvent : R extends ActorRef<infer TEvent, infer _> ? TEvent : never : never;
1032
- export declare type EventFrom<T, K extends Prop<TEvent, 'type'> = never, TEvent = ResolveEventType<T>> = IsNever<K> extends true ? TEvent : Extract<TEvent, {
1033
- type: K;
1034
- }>;
1032
+ export declare type EventFrom<T, K extends Prop<TEvent, 'type'> = never, TEvent extends EventObject = ResolveEventType<T>> = IsNever<K> extends true ? TEvent : ExtractEvent<TEvent, K>;
1035
1033
  export declare type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer _, infer __, infer ___, infer ____, infer _____, infer ______> ? TContext : R extends Model<infer TContext, infer _, infer __, infer ___> ? TContext : R extends State<infer TContext, infer _, infer __, infer ___, infer ____> ? TContext : R extends Interpreter<infer TContext, infer _, infer __, infer ___, infer ____> ? TContext : never : never;
1034
+ declare type Matches<TypegenEnabledArg, TypegenDisabledArg> = {
1035
+ (stateValue: TypegenEnabledArg): any;
1036
+ (stateValue: TypegenDisabledArg): any;
1037
+ };
1038
+ export declare type StateValueFrom<TMachine extends AnyStateMachine> = StateFrom<TMachine>['matches'] extends Matches<infer TypegenEnabledArg, infer TypegenDisabledArg> ? TMachine['__TResolvedTypesMeta'] extends TypegenEnabled ? TypegenEnabledArg : TypegenDisabledArg : never;
1039
+ export declare type PredictableActionArgumentsExec = (action: ActionObject<unknown, EventObject>, context: unknown, _event: SCXML.Event<EventObject>) => void;
1036
1040
  export {};
1037
1041
  //# sourceMappingURL=types.d.ts.map
package/es/utils.d.ts CHANGED
@@ -67,6 +67,6 @@ export declare function normalizeTarget<TContext, TEvent extends EventObject>(ta
67
67
  export declare function reportUnhandledExceptionOnInvocation(originalError: any, currentError: any, id: string): void;
68
68
  export declare function evaluateGuard<TContext, TEvent extends EventObject>(machine: StateNode<TContext, any, TEvent, any, any>, guard: Guard<TContext, TEvent>, context: TContext, _event: SCXML.Event<TEvent>, state: State<TContext, TEvent>): boolean;
69
69
  export declare function toInvokeSource(src: string | InvokeSourceDefinition): InvokeSourceDefinition;
70
- export declare function toObserver<T>(nextHandler: Observer<T> | ((value: T) => void), errorHandler?: (error: any) => void, completionHandler?: () => void): Observer<T>;
70
+ export declare function toObserver<T>(nextHandler?: Partial<Observer<T>> | ((value: T) => void), errorHandler?: (error: any) => void, completionHandler?: () => void): Observer<T>;
71
71
  export declare function createInvokeId(stateNodeId: string, index: number): string;
72
72
  //# sourceMappingURL=utils.d.ts.map
package/es/utils.js CHANGED
@@ -605,18 +605,14 @@ function toInvokeSource(src) {
605
605
  return src;
606
606
  }
607
607
  function toObserver(nextHandler, errorHandler, completionHandler) {
608
- if (typeof nextHandler === 'object') {
609
- return nextHandler;
610
- }
611
-
612
- var noop = function () {
613
- return void 0;
614
- };
608
+ var noop = function () {};
615
609
 
610
+ var isObserver = typeof nextHandler === 'object';
611
+ var self = isObserver ? nextHandler : null;
616
612
  return {
617
- next: nextHandler,
618
- error: errorHandler || noop,
619
- complete: completionHandler || noop
613
+ next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),
614
+ error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),
615
+ complete: ((isObserver ? nextHandler.complete : completionHandler) || noop).bind(self)
620
616
  };
621
617
  }
622
618
  function createInvokeId(stateNodeId, index) {
package/es/waitFor.js CHANGED
@@ -29,7 +29,12 @@ function waitFor(actorRef, predicate, options) {
29
29
 
30
30
  return new Promise(function (res, rej) {
31
31
  var done = false;
32
- var handle = setTimeout(function () {
32
+
33
+ if (process.env.NODE_ENV !== 'production' && resolvedOptions.timeout < 0) {
34
+ console.error('`timeout` passed to `waitFor` is negative and it will reject its internal promise immediately.');
35
+ }
36
+
37
+ var handle = resolvedOptions.timeout === Infinity ? undefined : setTimeout(function () {
33
38
  sub.unsubscribe();
34
39
  rej(new Error("Timeout of ".concat(resolvedOptions.timeout, " ms exceeded")));
35
40
  }, resolvedOptions.timeout);
package/lib/Machine.js CHANGED
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var StateNode = require('./StateNode.js');
6
+ var environment = require('./environment.js');
6
7
 
8
+ var warned = false;
7
9
  function Machine(config, options, initialContext) {
8
10
  if (initialContext === void 0) {
9
11
  initialContext = config.context;
@@ -12,6 +14,11 @@ function Machine(config, options, initialContext) {
12
14
  return new StateNode.StateNode(config, options, initialContext);
13
15
  }
14
16
  function createMachine(config, options) {
17
+ if (!environment.IS_PRODUCTION && !config.predictableActionArguments && !warned) {
18
+ warned = true;
19
+ console.warn('It is highly recommended to set `predictableActionArguments` to `true` when using `createMachine`. https://xstate.js.org/docs/guides/actions.html');
20
+ }
21
+
15
22
  return new StateNode.StateNode(config, options);
16
23
  }
17
24
 
package/lib/State.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { StateValue, ActivityMap, EventObject, HistoryValue, ActionObject, EventType, StateConfig, SCXML, StateSchema, TransitionDefinition, Typestate, ActorRef, StateMachine, SimpleEventsOf } from './types';
1
+ import { StateValue, ActivityMap, EventObject, HistoryValue, ActionObject, StateConfig, SCXML, StateSchema, TransitionDefinition, Typestate, ActorRef, StateMachine, SimpleEventsOf } from './types';
2
2
  import { StateNode } from './StateNode';
3
3
  import { TypegenDisabled, TypegenEnabled } from './typegenTypes';
4
4
  import { BaseActionObject, Prop } from './types';
@@ -44,7 +44,7 @@ export declare class State<TContext, TEvent extends EventObject = EventObject, T
44
44
  /**
45
45
  * The next events that will cause a transition from the current state.
46
46
  */
47
- nextEvents: EventType[];
47
+ nextEvents: Array<TEvent['type']>;
48
48
  /**
49
49
  * The transition definitions that resulted in this state.
50
50
  */
@@ -91,7 +91,7 @@ export declare class State<TContext, TEvent extends EventObject = EventObject, T
91
91
  * @param delimiter The character(s) that separate each subpath in the string state node path.
92
92
  */
93
93
  toStrings(stateValue?: StateValue, delimiter?: string): string[];
94
- toJSON(): Omit<this, "machine" | "tags" | "transitions" | "configuration"> & {
94
+ toJSON(): Omit<this, "machine" | "configuration" | "transitions" | "tags"> & {
95
95
  tags: string[];
96
96
  };
97
97
  /**
@@ -1,4 +1,4 @@
1
- import { Event, StateValue, StateTransition, MachineOptions, EventObject, HistoryValue, StateNodeDefinition, TransitionDefinition, DelayedTransitionDefinition, ActivityDefinition, StateNodeConfig, StateSchema, StateNodesConfig, InvokeDefinition, ActionObject, Mapper, PropertyMapper, SCXML, Typestate, TransitionDefinitionMap, MachineSchema, InternalMachineOptions, ServiceMap, StateConfig } from './types';
1
+ import { Event, StateValue, StateTransition, MachineOptions, EventObject, HistoryValue, StateNodeDefinition, TransitionDefinition, DelayedTransitionDefinition, ActivityDefinition, StateNodeConfig, StateSchema, StateNodesConfig, InvokeDefinition, ActionObject, Mapper, PropertyMapper, SCXML, Typestate, TransitionDefinitionMap, MachineSchema, InternalMachineOptions, ServiceMap, StateConfig, PredictableActionArgumentsExec } from './types';
2
2
  import { State } from './State';
3
3
  import { TypegenDisabled } from './typegenTypes';
4
4
  declare class StateNode<TContext = any, TStateSchema extends StateSchema = any, TEvent extends EventObject = EventObject, TTypestate extends Typestate<TContext> = {
@@ -189,12 +189,7 @@ declare class StateNode<TContext = any, TStateSchema extends StateSchema = any,
189
189
  private _transition;
190
190
  getTransitionData(state: State<TContext, TEvent, any, any, any>, event: Event<TEvent> | SCXML.Event<TEvent>): StateTransition<TContext, TEvent> | undefined;
191
191
  private next;
192
- private nodesFromChild;
193
- /**
194
- * Whether the given state node "escapes" this state node. If the `stateNode` is equal to or the parent of
195
- * this state node, it does not escape.
196
- */
197
- private escapes;
192
+ private getExternalReentryNodes;
198
193
  private getActions;
199
194
  /**
200
195
  * Determines the next state given the current `state` and sent `event`.
@@ -203,7 +198,7 @@ declare class StateNode<TContext = any, TStateSchema extends StateSchema = any,
203
198
  * @param event The event that was sent at the current state
204
199
  * @param context The current context (extended state) of the current state
205
200
  */
206
- transition(state: StateValue | State<TContext, TEvent, any, TTypestate, TResolvedTypesMeta> | undefined, event: Event<TEvent> | SCXML.Event<TEvent>, context?: TContext): State<TContext, TEvent, TStateSchema, TTypestate, TResolvedTypesMeta>;
201
+ transition(state: StateValue | State<TContext, TEvent, any, TTypestate, TResolvedTypesMeta> | undefined, event: Event<TEvent> | SCXML.Event<TEvent>, context?: TContext, exec?: PredictableActionArgumentsExec): State<TContext, TEvent, TStateSchema, TTypestate, TResolvedTypesMeta>;
207
202
  private resolveRaisedTransition;
208
203
  private resolveTransition;
209
204
  /**
package/lib/StateNode.js CHANGED
@@ -120,7 +120,7 @@ function () {
120
120
  stateNode.order = order++;
121
121
 
122
122
  try {
123
- for (var _b = _tslib.__values(stateUtils.getChildren(stateNode)), _c = _b.next(); !_c.done; _c = _b.next()) {
123
+ for (var _b = _tslib.__values(stateUtils.getAllChildren(stateNode)), _c = _b.next(); !_c.done; _c = _b.next()) {
124
124
  var child = _c.value;
125
125
  dfs(child);
126
126
  }
@@ -631,9 +631,14 @@ function () {
631
631
  return _this.getRelativeStateNodes(stateNode, state.historyValue);
632
632
  }));
633
633
  var isInternal = !!selectedTransition.internal;
634
- var reentryNodes = isInternal ? [] : utils.flatten(allNextStateNodes.map(function (n) {
635
- return _this.nodesFromChild(n);
636
- }));
634
+ var reentryNodes = [];
635
+
636
+ if (!isInternal) {
637
+ nextStateNodes.forEach(function (targetNode) {
638
+ reentryNodes.push.apply(reentryNodes, _tslib.__spreadArray([], _tslib.__read(_this.getExternalReentryNodes(targetNode)), false));
639
+ });
640
+ }
641
+
637
642
  return {
638
643
  transitions: [selectedTransition],
639
644
  entrySet: reentryNodes,
@@ -644,58 +649,38 @@ function () {
644
649
  };
645
650
  };
646
651
 
647
- StateNode.prototype.nodesFromChild = function (childStateNode) {
648
- if (childStateNode.escapes(this)) {
649
- return [];
650
- }
651
-
652
+ StateNode.prototype.getExternalReentryNodes = function (targetNode) {
652
653
  var nodes = [];
653
- var marker = childStateNode;
654
654
 
655
- while (marker && marker !== this) {
655
+ var _a = _tslib.__read(targetNode.order > this.order ? [targetNode, this] : [this, targetNode], 2),
656
+ marker = _a[0],
657
+ possibleAncestor = _a[1];
658
+
659
+ while (marker && marker !== possibleAncestor) {
656
660
  nodes.push(marker);
657
661
  marker = marker.parent;
658
662
  }
659
663
 
660
- nodes.push(this); // inclusive
661
-
662
- return nodes;
663
- };
664
- /**
665
- * Whether the given state node "escapes" this state node. If the `stateNode` is equal to or the parent of
666
- * this state node, it does not escape.
667
- */
668
-
669
-
670
- StateNode.prototype.escapes = function (stateNode) {
671
- if (this === stateNode) {
672
- return false;
673
- }
674
-
675
- var parent = this.parent;
676
-
677
- while (parent) {
678
- if (parent === stateNode) {
679
- return false;
680
- }
681
-
682
- parent = parent.parent;
664
+ if (marker !== possibleAncestor) {
665
+ // we never got to `possibleAncestor`, therefore the initial `marker` "escapes" it
666
+ // it's in a different part of the tree so no states will be reentered for such an external transition
667
+ return [];
683
668
  }
684
669
 
685
- return true;
670
+ nodes.push(possibleAncestor);
671
+ return nodes;
686
672
  };
687
673
 
688
- StateNode.prototype.getActions = function (transition, currentContext, _event, prevState) {
674
+ StateNode.prototype.getActions = function (resolvedConfig, isDone, transition, currentContext, _event, prevState) {
689
675
  var e_4, _a, e_5, _b;
690
676
 
691
677
  var prevConfig = stateUtils.getConfiguration([], prevState ? this.getStateNodes(prevState.value) : [this]);
692
- var resolvedConfig = transition.configuration.length ? stateUtils.getConfiguration(prevConfig, transition.configuration) : prevConfig;
693
678
 
694
679
  try {
695
680
  for (var resolvedConfig_1 = _tslib.__values(resolvedConfig), resolvedConfig_1_1 = resolvedConfig_1.next(); !resolvedConfig_1_1.done; resolvedConfig_1_1 = resolvedConfig_1.next()) {
696
681
  var sn = resolvedConfig_1_1.value;
697
682
 
698
- if (!stateUtils.has(prevConfig, sn)) {
683
+ if (!stateUtils.has(prevConfig, sn) || stateUtils.has(transition.entrySet, sn.parent)) {
699
684
  transition.entrySet.push(sn);
700
685
  }
701
686
  }
@@ -780,6 +765,18 @@ function () {
780
765
  exitActions = _c[1];
781
766
 
782
767
  var actions$1 = actions.toActionObjects(exitActions.concat(transition.actions).concat(entryActions), this.machine.options.actions);
768
+
769
+ if (isDone) {
770
+ var stopActions = actions.toActionObjects(utils.flatten(_tslib.__spreadArray([], _tslib.__read(resolvedConfig), false).sort(function (a, b) {
771
+ return b.order - a.order;
772
+ }).map(function (stateNode) {
773
+ return stateNode.onExit;
774
+ })), this.machine.options.actions).filter(function (action) {
775
+ return action.type !== actionTypes.raise && (action.type !== actionTypes.send || !!action.to && action.to !== types.SpecialTargets.Internal);
776
+ });
777
+ return actions$1.concat(stopActions);
778
+ }
779
+
783
780
  return actions$1;
784
781
  };
785
782
  /**
@@ -791,7 +788,7 @@ function () {
791
788
  */
792
789
 
793
790
 
794
- StateNode.prototype.transition = function (state, event, context) {
791
+ StateNode.prototype.transition = function (state, event, context, exec) {
795
792
  if (state === void 0) {
796
793
  state = this.initialState;
797
794
  }
@@ -829,14 +826,14 @@ function () {
829
826
  var prevConfig = stateUtils.getConfiguration([], this.getStateNodes(currentState.value));
830
827
  var resolvedConfig = stateTransition.configuration.length ? stateUtils.getConfiguration(prevConfig, stateTransition.configuration) : prevConfig;
831
828
  stateTransition.configuration = _tslib.__spreadArray([], _tslib.__read(resolvedConfig), false);
832
- return this.resolveTransition(stateTransition, currentState, currentState.context, _event);
829
+ return this.resolveTransition(stateTransition, currentState, currentState.context, exec, _event);
833
830
  };
834
831
 
835
- StateNode.prototype.resolveRaisedTransition = function (state, _event, originalEvent) {
832
+ StateNode.prototype.resolveRaisedTransition = function (state, _event, originalEvent, predictableExec) {
836
833
  var _a;
837
834
 
838
835
  var currentActions = state.actions;
839
- state = this.transition(state, _event); // Save original event to state
836
+ state = this.transition(state, _event, undefined, predictableExec); // Save original event to state
840
837
  // TODO: this should be the raised event! Delete in V5 (breaking)
841
838
 
842
839
  state._event = originalEvent;
@@ -847,7 +844,7 @@ function () {
847
844
  return state;
848
845
  };
849
846
 
850
- StateNode.prototype.resolveTransition = function (stateTransition, currentState, context, _event) {
847
+ StateNode.prototype.resolveTransition = function (stateTransition, currentState, context, predictableExec, _event) {
851
848
  var e_6, _a;
852
849
 
853
850
  var _this = this;
@@ -861,9 +858,11 @@ function () {
861
858
  // - OR there are transitions
862
859
 
863
860
  var willTransition = !currentState || stateTransition.transitions.length > 0;
861
+ var resolvedConfiguration = willTransition ? stateTransition.configuration : currentState ? currentState.configuration : [];
862
+ var isDone = stateUtils.isInFinalState(resolvedConfiguration, this);
864
863
  var resolvedStateValue = willTransition ? stateUtils.getValue(this.machine, configuration) : undefined;
865
864
  var historyValue = currentState ? currentState.historyValue ? currentState.historyValue : stateTransition.source ? this.machine.historyValue(currentState.value) : undefined : undefined;
866
- var actions$1 = this.getActions(stateTransition, context, _event, currentState);
865
+ var actions$1 = this.getActions(new Set(resolvedConfiguration), isDone, stateTransition, context, _event, currentState);
867
866
  var activities = currentState ? _tslib.__assign({}, currentState.activities) : {};
868
867
 
869
868
  try {
@@ -888,7 +887,7 @@ function () {
888
887
  }
889
888
  }
890
889
 
891
- var _b = _tslib.__read(actions.resolveActions(this, currentState, context, _event, actions$1, this.machine.config.preserveActionOrder), 2),
890
+ var _b = _tslib.__read(actions.resolveActions(this, currentState, context, _event, actions$1, predictableExec, this.machine.config.predictableActionArguments || this.machine.config.preserveActionOrder), 2),
892
891
  resolvedActions = _b[0],
893
892
  updatedContext = _b[1];
894
893
 
@@ -907,8 +906,6 @@ function () {
907
906
  acc[action.activity.id] = Actor.createInvocableActor(action.activity, _this.machine, updatedContext, _event);
908
907
  return acc;
909
908
  }, currentState ? _tslib.__assign({}, currentState.children) : {});
910
- var resolvedConfiguration = willTransition ? stateTransition.configuration : currentState ? currentState.configuration : [];
911
- var isDone = stateUtils.isInFinalState(resolvedConfiguration, this);
912
909
  var nextState = new State.State({
913
910
  value: resolvedStateValue || currentState.value,
914
911
  context: updatedContext,
@@ -938,34 +935,33 @@ function () {
938
935
  // and if some of the state nodes have transient ("always") transitions.
939
936
 
940
937
 
941
- var isTransient = !isDone && (this._transient || configuration.some(function (stateNode) {
938
+ var hasAlwaysTransitions = !isDone && (this._transient || configuration.some(function (stateNode) {
942
939
  return stateNode._transient;
943
940
  })); // If there are no enabled transitions, check if there are transient transitions.
944
941
  // If there are transient transitions, continue checking for more transitions
945
942
  // because an transient transition should be triggered even if there are no
946
943
  // enabled transitions.
947
944
  //
948
- // If we're already working on an transient transition (by checking
949
- // if the event is a NULL_EVENT), then stop to prevent an infinite loop.
945
+ // If we're already working on an transient transition then stop to prevent an infinite loop.
950
946
  //
951
947
  // Otherwise, if there are no enabled nor transient transitions, we are done.
952
948
 
953
- if (!willTransition && (!isTransient || _event.name === NULL_EVENT)) {
949
+ if (!willTransition && (!hasAlwaysTransitions || _event.name === NULL_EVENT)) {
954
950
  return nextState;
955
951
  }
956
952
 
957
953
  var maybeNextState = nextState;
958
954
 
959
955
  if (!isDone) {
960
- if (isTransient) {
956
+ if (hasAlwaysTransitions) {
961
957
  maybeNextState = this.resolveRaisedTransition(maybeNextState, {
962
958
  type: actionTypes.nullEvent
963
- }, _event);
959
+ }, _event, predictableExec);
964
960
  }
965
961
 
966
962
  while (raisedEvents.length) {
967
963
  var raisedEvent = raisedEvents.shift();
968
- maybeNextState = this.resolveRaisedTransition(maybeNextState, raisedEvent._event, _event);
964
+ maybeNextState = this.resolveRaisedTransition(maybeNextState, raisedEvent._event, _event, predictableExec);
969
965
  }
970
966
  } // Detect if state changed
971
967
 
@@ -1152,7 +1148,7 @@ function () {
1152
1148
  var configuration = this.getStateNodes(stateValue);
1153
1149
  return this.resolveTransition({
1154
1150
  configuration: configuration,
1155
- entrySet: configuration,
1151
+ entrySet: _tslib.__spreadArray([], _tslib.__read(configuration), false),
1156
1152
  exitSet: [],
1157
1153
  transitions: [],
1158
1154
  source: undefined,
package/lib/actions.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Action, Event, EventObject, SingleOrArray, SendAction, SendActionOptions, CancelAction, ActionObject, ActionType, Assigner, PropertyAssigner, AssignAction, ActionFunction, ActionFunctionMap, ActivityActionObject, ActionTypes, ActivityDefinition, RaiseAction, RaiseActionObject, DoneEvent, ErrorPlatformEvent, DoneEventObject, SendExpr, SendActionObject, PureAction, LogExpr, LogAction, LogActionObject, DelayFunctionMap, SCXML, ExprWithMeta, ChooseCondition, ChooseAction, AnyEventObject, Expr, StopAction, StopActionObject, Cast, ActorRef, EventFrom } from './types';
1
+ import { Action, Event, EventObject, SingleOrArray, SendAction, SendActionOptions, CancelAction, ActionObject, ActionType, Assigner, PropertyAssigner, AssignAction, ActionFunction, ActionFunctionMap, ActivityActionObject, ActionTypes, ActivityDefinition, RaiseAction, RaiseActionObject, DoneEvent, ErrorPlatformEvent, DoneEventObject, SendExpr, SendActionObject, PureAction, LogExpr, LogAction, LogActionObject, DelayFunctionMap, SCXML, ExprWithMeta, ChooseCondition, ChooseAction, AnyEventObject, Expr, StopAction, StopActionObject, Cast, EventFrom, AnyActorRef, PredictableActionArgumentsExec } from './types';
2
2
  import * as actionTypes from './actionTypes';
3
3
  import { State } from './State';
4
4
  import { StateNode } from './StateNode';
@@ -52,7 +52,7 @@ declare type InferEvent<E extends EventObject> = {
52
52
  * @param options Send action options
53
53
  * @returns An XState send action object
54
54
  */
55
- export declare function sendTo<TContext, TEvent extends EventObject, TActor extends ActorRef<EventObject>>(actor: (ctx: TContext) => TActor, event: EventFrom<TActor> | SendExpr<TContext, TEvent, InferEvent<Cast<EventFrom<TActor>, EventObject>>>, options?: SendActionOptions<TContext, TEvent>): SendAction<TContext, TEvent, any>;
55
+ export declare function sendTo<TContext, TEvent extends EventObject, TActor extends AnyActorRef>(actor: (ctx: TContext) => TActor, event: EventFrom<TActor> | SendExpr<TContext, TEvent, InferEvent<Cast<EventFrom<TActor>, EventObject>>>, options?: SendActionOptions<TContext, TEvent>): SendAction<TContext, TEvent, any>;
56
56
  /**
57
57
  * Sends an update event to this machine's parent.
58
58
  */
@@ -150,5 +150,5 @@ export declare function forwardTo<TContext, TEvent extends EventObject>(target:
150
150
  */
151
151
  export declare function escalate<TContext, TEvent extends EventObject, TErrorData = any>(errorData: TErrorData | ExprWithMeta<TContext, TEvent, TErrorData>, options?: SendActionOptions<TContext, TEvent>): SendAction<TContext, TEvent, AnyEventObject>;
152
152
  export declare function choose<TContext, TEvent extends EventObject>(conds: Array<ChooseCondition<TContext, TEvent>>): ChooseAction<TContext, TEvent>;
153
- export declare function resolveActions<TContext, TEvent extends EventObject>(machine: StateNode<TContext, any, TEvent, any, any, any>, currentState: State<TContext, TEvent> | undefined, currentContext: TContext, _event: SCXML.Event<TEvent>, actions: Array<ActionObject<TContext, TEvent>>, preserveActionOrder?: boolean): [Array<ActionObject<TContext, TEvent>>, TContext];
153
+ export declare function resolveActions<TContext, TEvent extends EventObject>(machine: StateNode<TContext, any, TEvent, any, any, any>, currentState: State<TContext, TEvent, any, any, any> | undefined, currentContext: TContext, _event: SCXML.Event<TEvent>, actions: Array<ActionObject<TContext, TEvent>>, predictableExec?: PredictableActionArgumentsExec, preserveActionOrder?: boolean): [Array<ActionObject<TContext, TEvent>>, TContext];
154
154
  //# sourceMappingURL=actions.d.ts.map