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.
- package/CHANGELOG.md +206 -0
- package/README.md +2 -2
- 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 +5 -3
- package/es/Actor.js +26 -4
- package/es/Machine.d.ts +4 -1
- package/es/State.d.ts +13 -5
- package/es/StateNode.d.ts +8 -5
- package/es/StateNode.js +68 -47
- package/es/actions.d.ts +12 -10
- package/es/actions.js +7 -9
- package/es/interpreter.d.ts +29 -20
- package/es/interpreter.js +31 -61
- package/es/invokeUtils.d.ts +7 -0
- package/es/invokeUtils.js +39 -0
- package/es/serviceScope.d.ts +10 -0
- package/es/serviceScope.js +18 -0
- package/es/stateUtils.d.ts +1 -1
- package/es/types.d.ts +59 -37
- package/es/utils.d.ts +4 -3
- package/es/utils.js +12 -3
- package/lib/Actor.d.ts +5 -3
- package/lib/Actor.js +24 -3
- package/lib/Machine.d.ts +4 -1
- package/lib/Machine.js +1 -0
- package/lib/SimulatedClock.js +1 -0
- package/lib/State.d.ts +13 -5
- package/lib/State.js +1 -0
- package/lib/StateNode.d.ts +8 -5
- package/lib/StateNode.js +73 -47
- package/lib/actionTypes.js +1 -0
- package/lib/actions.d.ts +12 -10
- package/lib/actions.js +6 -17
- package/lib/constants.js +1 -0
- package/lib/devTools.js +1 -0
- package/lib/each.js +1 -0
- package/lib/environment.js +1 -0
- package/lib/index.js +28 -20
- package/lib/interpreter.d.ts +29 -20
- package/lib/interpreter.js +32 -51
- package/lib/invokeUtils.d.ts +7 -0
- package/lib/invokeUtils.js +42 -0
- package/lib/json.js +1 -0
- package/lib/mapState.js +1 -0
- package/lib/match.js +1 -0
- package/lib/patterns.js +1 -0
- package/lib/registry.js +1 -0
- package/lib/scheduler.js +1 -0
- package/lib/scxml.js +1 -0
- package/lib/serviceScope.d.ts +10 -0
- package/lib/serviceScope.js +15 -0
- package/lib/stateUtils.d.ts +1 -1
- package/lib/stateUtils.js +1 -0
- package/lib/types.d.ts +59 -37
- package/lib/types.js +1 -0
- package/lib/utils.d.ts +4 -3
- package/lib/utils.js +9 -2
- package/package.json +4 -4
package/es/interpreter.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { __values, __assign, __spread } from './_virtual/_tslib.js';
|
|
2
2
|
import { IS_PRODUCTION } from './environment.js';
|
|
3
|
-
import { warn, mapContext, isFunction, keys, toSCXMLEvent, isPromiseLike, isObservable, isMachine, reportUnhandledExceptionOnInvocation, symbolObservable, isArray, toEventObject, isString, uniqueId } from './utils.js';
|
|
3
|
+
import { warn, mapContext, isFunction, keys, toSCXMLEvent, toInvokeSource, isPromiseLike, isObservable, isMachine, reportUnhandledExceptionOnInvocation, symbolObservable, isArray, toEventObject, isString, uniqueId } from './utils.js';
|
|
4
4
|
import { ActionTypes, SpecialTargets } from './types.js';
|
|
5
5
|
import { isInFinalState } from './stateUtils.js';
|
|
6
6
|
import { errorPlatform, log, stop, start, cancel, send, update, error as error$1 } from './actionTypes.js';
|
|
7
7
|
import { doneInvoke, initEvent, getActionFunction, error } from './actions.js';
|
|
8
8
|
import { isState, State, bindActionToState } from './State.js';
|
|
9
|
-
import {
|
|
9
|
+
import { provide, consume } from './serviceScope.js';
|
|
10
|
+
import { isActor, createDeferredActor } from './Actor.js';
|
|
10
11
|
import { Scheduler } from './scheduler.js';
|
|
11
12
|
import { registry } from './registry.js';
|
|
12
13
|
import { registerService } from './devTools.js';
|
|
@@ -14,23 +15,6 @@ var DEFAULT_SPAWN_OPTIONS = {
|
|
|
14
15
|
sync: false,
|
|
15
16
|
autoForward: false
|
|
16
17
|
};
|
|
17
|
-
/**
|
|
18
|
-
* Maintains a stack of the current service in scope.
|
|
19
|
-
* This is used to provide the correct service to spawn().
|
|
20
|
-
*
|
|
21
|
-
* @private
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
var withServiceScope = /*#__PURE__*/function () {
|
|
25
|
-
var serviceStack = [];
|
|
26
|
-
return function (service, fn) {
|
|
27
|
-
service && serviceStack.push(service);
|
|
28
|
-
var result = fn(service || serviceStack[serviceStack.length - 1]);
|
|
29
|
-
service && serviceStack.pop();
|
|
30
|
-
return result;
|
|
31
|
-
};
|
|
32
|
-
}();
|
|
33
|
-
|
|
34
18
|
var InterpreterStatus;
|
|
35
19
|
|
|
36
20
|
(function (InterpreterStatus) {
|
|
@@ -184,12 +168,12 @@ function () {
|
|
|
184
168
|
return this._initialState;
|
|
185
169
|
}
|
|
186
170
|
|
|
187
|
-
return
|
|
171
|
+
return provide(this, function () {
|
|
188
172
|
_this._initialState = _this.machine.initialState;
|
|
189
173
|
return _this._initialState;
|
|
190
174
|
});
|
|
191
175
|
},
|
|
192
|
-
enumerable:
|
|
176
|
+
enumerable: false,
|
|
193
177
|
configurable: true
|
|
194
178
|
});
|
|
195
179
|
Object.defineProperty(Interpreter.prototype, "state", {
|
|
@@ -200,7 +184,7 @@ function () {
|
|
|
200
184
|
|
|
201
185
|
return this._state;
|
|
202
186
|
},
|
|
203
|
-
enumerable:
|
|
187
|
+
enumerable: false,
|
|
204
188
|
configurable: true
|
|
205
189
|
});
|
|
206
190
|
/**
|
|
@@ -311,7 +295,7 @@ function () {
|
|
|
311
295
|
var finalChildStateNode = state.configuration.find(function (sn) {
|
|
312
296
|
return sn.type === 'final' && sn.parent === _this.machine;
|
|
313
297
|
});
|
|
314
|
-
var doneData = finalChildStateNode && finalChildStateNode.
|
|
298
|
+
var doneData = finalChildStateNode && finalChildStateNode.doneData ? mapContext(finalChildStateNode.doneData, state.context, _event) : undefined;
|
|
315
299
|
|
|
316
300
|
try {
|
|
317
301
|
for (var _l = __values(this.doneListeners), _m = _l.next(); !_m.done; _m = _l.next()) {
|
|
@@ -351,8 +335,8 @@ function () {
|
|
|
351
335
|
return this;
|
|
352
336
|
};
|
|
353
337
|
|
|
354
|
-
Interpreter.prototype.subscribe = function (nextListenerOrObserver, //
|
|
355
|
-
|
|
338
|
+
Interpreter.prototype.subscribe = function (nextListenerOrObserver, _, // TODO: error listener
|
|
339
|
+
completeListener) {
|
|
356
340
|
var _this = this;
|
|
357
341
|
|
|
358
342
|
if (!nextListenerOrObserver) {
|
|
@@ -472,7 +456,7 @@ function () {
|
|
|
472
456
|
registry.register(this.sessionId, this);
|
|
473
457
|
this.initialized = true;
|
|
474
458
|
this._status = InterpreterStatus.Running;
|
|
475
|
-
var resolvedState = initialState === undefined ? this.initialState :
|
|
459
|
+
var resolvedState = initialState === undefined ? this.initialState : provide(this, function () {
|
|
476
460
|
return isState(initialState) ? _this.machine.resolveState(initialState) : _this.machine.resolveState(State.from(initialState, _this.machine.context));
|
|
477
461
|
});
|
|
478
462
|
|
|
@@ -622,7 +606,7 @@ function () {
|
|
|
622
606
|
|
|
623
607
|
_this.forward(_event);
|
|
624
608
|
|
|
625
|
-
nextState =
|
|
609
|
+
nextState = provide(_this, function () {
|
|
626
610
|
return _this.machine.transition(nextState, _event);
|
|
627
611
|
});
|
|
628
612
|
batchedActions.push.apply(batchedActions, __spread(nextState.actions.map(function (a) {
|
|
@@ -685,7 +669,7 @@ function () {
|
|
|
685
669
|
throw _event.data.data;
|
|
686
670
|
}
|
|
687
671
|
|
|
688
|
-
var nextState =
|
|
672
|
+
var nextState = provide(this, function () {
|
|
689
673
|
return _this.machine.transition(_this.state, _event);
|
|
690
674
|
});
|
|
691
675
|
return nextState;
|
|
@@ -736,9 +720,13 @@ function () {
|
|
|
736
720
|
};
|
|
737
721
|
|
|
738
722
|
Interpreter.prototype.exec = function (action, state, actionFunctionMap) {
|
|
723
|
+
if (actionFunctionMap === void 0) {
|
|
724
|
+
actionFunctionMap = this.machine.options.actions;
|
|
725
|
+
}
|
|
726
|
+
|
|
739
727
|
var context = state.context,
|
|
740
728
|
_event = state._event;
|
|
741
|
-
var actionOrExec = getActionFunction(action.type, actionFunctionMap)
|
|
729
|
+
var actionOrExec = action.exec || getActionFunction(action.type, actionFunctionMap);
|
|
742
730
|
var exec = isFunction(actionOrExec) ? actionOrExec : actionOrExec ? actionOrExec.exec : action.exec;
|
|
743
731
|
|
|
744
732
|
if (exec) {
|
|
@@ -787,13 +775,14 @@ function () {
|
|
|
787
775
|
// (such as in transient states)
|
|
788
776
|
// don't bother starting the activity.
|
|
789
777
|
|
|
790
|
-
if (!this.state.activities[activity.type]) {
|
|
778
|
+
if (!this.state.activities[activity.id || activity.type]) {
|
|
791
779
|
break;
|
|
792
780
|
} // Invoked services
|
|
793
781
|
|
|
794
782
|
|
|
795
783
|
if (activity.type === ActionTypes.Invoke) {
|
|
796
|
-
var
|
|
784
|
+
var invokeSource = toInvokeSource(activity.src);
|
|
785
|
+
var serviceCreator = this.machine.options.services ? this.machine.options.services[invokeSource.type] : undefined;
|
|
797
786
|
var id = activity.id,
|
|
798
787
|
data = activity.data;
|
|
799
788
|
|
|
@@ -813,7 +802,11 @@ function () {
|
|
|
813
802
|
return;
|
|
814
803
|
}
|
|
815
804
|
|
|
816
|
-
var
|
|
805
|
+
var resolvedData = data ? mapContext(data, context, _event) : undefined;
|
|
806
|
+
var source = isFunction(serviceCreator) ? serviceCreator(context, _event.data, {
|
|
807
|
+
data: resolvedData,
|
|
808
|
+
src: invokeSource
|
|
809
|
+
}) : serviceCreator;
|
|
817
810
|
|
|
818
811
|
if (isPromiseLike(source)) {
|
|
819
812
|
this.state.children[id] = this.spawnPromise(Promise.resolve(source), id);
|
|
@@ -823,7 +816,7 @@ function () {
|
|
|
823
816
|
this.state.children[id] = this.spawnObservable(source, id);
|
|
824
817
|
} else if (isMachine(source)) {
|
|
825
818
|
// TODO: try/catch here
|
|
826
|
-
this.state.children[id] = this.spawnMachine(
|
|
819
|
+
this.state.children[id] = this.spawnMachine(resolvedData ? source.withContext(resolvedData) : source, {
|
|
827
820
|
id: id,
|
|
828
821
|
autoForward: autoForward
|
|
829
822
|
});
|
|
@@ -1239,36 +1232,12 @@ function () {
|
|
|
1239
1232
|
logger: global.console.log.bind(console),
|
|
1240
1233
|
devTools: false
|
|
1241
1234
|
};
|
|
1242
|
-
}(typeof
|
|
1235
|
+
}(typeof self !== 'undefined' ? self : global);
|
|
1243
1236
|
|
|
1244
1237
|
Interpreter.interpret = interpret;
|
|
1245
1238
|
return Interpreter;
|
|
1246
1239
|
}();
|
|
1247
1240
|
|
|
1248
|
-
var createNullActor = function (name) {
|
|
1249
|
-
if (name === void 0) {
|
|
1250
|
-
name = 'null';
|
|
1251
|
-
}
|
|
1252
|
-
|
|
1253
|
-
return {
|
|
1254
|
-
id: name,
|
|
1255
|
-
send: function () {
|
|
1256
|
-
return void 0;
|
|
1257
|
-
},
|
|
1258
|
-
subscribe: function () {
|
|
1259
|
-
// tslint:disable-next-line:no-empty
|
|
1260
|
-
return {
|
|
1261
|
-
unsubscribe: function () {}
|
|
1262
|
-
};
|
|
1263
|
-
},
|
|
1264
|
-
toJSON: function () {
|
|
1265
|
-
return {
|
|
1266
|
-
id: name
|
|
1267
|
-
};
|
|
1268
|
-
}
|
|
1269
|
-
};
|
|
1270
|
-
};
|
|
1271
|
-
|
|
1272
1241
|
var resolveSpawnOptions = function (nameOrOptions) {
|
|
1273
1242
|
if (isString(nameOrOptions)) {
|
|
1274
1243
|
return __assign(__assign({}, DEFAULT_SPAWN_OPTIONS), {
|
|
@@ -1283,15 +1252,16 @@ var resolveSpawnOptions = function (nameOrOptions) {
|
|
|
1283
1252
|
|
|
1284
1253
|
function spawn(entity, nameOrOptions) {
|
|
1285
1254
|
var resolvedOptions = resolveSpawnOptions(nameOrOptions);
|
|
1286
|
-
return
|
|
1255
|
+
return consume(function (service) {
|
|
1287
1256
|
if (!IS_PRODUCTION) {
|
|
1288
|
-
|
|
1257
|
+
var isLazyEntity = isMachine(entity) || isFunction(entity);
|
|
1258
|
+
warn(!!service || isLazyEntity, "Attempted to spawn an Actor (ID: \"" + (isMachine(entity) ? entity.id : 'undefined') + "\") outside of a service. This will have no effect.");
|
|
1289
1259
|
}
|
|
1290
1260
|
|
|
1291
1261
|
if (service) {
|
|
1292
1262
|
return service.spawn(entity, resolvedOptions.name, resolvedOptions);
|
|
1293
1263
|
} else {
|
|
1294
|
-
return
|
|
1264
|
+
return createDeferredActor(entity, resolvedOptions.name);
|
|
1295
1265
|
}
|
|
1296
1266
|
});
|
|
1297
1267
|
}
|
|
@@ -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,39 @@
|
|
|
1
|
+
import { __assign, __rest } from './_virtual/_tslib.js';
|
|
2
|
+
import { invoke } from './actionTypes.js';
|
|
3
|
+
import './actions.js';
|
|
4
|
+
|
|
5
|
+
function toInvokeSource(src) {
|
|
6
|
+
if (typeof src === 'string') {
|
|
7
|
+
var simpleSrc = {
|
|
8
|
+
type: src
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
simpleSrc.toString = function () {
|
|
12
|
+
return src;
|
|
13
|
+
}; // v4 compat - TODO: remove in v5
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
return simpleSrc;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return src;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function toInvokeDefinition(invokeConfig) {
|
|
23
|
+
return __assign(__assign({
|
|
24
|
+
type: invoke
|
|
25
|
+
}, invokeConfig), {
|
|
26
|
+
toJSON: function () {
|
|
27
|
+
var onDone = invokeConfig.onDone,
|
|
28
|
+
onError = invokeConfig.onError,
|
|
29
|
+
invokeDef = __rest(invokeConfig, ["onDone", "onError"]);
|
|
30
|
+
|
|
31
|
+
return __assign(__assign({}, invokeDef), {
|
|
32
|
+
type: invoke,
|
|
33
|
+
src: toInvokeSource(invokeConfig.src)
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { toInvokeDefinition, toInvokeSource };
|
|
@@ -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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maintains a stack of the current service in scope.
|
|
3
|
+
* This is used to provide the correct service to spawn().
|
|
4
|
+
*/
|
|
5
|
+
var serviceStack = [];
|
|
6
|
+
|
|
7
|
+
var provide = function (service, fn) {
|
|
8
|
+
serviceStack.push(service);
|
|
9
|
+
var result = fn(service);
|
|
10
|
+
serviceStack.pop();
|
|
11
|
+
return result;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
var consume = function (fn) {
|
|
15
|
+
return fn(serviceStack[serviceStack.length - 1]);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { consume, provide };
|
package/es/stateUtils.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventObject, StateNode, StateValue } from '.';
|
|
2
2
|
declare type Configuration<TC, TE extends EventObject> = Iterable<StateNode<TC, any, TE>>;
|
|
3
3
|
declare type AdjList<TC, TE extends EventObject> = Map<StateNode<TC, any, TE>, Array<StateNode<TC, any, TE>>>;
|
|
4
|
-
export declare const isLeafNode: (stateNode: StateNode<any, any, any
|
|
4
|
+
export declare const isLeafNode: (stateNode: StateNode<any, any, any>) => boolean;
|
|
5
5
|
export declare function getChildren<TC, TE extends EventObject>(stateNode: StateNode<TC, any, TE>): Array<StateNode<TC, any, TE>>;
|
|
6
6
|
export declare function getAllStateNodes<TC, TE extends EventObject>(stateNode: StateNode<TC, any, TE>): Array<StateNode<TC, any, TE>>;
|
|
7
7
|
export declare function getConfiguration<TC, TE extends EventObject>(prevStateNodes: Iterable<StateNode<TC, any, TE>>, stateNodes: Iterable<StateNode<TC, any, TE>>): Iterable<StateNode<TC, any, TE>>;
|
package/es/types.d.ts
CHANGED
|
@@ -49,12 +49,12 @@ export interface AssignMeta<TContext, TEvent extends EventObject> {
|
|
|
49
49
|
action: AssignAction<TContext, TEvent>;
|
|
50
50
|
_event: SCXML.Event<TEvent>;
|
|
51
51
|
}
|
|
52
|
-
export declare type ActionFunction<TContext, TEvent extends EventObject> = (context: TContext, event: TEvent, meta: ActionMeta<TContext, TEvent>) =>
|
|
52
|
+
export declare type ActionFunction<TContext, TEvent extends EventObject> = (context: TContext, event: TEvent, meta: ActionMeta<TContext, TEvent>) => void;
|
|
53
53
|
export interface ChooseConditon<TContext, TEvent extends EventObject> {
|
|
54
54
|
cond?: Condition<TContext, TEvent>;
|
|
55
55
|
actions: Actions<TContext, TEvent>;
|
|
56
56
|
}
|
|
57
|
-
export declare type Action<TContext, TEvent extends EventObject> = ActionType | ActionObject<TContext, TEvent> | ActionFunction<TContext, TEvent
|
|
57
|
+
export declare type Action<TContext, TEvent extends EventObject> = ActionType | ActionObject<TContext, TEvent> | ActionFunction<TContext, TEvent>;
|
|
58
58
|
export declare type Actions<TContext, TEvent extends EventObject> = SingleOrArray<Action<TContext, TEvent>>;
|
|
59
59
|
export declare type StateKey = string | State<any>;
|
|
60
60
|
export interface StateValueMap {
|
|
@@ -67,11 +67,14 @@ export interface StateValueMap {
|
|
|
67
67
|
* - For complex state nodes, this is an object, e.g., `{ success: "someChildState" }`.
|
|
68
68
|
*/
|
|
69
69
|
export declare type StateValue = string | StateValueMap;
|
|
70
|
-
|
|
71
|
-
[K in keyof
|
|
72
|
-
states:
|
|
73
|
-
} ?
|
|
74
|
-
};
|
|
70
|
+
declare type KeysWithStates<TStates extends Record<string, StateSchema> | undefined> = TStates extends object ? {
|
|
71
|
+
[K in keyof TStates]-?: TStates[K] extends {
|
|
72
|
+
states: object;
|
|
73
|
+
} ? K : never;
|
|
74
|
+
}[keyof TStates] : never;
|
|
75
|
+
export declare type ExtractStateValue<TSchema extends Required<Pick<StateSchema<any>, 'states'>>> = keyof TSchema['states'] | (KeysWithStates<TSchema['states']> extends never ? never : {
|
|
76
|
+
[K in KeysWithStates<TSchema['states']>]?: ExtractStateValue<TSchema['states'][K]>;
|
|
77
|
+
});
|
|
75
78
|
export interface HistoryValue {
|
|
76
79
|
states: Record<string, HistoryValue | undefined>;
|
|
77
80
|
current: StateValue | undefined;
|
|
@@ -115,6 +118,10 @@ export interface ActivityDefinition<TContext, TEvent extends EventObject> extend
|
|
|
115
118
|
export declare type Sender<TEvent extends EventObject> = (event: Event<TEvent>) => void;
|
|
116
119
|
export declare type Receiver<TEvent extends EventObject> = (listener: (event: TEvent) => void) => void;
|
|
117
120
|
export declare type InvokeCallback = (callback: Sender<any>, onReceive: Receiver<EventObject>) => any;
|
|
121
|
+
export interface InvokeMeta {
|
|
122
|
+
data: any;
|
|
123
|
+
src: InvokeSourceDefinition;
|
|
124
|
+
}
|
|
118
125
|
/**
|
|
119
126
|
* Returns either a Promises or a callback handler (for streams of events) given the
|
|
120
127
|
* machine's current `context` and `event` that invoked the service.
|
|
@@ -128,12 +135,12 @@ export declare type InvokeCallback = (callback: Sender<any>, onReceive: Receiver
|
|
|
128
135
|
* @param context The current machine `context`
|
|
129
136
|
* @param event The event that invoked the service
|
|
130
137
|
*/
|
|
131
|
-
export declare type InvokeCreator<TContext, TEvent = AnyEventObject, TFinalContext = any> = (context: TContext, event: TEvent) => PromiseLike<TFinalContext> | StateMachine<TFinalContext, any, any> | Subscribable<any> | InvokeCallback;
|
|
138
|
+
export declare type InvokeCreator<TContext, TEvent = AnyEventObject, TFinalContext = any> = (context: TContext, event: TEvent, meta: InvokeMeta) => PromiseLike<TFinalContext> | StateMachine<TFinalContext, any, any> | Subscribable<any> | InvokeCallback;
|
|
132
139
|
export interface InvokeDefinition<TContext, TEvent extends EventObject> extends ActivityDefinition<TContext, TEvent> {
|
|
133
140
|
/**
|
|
134
141
|
* The source of the machine to be invoked, or the machine itself.
|
|
135
142
|
*/
|
|
136
|
-
src: string;
|
|
143
|
+
src: string | InvokeSourceDefinition;
|
|
137
144
|
/**
|
|
138
145
|
* If `true`, events sent to the parent service will be forwarded to the invoked service.
|
|
139
146
|
*
|
|
@@ -152,7 +159,7 @@ export interface InvokeDefinition<TContext, TEvent extends EventObject> extends
|
|
|
152
159
|
*
|
|
153
160
|
* Data should be mapped to match the child machine's context shape.
|
|
154
161
|
*/
|
|
155
|
-
data?: Mapper<TContext, TEvent> | PropertyMapper<TContext, TEvent>;
|
|
162
|
+
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
|
|
156
163
|
}
|
|
157
164
|
export interface Delay {
|
|
158
165
|
id: string;
|
|
@@ -186,18 +193,18 @@ declare type TransitionsConfigMap<TContext, TEvent extends EventObject> = {
|
|
|
186
193
|
} & {
|
|
187
194
|
'*'?: TransitionConfigOrTarget<TContext, TEvent>;
|
|
188
195
|
};
|
|
189
|
-
declare type TransitionsConfigArray<TContext, TEvent extends EventObject> = Array<{
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
} ? TEvent : never> & {
|
|
193
|
-
event: K;
|
|
194
|
-
};
|
|
195
|
-
}[TEvent['type']] | (TransitionConfig<TContext, TEvent> & {
|
|
196
|
+
declare type TransitionsConfigArray<TContext, TEvent extends EventObject> = Array<(TEvent extends EventObject ? TransitionConfig<TContext, TEvent> & {
|
|
197
|
+
event: TEvent['type'];
|
|
198
|
+
} : never) | (TransitionConfig<TContext, TEvent> & {
|
|
196
199
|
event: '';
|
|
197
200
|
}) | (TransitionConfig<TContext, TEvent> & {
|
|
198
201
|
event: '*';
|
|
199
202
|
})>;
|
|
200
203
|
export declare type TransitionsConfig<TContext, TEvent extends EventObject> = TransitionsConfigMap<TContext, TEvent> | TransitionsConfigArray<TContext, TEvent>;
|
|
204
|
+
export interface InvokeSourceDefinition {
|
|
205
|
+
[key: string]: any;
|
|
206
|
+
type: string;
|
|
207
|
+
}
|
|
201
208
|
export declare type InvokeConfig<TContext, TEvent extends EventObject> = {
|
|
202
209
|
/**
|
|
203
210
|
* The unique identifier for the invoked machine. If not specified, this
|
|
@@ -207,7 +214,7 @@ export declare type InvokeConfig<TContext, TEvent extends EventObject> = {
|
|
|
207
214
|
/**
|
|
208
215
|
* The source of the machine to be invoked, or the machine itself.
|
|
209
216
|
*/
|
|
210
|
-
src: string | StateMachine<any, any, any> | InvokeCreator<TContext, TEvent, any>;
|
|
217
|
+
src: string | InvokeSourceDefinition | StateMachine<any, any, any> | InvokeCreator<TContext, TEvent, any>;
|
|
211
218
|
/**
|
|
212
219
|
* If `true`, events sent to the parent service will be forwarded to the invoked service.
|
|
213
220
|
*
|
|
@@ -226,7 +233,7 @@ export declare type InvokeConfig<TContext, TEvent extends EventObject> = {
|
|
|
226
233
|
*
|
|
227
234
|
* Data should be mapped to match the child machine's context shape.
|
|
228
235
|
*/
|
|
229
|
-
data?: Mapper<TContext, TEvent> | PropertyMapper<TContext, TEvent>;
|
|
236
|
+
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
|
|
230
237
|
/**
|
|
231
238
|
* The transition to take upon the invoked child machine reaching its final top-level state.
|
|
232
239
|
*/
|
|
@@ -235,7 +242,7 @@ export declare type InvokeConfig<TContext, TEvent extends EventObject> = {
|
|
|
235
242
|
* The transition to take upon the invoked child machine sending an error event.
|
|
236
243
|
*/
|
|
237
244
|
onError?: string | SingleOrArray<TransitionConfig<TContext, DoneInvokeEvent<any>>>;
|
|
238
|
-
}
|
|
245
|
+
};
|
|
239
246
|
export interface StateNodeConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> {
|
|
240
247
|
/**
|
|
241
248
|
* The relative key of the state node, which represents its location in the overall state value.
|
|
@@ -279,7 +286,7 @@ export interface StateNodeConfig<TContext, TStateSchema extends StateSchema, TEv
|
|
|
279
286
|
/**
|
|
280
287
|
* The services to invoke upon entering this state node. These services will be stopped upon exiting this state node.
|
|
281
288
|
*/
|
|
282
|
-
invoke?: SingleOrArray<InvokeConfig<TContext, TEvent>>;
|
|
289
|
+
invoke?: SingleOrArray<InvokeConfig<TContext, TEvent> | StateMachine<any, any, any>>;
|
|
283
290
|
/**
|
|
284
291
|
* The mapping of event types to their potential transition(s).
|
|
285
292
|
*/
|
|
@@ -315,6 +322,11 @@ export interface StateNodeConfig<TContext, TStateSchema extends StateSchema, TEv
|
|
|
315
322
|
* The delayed transitions are taken after the specified delay in an interpreter.
|
|
316
323
|
*/
|
|
317
324
|
after?: DelayedTransitions<TContext, TEvent>;
|
|
325
|
+
/**
|
|
326
|
+
* An eventless transition that is always taken when this state node is active.
|
|
327
|
+
* Equivalent to a transition specified as an empty `''`' string in the `on` property.
|
|
328
|
+
*/
|
|
329
|
+
always?: TransitionConfigOrTarget<TContext, TEvent>;
|
|
318
330
|
/**
|
|
319
331
|
* The activities to be started upon entering the state node,
|
|
320
332
|
* and stopped upon exiting the state node.
|
|
@@ -337,7 +349,7 @@ export interface StateNodeConfig<TContext, TStateSchema extends StateSchema, TEv
|
|
|
337
349
|
* The data will be evaluated with the current `context` and placed on the `.data` property
|
|
338
350
|
* of the event.
|
|
339
351
|
*/
|
|
340
|
-
data?: Mapper<TContext, TEvent> | PropertyMapper<TContext, TEvent>;
|
|
352
|
+
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
|
|
341
353
|
/**
|
|
342
354
|
* The unique ID of the state node, which can be referenced as a transition target via the
|
|
343
355
|
* `#id` syntax.
|
|
@@ -388,18 +400,18 @@ export interface FinalStateNodeConfig<TContext, TEvent extends EventObject> exte
|
|
|
388
400
|
* The data to be sent with the "done.state.<id>" event. The data can be
|
|
389
401
|
* static or dynamic (based on assigners).
|
|
390
402
|
*/
|
|
391
|
-
data?:
|
|
403
|
+
data?: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>;
|
|
392
404
|
}
|
|
393
405
|
export declare type SimpleOrStateNodeConfig<TContext, TStateSchema extends StateSchema, TEvent extends EventObject> = AtomicStateNodeConfig<TContext, TEvent> | StateNodeConfig<TContext, TStateSchema, TEvent>;
|
|
394
406
|
export declare type ActionFunctionMap<TContext, TEvent extends EventObject> = Record<string, ActionObject<TContext, TEvent> | ActionFunction<TContext, TEvent>>;
|
|
395
407
|
export declare type DelayFunctionMap<TContext, TEvent extends EventObject> = Record<string, DelayConfig<TContext, TEvent>>;
|
|
396
|
-
export declare type ServiceConfig<TContext> = string | StateMachine<any, any, any> | InvokeCreator<TContext>;
|
|
408
|
+
export declare type ServiceConfig<TContext, TEvent extends EventObject = AnyEventObject> = string | StateMachine<any, any, any> | InvokeCreator<TContext, TEvent>;
|
|
397
409
|
export declare type DelayConfig<TContext, TEvent extends EventObject> = number | DelayExpr<TContext, TEvent>;
|
|
398
410
|
export interface MachineOptions<TContext, TEvent extends EventObject> {
|
|
399
411
|
guards: Record<string, ConditionPredicate<TContext, TEvent>>;
|
|
400
412
|
actions: ActionFunctionMap<TContext, TEvent>;
|
|
401
413
|
activities: Record<string, ActivityConfig<TContext, TEvent>>;
|
|
402
|
-
services: Record<string, ServiceConfig<TContext>>;
|
|
414
|
+
services: Record<string, ServiceConfig<TContext, TEvent>>;
|
|
403
415
|
delays: DelayFunctionMap<TContext, TEvent>;
|
|
404
416
|
/**
|
|
405
417
|
* @private
|
|
@@ -434,7 +446,10 @@ export interface HistoryStateNode<TContext> extends StateNode<TContext> {
|
|
|
434
446
|
history: 'shallow' | 'deep';
|
|
435
447
|
target: StateValue | undefined;
|
|
436
448
|
}
|
|
437
|
-
export interface StateMachine<TContext, TStateSchema extends StateSchema, TEvent extends EventObject, TTypestate extends Typestate<TContext> =
|
|
449
|
+
export interface StateMachine<TContext, TStateSchema extends StateSchema, TEvent extends EventObject, TTypestate extends Typestate<TContext> = {
|
|
450
|
+
value: any;
|
|
451
|
+
context: TContext;
|
|
452
|
+
}> extends StateNode<TContext, TStateSchema, TEvent, TTypestate> {
|
|
438
453
|
id: string;
|
|
439
454
|
states: StateNode<TContext, TStateSchema, TEvent>['states'];
|
|
440
455
|
}
|
|
@@ -541,22 +556,22 @@ export interface LogAction<TContext, TEvent extends EventObject> extends ActionO
|
|
|
541
556
|
export interface LogActionObject<TContext, TEvent extends EventObject> extends LogAction<TContext, TEvent> {
|
|
542
557
|
value: any;
|
|
543
558
|
}
|
|
544
|
-
export interface SendAction<TContext, TEvent extends EventObject> extends ActionObject<TContext, TEvent> {
|
|
559
|
+
export interface SendAction<TContext, TEvent extends EventObject, TSentEvent extends EventObject> extends ActionObject<TContext, TEvent> {
|
|
545
560
|
to: string | number | Actor | ExprWithMeta<TContext, TEvent, string | number | Actor> | undefined;
|
|
546
|
-
event:
|
|
561
|
+
event: TSentEvent | SendExpr<TContext, TEvent, TSentEvent>;
|
|
547
562
|
delay?: number | string | DelayExpr<TContext, TEvent>;
|
|
548
563
|
id: string | number;
|
|
549
564
|
}
|
|
550
|
-
export interface SendActionObject<TContext, TEvent extends EventObject> extends SendAction<TContext, TEvent> {
|
|
565
|
+
export interface SendActionObject<TContext, TEvent extends EventObject, TSentEvent extends EventObject = AnyEventObject> extends SendAction<TContext, TEvent, TSentEvent> {
|
|
551
566
|
to: string | number | Actor | undefined;
|
|
552
|
-
_event: SCXML.Event<
|
|
553
|
-
event:
|
|
567
|
+
_event: SCXML.Event<TSentEvent>;
|
|
568
|
+
event: TSentEvent;
|
|
554
569
|
delay?: number;
|
|
555
570
|
id: string | number;
|
|
556
571
|
}
|
|
557
572
|
export declare type Expr<TContext, TEvent extends EventObject, T> = (context: TContext, event: TEvent) => T;
|
|
558
573
|
export declare type ExprWithMeta<TContext, TEvent extends EventObject, T> = (context: TContext, event: TEvent, meta: SCXMLEventMeta<TEvent>) => T;
|
|
559
|
-
export declare type SendExpr<TContext, TEvent extends EventObject> = ExprWithMeta<TContext, TEvent,
|
|
574
|
+
export declare type SendExpr<TContext, TEvent extends EventObject, TSentEvent extends EventObject = AnyEventObject> = ExprWithMeta<TContext, TEvent, TSentEvent>;
|
|
560
575
|
export declare enum SpecialTargets {
|
|
561
576
|
Parent = "#_parent",
|
|
562
577
|
Internal = "#_internal"
|
|
@@ -573,10 +588,10 @@ export declare type Assigner<TContext, TEvent extends EventObject> = (context: T
|
|
|
573
588
|
export declare type PropertyAssigner<TContext, TEvent extends EventObject> = {
|
|
574
589
|
[K in keyof TContext]?: ((context: TContext, event: TEvent, meta: AssignMeta<TContext, TEvent>) => TContext[K]) | TContext[K];
|
|
575
590
|
};
|
|
576
|
-
export declare type Mapper<TContext, TEvent extends EventObject> = (context: TContext, event: TEvent) =>
|
|
577
|
-
export declare type PropertyMapper<TContext, TEvent extends EventObject> =
|
|
578
|
-
[
|
|
579
|
-
}
|
|
591
|
+
export declare type Mapper<TContext, TEvent extends EventObject, TParams extends {}> = (context: TContext, event: TEvent) => TParams;
|
|
592
|
+
export declare type PropertyMapper<TContext, TEvent extends EventObject, TParams extends {}> = {
|
|
593
|
+
[K in keyof TParams]?: ((context: TContext, event: TEvent) => TParams[K]) | TParams[K];
|
|
594
|
+
};
|
|
580
595
|
export interface AnyAssignAction<TContext, TEvent extends EventObject> extends ActionObject<TContext, TEvent> {
|
|
581
596
|
type: ActionTypes.Assign;
|
|
582
597
|
assignment: any;
|
|
@@ -599,6 +614,13 @@ export interface TransitionDefinition<TContext, TEvent extends EventObject> exte
|
|
|
599
614
|
actions: Array<ActionObject<TContext, TEvent>>;
|
|
600
615
|
cond?: Guard<TContext, TEvent>;
|
|
601
616
|
eventType: TEvent['type'] | NullEvent['type'] | '*';
|
|
617
|
+
toJSON: () => {
|
|
618
|
+
target: string[] | undefined;
|
|
619
|
+
source: string;
|
|
620
|
+
actions: Array<ActionObject<TContext, TEvent>>;
|
|
621
|
+
cond?: Guard<TContext, TEvent>;
|
|
622
|
+
eventType: TEvent['type'] | NullEvent['type'] | '*';
|
|
623
|
+
};
|
|
602
624
|
}
|
|
603
625
|
export declare type TransitionDefinitionMap<TContext, TEvent extends EventObject> = {
|
|
604
626
|
[K in TEvent['type'] | NullEvent['type'] | '*']: Array<TransitionDefinition<TContext, K extends TEvent['type'] ? Extract<TEvent, {
|
|
@@ -788,7 +810,7 @@ export declare namespace SCXML {
|
|
|
788
810
|
}
|
|
789
811
|
}
|
|
790
812
|
export interface Unsubscribable {
|
|
791
|
-
unsubscribe():
|
|
813
|
+
unsubscribe(): void;
|
|
792
814
|
}
|
|
793
815
|
export interface Subscribable<T> {
|
|
794
816
|
subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Unsubscribable;
|
package/es/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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';
|
|
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';
|
|
2
2
|
import { StateNode } from './StateNode';
|
|
3
3
|
import { State } from '.';
|
|
4
4
|
import { Actor } from './Actor';
|
|
@@ -39,7 +39,7 @@ export declare function pathsToStateValue(paths: string[][]): StateValue;
|
|
|
39
39
|
export declare function flatten<T>(array: Array<T | T[]>): T[];
|
|
40
40
|
export declare function toArrayStrict<T>(value: T[] | T): T[];
|
|
41
41
|
export declare function toArray<T>(value: T[] | T | undefined): T[];
|
|
42
|
-
export declare function mapContext<TContext, TEvent extends EventObject>(mapper: Mapper<TContext, TEvent> | PropertyMapper<TContext, TEvent>, context: TContext, _event: SCXML.Event<TEvent>): any;
|
|
42
|
+
export declare function mapContext<TContext, TEvent extends EventObject>(mapper: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>, context: TContext, _event: SCXML.Event<TEvent>): any;
|
|
43
43
|
export declare function isBuiltInEvent(eventType: EventType): boolean;
|
|
44
44
|
export declare function isPromiseLike(value: any): value is PromiseLike<any>;
|
|
45
45
|
export declare function partition<T, A extends T, B extends T>(items: T[], predicate: (item: T) => item is A): [A[], B[]];
|
|
@@ -52,7 +52,7 @@ export declare function isArray(value: any): value is any[];
|
|
|
52
52
|
export declare function isFunction(value: any): value is Function;
|
|
53
53
|
export declare function isString(value: any): value is string;
|
|
54
54
|
export declare function toGuard<TContext, TEvent extends EventObject>(condition?: Condition<TContext, TEvent>, guardMap?: Record<string, ConditionPredicate<TContext, TEvent>>): Guard<TContext, TEvent> | undefined;
|
|
55
|
-
export declare function isObservable<T>(value:
|
|
55
|
+
export declare function isObservable<T>(value: any): value is Subscribable<T>;
|
|
56
56
|
export declare const symbolObservable: string | symbol;
|
|
57
57
|
export declare function isMachine(value: any): value is StateMachine<any, any, any>;
|
|
58
58
|
export declare function isActor(value: any): value is Actor;
|
|
@@ -65,4 +65,5 @@ export declare function toTransitionConfigArray<TContext, TEvent extends EventOb
|
|
|
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
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;
|
|
68
|
+
export declare function toInvokeSource(src: string | InvokeSourceDefinition): InvokeSourceDefinition;
|
|
68
69
|
//# sourceMappingURL=utils.d.ts.map
|
package/es/utils.js
CHANGED
|
@@ -259,7 +259,7 @@ function mapContext(mapper, context, _event) {
|
|
|
259
259
|
var result = {};
|
|
260
260
|
|
|
261
261
|
try {
|
|
262
|
-
for (var _b = __values(keys(mapper)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
262
|
+
for (var _b = __values(Object.keys(mapper)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
263
263
|
var key = _c.value;
|
|
264
264
|
var subMapper = mapper[key];
|
|
265
265
|
|
|
@@ -530,7 +530,6 @@ function toSCXMLEvent(event, scxmlEvent) {
|
|
|
530
530
|
function toTransitionConfigArray(event, configLike) {
|
|
531
531
|
var transitions = toArrayStrict(configLike).map(function (transitionLike) {
|
|
532
532
|
if (typeof transitionLike === 'undefined' || typeof transitionLike === 'string' || isMachine(transitionLike)) {
|
|
533
|
-
// @ts-ignore until Type instantiation is excessively deep and possibly infinite bug is fixed
|
|
534
533
|
return {
|
|
535
534
|
target: transitionLike,
|
|
536
535
|
event: event
|
|
@@ -588,4 +587,14 @@ function evaluateGuard(machine, guard, context, _event, state) {
|
|
|
588
587
|
return condFn(context, _event.data, guardMeta);
|
|
589
588
|
}
|
|
590
589
|
|
|
591
|
-
|
|
590
|
+
function toInvokeSource(src) {
|
|
591
|
+
if (typeof src === 'string') {
|
|
592
|
+
return {
|
|
593
|
+
type: src
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
return src;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export { evaluateGuard, flatten, getEventType, isArray, isBuiltInEvent, isFunction, isMachine, isObservable, isPromiseLike, isStateLike, isString, keys, mapContext, mapFilterValues, mapValues, matchesState, nestedPath, normalizeTarget, partition, path, pathToStateValue, reportUnhandledExceptionOnInvocation, symbolObservable, toArray, toArrayStrict, toEventObject, toGuard, toInvokeSource, toSCXMLEvent, toStatePath, toStatePaths, toStateValue, toTransitionConfigArray, uniqueId, updateContext, updateHistoryStates, updateHistoryValue, warn };
|
package/lib/Actor.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventObject, Subscribable, InvokeDefinition, AnyEventObject } from './types';
|
|
1
|
+
import { EventObject, Subscribable, InvokeDefinition, AnyEventObject, StateMachine, Spawnable, SCXML } from './types';
|
|
2
2
|
export interface Actor<TContext = any, TEvent extends EventObject = AnyEventObject> extends Subscribable<TContext> {
|
|
3
3
|
id: string;
|
|
4
4
|
send: (event: TEvent) => any;
|
|
@@ -8,14 +8,16 @@ export interface Actor<TContext = any, TEvent extends EventObject = AnyEventObje
|
|
|
8
8
|
};
|
|
9
9
|
meta?: InvokeDefinition<TContext, TEvent>;
|
|
10
10
|
state?: any;
|
|
11
|
+
deferred?: boolean;
|
|
11
12
|
}
|
|
12
13
|
export declare function createNullActor(id: string): Actor;
|
|
13
14
|
/**
|
|
14
|
-
* Creates a
|
|
15
|
+
* Creates a deferred actor that is able to be invoked given the provided
|
|
15
16
|
* invocation information in its `.meta` value.
|
|
16
17
|
*
|
|
17
18
|
* @param invokeDefinition The meta information needed to invoke the actor.
|
|
18
19
|
*/
|
|
19
|
-
export declare function createInvocableActor<TC, TE extends EventObject>(invokeDefinition: InvokeDefinition<TC, TE>): Actor;
|
|
20
|
+
export declare function createInvocableActor<TC, TE extends EventObject>(invokeDefinition: InvokeDefinition<TC, TE>, machine: StateMachine<TC, any, TE>, context: TC, _event: SCXML.Event<TE>): Actor;
|
|
21
|
+
export declare function createDeferredActor(entity: Spawnable, id: string, data?: any): Actor;
|
|
20
22
|
export declare function isActor(item: any): item is Actor;
|
|
21
23
|
//# sourceMappingURL=Actor.d.ts.map
|