xstate 4.9.1 → 4.13.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +206 -0
  2. package/README.md +2 -2
  3. package/dist/xstate.interpreter.js +1 -1
  4. package/dist/xstate.js +1 -1
  5. package/dist/xstate.web.js +2 -2
  6. package/es/Actor.d.ts +5 -3
  7. package/es/Actor.js +26 -4
  8. package/es/Machine.d.ts +4 -1
  9. package/es/State.d.ts +13 -5
  10. package/es/StateNode.d.ts +8 -5
  11. package/es/StateNode.js +68 -47
  12. package/es/actions.d.ts +12 -10
  13. package/es/actions.js +7 -9
  14. package/es/interpreter.d.ts +29 -20
  15. package/es/interpreter.js +31 -61
  16. package/es/invokeUtils.d.ts +7 -0
  17. package/es/invokeUtils.js +39 -0
  18. package/es/serviceScope.d.ts +10 -0
  19. package/es/serviceScope.js +18 -0
  20. package/es/stateUtils.d.ts +1 -1
  21. package/es/types.d.ts +59 -37
  22. package/es/utils.d.ts +4 -3
  23. package/es/utils.js +12 -3
  24. package/lib/Actor.d.ts +5 -3
  25. package/lib/Actor.js +24 -3
  26. package/lib/Machine.d.ts +4 -1
  27. package/lib/Machine.js +1 -0
  28. package/lib/SimulatedClock.js +1 -0
  29. package/lib/State.d.ts +13 -5
  30. package/lib/State.js +1 -0
  31. package/lib/StateNode.d.ts +8 -5
  32. package/lib/StateNode.js +73 -47
  33. package/lib/actionTypes.js +1 -0
  34. package/lib/actions.d.ts +12 -10
  35. package/lib/actions.js +6 -17
  36. package/lib/constants.js +1 -0
  37. package/lib/devTools.js +1 -0
  38. package/lib/each.js +1 -0
  39. package/lib/environment.js +1 -0
  40. package/lib/index.js +28 -20
  41. package/lib/interpreter.d.ts +29 -20
  42. package/lib/interpreter.js +32 -51
  43. package/lib/invokeUtils.d.ts +7 -0
  44. package/lib/invokeUtils.js +42 -0
  45. package/lib/json.js +1 -0
  46. package/lib/mapState.js +1 -0
  47. package/lib/match.js +1 -0
  48. package/lib/patterns.js +1 -0
  49. package/lib/registry.js +1 -0
  50. package/lib/scheduler.js +1 -0
  51. package/lib/scxml.js +1 -0
  52. package/lib/serviceScope.d.ts +10 -0
  53. package/lib/serviceScope.js +15 -0
  54. package/lib/stateUtils.d.ts +1 -1
  55. package/lib/stateUtils.js +1 -0
  56. package/lib/types.d.ts +59 -37
  57. package/lib/types.js +1 -0
  58. package/lib/utils.d.ts +4 -3
  59. package/lib/utils.js +9 -2
  60. package/package.json +4 -4
