xstate 4.7.8 → 4.10.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 +79 -0
- package/dist/xstate.interpreter.js +1 -1
- package/dist/xstate.js +1 -1
- package/dist/xstate.web.js +2 -2
- package/es/Machine.d.ts +4 -1
- package/es/State.d.ts +9 -4
- package/es/State.js +3 -1
- package/es/StateNode.d.ts +5 -3
- package/es/StateNode.js +47 -80
- package/es/actionTypes.d.ts +1 -0
- package/es/actionTypes.js +2 -1
- package/es/actions.d.ts +17 -11
- package/es/actions.js +86 -7
- package/es/index.d.ts +3 -1
- package/es/index.js +4 -2
- package/es/interpreter.d.ts +12 -11
- package/es/interpreter.js +30 -16
- package/es/json.d.ts +31 -0
- package/es/registry.js +1 -3
- package/es/types.d.ts +42 -18
- package/es/types.js +1 -0
- package/es/utils.d.ts +3 -2
- package/es/utils.js +24 -7
- package/lib/Machine.d.ts +4 -1
- package/lib/State.d.ts +9 -4
- package/lib/State.js +2 -1
- package/lib/StateNode.d.ts +5 -3
- package/lib/StateNode.js +29 -69
- package/lib/actionTypes.d.ts +1 -0
- package/lib/actionTypes.js +1 -0
- package/lib/actions.d.ts +17 -11
- package/lib/actions.js +81 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +3 -1
- package/lib/interpreter.d.ts +12 -11
- package/lib/interpreter.js +20 -10
- package/lib/json.d.ts +31 -0
- package/lib/json.js +84 -0
- package/lib/scxml.js +132 -57
- package/lib/types.d.ts +42 -18
- package/lib/types.js +1 -0
- package/lib/utils.d.ts +3 -2
- package/lib/utils.js +22 -4
- package/package.json +2 -2
package/lib/json.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { StateNode, ActionObject, Guard, InvokeDefinition } from './';
|
|
2
|
+
interface JSONFunction {
|
|
3
|
+
$function: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function stringifyFunction(fn: Function): JSONFunction;
|
|
6
|
+
interface TransitionConfig {
|
|
7
|
+
target: string[];
|
|
8
|
+
source: string;
|
|
9
|
+
actions: Array<ActionObject<any, any>>;
|
|
10
|
+
cond: Guard<any, any> | undefined;
|
|
11
|
+
eventType: string;
|
|
12
|
+
}
|
|
13
|
+
interface StateNodeConfig {
|
|
14
|
+
type: StateNode['type'];
|
|
15
|
+
id: string;
|
|
16
|
+
key: string;
|
|
17
|
+
initial?: string;
|
|
18
|
+
entry: Array<ActionObject<any, any>>;
|
|
19
|
+
exit: Array<ActionObject<any, any>>;
|
|
20
|
+
on: {
|
|
21
|
+
[key: string]: TransitionConfig[];
|
|
22
|
+
};
|
|
23
|
+
invoke: Array<InvokeDefinition<any, any>>;
|
|
24
|
+
states: Record<string, StateNodeConfig>;
|
|
25
|
+
}
|
|
26
|
+
export declare function machineToJSON(stateNode: StateNode): StateNodeConfig;
|
|
27
|
+
export declare function stringify(machine: StateNode): string;
|
|
28
|
+
export declare function parse(machineString: string): StateNodeConfig;
|
|
29
|
+
export declare function jsonify<T extends Record<string, any>>(value: T): T;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=json.d.ts.map
|
package/lib/json.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var utils_1 = require("./utils");
|
|
4
|
+
// tslint:disable-next-line:ban-types
|
|
5
|
+
function stringifyFunction(fn) {
|
|
6
|
+
return {
|
|
7
|
+
$function: fn.toString()
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
exports.stringifyFunction = stringifyFunction;
|
|
11
|
+
function getStateNodeId(stateNode) {
|
|
12
|
+
return "#" + stateNode.id;
|
|
13
|
+
}
|
|
14
|
+
// derive config from machine
|
|
15
|
+
function machineToJSON(stateNode) {
|
|
16
|
+
var config = {
|
|
17
|
+
type: stateNode.type,
|
|
18
|
+
initial: stateNode.initial === undefined ? undefined : String(stateNode.initial),
|
|
19
|
+
id: stateNode.id,
|
|
20
|
+
key: stateNode.key,
|
|
21
|
+
entry: stateNode.onEntry,
|
|
22
|
+
exit: stateNode.onExit,
|
|
23
|
+
on: utils_1.mapValues(stateNode.on, function (transition) {
|
|
24
|
+
return transition.map(function (t) {
|
|
25
|
+
return {
|
|
26
|
+
target: t.target ? t.target.map(getStateNodeId) : [],
|
|
27
|
+
source: getStateNodeId(t.source),
|
|
28
|
+
actions: t.actions,
|
|
29
|
+
cond: t.cond,
|
|
30
|
+
eventType: t.eventType
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}),
|
|
34
|
+
invoke: stateNode.invoke,
|
|
35
|
+
states: {}
|
|
36
|
+
};
|
|
37
|
+
Object.values(stateNode.states).forEach(function (sn) {
|
|
38
|
+
config.states[sn.key] = machineToJSON(sn);
|
|
39
|
+
});
|
|
40
|
+
return config;
|
|
41
|
+
}
|
|
42
|
+
exports.machineToJSON = machineToJSON;
|
|
43
|
+
function stringify(machine) {
|
|
44
|
+
return JSON.stringify(machineToJSON(machine), function (_, value) {
|
|
45
|
+
if (utils_1.isFunction(value)) {
|
|
46
|
+
return { $function: value.toString() };
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
exports.stringify = stringify;
|
|
52
|
+
function parse(machineString) {
|
|
53
|
+
var config = JSON.parse(machineString, function (_, value) {
|
|
54
|
+
if (typeof value === 'object' && '$function' in value) {
|
|
55
|
+
return new Function(value.value);
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
});
|
|
59
|
+
return config;
|
|
60
|
+
}
|
|
61
|
+
exports.parse = parse;
|
|
62
|
+
function jsonify(value) {
|
|
63
|
+
Object.defineProperty(value, 'toJSON', {
|
|
64
|
+
value: function () {
|
|
65
|
+
return utils_1.mapValues(value, function (subValue) {
|
|
66
|
+
if (utils_1.isFunction(subValue)) {
|
|
67
|
+
return stringifyFunction(subValue);
|
|
68
|
+
}
|
|
69
|
+
else if (typeof subValue === 'object' && !Array.isArray(subValue)) {
|
|
70
|
+
// mostly for assignments
|
|
71
|
+
return utils_1.mapValues(subValue, function (subSubValue) {
|
|
72
|
+
if (utils_1.isFunction(subSubValue)) {
|
|
73
|
+
return stringifyFunction(subSubValue);
|
|
74
|
+
}
|
|
75
|
+
return subSubValue;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return subValue;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
exports.jsonify = jsonify;
|
package/lib/scxml.js
CHANGED
|
@@ -30,6 +30,17 @@ var __spread = (this && this.__spread) || function () {
|
|
|
30
30
|
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
|
|
31
31
|
return ar;
|
|
32
32
|
};
|
|
33
|
+
var __values = (this && this.__values) || function(o) {
|
|
34
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
35
|
+
if (m) return m.call(o);
|
|
36
|
+
if (o && typeof o.length === "number") return {
|
|
37
|
+
next: function () {
|
|
38
|
+
if (o && i >= o.length) o = void 0;
|
|
39
|
+
return { value: o && o[i++], done: !o };
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
43
|
+
};
|
|
33
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
45
|
var xml_js_1 = require("xml-js");
|
|
35
46
|
var index_1 = require("./index");
|
|
@@ -103,60 +114,128 @@ var evaluateExecutableContent = function (context, _ev, meta, body) {
|
|
|
103
114
|
var fn = new (Function.bind.apply(Function, __spread([void 0], args, [fnBody])))();
|
|
104
115
|
return fn(context, meta._event);
|
|
105
116
|
};
|
|
106
|
-
function
|
|
107
|
-
return
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
var
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
117
|
+
function createCond(cond) {
|
|
118
|
+
return function (context, _event, meta) {
|
|
119
|
+
return evaluateExecutableContent(context, _event, meta, "return " + cond + ";");
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function mapAction(element) {
|
|
123
|
+
var e_1, _a;
|
|
124
|
+
switch (element.name) {
|
|
125
|
+
case 'raise': {
|
|
126
|
+
return actions.raise(element.attributes.event);
|
|
127
|
+
}
|
|
128
|
+
case 'assign': {
|
|
129
|
+
return actions.assign(function (context, e, meta) {
|
|
130
|
+
var fnBody = "\n return {'" + element.attributes.location + "': " + element.attributes.expr + "};\n ";
|
|
131
|
+
return evaluateExecutableContent(context, e, meta, fnBody);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
case 'send': {
|
|
135
|
+
var _b = element.attributes, event_1 = _b.event, eventexpr_1 = _b.eventexpr, target = _b.target;
|
|
136
|
+
var convertedEvent = void 0;
|
|
137
|
+
var convertedDelay = void 0;
|
|
138
|
+
var params_1 = element.elements &&
|
|
139
|
+
element.elements.reduce(function (acc, child) {
|
|
140
|
+
if (child.name === 'content') {
|
|
141
|
+
throw new Error('Conversion of <content/> inside <send/> not implemented.');
|
|
142
|
+
}
|
|
143
|
+
return "" + acc + child.attributes.name + ":" + child.attributes.expr + ",\n";
|
|
144
|
+
}, '');
|
|
145
|
+
if (event_1 && !params_1) {
|
|
146
|
+
convertedEvent = event_1;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
convertedEvent = function (context, _ev, meta) {
|
|
150
|
+
var fnBody = "\n return { type: " + (event_1 ? "\"" + event_1 + "\"" : eventexpr_1) + ", " + (params_1 ? params_1 : '') + " }\n ";
|
|
151
|
+
return evaluateExecutableContent(context, _ev, meta, fnBody);
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if ('delay' in element.attributes) {
|
|
155
|
+
convertedDelay = delayToMs(element.attributes.delay);
|
|
156
|
+
}
|
|
157
|
+
else if (element.attributes.delayexpr) {
|
|
158
|
+
convertedDelay = function (context, _ev, meta) {
|
|
159
|
+
var fnBody = "\n return (" + delayToMs + ")(" + element.attributes.delayexpr + ");\n ";
|
|
160
|
+
return evaluateExecutableContent(context, _ev, meta, fnBody);
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return actions.send(convertedEvent, {
|
|
164
|
+
delay: convertedDelay,
|
|
165
|
+
to: target
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
case 'log': {
|
|
169
|
+
var label = element.attributes.label;
|
|
170
|
+
return actions.log(function (context, e, meta) {
|
|
171
|
+
var fnBody = "\n return " + element.attributes.expr + ";\n ";
|
|
172
|
+
return evaluateExecutableContent(context, e, meta, fnBody);
|
|
173
|
+
}, label !== undefined ? String(label) : undefined);
|
|
174
|
+
}
|
|
175
|
+
case 'if': {
|
|
176
|
+
var conds = [];
|
|
177
|
+
var current = {
|
|
178
|
+
cond: createCond(element.attributes.cond),
|
|
179
|
+
actions: []
|
|
180
|
+
};
|
|
181
|
+
try {
|
|
182
|
+
for (var _c = __values(element.elements), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
183
|
+
var el = _d.value;
|
|
184
|
+
if (el.type === 'comment') {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
switch (el.name) {
|
|
188
|
+
case 'elseif':
|
|
189
|
+
conds.push(current);
|
|
190
|
+
current = {
|
|
191
|
+
cond: createCond(el.attributes.cond),
|
|
192
|
+
actions: []
|
|
193
|
+
};
|
|
194
|
+
break;
|
|
195
|
+
case 'else':
|
|
196
|
+
conds.push(current);
|
|
197
|
+
current = { actions: [] };
|
|
198
|
+
break;
|
|
199
|
+
default:
|
|
200
|
+
current.actions.push(mapAction(el));
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
139
203
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
204
|
+
}
|
|
205
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
206
|
+
finally {
|
|
207
|
+
try {
|
|
208
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
145
209
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
case 'log':
|
|
151
|
-
var label = element.attributes.label;
|
|
152
|
-
return actions.log(function (context, e, meta) {
|
|
153
|
-
var fnBody = "\n return " + element.attributes.expr + ";\n ";
|
|
154
|
-
return evaluateExecutableContent(context, e, meta, fnBody);
|
|
155
|
-
}, label !== undefined ? String(label) : undefined);
|
|
156
|
-
default:
|
|
157
|
-
return { type: 'not-implemented' };
|
|
210
|
+
finally { if (e_1) throw e_1.error; }
|
|
211
|
+
}
|
|
212
|
+
conds.push(current);
|
|
213
|
+
return actions.choose(conds);
|
|
158
214
|
}
|
|
159
|
-
|
|
215
|
+
default:
|
|
216
|
+
throw new Error("Conversion of \"" + element.name + "\" elements is not implemented yet.");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function mapActions(elements) {
|
|
220
|
+
var e_2, _a;
|
|
221
|
+
var mapped = [];
|
|
222
|
+
try {
|
|
223
|
+
for (var elements_1 = __values(elements), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
|
|
224
|
+
var element = elements_1_1.value;
|
|
225
|
+
if (element.type === 'comment') {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
mapped.push(mapAction(element));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
232
|
+
finally {
|
|
233
|
+
try {
|
|
234
|
+
if (elements_1_1 && !elements_1_1.done && (_a = elements_1.return)) _a.call(elements_1);
|
|
235
|
+
}
|
|
236
|
+
finally { if (e_2) throw e_2.error; }
|
|
237
|
+
}
|
|
238
|
+
return mapped;
|
|
160
239
|
}
|
|
161
240
|
function toConfig(nodeJson, id, options) {
|
|
162
241
|
var parallel = nodeJson.name === 'parallel';
|
|
@@ -212,10 +291,7 @@ function toConfig(nodeJson, id, options) {
|
|
|
212
291
|
var internal = getAttribute(value, 'type') === 'internal';
|
|
213
292
|
return __assign(__assign(__assign({ event: event, target: getTargets(targets) }, (value.elements ? executableContent(value.elements) : undefined)), (value.attributes && value.attributes.cond
|
|
214
293
|
? {
|
|
215
|
-
cond:
|
|
216
|
-
var fnBody = "\n return " + value.attributes.cond + ";\n ";
|
|
217
|
-
return evaluateExecutableContent(context, _event, meta, fnBody);
|
|
218
|
-
}
|
|
294
|
+
cond: createCond(value.attributes.cond)
|
|
219
295
|
}
|
|
220
296
|
: undefined)), { internal: internal });
|
|
221
297
|
});
|
|
@@ -226,8 +302,7 @@ function toConfig(nodeJson, id, options) {
|
|
|
226
302
|
? mapActions(onExitElement.elements)
|
|
227
303
|
: undefined;
|
|
228
304
|
var invoke = invokeElements.map(function (element) {
|
|
229
|
-
if (!['scxml', 'http://www.w3.org/TR/scxml/'].includes(element.attributes
|
|
230
|
-
.type)) {
|
|
305
|
+
if (!['scxml', 'http://www.w3.org/TR/scxml/'].includes(element.attributes.type)) {
|
|
231
306
|
throw new Error('Currently only converting invoke elements of type SCXML is supported.');
|
|
232
307
|
}
|
|
233
308
|
var content = element.elements.find(function (el) { return el.name === 'content'; });
|
package/lib/types.d.ts
CHANGED
|
@@ -50,7 +50,11 @@ export interface AssignMeta<TContext, TEvent extends EventObject> {
|
|
|
50
50
|
_event: SCXML.Event<TEvent>;
|
|
51
51
|
}
|
|
52
52
|
export declare type ActionFunction<TContext, TEvent extends EventObject> = (context: TContext, event: TEvent, meta: ActionMeta<TContext, TEvent>) => any | void;
|
|
53
|
-
export
|
|
53
|
+
export interface ChooseConditon<TContext, TEvent extends EventObject> {
|
|
54
|
+
cond?: Condition<TContext, TEvent>;
|
|
55
|
+
actions: Actions<TContext, TEvent>;
|
|
56
|
+
}
|
|
57
|
+
export declare type Action<TContext, TEvent extends EventObject> = ActionType | ActionObject<TContext, TEvent> | ActionFunction<TContext, TEvent> | AssignAction<Required<TContext>, TEvent> | SendAction<TContext, TEvent, AnyEventObject> | RaiseAction<AnyEventObject> | ChooseAction<TContext, TEvent>;
|
|
54
58
|
export declare type Actions<TContext, TEvent extends EventObject> = SingleOrArray<Action<TContext, TEvent>>;
|
|
55
59
|
export declare type StateKey = string | State<any>;
|
|
56
60
|
export interface StateValueMap {
|
|
@@ -171,21 +175,28 @@ export declare type StatesConfig<TContext, TStateSchema extends StateSchema, TEv
|
|
|
171
175
|
export declare type StatesDefinition<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> = {
|
|
172
176
|
[K in keyof TStateSchema['states']]: StateNodeDefinition<TContext, TStateSchema['states'][K], TEvent>;
|
|
173
177
|
};
|
|
174
|
-
export declare type
|
|
178
|
+
export declare type TransitionConfigTarget<TContext, TEvent extends EventObject> = string | undefined | StateNode<TContext, any, TEvent>;
|
|
179
|
+
export declare type TransitionConfigOrTarget<TContext, TEvent extends EventObject> = SingleOrArray<TransitionConfigTarget<TContext, TEvent> | TransitionConfig<TContext, TEvent>>;
|
|
175
180
|
declare type TransitionsConfigMap<TContext, TEvent extends EventObject> = {
|
|
176
|
-
[K in TEvent['type']
|
|
181
|
+
[K in TEvent['type']]?: TransitionConfigOrTarget<TContext, TEvent extends {
|
|
177
182
|
type: K;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
|
|
183
|
+
} ? TEvent : never>;
|
|
184
|
+
} & {
|
|
185
|
+
''?: TransitionConfigOrTarget<TContext, TEvent>;
|
|
186
|
+
} & {
|
|
187
|
+
'*'?: TransitionConfigOrTarget<TContext, TEvent>;
|
|
181
188
|
};
|
|
182
189
|
declare type TransitionsConfigArray<TContext, TEvent extends EventObject> = Array<{
|
|
183
|
-
[K in TEvent['type']
|
|
190
|
+
[K in TEvent['type']]: TransitionConfig<TContext, TEvent extends {
|
|
184
191
|
type: K;
|
|
185
|
-
}
|
|
192
|
+
} ? TEvent : never> & {
|
|
186
193
|
event: K;
|
|
187
194
|
};
|
|
188
|
-
}[TEvent['type'] |
|
|
195
|
+
}[TEvent['type']] | (TransitionConfig<TContext, TEvent> & {
|
|
196
|
+
event: '';
|
|
197
|
+
}) | (TransitionConfig<TContext, TEvent> & {
|
|
198
|
+
event: '*';
|
|
199
|
+
})>;
|
|
189
200
|
export declare type TransitionsConfig<TContext, TEvent extends EventObject> = TransitionsConfigMap<TContext, TEvent> | TransitionsConfigArray<TContext, TEvent>;
|
|
190
201
|
export declare type InvokeConfig<TContext, TEvent extends EventObject> = {
|
|
191
202
|
/**
|
|
@@ -345,14 +356,15 @@ export interface StateNodeDefinition<TContext, TStateSchema extends StateSchema,
|
|
|
345
356
|
id: string;
|
|
346
357
|
version: string | undefined;
|
|
347
358
|
key: string;
|
|
359
|
+
context: TContext;
|
|
348
360
|
type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';
|
|
349
361
|
initial: StateNodeConfig<TContext, TStateSchema, TEvent>['initial'];
|
|
350
362
|
history: boolean | 'shallow' | 'deep' | undefined;
|
|
351
363
|
states: StatesDefinition<TContext, TStateSchema, TEvent>;
|
|
352
364
|
on: TransitionDefinitionMap<TContext, TEvent>;
|
|
353
365
|
transitions: Array<TransitionDefinition<TContext, TEvent>>;
|
|
354
|
-
|
|
355
|
-
|
|
366
|
+
entry: Array<ActionObject<TContext, TEvent>>;
|
|
367
|
+
exit: Array<ActionObject<TContext, TEvent>>;
|
|
356
368
|
activities: Array<ActivityDefinition<TContext, TEvent>>;
|
|
357
369
|
meta: any;
|
|
358
370
|
order: number;
|
|
@@ -478,7 +490,8 @@ export declare enum ActionTypes {
|
|
|
478
490
|
ErrorPlatform = "error.platform",
|
|
479
491
|
ErrorCustom = "xstate.error",
|
|
480
492
|
Update = "xstate.update",
|
|
481
|
-
Pure = "xstate.pure"
|
|
493
|
+
Pure = "xstate.pure",
|
|
494
|
+
Choose = "xstate.choose"
|
|
482
495
|
}
|
|
483
496
|
export interface RaiseAction<TEvent extends EventObject> {
|
|
484
497
|
type: ActionTypes.Raise;
|
|
@@ -528,22 +541,22 @@ export interface LogAction<TContext, TEvent extends EventObject> extends ActionO
|
|
|
528
541
|
export interface LogActionObject<TContext, TEvent extends EventObject> extends LogAction<TContext, TEvent> {
|
|
529
542
|
value: any;
|
|
530
543
|
}
|
|
531
|
-
export interface SendAction<TContext, TEvent extends EventObject> extends ActionObject<TContext, TEvent> {
|
|
544
|
+
export interface SendAction<TContext, TEvent extends EventObject, TSentEvent extends EventObject> extends ActionObject<TContext, TEvent> {
|
|
532
545
|
to: string | number | Actor | ExprWithMeta<TContext, TEvent, string | number | Actor> | undefined;
|
|
533
|
-
event:
|
|
546
|
+
event: TSentEvent | SendExpr<TContext, TEvent, TSentEvent>;
|
|
534
547
|
delay?: number | string | DelayExpr<TContext, TEvent>;
|
|
535
548
|
id: string | number;
|
|
536
549
|
}
|
|
537
|
-
export interface SendActionObject<TContext, TEvent extends EventObject> extends SendAction<TContext, TEvent> {
|
|
550
|
+
export interface SendActionObject<TContext, TEvent extends EventObject, TSentEvent extends EventObject = AnyEventObject> extends SendAction<TContext, TEvent, TSentEvent> {
|
|
538
551
|
to: string | number | Actor | undefined;
|
|
539
|
-
_event: SCXML.Event<
|
|
540
|
-
event:
|
|
552
|
+
_event: SCXML.Event<TSentEvent>;
|
|
553
|
+
event: TSentEvent;
|
|
541
554
|
delay?: number;
|
|
542
555
|
id: string | number;
|
|
543
556
|
}
|
|
544
557
|
export declare type Expr<TContext, TEvent extends EventObject, T> = (context: TContext, event: TEvent) => T;
|
|
545
558
|
export declare type ExprWithMeta<TContext, TEvent extends EventObject, T> = (context: TContext, event: TEvent, meta: SCXMLEventMeta<TEvent>) => T;
|
|
546
|
-
export declare type SendExpr<TContext, TEvent extends EventObject> = ExprWithMeta<TContext, TEvent,
|
|
559
|
+
export declare type SendExpr<TContext, TEvent extends EventObject, TSentEvent extends EventObject = AnyEventObject> = ExprWithMeta<TContext, TEvent, TSentEvent>;
|
|
547
560
|
export declare enum SpecialTargets {
|
|
548
561
|
Parent = "#_parent",
|
|
549
562
|
Internal = "#_internal"
|
|
@@ -576,12 +589,23 @@ export interface PureAction<TContext, TEvent extends EventObject> extends Action
|
|
|
576
589
|
type: ActionTypes.Pure;
|
|
577
590
|
get: (context: TContext, event: TEvent) => SingleOrArray<ActionObject<TContext, TEvent>> | undefined;
|
|
578
591
|
}
|
|
592
|
+
export interface ChooseAction<TContext, TEvent extends EventObject> extends ActionObject<TContext, TEvent> {
|
|
593
|
+
type: ActionTypes.Choose;
|
|
594
|
+
conds: Array<ChooseConditon<TContext, TEvent>>;
|
|
595
|
+
}
|
|
579
596
|
export interface TransitionDefinition<TContext, TEvent extends EventObject> extends TransitionConfig<TContext, TEvent> {
|
|
580
597
|
target: Array<StateNode<TContext, any, TEvent>> | undefined;
|
|
581
598
|
source: StateNode<TContext, any, TEvent>;
|
|
582
599
|
actions: Array<ActionObject<TContext, TEvent>>;
|
|
583
600
|
cond?: Guard<TContext, TEvent>;
|
|
584
601
|
eventType: TEvent['type'] | NullEvent['type'] | '*';
|
|
602
|
+
toJSON: () => {
|
|
603
|
+
target: string[] | undefined;
|
|
604
|
+
source: string;
|
|
605
|
+
actions: Array<ActionObject<TContext, TEvent>>;
|
|
606
|
+
cond?: Guard<TContext, TEvent>;
|
|
607
|
+
eventType: TEvent['type'] | NullEvent['type'] | '*';
|
|
608
|
+
};
|
|
585
609
|
}
|
|
586
610
|
export declare type TransitionDefinitionMap<TContext, TEvent extends EventObject> = {
|
|
587
611
|
[K in TEvent['type'] | NullEvent['type'] | '*']: Array<TransitionDefinition<TContext, K extends TEvent['type'] ? Extract<TEvent, {
|
package/lib/types.js
CHANGED
|
@@ -21,6 +21,7 @@ var ActionTypes;
|
|
|
21
21
|
ActionTypes["ErrorCustom"] = "xstate.error";
|
|
22
22
|
ActionTypes["Update"] = "xstate.update";
|
|
23
23
|
ActionTypes["Pure"] = "xstate.pure";
|
|
24
|
+
ActionTypes["Choose"] = "xstate.choose";
|
|
24
25
|
})(ActionTypes = exports.ActionTypes || (exports.ActionTypes = {}));
|
|
25
26
|
var SpecialTargets;
|
|
26
27
|
(function (SpecialTargets) {
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Event, StateValue, ActionType, Action, EventObject, PropertyMapper, Mapper, EventType, HistoryValue, AssignAction, Condition,
|
|
1
|
+
import { Event, StateValue, ActionType, Action, EventObject, PropertyMapper, Mapper, EventType, HistoryValue, AssignAction, Condition, Subscribable, StateMachine, ConditionPredicate, SCXML, StateLike, EventData, TransitionConfig, TransitionConfigTarget, NullEvent, SingleOrArray, Guard } from './types';
|
|
2
2
|
import { StateNode } from './StateNode';
|
|
3
3
|
import { State } from '.';
|
|
4
4
|
import { Actor } from './Actor';
|
|
@@ -59,9 +59,10 @@ export declare function isActor(value: any): value is Actor;
|
|
|
59
59
|
export declare const uniqueId: () => string;
|
|
60
60
|
export declare function toEventObject<TEvent extends EventObject>(event: Event<TEvent>, payload?: EventData): TEvent;
|
|
61
61
|
export declare function toSCXMLEvent<TEvent extends EventObject>(event: Event<TEvent> | SCXML.Event<TEvent>, scxmlEvent?: Partial<SCXML.Event<TEvent>>): SCXML.Event<TEvent>;
|
|
62
|
-
export declare function toTransitionConfigArray<TContext, TEvent extends EventObject>(event: TEvent['type'] | NullEvent['type'] | '*', configLike: SingleOrArray<TransitionConfig<TContext, TEvent> |
|
|
62
|
+
export declare function toTransitionConfigArray<TContext, TEvent extends EventObject>(event: TEvent['type'] | NullEvent['type'] | '*', configLike: SingleOrArray<TransitionConfig<TContext, TEvent> | TransitionConfigTarget<TContext, TEvent>>): Array<TransitionConfig<TContext, TEvent> & {
|
|
63
63
|
event: TEvent['type'] | NullEvent['type'] | '*';
|
|
64
64
|
}>;
|
|
65
65
|
export declare function normalizeTarget<TContext, TEvent extends EventObject>(target: SingleOrArray<string | StateNode<TContext, any, TEvent>> | undefined): Array<string | StateNode<TContext, any, TEvent>> | undefined;
|
|
66
66
|
export declare function reportUnhandledExceptionOnInvocation(originalError: any, currentError: any, id: string): void;
|
|
67
|
+
export declare function evaluateGuard<TContext, TEvent extends EventObject>(machine: StateNode<TContext, any, TEvent>, guard: Guard<TContext, TEvent>, context: TContext, _event: SCXML.Event<TEvent>, state: State<TContext, TEvent>): boolean;
|
|
67
68
|
//# sourceMappingURL=utils.d.ts.map
|
package/lib/utils.js
CHANGED
|
@@ -108,10 +108,10 @@ function toStatePath(stateId, delimiter) {
|
|
|
108
108
|
exports.toStatePath = toStatePath;
|
|
109
109
|
function isStateLike(state) {
|
|
110
110
|
return (typeof state === 'object' &&
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
111
|
+
'value' in state &&
|
|
112
|
+
'context' in state &&
|
|
113
|
+
'event' in state &&
|
|
114
|
+
'_event' in state);
|
|
115
115
|
}
|
|
116
116
|
exports.isStateLike = isStateLike;
|
|
117
117
|
function toStateValue(stateValue, delimiter) {
|
|
@@ -584,3 +584,21 @@ function reportUnhandledExceptionOnInvocation(originalError, currentError, id) {
|
|
|
584
584
|
}
|
|
585
585
|
}
|
|
586
586
|
exports.reportUnhandledExceptionOnInvocation = reportUnhandledExceptionOnInvocation;
|
|
587
|
+
function evaluateGuard(machine, guard, context, _event, state) {
|
|
588
|
+
var guards = machine.options.guards;
|
|
589
|
+
var guardMeta = {
|
|
590
|
+
state: state,
|
|
591
|
+
cond: guard,
|
|
592
|
+
_event: _event
|
|
593
|
+
};
|
|
594
|
+
// TODO: do not hardcode!
|
|
595
|
+
if (guard.type === constants_1.DEFAULT_GUARD_TYPE) {
|
|
596
|
+
return guard.predicate(context, _event.data, guardMeta);
|
|
597
|
+
}
|
|
598
|
+
var condFn = guards[guard.type];
|
|
599
|
+
if (!condFn) {
|
|
600
|
+
throw new Error("Guard '" + guard.type + "' is not implemented on machine '" + machine.id + "'.");
|
|
601
|
+
}
|
|
602
|
+
return condFn(context, _event.data, guardMeta);
|
|
603
|
+
}
|
|
604
|
+
exports.evaluateGuard = evaluateGuard;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xstate",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.10.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": "^24.1.9",
|
|
68
68
|
"tslib": "^1.10.0",
|
|
69
|
-
"typescript": "^3.
|
|
69
|
+
"typescript": "^3.8.3",
|
|
70
70
|
"xml-js": "^1.6.11"
|
|
71
71
|
}
|
|
72
72
|
}
|