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/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 mapActions(elements) {
107
- return elements.map(function (element) {
108
- switch (element.name) {
109
- case 'raise':
110
- return actions.raise(element.attributes
111
- .event);
112
- case 'assign':
113
- return actions.assign(function (context, e, meta) {
114
- var fnBody = "\n return {'" + element.attributes.location + "': " + element.attributes.expr + "};\n ";
115
- return evaluateExecutableContent(context, e, meta, fnBody);
116
- });
117
- case 'send':
118
- var _a = element.attributes, event_1 = _a.event, eventexpr_1 = _a.eventexpr, target = _a.target;
119
- var convertedEvent = void 0;
120
- var convertedDelay = void 0;
121
- var params_1 = element.elements &&
122
- element.elements.reduce(function (acc, child) {
123
- if (child.name === 'content') {
124
- throw new Error('Conversion of <content/> inside <send/> not implemented.');
125
- }
126
- return "" + acc + child.attributes.name + ":" + child.attributes.expr + ",\n";
127
- }, '');
128
- if (event_1 && !params_1) {
129
- convertedEvent = event_1;
130
- }
131
- else {
132
- convertedEvent = function (context, _ev, meta) {
133
- var fnBody = "\n return { type: " + (event_1 ? "\"" + event_1 + "\"" : eventexpr_1) + ", " + (params_1 ? params_1 : '') + " }\n ";
134
- return evaluateExecutableContent(context, _ev, meta, fnBody);
135
- };
136
- }
137
- if ('delay' in element.attributes) {
138
- convertedDelay = delayToMs(element.attributes.delay);
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
- else if (element.attributes.delayexpr) {
141
- convertedDelay = function (context, _ev, meta) {
142
- var fnBody = "\n return (" + delayToMs + ")(" + element.attributes.delayexpr + ");\n ";
143
- return evaluateExecutableContent(context, _ev, meta, fnBody);
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
- return actions.send(convertedEvent, {
147
- delay: convertedDelay,
148
- to: target
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: function (context, _event, meta) {
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 declare type Action<TContext, TEvent extends EventObject> = ActionType | ActionObject<TContext, TEvent> | ActionFunction<TContext, TEvent> | AssignAction<Required<TContext>, TEvent> | SendAction<TContext, TEvent> | RaiseAction<AnyEventObject>;
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 TransitionConfigTargetShortcut<TContext, TEvent extends EventObject> = string | undefined | StateNode<TContext, any, TEvent>;
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'] | NullEvent['type'] | '*']?: SingleOrArray<TransitionConfigTargetShortcut<TContext, TEvent> | (TransitionConfig<TContext, K extends TEvent['type'] ? Extract<TEvent, {
181
+ [K in TEvent['type']]?: TransitionConfigOrTarget<TContext, TEvent extends {
177
182
  type: K;
178
- }> : EventObject> & {
179
- event?: undefined;
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'] | NullEvent['type'] | '*']: TransitionConfig<TContext, K extends TEvent['type'] ? Extract<TEvent, {
190
+ [K in TEvent['type']]: TransitionConfig<TContext, TEvent extends {
184
191
  type: K;
185
- }> : EventObject> & {
192
+ } ? TEvent : never> & {
186
193
  event: K;
187
194
  };
188
- }[TEvent['type'] | NullEvent['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
- onEntry: Array<ActionObject<TContext, TEvent>>;
355
- onExit: Array<ActionObject<TContext, TEvent>>;
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: TEvent | SendExpr<TContext, TEvent>;
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<TEvent>;
540
- event: TEvent;
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, 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, Guard, Subscribable, StateMachine, ConditionPredicate, SCXML, StateLike, EventData, TransitionConfig, TransitionConfigTargetShortcut, NullEvent, SingleOrArray } 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 } 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> | TransitionConfigTargetShortcut<TContext, TEvent>>): Array<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
- ('value' in state &&
112
- 'context' in state &&
113
- 'event' in state &&
114
- '_event' in state));
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.7.8",
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.7.2",
69
+ "typescript": "^3.8.3",
70
70
  "xml-js": "^1.6.11"
71
71
  }
72
72
  }