package/lib/actions.js CHANGED
@@ -10,17 +10,6 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
- var __rest = (this && this.__rest) || function (s, e) {
14
- var t = {};
15
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
- t[p] = s[p];
17
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
- t[p[i]] = s[p[i]];
21
- }
22
- return t;
23
- };
24
13
  var __read = (this && this.__read) || function (o, n) {
25
14
  var m = typeof Symbol === "function" && o[Symbol.iterator];
26
15
  if (!m) return o;
@@ -38,11 +27,11 @@ var __read = (this && this.__read) || function (o, n) {
38
27
  return ar;
39
28
  };
40
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.resolveActions = exports.choose = exports.escalate = exports.forwardTo = exports.pure = exports.error = exports.doneInvoke = exports.done = exports.after = exports.isActionObject = exports.assign = exports.stop = exports.start = exports.cancel = exports.resolveLog = exports.log = exports.respond = exports.sendUpdate = exports.sendParent = exports.resolveSend = exports.send = exports.resolveRaise = exports.raise = exports.toActivityDefinition = exports.toActionObjects = exports.toActionObject = exports.getActionFunction = exports.initEvent = exports.actionTypes = void 0;
41
31
  var types_1 = require("./types");
42
32
  var actionTypes = require("./actionTypes");
43
33
  exports.actionTypes = actionTypes;
44
34
  var utils_1 = require("./utils");
45
- var utils_2 = require("./utils");
46
35
  var environment_1 = require("./environment");
47
36
  exports.initEvent = utils_1.toSCXMLEvent({ type: actionTypes.init });
48
37
  function getActionFunction(actionType, actionFunctionMap) {
@@ -81,8 +70,8 @@ function toActionObject(action, actionFunctionMap) {
81
70
  actionObject = __assign(__assign({}, action), { exec: exec });
82
71
  }
83
72
  else if (exec) {
84
- var type = action.type, other = __rest(action, ["type"]);
85
- actionObject = __assign(__assign({ type: type }, exec), other);
73
+ var actionType = exec.type || action.type;
74
+ actionObject = __assign(__assign(__assign({}, exec), action), { type: actionType });
86
75
  }
87
76
  else {
88
77
  actionObject = action;
@@ -100,7 +89,7 @@ exports.toActionObjects = function (action, actionFunctionMap) {
100
89
  if (!action) {
101
90
  return [];
102
91
  }
103
- var actions = utils_2.isArray(action) ? action : [action];
92
+ var actions = utils_1.isArray(action) ? action : [action];
104
93
  return actions.map(function (subAction) {
105
94
  return toActionObject(subAction, actionFunctionMap);
106
95
  });
@@ -426,7 +415,7 @@ function resolveActions(machine, currentState, currentContext, _event, actions)
426
415
  if (!matchedActions) {
427
416
  return [];
428
417
  }
429
- var resolved = resolveActions(machine, currentState, updatedContext, _event, exports.toActionObjects(utils_1.toArray(matchedActions)));
418
+ var resolved = resolveActions(machine, currentState, updatedContext, _event, exports.toActionObjects(utils_1.toArray(matchedActions), machine.options.actions));
430
419
  updatedContext = resolved[1];
431
420
  return resolved[0];
432
421
  }
@@ -435,7 +424,7 @@ function resolveActions(machine, currentState, currentContext, _event, actions)
435
424
  if (!matchedActions) {
436
425
  return [];
437
426
  }
438
- var resolved = resolveActions(machine, currentState, updatedContext, _event, exports.toActionObjects(utils_1.toArray(matchedActions)));
427
+ var resolved = resolveActions(machine, currentState, updatedContext, _event, exports.toActionObjects(utils_1.toArray(matchedActions), machine.options.actions));
439
428
  updatedContext = resolved[1];
440
429
  return resolved[0];
441
430
  }
package/lib/constants.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TARGETLESS_KEY = exports.DEFAULT_GUARD_TYPE = exports.EMPTY_ACTIVITY_MAP = exports.STATE_DELIMITER = void 0;
3
4
  exports.STATE_DELIMITER = '.';
4
5
  exports.EMPTY_ACTIVITY_MAP = {};
5
6
  exports.DEFAULT_GUARD_TYPE = 'xstate.guard';
package/lib/devTools.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerService = void 0;
3
4
  var environment_1 = require("./environment");
4
5
  function getDevTools() {
5
6
  var w = window;
package/lib/each.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.each = void 0;
3
4
  function each(collection, item, indexOrActions, maybeActions) {
4
5
  var actions = maybeActions || indexOrActions;
5
6
  var index = maybeActions ? indexOrActions : undefined;
@@ -1,3 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IS_PRODUCTION = void 0;
3
4
  exports.IS_PRODUCTION = process.env.NODE_ENV === 'production';
package/lib/index.js CHANGED
@@ -1,32 +1,40 @@
1
1
  "use strict";
2
- function __export(m) {
3
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4
- }
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
11
+ };
5
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.createMachine = exports.doneInvoke = exports.spawn = exports.matchState = exports.Interpreter = exports.interpret = exports.forwardTo = exports.sendUpdate = exports.sendParent = exports.send = exports.assign = exports.actions = exports.mapState = exports.matchesState = exports.State = exports.StateNode = exports.Machine = void 0;
6
14
  var utils_1 = require("./utils");
7
- exports.matchesState = utils_1.matchesState;
15
+ Object.defineProperty(exports, "matchesState", { enumerable: true, get: function () { return utils_1.matchesState; } });
8
16
  var mapState_1 = require("./mapState");
9
- exports.mapState = mapState_1.mapState;
17
+ Object.defineProperty(exports, "mapState", { enumerable: true, get: function () { return mapState_1.mapState; } });
10
18
  var StateNode_1 = require("./StateNode");
11
- exports.StateNode = StateNode_1.StateNode;
19
+ Object.defineProperty(exports, "StateNode", { enumerable: true, get: function () { return StateNode_1.StateNode; } });
12
20
  var State_1 = require("./State");
13
- exports.State = State_1.State;
21
+ Object.defineProperty(exports, "State", { enumerable: true, get: function () { return State_1.State; } });
14
22
  var Machine_1 = require("./Machine");
15
- exports.Machine = Machine_1.Machine;
16
- exports.createMachine = Machine_1.createMachine;
23
+ Object.defineProperty(exports, "Machine", { enumerable: true, get: function () { return Machine_1.Machine; } });
24
+ Object.defineProperty(exports, "createMachine", { enumerable: true, get: function () { return Machine_1.createMachine; } });
17
25
  var actions_1 = require("./actions");
18
- exports.send = actions_1.send;
19
- exports.sendParent = actions_1.sendParent;
20
- exports.sendUpdate = actions_1.sendUpdate;
21
- exports.assign = actions_1.assign;
22
- exports.doneInvoke = actions_1.doneInvoke;
23
- exports.forwardTo = actions_1.forwardTo;
26
+ Object.defineProperty(exports, "send", { enumerable: true, get: function () { return actions_1.send; } });
27
+ Object.defineProperty(exports, "sendParent", { enumerable: true, get: function () { return actions_1.sendParent; } });
28
+ Object.defineProperty(exports, "sendUpdate", { enumerable: true, get: function () { return actions_1.sendUpdate; } });
29
+ Object.defineProperty(exports, "assign", { enumerable: true, get: function () { return actions_1.assign; } });
30
+ Object.defineProperty(exports, "doneInvoke", { enumerable: true, get: function () { return actions_1.doneInvoke; } });
31
+ Object.defineProperty(exports, "forwardTo", { enumerable: true, get: function () { return actions_1.forwardTo; } });
24
32
  var interpreter_1 = require("./interpreter");
25
- exports.interpret = interpreter_1.interpret;
26
- exports.Interpreter = interpreter_1.Interpreter;
27
- exports.spawn = interpreter_1.spawn;
33
+ Object.defineProperty(exports, "interpret", { enumerable: true, get: function () { return interpreter_1.interpret; } });
34
+ Object.defineProperty(exports, "Interpreter", { enumerable: true, get: function () { return interpreter_1.Interpreter; } });
35
+ Object.defineProperty(exports, "spawn", { enumerable: true, get: function () { return interpreter_1.spawn; } });
28
36
  var match_1 = require("./match");
29
- exports.matchState = match_1.matchState;
37
+ Object.defineProperty(exports, "matchState", { enumerable: true, get: function () { return match_1.matchState; } });
30
38
  var actions = {
31
39
  raise: actions_1.raise,
32
40
  send: actions_1.send,
@@ -46,4 +54,4 @@ var actions = {
46
54
  pure: actions_1.pure
47
55
  };
48
56
  exports.actions = actions;
49
- __export(require("./types"));
57
+ __exportStar(require("./types"), exports);
@@ -1,7 +1,10 @@
1
- import { StateMachine, Event, EventObject, DefaultContext, StateSchema, StateValue, InterpreterOptions, DoneEvent, Unsubscribable, MachineOptions, SCXML, EventData, Observer, Spawnable, Typestate } from './types';
1
+ import { StateMachine, Event, EventObject, DefaultContext, StateSchema, StateValue, InterpreterOptions, SingleOrArray, DoneEvent, Unsubscribable, MachineOptions, SCXML, EventData, Observer, Spawnable, Typestate } from './types';
2
2
  import { State } from './State';
3
3
  import { Actor } from './Actor';
4
- export declare type StateListener<TContext, TEvent extends EventObject, TTypestate extends Typestate<TContext> = any> = (state: State<TContext, TEvent, any, TTypestate>, event: TEvent) => void;
4
+ export declare type StateListener<TContext, TEvent extends EventObject, TStateSchema extends StateSchema<TContext> = any, TTypestate extends Typestate<TContext> = {
5
+ value: any;
6
+ context: TContext;
7
+ }> = (state: State<TContext, TEvent, TStateSchema, TTypestate>, event: TEvent) => void;
5
8
  export declare type ContextListener<TContext = DefaultContext> = (context: TContext, prevContext: TContext | undefined) => void;
6
9
  export declare type EventListener<TEvent extends EventObject = EventObject> = (event: TEvent) => void;
7
10
  export declare type Listener = () => void;
@@ -14,7 +17,10 @@ interface SpawnOptions {
14
17
  autoForward?: boolean;
15
18
  sync?: boolean;
16
19
  }
17
- export declare class Interpreter<TContext, TStateSchema extends StateSchema = any, TEvent extends EventObject = EventObject, TTypestate extends Typestate<TContext> = any> implements Actor<State<TContext, TEvent>, TEvent> {
20
+ export declare class Interpreter<TContext, TStateSchema extends StateSchema = any, TEvent extends EventObject = EventObject, TTypestate extends Typestate<TContext> = {
21
+ value: any;
22
+ context: TContext;
23
+ }> implements Actor<State<TContext, TEvent, TStateSchema, TTypestate>, TEvent> {
18
24
  machine: StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
19
25
  /**
20
26
  * The default interpreter options:
@@ -63,8 +69,8 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
63
69
  * @param options Interpreter options
64
70
  */
65
71
  constructor(machine: StateMachine<TContext, TStateSchema, TEvent, TTypestate>, options?: Partial<InterpreterOptions>);
66
- get initialState(): State<TContext, TEvent>;
67
- get state(): State<TContext, TEvent, any, TTypestate>;
72
+ get initialState(): State<TContext, TEvent, TStateSchema, TTypestate>;
73
+ get state(): State<TContext, TEvent, TStateSchema, TTypestate>;
68
74
  static interpret: typeof interpret;
69
75
  /**
70
76
  * Executes the actions of the given state, with that state's `context` and `event`.
@@ -72,56 +78,56 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
72
78
  * @param state The state whose actions will be executed
73
79
  * @param actionsConfig The action implementations to use
74
80
  */
75
- execute(state: State<TContext, TEvent>, actionsConfig?: MachineOptions<TContext, TEvent>['actions']): void;
81
+ execute(state: State<TContext, TEvent, TStateSchema, TTypestate>, actionsConfig?: MachineOptions<TContext, TEvent>['actions']): void;
76
82
  private update;
77
- onTransition(listener: StateListener<TContext, TEvent, TTypestate>): this;
83
+ onTransition(listener: StateListener<TContext, TEvent, TStateSchema, TTypestate>): this;
78
84
  subscribe(observer: Observer<State<TContext, TEvent, any, TTypestate>>): Unsubscribable;
79
85
  subscribe(nextListener?: (state: State<TContext, TEvent, any, TTypestate>) => void, errorListener?: (error: any) => void, completeListener?: () => void): Unsubscribable;
80
86
  /**
81
87
  * Adds an event listener that is notified whenever an event is sent to the running interpreter.
82
88
  * @param listener The event listener
83
89
  */
84
- onEvent(listener: EventListener): Interpreter<TContext, TStateSchema, TEvent>;
90
+ onEvent(listener: EventListener): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
85
91
  /**
86
92
  * Adds an event listener that is notified whenever a `send` event occurs.
87
93
  * @param listener The event listener
88
94
  */
89
- onSend(listener: EventListener): Interpreter<TContext, TStateSchema, TEvent>;
95
+ onSend(listener: EventListener): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
90
96
  /**
91
97
  * Adds a context listener that is notified whenever the state context changes.
92
98
  * @param listener The context listener
93
99
  */
94
- onChange(listener: ContextListener<TContext>): Interpreter<TContext, TStateSchema, TEvent>;
100
+ onChange(listener: ContextListener<TContext>): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
95
101
  /**
96
102
  * Adds a listener that is notified when the machine is stopped.
97
103
  * @param listener The listener
98
104
  */
99
- onStop(listener: Listener): Interpreter<TContext, TStateSchema, TEvent>;
105
+ onStop(listener: Listener): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
100
106
  /**
101
107
  * Adds a state listener that is notified when the statechart has reached its final state.
102
108
  * @param listener The state listener
103
109
  */
104
- onDone(listener: EventListener<DoneEvent>): Interpreter<TContext, TStateSchema, TEvent>;
110
+ onDone(listener: EventListener<DoneEvent>): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
105
111
  /**
106
112
  * Removes a listener.
107
113
  * @param listener The listener to remove
108
114
  */
109
- off(listener: (...args: any[]) => void): Interpreter<TContext, TStateSchema, TEvent>;
115
+ off(listener: (...args: any[]) => void): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
110
116
  /**
111
117
  * Alias for Interpreter.prototype.start
112
118
  */
113
- init: (initialState?: string | import("./types").StateValueMap | State<TContext, TEvent, any, any> | undefined) => Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
119
+ init: (initialState?: string | import("./types").StateValueMap | State<TContext, TEvent, TStateSchema, TTypestate> | undefined) => Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
114
120
  /**
115
121
  * Starts the interpreter from the given state, or the initial state.
116
122
  * @param initialState The state to start the statechart from
117
123
  */
118
- start(initialState?: State<TContext, TEvent> | StateValue): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
124
+ start(initialState?: State<TContext, TEvent, TStateSchema, TTypestate> | StateValue): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
119
125
  /**
120
126
  * Stops the interpreter and unsubscribe all listeners.
121
127
  *
122
128
  * This will also notify the `onStop` listeners.
123
129
  */
124
- stop(): Interpreter<TContext, TStateSchema, TEvent>;
130
+ stop(): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
125
131
  /**
126
132
  * Sends an event to the running interpreter to trigger a transition.
127
133
  *
@@ -131,14 +137,14 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
131
137
  *
132
138
  * @param event The event(s) to send
133
139
  */
134
- send: (event: TEvent | TEvent["type"] | Event<TEvent>[] | SCXML.Event<TEvent>, payload?: EventData | undefined) => State<TContext, TEvent, any, any>;
140
+ send: (event: SingleOrArray<Event<TEvent>> | SCXML.Event<TEvent>, payload?: EventData | undefined) => State<TContext, TEvent, TStateSchema, TTypestate>;
135
141
  private batch;
136
142
  /**
137
143
  * Returns a send function bound to this interpreter instance.
138
144
  *
139
145
  * @param event The event to be sent by the sender.
140
146
  */
141
- sender(event: Event<TEvent>): () => State<TContext, TEvent>;
147
+ sender(event: Event<TEvent>): () => State<TContext, TEvent, TStateSchema, TTypestate>;
142
148
  private sendTo;
143
149
  /**
144
150
  * Returns the next state given the interpreter's current state and the event.
@@ -147,7 +153,7 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
147
153
  *
148
154
  * @param event The event to determine the next state
149
155
  */
150
- nextState(event: Event<TEvent> | SCXML.Event<TEvent>): State<TContext, TEvent>;
156
+ nextState(event: Event<TEvent> | SCXML.Event<TEvent>): State<TContext, TEvent, TStateSchema, TTypestate>;
151
157
  private forward;
152
158
  private defer;
153
159
  private cancel;
@@ -179,6 +185,9 @@ export declare function spawn(entity: Spawnable, nameOrOptions?: string | SpawnO
179
185
  * @param machine The machine to interpret
180
186
  * @param options Interpreter options
181
187
  */
182
- export declare function interpret<TContext = DefaultContext, TStateSchema extends StateSchema = any, TEvent extends EventObject = EventObject, TTypestate extends Typestate<TContext> = any>(machine: StateMachine<TContext, TStateSchema, TEvent, TTypestate>, options?: Partial<InterpreterOptions>): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
188
+ export declare function interpret<TContext = DefaultContext, TStateSchema extends StateSchema = any, TEvent extends EventObject = EventObject, TTypestate extends Typestate<TContext> = {
189
+ value: any;
190
+ context: TContext;
191
+ }>(machine: StateMachine<TContext, TStateSchema, TEvent, TTypestate>, options?: Partial<InterpreterOptions>): Interpreter<TContext, TStateSchema, TEvent, TTypestate>;
183
192
  export {};
184
193
  //# sourceMappingURL=interpreter.d.ts.map
@@ -42,6 +42,7 @@ var __spread = (this && this.__spread) || function () {
42
42
  return ar;
43
43
  };
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.interpret = exports.spawn = exports.Interpreter = void 0;
45
46
  var types_1 = require("./types");
46
47
  var State_1 = require("./State");
47
48
  var actionTypes = require("./actionTypes");
@@ -53,22 +54,8 @@ var Actor_1 = require("./Actor");
53
54
  var stateUtils_1 = require("./stateUtils");
54
55
  var registry_1 = require("./registry");
55
56
  var devTools_1 = require("./devTools");
57
+ var serviceScope = require("./serviceScope");
56
58
  var DEFAULT_SPAWN_OPTIONS = { sync: false, autoForward: false };
57
- /**
58
- * Maintains a stack of the current service in scope.
59
- * This is used to provide the correct service to spawn().
60
- *
61
- * @private
62
- */
63
- var withServiceScope = (function () {
64
- var serviceStack = [];
65
- return function (service, fn) {
66
- service && serviceStack.push(service);
67
- var result = fn(service || serviceStack[serviceStack.length - 1]);
68
- service && serviceStack.pop();
69
- return result;
70
- };
71
- })();
72
59
  var InterpreterStatus;
73
60
  (function (InterpreterStatus) {
74
61
  InterpreterStatus[InterpreterStatus["NotStarted"] = 0] = "NotStarted";
@@ -191,12 +178,12 @@ var Interpreter = /** @class */ (function () {
191
178
  if (this._initialState) {
192
179
  return this._initialState;
193
180
  }
194
- return withServiceScope(this, function () {
181
+ return serviceScope.provide(this, function () {
195
182
  _this._initialState = _this.machine.initialState;
196
183
  return _this._initialState;
197
184
  });
198
185
  },
199
- enumerable: true,
186
+ enumerable: false,
200
187
  configurable: true
201
188
  });
202
189
  Object.defineProperty(Interpreter.prototype, "state", {
@@ -206,7 +193,7 @@ var Interpreter = /** @class */ (function () {
206
193
  }
207
194
  return this._state;
208
195
  },
209
- enumerable: true,
196
+ enumerable: false,
210
197
  configurable: true
211
198
  });
212
199
  /**
@@ -292,8 +279,8 @@ var Interpreter = /** @class */ (function () {
292
279
  if (this.state.configuration && isDone) {
293
280
  // get final child state node
294
281
  var finalChildStateNode = state.configuration.find(function (sn) { return sn.type === 'final' && sn.parent === _this.machine; });
295
- var doneData = finalChildStateNode && finalChildStateNode.data
296
- ? utils_1.mapContext(finalChildStateNode.data, state.context, _event)
282
+ var doneData = finalChildStateNode && finalChildStateNode.doneData
283
+ ? utils_1.mapContext(finalChildStateNode.doneData, state.context, _event)
297
284
  : undefined;
298
285
  try {
299
286
  for (var _l = __values(this.doneListeners), _m = _l.next(); !_m.done; _m = _l.next()) {
@@ -325,9 +312,8 @@ var Interpreter = /** @class */ (function () {
325
312
  }
326
313
  return this;
327
314
  };
328
- Interpreter.prototype.subscribe = function (nextListenerOrObserver,
329
- // @ts-ignore
330
- errorListener, completeListener) {
315
+ Interpreter.prototype.subscribe = function (nextListenerOrObserver, _, // TODO: error listener
316
+ completeListener) {
331
317
  var _this = this;
332
318
  if (!nextListenerOrObserver) {
333
319
  return { unsubscribe: function () { return void 0; } };
@@ -425,7 +411,7 @@ var Interpreter = /** @class */ (function () {
425
411
  this._status = InterpreterStatus.Running;
426
412
  var resolvedState = initialState === undefined
427
413
  ? this.initialState
428
- : withServiceScope(this, function () {
414
+ : serviceScope.provide(this, function () {
429
415
  return State_1.isState(initialState)
430
416
  ? _this.machine.resolveState(initialState)
431
417
  : _this.machine.resolveState(State_1.State.from(initialState, _this.machine.context));
@@ -547,7 +533,7 @@ var Interpreter = /** @class */ (function () {
547
533
  var _loop_1 = function (event_1) {
548
534
  var _event = utils_1.toSCXMLEvent(event_1);
549
535
  _this.forward(_event);
550
- nextState = withServiceScope(_this, function () {
536
+ nextState = serviceScope.provide(_this, function () {
551
537
  return _this.machine.transition(nextState, _event);
552
538
  });
553
539
  batchedActions.push.apply(batchedActions, __spread(nextState.actions.map(function (a) {
@@ -595,7 +581,7 @@ var Interpreter = /** @class */ (function () {
595
581
  !this.state.nextEvents.some(function (nextEvent) { return nextEvent.indexOf(actionTypes.errorPlatform) === 0; })) {
596
582
  throw _event.data.data;
597
583
  }
598
- var nextState = withServiceScope(this, function () {
584
+ var nextState = serviceScope.provide(this, function () {
599
585
  return _this.machine.transition(_this.state, _event);
600
586
  });
601
587
  return nextState;
@@ -636,8 +622,10 @@ var Interpreter = /** @class */ (function () {
636
622
  delete this.delayedEventsMap[sendId];
637
623
  };
638
624
  Interpreter.prototype.exec = function (action, state, actionFunctionMap) {
625
+ if (actionFunctionMap === void 0) { actionFunctionMap = this.machine
626
+ .options.actions; }
639
627
  var context = state.context, _event = state._event;
640
- var actionOrExec = actions_1.getActionFunction(action.type, actionFunctionMap) || action.exec;
628
+ var actionOrExec = action.exec || actions_1.getActionFunction(action.type, actionFunctionMap);
641
629
  var exec = utils_1.isFunction(actionOrExec)
642
630
  ? actionOrExec
643
631
  : actionOrExec
@@ -686,14 +674,14 @@ var Interpreter = /** @class */ (function () {
686
674
  // If the activity will be stopped right after it's started
687
675
  // (such as in transient states)
688
676
  // don't bother starting the activity.
689
- if (!this.state.activities[activity.type]) {
677
+ if (!this.state.activities[activity.id || activity.type]) {
690
678
  break;
691
679
  }
692
680
  // Invoked services
693
681
  if (activity.type === types_1.ActionTypes.Invoke) {
694
- var serviceCreator = this
695
- .machine.options.services
696
- ? this.machine.options.services[activity.src]
682
+ var invokeSource = utils_1.toInvokeSource(activity.src);
683
+ var serviceCreator = this.machine.options.services
684
+ ? this.machine.options.services[invokeSource.type]
697
685
  : undefined;
698
686
  var id = activity.id, data = activity.data;
699
687
  if (!environment_1.IS_PRODUCTION) {
@@ -712,8 +700,14 @@ var Interpreter = /** @class */ (function () {
712
700
  }
713
701
  return;
714
702
  }
703
+ var resolvedData = data
704
+ ? utils_1.mapContext(data, context, _event)
705
+ : undefined;
715
706
  var source = utils_1.isFunction(serviceCreator)
716
- ? serviceCreator(context, _event.data)
707
+ ? serviceCreator(context, _event.data, {
708
+ data: resolvedData,
709
+ src: invokeSource
710
+ })
717
711
  : serviceCreator;
718
712
  if (utils_1.isPromiseLike(source)) {
719
713
  this.state.children[id] = this.spawnPromise(Promise.resolve(source), id);
@@ -726,9 +720,7 @@ var Interpreter = /** @class */ (function () {
726
720
  }
727
721
  else if (utils_1.isMachine(source)) {
728
722
  // TODO: try/catch here
729
- this.state.children[id] = this.spawnMachine(data
730
- ? source.withContext(utils_1.mapContext(data, context, _event))
731
- : source, {
723
+ this.state.children[id] = this.spawnMachine(resolvedData ? source.withContext(resolvedData) : source, {
732
724
  id: id,
733
725
  autoForward: autoForward
734
726
  });
@@ -1044,23 +1036,11 @@ var Interpreter = /** @class */ (function () {
1044
1036
  },
1045
1037
  logger: global.console.log.bind(console),
1046
1038
  devTools: false
1047
- }); })(typeof window === 'undefined' ? global : window);
1039
+ }); })(typeof self !== 'undefined' ? self : global);
1048
1040
  Interpreter.interpret = interpret;
1049
1041
  return Interpreter;
1050
1042
  }());
1051
1043
  exports.Interpreter = Interpreter;
1052
- var createNullActor = function (name) {
1053
- if (name === void 0) { name = 'null'; }
1054
- return ({
1055
- id: name,
1056
- send: function () { return void 0; },
1057
- subscribe: function () {
1058
- // tslint:disable-next-line:no-empty
1059
- return { unsubscribe: function () { } };
1060
- },
1061
- toJSON: function () { return ({ id: name }); }
1062
- });
1063
- };
1064
1044
  var resolveSpawnOptions = function (nameOrOptions) {
1065
1045
  if (utils_1.isString(nameOrOptions)) {
1066
1046
  return __assign(__assign({}, DEFAULT_SPAWN_OPTIONS), { name: nameOrOptions });
@@ -1069,15 +1049,16 @@ var resolveSpawnOptions = function (nameOrOptions) {
1069
1049
  };
1070
1050
  function spawn(entity, nameOrOptions) {
1071
1051
  var resolvedOptions = resolveSpawnOptions(nameOrOptions);
1072
- return withServiceScope(undefined, function (service) {
1052
+ return serviceScope.consume(function (service) {
1073
1053
  if (!environment_1.IS_PRODUCTION) {
1074
- utils_1.warn(!!service, "Attempted to spawn an Actor (ID: \"" + (utils_1.isMachine(entity) ? entity.id : 'undefined') + "\") outside of a service. This will have no effect.");
1054
+ var isLazyEntity = utils_1.isMachine(entity) || utils_1.isFunction(entity);
1055
+ utils_1.warn(!!service || isLazyEntity, "Attempted to spawn an Actor (ID: \"" + (utils_1.isMachine(entity) ? entity.id : 'undefined') + "\") outside of a service. This will have no effect.");
1075
1056
  }
1076
1057
  if (service) {
1077
1058
  return service.spawn(entity, resolvedOptions.name, resolvedOptions);
1078
1059
  }
1079
1060
  else {
1080
- return createNullActor(resolvedOptions.name);
1061
+ return Actor_1.createDeferredActor(entity, resolvedOptions.name);
1081
1062
  }
1082
1063
  });
1083
1064
  }
@@ -0,0 +1,7 @@
1
+ import { EventObject, InvokeConfig, InvokeDefinition, InvokeSourceDefinition } from './types';
2
+ export declare function toInvokeSource(src: string | InvokeSourceDefinition): InvokeSourceDefinition;
3
+ export declare function toInvokeDefinition<TContext, TEvent extends EventObject>(invokeConfig: InvokeConfig<TContext, TEvent> & {
4
+ src: string | InvokeSourceDefinition;
5
+ id: string;
6
+ }): InvokeDefinition<TContext, TEvent>;
7
+ //# sourceMappingURL=invokeUtils.d.ts.map
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.toInvokeDefinition = exports.toInvokeSource = void 0;
26
+ var actions_1 = require("./actions");
27
+ function toInvokeSource(src) {
28
+ if (typeof src === 'string') {
29
+ var simpleSrc = { type: src };
30
+ simpleSrc.toString = function () { return src; }; // v4 compat - TODO: remove in v5
31
+ return simpleSrc;
32
+ }
33
+ return src;
34
+ }
35
+ exports.toInvokeSource = toInvokeSource;
36
+ function toInvokeDefinition(invokeConfig) {
37
+ return __assign(__assign({ type: actions_1.actionTypes.invoke }, invokeConfig), { toJSON: function () {
38
+ var onDone = invokeConfig.onDone, onError = invokeConfig.onError, invokeDef = __rest(invokeConfig, ["onDone", "onError"]);
39
+ return __assign(__assign({}, invokeDef), { type: actions_1.actionTypes.invoke, src: toInvokeSource(invokeConfig.src) });
40
+ } });
41
+ }
42
+ exports.toInvokeDefinition = toInvokeDefinition;
package/lib/json.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jsonify = exports.parse = exports.stringify = exports.machineToJSON = exports.stringifyFunction = void 0;
3
4
  var utils_1 = require("./utils");
4
5
  // tslint:disable-next-line:ban-types
5
6
  function stringifyFunction(fn) {
package/lib/mapState.js CHANGED
@@ -11,6 +11,7 @@ var __values = (this && this.__values) || function(o) {
11
11
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.mapState = void 0;
14
15
  var utils_1 = require("./utils");
15
16
  function mapState(stateMap, stateId) {
16
17
  var e_1, _a;
package/lib/match.js CHANGED
@@ -27,6 +27,7 @@ var __read = (this && this.__read) || function (o, n) {
27
27
  return ar;
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.matchState = void 0;
30
31
  var State_1 = require("./State");
31
32
  function matchState(state, patterns, defaultValue) {
32
33
  var e_1, _a;
package/lib/patterns.js CHANGED
@@ -11,6 +11,7 @@ var __assign = (this && this.__assign) || function () {
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.sequence = exports.toggle = void 0;
14
15
  var utils_1 = require("./utils");
15
16
  function toggle(onState, offState, eventType) {
16
17
  var _a, _b, _c;
package/lib/registry.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registry = void 0;
3
4
  var children = new Map();
4
5
  var sessionIdIndex = 0;
5
6
  exports.registry = {
package/lib/scheduler.js CHANGED
@@ -11,6 +11,7 @@ var __assign = (this && this.__assign) || function () {
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.Scheduler = void 0;
14
15
  var defaultOptions = {
15
16
  deferEvents: false
16
17
  };
package/lib/scxml.js CHANGED
@@ -42,6 +42,7 @@ var __values = (this && this.__values) || function(o) {
42
42
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
43
43
  };
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.toMachine = void 0;
45
46
  var xml_js_1 = require("xml-js");
46
47
  var index_1 = require("./index");
47
48
  var utils_1 = require("./utils");
@@ -0,0 +1,10 @@
1
+ import { Interpreter } from './interpreter';
2
+ export declare const provide: <T, TService extends Interpreter<any, any, any, {
3
+ value: any;
4
+ context: any;
5
+ }>>(service: TService | undefined, fn: (service: TService | undefined) => T) => T;
6
+ export declare const consume: <T, TService extends Interpreter<any, any, any, {
7
+ value: any;
8
+ context: any;
9
+ }>>(fn: (service: TService) => T) => T;
10
+ //# sourceMappingURL=serviceScope.d.ts.map