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.
- package/dist/xstate.interpreter.js +1 -1
- package/dist/xstate.js +1 -1
- package/dist/xstate.web.js +2 -2
- package/es/Machine.js +7 -0
- package/es/State.d.ts +3 -3
- package/es/StateNode.d.ts +3 -8
- package/es/StateNode.js +53 -57
- package/es/actions.d.ts +3 -3
- package/es/actions.js +43 -9
- package/es/interpreter.d.ts +4 -1
- package/es/interpreter.js +303 -253
- package/es/model.types.d.ts +6 -2
- package/es/stateUtils.d.ts +1 -0
- package/es/stateUtils.js +6 -3
- package/es/typegenTypes.d.ts +13 -10
- package/es/types.d.ts +22 -18
- package/es/utils.d.ts +1 -1
- package/es/utils.js +6 -10
- package/es/waitFor.js +6 -1
- package/lib/Machine.js +7 -0
- package/lib/State.d.ts +3 -3
- package/lib/StateNode.d.ts +3 -8
- package/lib/StateNode.js +51 -55
- package/lib/actions.d.ts +3 -3
- package/lib/actions.js +43 -9
- package/lib/interpreter.d.ts +4 -1
- package/lib/interpreter.js +298 -248
- package/lib/model.types.d.ts +6 -2
- package/lib/stateUtils.d.ts +1 -0
- package/lib/stateUtils.js +6 -2
- package/lib/typegenTypes.d.ts +13 -10
- package/lib/types.d.ts +22 -18
- package/lib/utils.d.ts +1 -1
- package/lib/utils.js +6 -10
- package/lib/waitFor.js +6 -1
- package/package.json +1 -1
- package/CHANGELOG.md +0 -1460
package/es/model.types.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { AnyFunction, AssignAction, Assigner, BaseActionObject, Compute, EventObject,
|
|
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,
|
|
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
|
package/es/stateUtils.d.ts
CHANGED
|
@@ -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
|
|
7
|
+
function getAllChildren(stateNode) {
|
|
8
8
|
return Object.keys(stateNode.states).map(function (key) {
|
|
9
9
|
return stateNode.states[key];
|
|
10
|
-
})
|
|
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 };
|
package/es/typegenTypes.d.ts
CHANGED
|
@@ -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:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
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']]:
|
|
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
|
|
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 :
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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:
|
|
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" | "
|
|
94
|
+
toJSON(): Omit<this, "machine" | "configuration" | "transitions" | "tags"> & {
|
|
95
95
|
tags: string[];
|
|
96
96
|
};
|
|
97
97
|
/**
|
package/lib/StateNode.d.ts
CHANGED
|
@@ -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
|
|
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.
|
|
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 =
|
|
635
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
661
|
-
|
|
662
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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 && (!
|
|
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 (
|
|
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,
|
|
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
|
|
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
|