xstate 4.19.2 → 4.22.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/CHANGELOG.md +188 -0
- package/dist/xstate.interpreter.js +1 -1
- package/dist/xstate.js +1 -1
- package/dist/xstate.web.js +2 -2
- package/es/Actor.d.ts +6 -5
- package/es/Actor.js +23 -3
- package/es/Machine.d.ts +7 -2
- package/es/Machine.js +2 -4
- package/es/State.js +2 -2
- package/es/StateNode.d.ts +5 -4
- package/es/StateNode.js +31 -26
- package/es/behaviors.d.ts +37 -0
- package/es/behaviors.js +63 -0
- package/es/interpreter.d.ts +8 -7
- package/es/interpreter.js +40 -16
- package/es/model.d.ts +2 -1
- package/es/stateUtils.d.ts +1 -0
- package/es/stateUtils.js +15 -1
- package/es/types.d.ts +28 -7
- package/es/utils.d.ts +3 -2
- package/es/utils.js +5 -1
- package/lib/Actor.d.ts +6 -5
- package/lib/Actor.js +18 -3
- package/lib/Machine.d.ts +7 -2
- package/lib/Machine.js +2 -8
- package/lib/State.js +1 -1
- package/lib/StateNode.d.ts +5 -4
- package/lib/StateNode.js +29 -22
- package/lib/behaviors.d.ts +37 -0
- package/lib/behaviors.js +110 -0
- package/lib/interpreter.d.ts +8 -7
- package/lib/interpreter.js +28 -19
- package/lib/model.d.ts +2 -1
- package/lib/model.js +5 -1
- package/lib/stateUtils.d.ts +1 -0
- package/lib/stateUtils.js +11 -1
- package/lib/types.d.ts +28 -7
- package/lib/utils.d.ts +3 -2
- package/lib/utils.js +8 -1
- package/package.json +2 -2
package/lib/behaviors.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.spawnBehavior = exports.fromPromise = exports.fromReducer = void 0;
|
|
4
|
+
var actions_1 = require("./actions");
|
|
5
|
+
var Actor_1 = require("./Actor");
|
|
6
|
+
var utils_1 = require("./utils");
|
|
7
|
+
/**
|
|
8
|
+
* Returns an actor behavior from a reducer and its initial state.
|
|
9
|
+
*
|
|
10
|
+
* @param transition The pure reducer that returns the next state given the current state and event.
|
|
11
|
+
* @param initialState The initial state of the reducer.
|
|
12
|
+
* @returns An actor behavior
|
|
13
|
+
*/
|
|
14
|
+
function fromReducer(transition, initialState) {
|
|
15
|
+
return {
|
|
16
|
+
transition: transition,
|
|
17
|
+
initialState: initialState
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
exports.fromReducer = fromReducer;
|
|
21
|
+
function fromPromise(promiseFn) {
|
|
22
|
+
var initialState = {
|
|
23
|
+
error: undefined,
|
|
24
|
+
data: undefined,
|
|
25
|
+
status: 'pending'
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
transition: function (state, event, _a) {
|
|
29
|
+
var parent = _a.parent, id = _a.id, observers = _a.observers;
|
|
30
|
+
switch (event.type) {
|
|
31
|
+
case 'fulfill':
|
|
32
|
+
parent === null || parent === void 0 ? void 0 : parent.send(actions_1.doneInvoke(id, event.data));
|
|
33
|
+
return {
|
|
34
|
+
error: undefined,
|
|
35
|
+
data: event.data,
|
|
36
|
+
status: 'fulfilled'
|
|
37
|
+
};
|
|
38
|
+
case 'reject':
|
|
39
|
+
parent === null || parent === void 0 ? void 0 : parent.send(actions_1.error(id, event.error));
|
|
40
|
+
observers.forEach(function (observer) {
|
|
41
|
+
observer.error(event.error);
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
error: event.error,
|
|
45
|
+
data: undefined,
|
|
46
|
+
status: 'rejected'
|
|
47
|
+
};
|
|
48
|
+
default:
|
|
49
|
+
return state;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
initialState: initialState,
|
|
53
|
+
start: function (_a) {
|
|
54
|
+
var self = _a.self;
|
|
55
|
+
promiseFn().then(function (data) {
|
|
56
|
+
self.send({ type: 'fulfill', data: data });
|
|
57
|
+
}, function (reason) {
|
|
58
|
+
self.send({ type: 'reject', error: reason });
|
|
59
|
+
});
|
|
60
|
+
return initialState;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
exports.fromPromise = fromPromise;
|
|
65
|
+
function spawnBehavior(behavior, options) {
|
|
66
|
+
if (options === void 0) { options = {}; }
|
|
67
|
+
var state = behavior.initialState;
|
|
68
|
+
var observers = new Set();
|
|
69
|
+
var mailbox = [];
|
|
70
|
+
var flushing = false;
|
|
71
|
+
var flush = function () {
|
|
72
|
+
if (flushing) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
flushing = true;
|
|
76
|
+
while (mailbox.length > 0) {
|
|
77
|
+
var event_1 = mailbox.shift();
|
|
78
|
+
state = behavior.transition(state, event_1, actorCtx);
|
|
79
|
+
observers.forEach(function (observer) { return observer.next(state); });
|
|
80
|
+
}
|
|
81
|
+
flushing = false;
|
|
82
|
+
};
|
|
83
|
+
var actor = Actor_1.toActorRef({
|
|
84
|
+
id: options.id,
|
|
85
|
+
send: function (event) {
|
|
86
|
+
mailbox.push(event);
|
|
87
|
+
flush();
|
|
88
|
+
},
|
|
89
|
+
getSnapshot: function () { return state; },
|
|
90
|
+
subscribe: function (next, handleError, complete) {
|
|
91
|
+
var observer = utils_1.toObserver(next, handleError, complete);
|
|
92
|
+
observers.add(observer);
|
|
93
|
+
observer.next(state);
|
|
94
|
+
return {
|
|
95
|
+
unsubscribe: function () {
|
|
96
|
+
observers.delete(observer);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
var actorCtx = {
|
|
102
|
+
parent: options.parent,
|
|
103
|
+
self: actor,
|
|
104
|
+
id: options.id || 'anonymous',
|
|
105
|
+
observers: observers
|
|
106
|
+
};
|
|
107
|
+
state = behavior.start ? behavior.start(actorCtx) : state;
|
|
108
|
+
return actor;
|
|
109
|
+
}
|
|
110
|
+
exports.spawnBehavior = spawnBehavior;
|
package/lib/interpreter.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { StateMachine, Event, EventObject, DefaultContext, StateSchema, StateValue, InterpreterOptions, SingleOrArray, DoneEvent, MachineOptions, SCXML, EventData, Observer, Spawnable, Typestate } from './types';
|
|
1
|
+
import { StateMachine, Event, EventObject, DefaultContext, StateSchema, StateValue, InterpreterOptions, SingleOrArray, DoneEvent, MachineOptions, SCXML, EventData, Observer, Spawnable, Typestate, ActorRef, ActorRefFrom, Behavior, Subscription } from './types';
|
|
2
2
|
import { State } from './State';
|
|
3
|
-
import { ActorRefFrom, SpawnedActorRef, Subscription } from '.';
|
|
4
3
|
export declare type StateListener<TContext, TEvent extends EventObject, TStateSchema extends StateSchema<TContext> = any, TTypestate extends Typestate<TContext> = {
|
|
5
4
|
value: any;
|
|
6
5
|
context: TContext;
|
|
@@ -25,7 +24,7 @@ export declare enum InterpreterStatus {
|
|
|
25
24
|
export declare class Interpreter<TContext, TStateSchema extends StateSchema = any, TEvent extends EventObject = EventObject, TTypestate extends Typestate<TContext> = {
|
|
26
25
|
value: any;
|
|
27
26
|
context: TContext;
|
|
28
|
-
}> implements
|
|
27
|
+
}> implements ActorRef<TEvent, State<TContext, TEvent, TStateSchema, TTypestate>> {
|
|
29
28
|
machine: StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
|
|
30
29
|
/**
|
|
31
30
|
* The default interpreter options:
|
|
@@ -64,7 +63,7 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
|
|
|
64
63
|
* The globally unique process ID for this invocation.
|
|
65
64
|
*/
|
|
66
65
|
sessionId: string;
|
|
67
|
-
children: Map<string | number,
|
|
66
|
+
children: Map<string | number, ActorRef<any>>;
|
|
68
67
|
private forwardTo;
|
|
69
68
|
private devTools?;
|
|
70
69
|
/**
|
|
@@ -165,12 +164,13 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
|
|
|
165
164
|
private exec;
|
|
166
165
|
private removeChild;
|
|
167
166
|
private stopChild;
|
|
168
|
-
spawn(entity: Spawnable, name: string, options?: SpawnOptions):
|
|
167
|
+
spawn(entity: Spawnable, name: string, options?: SpawnOptions): ActorRef<any>;
|
|
169
168
|
spawnMachine<TChildContext, TChildStateSchema, TChildEvent extends EventObject>(machine: StateMachine<TChildContext, TChildStateSchema, TChildEvent>, options?: {
|
|
170
169
|
id?: string;
|
|
171
170
|
autoForward?: boolean;
|
|
172
171
|
sync?: boolean;
|
|
173
|
-
}):
|
|
172
|
+
}): ActorRef<TChildEvent, State<TChildContext, TChildEvent>>;
|
|
173
|
+
private spawnBehavior;
|
|
174
174
|
private spawnPromise;
|
|
175
175
|
private spawnCallback;
|
|
176
176
|
private spawnObservable;
|
|
@@ -183,8 +183,9 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
|
|
|
183
183
|
};
|
|
184
184
|
getSnapshot(): State<TContext, TEvent, TStateSchema, TTypestate>;
|
|
185
185
|
}
|
|
186
|
+
export declare function spawn<T extends Behavior<any, any>>(entity: T, nameOrOptions?: string | SpawnOptions): ActorRefFrom<T>;
|
|
186
187
|
export declare function spawn<TC, TE extends EventObject>(entity: StateMachine<TC, any, TE>, nameOrOptions?: string | SpawnOptions): ActorRefFrom<StateMachine<TC, any, TE>>;
|
|
187
|
-
export declare function spawn(entity: Spawnable, nameOrOptions?: string | SpawnOptions):
|
|
188
|
+
export declare function spawn(entity: Spawnable, nameOrOptions?: string | SpawnOptions): ActorRef<any>;
|
|
188
189
|
/**
|
|
189
190
|
* Creates a new Interpreter instance for the given machine with the provided options, if any.
|
|
190
191
|
*
|
package/lib/interpreter.js
CHANGED
|
@@ -56,6 +56,7 @@ var stateUtils_1 = require("./stateUtils");
|
|
|
56
56
|
var registry_1 = require("./registry");
|
|
57
57
|
var devTools_1 = require("./devTools");
|
|
58
58
|
var serviceScope = require("./serviceScope");
|
|
59
|
+
var behaviors_1 = require("./behaviors");
|
|
59
60
|
var DEFAULT_SPAWN_OPTIONS = { sync: false, autoForward: false };
|
|
60
61
|
var InterpreterStatus;
|
|
61
62
|
(function (InterpreterStatus) {
|
|
@@ -725,31 +726,28 @@ var Interpreter = /** @class */ (function () {
|
|
|
725
726
|
var resolvedData = data
|
|
726
727
|
? utils_1.mapContext(data, context, _event)
|
|
727
728
|
: undefined;
|
|
729
|
+
if (typeof serviceCreator === 'string') {
|
|
730
|
+
// TODO: warn
|
|
731
|
+
return;
|
|
732
|
+
}
|
|
728
733
|
var source = utils_1.isFunction(serviceCreator)
|
|
729
734
|
? serviceCreator(context, _event.data, {
|
|
730
735
|
data: resolvedData,
|
|
731
736
|
src: invokeSource
|
|
732
737
|
})
|
|
733
738
|
: serviceCreator;
|
|
734
|
-
if (
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
else if (utils_1.isFunction(source)) {
|
|
738
|
-
this.spawnCallback(source, id);
|
|
739
|
-
}
|
|
740
|
-
else if (utils_1.isObservable(source)) {
|
|
741
|
-
this.spawnObservable(source, id);
|
|
739
|
+
if (!source) {
|
|
740
|
+
// TODO: warn?
|
|
741
|
+
return;
|
|
742
742
|
}
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
743
|
+
var options = void 0;
|
|
744
|
+
if (utils_1.isMachine(source)) {
|
|
745
|
+
source = resolvedData ? source.withContext(resolvedData) : source;
|
|
746
|
+
options = {
|
|
747
747
|
autoForward: autoForward
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
else {
|
|
751
|
-
// service is string
|
|
748
|
+
};
|
|
752
749
|
}
|
|
750
|
+
this.spawn(source, id, options);
|
|
753
751
|
}
|
|
754
752
|
else {
|
|
755
753
|
this.spawnActivity(activity);
|
|
@@ -808,6 +806,9 @@ var Interpreter = /** @class */ (function () {
|
|
|
808
806
|
else if (utils_1.isMachine(entity)) {
|
|
809
807
|
return this.spawnMachine(entity, __assign(__assign({}, options), { id: name }));
|
|
810
808
|
}
|
|
809
|
+
else if (utils_1.isBehavior(entity)) {
|
|
810
|
+
return this.spawnBehavior(entity, name);
|
|
811
|
+
}
|
|
811
812
|
else {
|
|
812
813
|
throw new Error("Unable to spawn entity \"" + name + "\" of type \"" + typeof entity + "\".");
|
|
813
814
|
}
|
|
@@ -838,10 +839,15 @@ var Interpreter = /** @class */ (function () {
|
|
|
838
839
|
.start();
|
|
839
840
|
return actor;
|
|
840
841
|
};
|
|
842
|
+
Interpreter.prototype.spawnBehavior = function (behavior, id) {
|
|
843
|
+
var actorRef = behaviors_1.spawnBehavior(behavior, { id: id, parent: this });
|
|
844
|
+
this.children.set(id, actorRef);
|
|
845
|
+
return actorRef;
|
|
846
|
+
};
|
|
841
847
|
Interpreter.prototype.spawnPromise = function (promise, id) {
|
|
842
848
|
var _this = this;
|
|
843
849
|
var canceled = false;
|
|
844
|
-
var resolvedData
|
|
850
|
+
var resolvedData;
|
|
845
851
|
promise.then(function (response) {
|
|
846
852
|
if (!canceled) {
|
|
847
853
|
resolvedData = response;
|
|
@@ -912,7 +918,7 @@ var Interpreter = /** @class */ (function () {
|
|
|
912
918
|
var canceled = false;
|
|
913
919
|
var receivers = new Set();
|
|
914
920
|
var listeners = new Set();
|
|
915
|
-
var emitted
|
|
921
|
+
var emitted;
|
|
916
922
|
var receive = function (e) {
|
|
917
923
|
emitted = e;
|
|
918
924
|
listeners.forEach(function (listener) { return listener(e); });
|
|
@@ -962,7 +968,7 @@ var Interpreter = /** @class */ (function () {
|
|
|
962
968
|
};
|
|
963
969
|
Interpreter.prototype.spawnObservable = function (source, id) {
|
|
964
970
|
var _this = this;
|
|
965
|
-
var emitted
|
|
971
|
+
var emitted;
|
|
966
972
|
var subscription = source.subscribe(function (value) {
|
|
967
973
|
emitted = value;
|
|
968
974
|
_this.send(utils_1.toSCXMLEvent(value, { origin: id }));
|
|
@@ -1052,6 +1058,9 @@ var Interpreter = /** @class */ (function () {
|
|
|
1052
1058
|
return this;
|
|
1053
1059
|
};
|
|
1054
1060
|
Interpreter.prototype.getSnapshot = function () {
|
|
1061
|
+
if (this.status === InterpreterStatus.NotStarted) {
|
|
1062
|
+
return this.initialState;
|
|
1063
|
+
}
|
|
1055
1064
|
return this._state;
|
|
1056
1065
|
};
|
|
1057
1066
|
/**
|
package/lib/model.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AssignAction, Assigner, PropertyAssigner, ExtractEvent, EventObject } from './types';
|
|
1
|
+
import type { AssignAction, Assigner, PropertyAssigner, ExtractEvent, EventObject, MachineConfig, StateMachine, MachineOptions } from './types';
|
|
2
2
|
declare type AnyFunction = (...args: any[]) => any;
|
|
3
3
|
declare type Cast<A1 extends any, A2 extends any> = A1 extends A2 ? A1 : A2;
|
|
4
4
|
declare type Compute<A extends any> = {
|
|
@@ -10,6 +10,7 @@ export interface Model<TContext, TEvent extends EventObject, TModelCreators = vo
|
|
|
10
10
|
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>>;
|
|
11
11
|
events: Prop<TModelCreators, 'events'>;
|
|
12
12
|
reset: () => AssignAction<TContext, any>;
|
|
13
|
+
createMachine: (config: MachineConfig<TContext, any, TEvent>, implementations?: Partial<MachineOptions<TContext, TEvent>>) => StateMachine<TContext, any, TEvent, any>;
|
|
13
14
|
}
|
|
14
15
|
export declare type ModelContextFrom<TModel extends Model<any, any, any>> = TModel extends Model<infer TContext, any, any> ? TContext : never;
|
|
15
16
|
export declare type ModelEventsFrom<TModel extends Model<any, any, any>> = TModel extends Model<any, infer TEvent, any> ? TEvent : never;
|
package/lib/model.js
CHANGED
|
@@ -34,6 +34,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
35
|
exports.createModel = void 0;
|
|
36
36
|
var actions_1 = require("./actions");
|
|
37
|
+
var Machine_1 = require("./Machine");
|
|
37
38
|
var utils_1 = require("./utils");
|
|
38
39
|
function createModel(initialContext, creators) {
|
|
39
40
|
var eventCreators = creators === null || creators === void 0 ? void 0 : creators.events;
|
|
@@ -49,7 +50,10 @@ function createModel(initialContext, creators) {
|
|
|
49
50
|
return (__assign(__assign({}, fn.apply(void 0, __spreadArray([], __read(args)))), { type: eventType }));
|
|
50
51
|
}; })
|
|
51
52
|
: undefined),
|
|
52
|
-
reset: function () { return actions_1.assign(initialContext); }
|
|
53
|
+
reset: function () { return actions_1.assign(initialContext); },
|
|
54
|
+
createMachine: function (config, implementations) {
|
|
55
|
+
return Machine_1.createMachine('context' in config ? config : __assign(__assign({}, config), { context: initialContext }), implementations);
|
|
56
|
+
}
|
|
53
57
|
};
|
|
54
58
|
return model;
|
|
55
59
|
}
|
package/lib/stateUtils.d.ts
CHANGED
|
@@ -10,5 +10,6 @@ export declare function getValue<TC, TE extends EventObject>(rootNode: StateNode
|
|
|
10
10
|
export declare function has<T>(iterable: Iterable<T>, item: T): boolean;
|
|
11
11
|
export declare function nextEvents<TC, TE extends EventObject>(configuration: Array<StateNode<TC, any, TE>>): Array<TE['type']>;
|
|
12
12
|
export declare function isInFinalState<TC, TE extends EventObject>(configuration: Array<StateNode<TC, any, TE, any>>, stateNode: StateNode<TC, any, TE, any>): boolean;
|
|
13
|
+
export declare function getMeta(configuration?: StateNode[]): Record<string, any>;
|
|
13
14
|
export {};
|
|
14
15
|
//# sourceMappingURL=stateUtils.d.ts.map
|
package/lib/stateUtils.js
CHANGED
|
@@ -32,7 +32,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
|
32
32
|
return to;
|
|
33
33
|
};
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
-
exports.isInFinalState = exports.nextEvents = exports.has = exports.getValue = exports.getAdjList = exports.getConfiguration = exports.getAllStateNodes = exports.getChildren = exports.isLeafNode = void 0;
|
|
35
|
+
exports.getMeta = exports.isInFinalState = exports.nextEvents = exports.has = exports.getValue = exports.getAdjList = exports.getConfiguration = exports.getAllStateNodes = exports.getChildren = exports.isLeafNode = void 0;
|
|
36
36
|
var utils_1 = require("./utils");
|
|
37
37
|
var isLeafNode = function (stateNode) {
|
|
38
38
|
return stateNode.type === 'atomic' || stateNode.type === 'final';
|
|
@@ -225,3 +225,13 @@ function isInFinalState(configuration, stateNode) {
|
|
|
225
225
|
return false;
|
|
226
226
|
}
|
|
227
227
|
exports.isInFinalState = isInFinalState;
|
|
228
|
+
function getMeta(configuration) {
|
|
229
|
+
if (configuration === void 0) { configuration = []; }
|
|
230
|
+
return configuration.reduce(function (acc, stateNode) {
|
|
231
|
+
if (stateNode.meta !== undefined) {
|
|
232
|
+
acc[stateNode.id] = stateNode.meta;
|
|
233
|
+
}
|
|
234
|
+
return acc;
|
|
235
|
+
}, {});
|
|
236
|
+
}
|
|
237
|
+
exports.getMeta = getMeta;
|
package/lib/types.d.ts
CHANGED
|
@@ -134,7 +134,7 @@ export interface PayloadSender<TEvent extends EventObject> {
|
|
|
134
134
|
<K extends TEvent['type']>(eventType: K, payload: NeverIfEmpty<ExtractExtraParameters<TEvent, K>>): void;
|
|
135
135
|
}
|
|
136
136
|
export declare type Receiver<TEvent extends EventObject> = (listener: (event: TEvent) => void) => void;
|
|
137
|
-
export declare type InvokeCallback<TEvent extends EventObject = AnyEventObject> = (callback: Sender<
|
|
137
|
+
export declare type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEvent extends EventObject = AnyEventObject> = (callback: Sender<TSentEvent>, onReceive: Receiver<TEvent>) => (() => void) | Promise<any> | void;
|
|
138
138
|
export interface InvokeMeta {
|
|
139
139
|
data: any;
|
|
140
140
|
src: InvokeSourceDefinition;
|
|
@@ -152,7 +152,7 @@ export interface InvokeMeta {
|
|
|
152
152
|
* @param context The current machine `context`
|
|
153
153
|
* @param event The event that invoked the service
|
|
154
154
|
*/
|
|
155
|
-
export declare type InvokeCreator<TContext, TEvent extends EventObject
|
|
155
|
+
export declare type InvokeCreator<TContext, TEvent extends EventObject, TFinalContext = any> = (context: TContext, event: TEvent, meta: InvokeMeta) => PromiseLike<TFinalContext> | StateMachine<TFinalContext, any, any> | Subscribable<EventObject> | InvokeCallback<any, TEvent> | Behavior<any>;
|
|
156
156
|
export interface InvokeDefinition<TContext, TEvent extends EventObject> extends ActivityDefinition<TContext, TEvent> {
|
|
157
157
|
/**
|
|
158
158
|
* The source of the machine to be invoked, or the machine itself.
|
|
@@ -490,6 +490,8 @@ export interface StateMachine<TContext, TStateSchema extends StateSchema, TEvent
|
|
|
490
490
|
}> extends StateNode<TContext, TStateSchema, TEvent, TTypestate> {
|
|
491
491
|
id: string;
|
|
492
492
|
states: StateNode<TContext, TStateSchema, TEvent>['states'];
|
|
493
|
+
withConfig(options: Partial<MachineOptions<TContext, TEvent>>, context?: TContext): StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
|
|
494
|
+
withContext(context: TContext): StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
|
|
493
495
|
}
|
|
494
496
|
export declare type StateFrom<TMachine extends StateMachine<any, any, any>> = ReturnType<TMachine['transition']>;
|
|
495
497
|
export interface ActionMap<TContext, TEvent extends EventObject> {
|
|
@@ -876,23 +878,42 @@ export interface Subscribable<T> {
|
|
|
876
878
|
subscribe(observer: Observer<T>): Subscription;
|
|
877
879
|
subscribe(next: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
|
|
878
880
|
}
|
|
879
|
-
export declare type Spawnable = StateMachine<any, any, any> |
|
|
881
|
+
export declare type Spawnable = StateMachine<any, any, any> | PromiseLike<any> | InvokeCallback | Subscribable<any> | Behavior<any>;
|
|
880
882
|
export declare type ExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends {
|
|
881
883
|
type: TEventType;
|
|
882
884
|
} ? TEvent : never;
|
|
885
|
+
export interface BaseActorRef<TEvent extends EventObject> {
|
|
886
|
+
send: (event: TEvent) => void;
|
|
887
|
+
}
|
|
883
888
|
export interface ActorRef<TEvent extends EventObject, TEmitted = any> extends Subscribable<TEmitted> {
|
|
884
889
|
send: Sender<TEvent>;
|
|
885
|
-
}
|
|
886
|
-
export interface SpawnedActorRef<TEvent extends EventObject, TEmitted = any> extends ActorRef<TEvent, TEmitted> {
|
|
887
890
|
id: string;
|
|
888
891
|
getSnapshot: () => TEmitted | undefined;
|
|
889
892
|
stop?: () => void;
|
|
890
893
|
toJSON?: () => any;
|
|
891
894
|
}
|
|
892
|
-
|
|
895
|
+
/**
|
|
896
|
+
* @deprecated Use `ActorRef` instead.
|
|
897
|
+
*/
|
|
898
|
+
export declare type SpawnedActorRef<TEvent extends EventObject, TEmitted = any> = ActorRef<TEvent, TEmitted>;
|
|
899
|
+
export declare type ActorRefFrom<T extends StateMachine<any, any, any> | Promise<any> | Behavior<any>> = T extends StateMachine<infer TContext, any, infer TEvent, infer TTypestate> ? ActorRef<TEvent, State<TContext, TEvent, any, TTypestate>> & {
|
|
900
|
+
/**
|
|
901
|
+
* @deprecated Use `.getSnapshot()` instead.
|
|
902
|
+
*/
|
|
893
903
|
state: State<TContext, TEvent, any, TTypestate>;
|
|
894
|
-
} : T extends Promise<infer U> ?
|
|
904
|
+
} : T extends Promise<infer U> ? ActorRef<never, U> : T extends Behavior<infer TEvent, infer TEmitted> ? ActorRef<TEvent, TEmitted> : never;
|
|
895
905
|
export declare type AnyInterpreter = Interpreter<any, any, any, any>;
|
|
896
906
|
export declare type InterpreterFrom<T extends StateMachine<any, any, any, any>> = T extends StateMachine<infer TContext, infer TStateSchema, infer TEvent, infer TTypestate> ? Interpreter<TContext, TStateSchema, TEvent, TTypestate> : never;
|
|
907
|
+
export interface ActorContext<TEvent extends EventObject, TEmitted> {
|
|
908
|
+
parent?: ActorRef<any, any>;
|
|
909
|
+
self: ActorRef<TEvent, TEmitted>;
|
|
910
|
+
id: string;
|
|
911
|
+
observers: Set<Observer<TEmitted>>;
|
|
912
|
+
}
|
|
913
|
+
export interface Behavior<TEvent extends EventObject, TEmitted = any> {
|
|
914
|
+
transition: (state: TEmitted, event: TEvent, actorCtx: ActorContext<TEvent, TEmitted>) => TEmitted;
|
|
915
|
+
initialState: TEmitted;
|
|
916
|
+
start?: (actorCtx: ActorContext<TEvent, TEmitted>) => TEmitted;
|
|
917
|
+
}
|
|
897
918
|
export {};
|
|
898
919
|
//# sourceMappingURL=types.d.ts.map
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Event, StateValue, ActionType, Action, EventObject, PropertyMapper, Mapper, EventType, HistoryValue, AssignAction, Condition, Subscribable, StateMachine, ConditionPredicate, SCXML, StateLike, EventData, TransitionConfig, TransitionConfigTarget, NullEvent, SingleOrArray, Guard, InvokeSourceDefinition } from './types';
|
|
1
|
+
import { Event, StateValue, ActionType, Action, EventObject, PropertyMapper, Mapper, EventType, HistoryValue, AssignAction, Condition, Subscribable, StateMachine, ConditionPredicate, SCXML, StateLike, EventData, TransitionConfig, TransitionConfigTarget, NullEvent, SingleOrArray, Guard, InvokeSourceDefinition, Observer, Behavior } from './types';
|
|
2
2
|
import { StateNode } from './StateNode';
|
|
3
|
-
import {
|
|
3
|
+
import { State } from './State';
|
|
4
4
|
import { Actor } from './Actor';
|
|
5
5
|
export declare function keys<T extends object>(value: T): Array<keyof T & string>;
|
|
6
6
|
export declare function matchesState(parentStateId: StateValue, childStateId: StateValue, delimiter?: string): boolean;
|
|
@@ -40,6 +40,7 @@ export declare function toArray<T>(value: T[] | T | undefined): T[];
|
|
|
40
40
|
export declare function mapContext<TContext, TEvent extends EventObject>(mapper: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>, context: TContext, _event: SCXML.Event<TEvent>): any;
|
|
41
41
|
export declare function isBuiltInEvent(eventType: EventType): boolean;
|
|
42
42
|
export declare function isPromiseLike(value: any): value is PromiseLike<any>;
|
|
43
|
+
export declare function isBehavior(value: any): value is Behavior<any, any>;
|
|
43
44
|
export declare function partition<T, A extends T, B extends T>(items: T[], predicate: (item: T) => item is A): [A[], B[]];
|
|
44
45
|
export declare function updateHistoryStates(hist: HistoryValue, stateValue: StateValue): Record<string, HistoryValue | undefined>;
|
|
45
46
|
export declare function updateHistoryValue(hist: HistoryValue, stateValue: StateValue): HistoryValue;
|
package/lib/utils.js
CHANGED
|
@@ -43,7 +43,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
|
43
43
|
return to;
|
|
44
44
|
};
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.toObserver = exports.toInvokeSource = exports.evaluateGuard = exports.reportUnhandledExceptionOnInvocation = exports.normalizeTarget = exports.toTransitionConfigArray = exports.toSCXMLEvent = exports.toEventObject = exports.uniqueId = exports.isActor = exports.isMachine = exports.symbolObservable = exports.isObservable = exports.toGuard = exports.isString = exports.isFunction = exports.isArray = exports.warn = exports.updateContext = exports.updateHistoryValue = exports.updateHistoryStates = exports.partition = exports.isPromiseLike = exports.isBuiltInEvent = exports.mapContext = exports.toArray = exports.toArrayStrict = exports.flatten = exports.pathsToStateValue = exports.toStatePaths = exports.nestedPath = exports.path = exports.mapFilterValues = exports.mapValues = exports.pathToStateValue = exports.toStateValue = exports.isStateLike = exports.toStatePath = exports.getActionType = exports.getEventType = exports.matchesState = exports.keys = void 0;
|
|
46
|
+
exports.toObserver = exports.toInvokeSource = exports.evaluateGuard = exports.reportUnhandledExceptionOnInvocation = exports.normalizeTarget = exports.toTransitionConfigArray = exports.toSCXMLEvent = exports.toEventObject = exports.uniqueId = exports.isActor = exports.isMachine = exports.symbolObservable = exports.isObservable = exports.toGuard = exports.isString = exports.isFunction = exports.isArray = exports.warn = exports.updateContext = exports.updateHistoryValue = exports.updateHistoryStates = exports.partition = exports.isBehavior = exports.isPromiseLike = exports.isBuiltInEvent = exports.mapContext = exports.toArray = exports.toArrayStrict = exports.flatten = exports.pathsToStateValue = exports.toStatePaths = exports.nestedPath = exports.path = exports.mapFilterValues = exports.mapValues = exports.pathToStateValue = exports.toStateValue = exports.isStateLike = exports.toStatePath = exports.getActionType = exports.getEventType = exports.matchesState = exports.keys = void 0;
|
|
47
47
|
var constants_1 = require("./constants");
|
|
48
48
|
var environment_1 = require("./environment");
|
|
49
49
|
function keys(value) {
|
|
@@ -345,6 +345,13 @@ function isPromiseLike(value) {
|
|
|
345
345
|
return false;
|
|
346
346
|
}
|
|
347
347
|
exports.isPromiseLike = isPromiseLike;
|
|
348
|
+
function isBehavior(value) {
|
|
349
|
+
return (value !== null &&
|
|
350
|
+
typeof value === 'object' &&
|
|
351
|
+
'transition' in value &&
|
|
352
|
+
typeof value.transition === 'function');
|
|
353
|
+
}
|
|
354
|
+
exports.isBehavior = isBehavior;
|
|
348
355
|
function partition(items, predicate) {
|
|
349
356
|
var e_6, _a;
|
|
350
357
|
var _b = __read([[], []], 2), truthy = _b[0], falsy = _b[1];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xstate",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.22.0",
|
|
4
4
|
"description": "Finite State Machines and Statecharts for the Modern Web.",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "es/index.js",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"rxjs": "^6.5.1",
|
|
67
67
|
"ts-jest": "^26.5.6",
|
|
68
68
|
"tslib": "^2.2.0",
|
|
69
|
-
"typescript": "^4.2
|
|
69
|
+
"typescript": "^4.3.2",
|
|
70
70
|
"xml-js": "^1.6.11"
|
|
71
71
|
}
|
|
72
72
|
}
|