xstate 5.0.0-beta.20 → 5.0.0-beta.21
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/actions/dist/xstate-actions.cjs.js +1 -1
- package/actions/dist/xstate-actions.development.cjs.js +1 -1
- package/actions/dist/xstate-actions.development.esm.js +1 -1
- package/actions/dist/xstate-actions.esm.js +1 -1
- package/actions/dist/xstate-actions.umd.min.js +1 -1
- package/actions/dist/xstate-actions.umd.min.js.map +1 -1
- package/actors/dist/xstate-actors.cjs.js +1 -1
- package/actors/dist/xstate-actors.development.cjs.js +1 -1
- package/actors/dist/xstate-actors.development.esm.js +1 -1
- package/actors/dist/xstate-actors.esm.js +1 -1
- package/actors/dist/xstate-actors.umd.min.js +1 -1
- package/actors/dist/xstate-actors.umd.min.js.map +1 -1
- package/dist/{actions-b299d008.development.esm.js → actions-49f0501e.development.esm.js} +136 -63
- package/dist/{actions-a8a9433c.esm.js → actions-5039c951.esm.js} +134 -64
- package/dist/{actions-d1c41ed3.development.cjs.js → actions-a95d2e66.development.cjs.js} +136 -62
- package/dist/{actions-069d9805.cjs.js → actions-c619a105.cjs.js} +134 -63
- package/dist/declarations/src/Machine.d.ts +2 -2
- package/dist/declarations/src/State.d.ts +4 -7
- package/dist/declarations/src/StateMachine.d.ts +7 -6
- package/dist/declarations/src/StateNode.d.ts +3 -3
- package/dist/declarations/src/actions/send.d.ts +1 -1
- package/dist/declarations/src/actions/stop.d.ts +1 -1
- package/dist/declarations/src/actions.d.ts +2 -2
- package/dist/declarations/src/actors/callback.d.ts +4 -4
- package/dist/declarations/src/actors/observable.d.ts +7 -4
- package/dist/declarations/src/actors/promise.d.ts +4 -4
- package/dist/declarations/src/types.d.ts +41 -29
- package/dist/declarations/src/utils.d.ts +2 -2
- package/dist/xstate.cjs.js +11 -10
- package/dist/xstate.development.cjs.js +11 -10
- package/dist/xstate.development.esm.js +12 -11
- package/dist/xstate.esm.js +12 -11
- package/dist/xstate.umd.min.js +1 -1
- package/dist/xstate.umd.min.js.map +1 -1
- package/guards/dist/xstate-guards.cjs.js +1 -1
- package/guards/dist/xstate-guards.development.cjs.js +1 -1
- package/guards/dist/xstate-guards.development.esm.js +1 -1
- package/guards/dist/xstate-guards.esm.js +1 -1
- package/guards/dist/xstate-guards.umd.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
var dev_dist_xstateDev = require('../dev/dist/xstate-dev.cjs.js');
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* `T | unknown` reduces to `unknown` and that can be problematic when it comes to contextual typing.
|
|
7
|
+
* It especially is a problem when the union has a function member, like here:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* declare function test(cbOrVal: ((arg: number) => unknown) | unknown): void;
|
|
11
|
+
* test((arg) => {}) // oops, implicit any
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* This type can be used to avoid this problem. This union represents the same value space as `unknown`.
|
|
15
|
+
*/
|
|
16
|
+
|
|
5
17
|
// https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379091887
|
|
6
18
|
|
|
7
19
|
/**
|
|
@@ -406,27 +418,15 @@ function toArray(value) {
|
|
|
406
418
|
}
|
|
407
419
|
return toArrayStrict(value);
|
|
408
420
|
}
|
|
409
|
-
function mapContext(mapper, context, event) {
|
|
421
|
+
function mapContext(mapper, context, event, self) {
|
|
410
422
|
if (typeof mapper === 'function') {
|
|
411
423
|
return mapper({
|
|
412
424
|
context,
|
|
413
|
-
event
|
|
425
|
+
event,
|
|
426
|
+
self
|
|
414
427
|
});
|
|
415
428
|
}
|
|
416
|
-
|
|
417
|
-
const args = {
|
|
418
|
-
context,
|
|
419
|
-
event
|
|
420
|
-
};
|
|
421
|
-
for (const key of Object.keys(mapper)) {
|
|
422
|
-
const subMapper = mapper[key];
|
|
423
|
-
if (typeof subMapper === 'function') {
|
|
424
|
-
result[key] = subMapper(args);
|
|
425
|
-
} else {
|
|
426
|
-
result[key] = subMapper;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
return result;
|
|
429
|
+
return mapper;
|
|
430
430
|
}
|
|
431
431
|
function isPromiseLike(value) {
|
|
432
432
|
if (value instanceof Promise) {
|
|
@@ -478,13 +478,12 @@ function toInvokeConfig(invocable, id) {
|
|
|
478
478
|
};
|
|
479
479
|
}
|
|
480
480
|
function toObserver(nextHandler, errorHandler, completionHandler) {
|
|
481
|
-
const noop = () => {};
|
|
482
481
|
const isObserver = typeof nextHandler === 'object';
|
|
483
|
-
const self = isObserver ? nextHandler :
|
|
482
|
+
const self = isObserver ? nextHandler : undefined;
|
|
484
483
|
return {
|
|
485
|
-
next: (
|
|
486
|
-
error: (
|
|
487
|
-
complete: (
|
|
484
|
+
next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),
|
|
485
|
+
error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),
|
|
486
|
+
complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(self)
|
|
488
487
|
};
|
|
489
488
|
}
|
|
490
489
|
function createInvokeId(stateNodeId, index) {
|
|
@@ -498,7 +497,7 @@ function resolveReferencedActor(referenced) {
|
|
|
498
497
|
}
|
|
499
498
|
|
|
500
499
|
function fromCallback(invokeCallback) {
|
|
501
|
-
|
|
500
|
+
return {
|
|
502
501
|
config: invokeCallback,
|
|
503
502
|
start: (_state, {
|
|
504
503
|
self
|
|
@@ -564,19 +563,20 @@ function fromCallback(invokeCallback) {
|
|
|
564
563
|
},
|
|
565
564
|
getSnapshot: () => undefined,
|
|
566
565
|
getPersistedState: ({
|
|
567
|
-
input
|
|
568
|
-
|
|
566
|
+
input,
|
|
567
|
+
canceled
|
|
568
|
+
}) => ({
|
|
569
|
+
input,
|
|
570
|
+
canceled
|
|
571
|
+
})
|
|
569
572
|
};
|
|
570
|
-
return logic;
|
|
571
573
|
}
|
|
572
574
|
|
|
573
575
|
function fromObservable(observableCreator) {
|
|
574
576
|
const nextEventType = '$$xstate.next';
|
|
575
577
|
const errorEventType = '$$xstate.error';
|
|
576
578
|
const completeEventType = '$$xstate.complete';
|
|
577
|
-
|
|
578
|
-
// TODO: add event types
|
|
579
|
-
const logic = {
|
|
579
|
+
return {
|
|
580
580
|
config: observableCreator,
|
|
581
581
|
transition: (state, event, {
|
|
582
582
|
self,
|
|
@@ -606,6 +606,7 @@ function fromObservable(observableCreator) {
|
|
|
606
606
|
status: 'error',
|
|
607
607
|
input: undefined,
|
|
608
608
|
data: event.data,
|
|
609
|
+
// TODO: if we keep this as `data` we should reflect this in the type
|
|
609
610
|
subscription: undefined
|
|
610
611
|
};
|
|
611
612
|
case completeEventType:
|
|
@@ -683,7 +684,6 @@ function fromObservable(observableCreator) {
|
|
|
683
684
|
subscription: undefined
|
|
684
685
|
})
|
|
685
686
|
};
|
|
686
|
-
return logic;
|
|
687
687
|
}
|
|
688
688
|
|
|
689
689
|
/**
|
|
@@ -700,7 +700,7 @@ function fromEventObservable(lazyObservable) {
|
|
|
700
700
|
const completeEventType = '$$xstate.complete';
|
|
701
701
|
|
|
702
702
|
// TODO: event types
|
|
703
|
-
|
|
703
|
+
return {
|
|
704
704
|
config: lazyObservable,
|
|
705
705
|
transition: (state, event) => {
|
|
706
706
|
if (state.status !== 'active') {
|
|
@@ -713,6 +713,7 @@ function fromEventObservable(lazyObservable) {
|
|
|
713
713
|
status: 'error',
|
|
714
714
|
input: undefined,
|
|
715
715
|
data: event.data,
|
|
716
|
+
// TODO: if we keep this as `data` we should reflect this in the type
|
|
716
717
|
subscription: undefined
|
|
717
718
|
};
|
|
718
719
|
case completeEventType:
|
|
@@ -787,7 +788,6 @@ function fromEventObservable(lazyObservable) {
|
|
|
787
788
|
subscription: undefined
|
|
788
789
|
})
|
|
789
790
|
};
|
|
790
|
-
return logic;
|
|
791
791
|
}
|
|
792
792
|
|
|
793
793
|
const resolveEventType = '$$xstate.resolve';
|
|
@@ -815,6 +815,7 @@ promiseCreator) {
|
|
|
815
815
|
...state,
|
|
816
816
|
status: 'error',
|
|
817
817
|
data: event.data,
|
|
818
|
+
// TODO: if we keep this as `data` we should reflect this in the type
|
|
818
819
|
input: undefined
|
|
819
820
|
};
|
|
820
821
|
case stopSignalType:
|
|
@@ -924,6 +925,19 @@ function createEmptyActor() {
|
|
|
924
925
|
return interpret(emptyLogic);
|
|
925
926
|
}
|
|
926
927
|
|
|
928
|
+
/**
|
|
929
|
+
* This function makes sure that unhandled errors are thrown in a separate macrotask.
|
|
930
|
+
* It allows those errors to be detected by global error handlers and reported to bug tracking services
|
|
931
|
+
* without interrupting our own stack of execution.
|
|
932
|
+
*
|
|
933
|
+
* @param err error to be thrown
|
|
934
|
+
*/
|
|
935
|
+
function reportUnhandledError(err) {
|
|
936
|
+
setTimeout(() => {
|
|
937
|
+
throw err;
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
|
|
927
941
|
function createSystem() {
|
|
928
942
|
let sessionIdCounter = 0;
|
|
929
943
|
const children = new Map();
|
|
@@ -1092,29 +1106,38 @@ class Interpreter {
|
|
|
1092
1106
|
deferredFn();
|
|
1093
1107
|
}
|
|
1094
1108
|
for (const observer of this.observers) {
|
|
1095
|
-
|
|
1109
|
+
// TODO: should observers be notified in case of the error?
|
|
1110
|
+
try {
|
|
1111
|
+
observer.next?.(snapshot);
|
|
1112
|
+
} catch (err) {
|
|
1113
|
+
reportUnhandledError(err);
|
|
1114
|
+
}
|
|
1096
1115
|
}
|
|
1097
1116
|
const status = this.logic.getStatus?.(state);
|
|
1098
1117
|
switch (status?.status) {
|
|
1099
1118
|
case 'done':
|
|
1100
1119
|
this._stopProcedure();
|
|
1120
|
+
this._complete();
|
|
1101
1121
|
this._doneEvent = doneInvoke(this.id, status.data);
|
|
1102
1122
|
this._parent?.send(this._doneEvent);
|
|
1103
|
-
this._complete();
|
|
1104
1123
|
break;
|
|
1105
1124
|
case 'error':
|
|
1106
1125
|
this._stopProcedure();
|
|
1107
|
-
this._parent?.send(error(this.id, status.data));
|
|
1108
1126
|
this._error(status.data);
|
|
1127
|
+
this._parent?.send(error(this.id, status.data));
|
|
1109
1128
|
break;
|
|
1110
1129
|
}
|
|
1111
1130
|
}
|
|
1112
1131
|
subscribe(nextListenerOrObserver, errorListener, completeListener) {
|
|
1113
1132
|
const observer = toObserver(nextListenerOrObserver, errorListener, completeListener);
|
|
1114
|
-
this.
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1133
|
+
if (this.status !== ActorStatus.Stopped) {
|
|
1134
|
+
this.observers.add(observer);
|
|
1135
|
+
} else {
|
|
1136
|
+
try {
|
|
1137
|
+
observer.complete?.();
|
|
1138
|
+
} catch (err) {
|
|
1139
|
+
reportUnhandledError(err);
|
|
1140
|
+
}
|
|
1118
1141
|
}
|
|
1119
1142
|
return {
|
|
1120
1143
|
unsubscribe: () => {
|
|
@@ -1136,8 +1159,26 @@ class Interpreter {
|
|
|
1136
1159
|
this.system._set(this._systemId, this);
|
|
1137
1160
|
}
|
|
1138
1161
|
this.status = ActorStatus.Running;
|
|
1162
|
+
const status = this.logic.getStatus?.(this._state);
|
|
1163
|
+
switch (status?.status) {
|
|
1164
|
+
case 'done':
|
|
1165
|
+
// a state machine can be "done" upon intialization (it could reach a final state using initial microsteps)
|
|
1166
|
+
// we still need to complete observers, flush deferreds etc
|
|
1167
|
+
this.update(this._state);
|
|
1168
|
+
// fallthrough
|
|
1169
|
+
case 'error':
|
|
1170
|
+
// TODO: rethink cleanup of observers, mailbox, etc
|
|
1171
|
+
return this;
|
|
1172
|
+
}
|
|
1139
1173
|
if (this.logic.start) {
|
|
1140
|
-
|
|
1174
|
+
try {
|
|
1175
|
+
this.logic.start(this._state, this._actorContext);
|
|
1176
|
+
} catch (err) {
|
|
1177
|
+
this._stopProcedure();
|
|
1178
|
+
this._error(err);
|
|
1179
|
+
this._parent?.send(error(this.id, err));
|
|
1180
|
+
return this;
|
|
1181
|
+
}
|
|
1141
1182
|
}
|
|
1142
1183
|
|
|
1143
1184
|
// TODO: this notifies all subscribers but usually this is redundant
|
|
@@ -1151,23 +1192,30 @@ class Interpreter {
|
|
|
1151
1192
|
return this;
|
|
1152
1193
|
}
|
|
1153
1194
|
_process(event) {
|
|
1195
|
+
// TODO: reexamine what happens when an action (or a guard or smth) throws
|
|
1196
|
+
let nextState;
|
|
1197
|
+
let caughtError;
|
|
1154
1198
|
try {
|
|
1155
|
-
|
|
1156
|
-
this.update(nextState);
|
|
1157
|
-
if (event.type === stopSignalType) {
|
|
1158
|
-
this._stopProcedure();
|
|
1159
|
-
this._complete();
|
|
1160
|
-
}
|
|
1199
|
+
nextState = this.logic.transition(this._state, event, this._actorContext);
|
|
1161
1200
|
} catch (err) {
|
|
1162
|
-
//
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
}
|
|
1201
|
+
// we wrap it in a box so we can rethrow it later even if falsy value gets caught here
|
|
1202
|
+
caughtError = {
|
|
1203
|
+
err
|
|
1204
|
+
};
|
|
1205
|
+
}
|
|
1206
|
+
if (caughtError) {
|
|
1207
|
+
const {
|
|
1208
|
+
err
|
|
1209
|
+
} = caughtError;
|
|
1210
|
+
this._stopProcedure();
|
|
1211
|
+
this._error(err);
|
|
1212
|
+
this._parent?.send(error(this.id, err));
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
this.update(nextState);
|
|
1216
|
+
if (event.type === stopSignalType) {
|
|
1217
|
+
this._stopProcedure();
|
|
1218
|
+
this._complete();
|
|
1171
1219
|
}
|
|
1172
1220
|
}
|
|
1173
1221
|
_stop() {
|
|
@@ -1196,15 +1244,35 @@ class Interpreter {
|
|
|
1196
1244
|
}
|
|
1197
1245
|
_complete() {
|
|
1198
1246
|
for (const observer of this.observers) {
|
|
1199
|
-
|
|
1247
|
+
try {
|
|
1248
|
+
observer.complete?.();
|
|
1249
|
+
} catch (err) {
|
|
1250
|
+
reportUnhandledError(err);
|
|
1251
|
+
}
|
|
1200
1252
|
}
|
|
1201
1253
|
this.observers.clear();
|
|
1202
1254
|
}
|
|
1203
|
-
_error(
|
|
1255
|
+
_error(err) {
|
|
1256
|
+
if (!this.observers.size) {
|
|
1257
|
+
if (!this._parent) {
|
|
1258
|
+
reportUnhandledError(err);
|
|
1259
|
+
}
|
|
1260
|
+
return;
|
|
1261
|
+
}
|
|
1262
|
+
let reportError = false;
|
|
1204
1263
|
for (const observer of this.observers) {
|
|
1205
|
-
observer.error
|
|
1264
|
+
const errorListener = observer.error;
|
|
1265
|
+
reportError ||= !errorListener;
|
|
1266
|
+
try {
|
|
1267
|
+
errorListener?.(err);
|
|
1268
|
+
} catch (err2) {
|
|
1269
|
+
reportUnhandledError(err2);
|
|
1270
|
+
}
|
|
1206
1271
|
}
|
|
1207
1272
|
this.observers.clear();
|
|
1273
|
+
if (reportError) {
|
|
1274
|
+
reportUnhandledError(err);
|
|
1275
|
+
}
|
|
1208
1276
|
}
|
|
1209
1277
|
_stopProcedure() {
|
|
1210
1278
|
if (this.status !== ActorStatus.Running) {
|
|
@@ -1526,10 +1594,10 @@ function toGuardDefinition(guardConfig, getPredicate) {
|
|
|
1526
1594
|
}
|
|
1527
1595
|
}
|
|
1528
1596
|
|
|
1529
|
-
function getOutput(configuration, context, event) {
|
|
1597
|
+
function getOutput(configuration, context, event, self) {
|
|
1530
1598
|
const machine = configuration[0].machine;
|
|
1531
1599
|
const finalChildStateNode = configuration.find(stateNode => stateNode.type === 'final' && stateNode.parent === machine.root);
|
|
1532
|
-
return finalChildStateNode && finalChildStateNode.output ? mapContext(finalChildStateNode.output, context, event) : undefined;
|
|
1600
|
+
return finalChildStateNode && finalChildStateNode.output ? mapContext(finalChildStateNode.output, context, event, self) : undefined;
|
|
1533
1601
|
}
|
|
1534
1602
|
const isAtomicStateNode = stateNode => stateNode.type === 'atomic' || stateNode.type === 'final';
|
|
1535
1603
|
function getChildren(stateNode) {
|
|
@@ -2145,7 +2213,7 @@ function microstepProcedure(transitions, currentState, mutConfiguration, event,
|
|
|
2145
2213
|
actions.push(...filteredTransitions.flatMap(t => t.actions));
|
|
2146
2214
|
|
|
2147
2215
|
// Enter states
|
|
2148
|
-
enterStates(event, filteredTransitions, mutConfiguration, actions, internalQueue, currentState, historyValue, isInitial);
|
|
2216
|
+
enterStates(event, filteredTransitions, mutConfiguration, actions, internalQueue, currentState, historyValue, isInitial, actorCtx);
|
|
2149
2217
|
const nextConfiguration = [...mutConfiguration];
|
|
2150
2218
|
const done = isInFinalState(nextConfiguration);
|
|
2151
2219
|
if (done) {
|
|
@@ -2154,7 +2222,7 @@ function microstepProcedure(transitions, currentState, mutConfiguration, event,
|
|
|
2154
2222
|
}
|
|
2155
2223
|
try {
|
|
2156
2224
|
const nextState = resolveActionsAndContext(actions, event, currentState, actorCtx);
|
|
2157
|
-
const output = done ? getOutput(nextConfiguration, nextState.context, event) : undefined;
|
|
2225
|
+
const output = done ? getOutput(nextConfiguration, nextState.context, event, actorCtx.self) : undefined;
|
|
2158
2226
|
internalQueue.push(...nextState._internalQueue);
|
|
2159
2227
|
return cloneState(currentState, {
|
|
2160
2228
|
configuration: nextConfiguration,
|
|
@@ -2171,7 +2239,7 @@ function microstepProcedure(transitions, currentState, mutConfiguration, event,
|
|
|
2171
2239
|
throw e;
|
|
2172
2240
|
}
|
|
2173
2241
|
}
|
|
2174
|
-
function enterStates(event, filteredTransitions, mutConfiguration, actions, internalQueue, currentState, historyValue, isInitial) {
|
|
2242
|
+
function enterStates(event, filteredTransitions, mutConfiguration, actions, internalQueue, currentState, historyValue, isInitial, actorContext) {
|
|
2175
2243
|
const statesToEnter = new Set();
|
|
2176
2244
|
const statesForDefaultEntry = new Set();
|
|
2177
2245
|
computeEntrySet(filteredTransitions, historyValue, statesForDefaultEntry, statesToEnter);
|
|
@@ -2199,7 +2267,7 @@ function enterStates(event, filteredTransitions, mutConfiguration, actions, inte
|
|
|
2199
2267
|
if (!parent.parent) {
|
|
2200
2268
|
continue;
|
|
2201
2269
|
}
|
|
2202
|
-
internalQueue.push(done(parent.id, stateNodeToEnter.output ? mapContext(stateNodeToEnter.output, currentState.context, event) : undefined));
|
|
2270
|
+
internalQueue.push(done(parent.id, stateNodeToEnter.output ? mapContext(stateNodeToEnter.output, currentState.context, event, actorContext.self) : undefined));
|
|
2203
2271
|
if (parent.parent) {
|
|
2204
2272
|
const grandparent = parent.parent;
|
|
2205
2273
|
if (grandparent.type === 'parallel') {
|
|
@@ -2519,6 +2587,7 @@ class State {
|
|
|
2519
2587
|
this.value = void 0;
|
|
2520
2588
|
this.done = void 0;
|
|
2521
2589
|
this.output = void 0;
|
|
2590
|
+
this.error = void 0;
|
|
2522
2591
|
this.context = void 0;
|
|
2523
2592
|
this.historyValue = {};
|
|
2524
2593
|
this._internalQueue = void 0;
|
|
@@ -2535,6 +2604,7 @@ class State {
|
|
|
2535
2604
|
this.tags = new Set(flatten(this.configuration.map(sn => sn.tags)));
|
|
2536
2605
|
this.done = config.done ?? false;
|
|
2537
2606
|
this.output = config.output;
|
|
2607
|
+
this.error = config.error;
|
|
2538
2608
|
}
|
|
2539
2609
|
|
|
2540
2610
|
/**
|
|
@@ -2996,6 +3066,7 @@ exports.and = and;
|
|
|
2996
3066
|
exports.assign = assign;
|
|
2997
3067
|
exports.cancel = cancel;
|
|
2998
3068
|
exports.choose = choose;
|
|
3069
|
+
exports.cloneState = cloneState;
|
|
2999
3070
|
exports.constantPrefixes = constantPrefixes;
|
|
3000
3071
|
exports.createEmptyActor = createEmptyActor;
|
|
3001
3072
|
exports.createInitEvent = createInitEvent;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MachineConfig, EventObject,
|
|
1
|
+
import { MachineConfig, EventObject, MachineContext, InternalMachineImplementations, ParameterizedObject, ProvidedActor, AnyEventObject } from "./types.js";
|
|
2
2
|
import { TypegenConstraint, TypegenDisabled, ResolveTypegenMeta } from "./typegenTypes.js";
|
|
3
3
|
import { StateMachine } from "./StateMachine.js";
|
|
4
|
-
export declare function createMachine<TContext extends MachineContext, TEvent extends EventObject = AnyEventObject, TActor extends ProvidedActor = ProvidedActor, TTypesMeta extends TypegenConstraint = TypegenDisabled>(config: MachineConfig<TContext, TEvent, ParameterizedObject, TActor, TTypesMeta>, implementations?: InternalMachineImplementations<TContext, TEvent, ParameterizedObject, TActor, ResolveTypegenMeta<TTypesMeta, TEvent, ParameterizedObject, TActor>>): StateMachine<TContext, TEvent, ParameterizedObject, TActor, ResolveTypegenMeta<TTypesMeta, TEvent, ParameterizedObject, TActor>>;
|
|
4
|
+
export declare function createMachine<TContext extends MachineContext, TEvent extends EventObject = AnyEventObject, TActor extends ProvidedActor = ProvidedActor, TInput = any, TTypesMeta extends TypegenConstraint = TypegenDisabled>(config: MachineConfig<TContext, TEvent, ParameterizedObject, TActor, TInput, TTypesMeta>, implementations?: InternalMachineImplementations<TContext, TEvent, ParameterizedObject, TActor, ResolveTypegenMeta<TTypesMeta, TEvent, ParameterizedObject, TActor>>): StateMachine<TContext, TEvent, ParameterizedObject, TActor, TInput, ResolveTypegenMeta<TTypesMeta, TEvent, ParameterizedObject, TActor>>;
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import type { StateNode } from "./StateNode.js";
|
|
2
2
|
import { TypegenDisabled, TypegenEnabled } from "./typegenTypes.js";
|
|
3
3
|
import type { ProvidedActor, ActorRefFrom, AnyState, AnyStateMachine, EventObject, HistoryValue, MachineContext, PersistedMachineState, Prop, StateConfig, StateValue, TODO, AnyActorRef, Compute } from "./types.js";
|
|
4
|
-
type ComputeConcreteChildren<TActor extends
|
|
5
|
-
[
|
|
6
|
-
id: K;
|
|
7
|
-
})['logic']>;
|
|
4
|
+
type ComputeConcreteChildren<TActor extends ProvidedActor> = {
|
|
5
|
+
[A in TActor as 'id' extends keyof A ? A['id'] & string : never]?: ActorRefFrom<A['logic']>;
|
|
8
6
|
};
|
|
9
|
-
type ComputeChildren<TActor extends ProvidedActor> = string extends TActor['src'] ? Record<string, AnyActorRef> : Compute<ComputeConcreteChildren<
|
|
10
|
-
id: string;
|
|
11
|
-
}>> & (undefined extends TActor['id'] ? {
|
|
7
|
+
type ComputeChildren<TActor extends ProvidedActor> = string extends TActor['src'] ? Record<string, AnyActorRef> : Compute<ComputeConcreteChildren<TActor> & (undefined extends TActor['id'] ? {
|
|
12
8
|
[id: string]: TActor extends any ? ActorRefFrom<TActor['logic']> | undefined : never;
|
|
13
9
|
} : {})>;
|
|
14
10
|
export declare function isStateConfig<TContext extends MachineContext, TEvent extends EventObject>(state: any): state is StateConfig<TContext, TEvent>;
|
|
@@ -28,6 +24,7 @@ export declare class State<TContext extends MachineContext, TEvent extends Event
|
|
|
28
24
|
* The done data of the top-level finite state.
|
|
29
25
|
*/
|
|
30
26
|
output: any;
|
|
27
|
+
error: unknown;
|
|
31
28
|
context: TContext;
|
|
32
29
|
historyValue: Readonly<HistoryValue<TContext, TEvent>>;
|
|
33
30
|
_internalQueue: Array<TEvent>;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { State } from "./State.js";
|
|
2
2
|
import { StateNode } from "./StateNode.js";
|
|
3
3
|
import type { AreAllImplementationsAssumedToBeProvided, MarkAllImplementationsAsProvided, ResolveTypegenMeta, TypegenDisabled } from "./typegenTypes.js";
|
|
4
|
-
import type { ActorContext, ActorLogic, EventObject, InternalMachineImplementations, MachineConfig, MachineContext, MachineImplementationsSimplified, MachineTypes, NoInfer, StateConfig, StateMachineDefinition, StateValue, TransitionDefinition, PersistedMachineState, ParameterizedObject, AnyActorContext, ProvidedActor, Equals } from "./types.js";
|
|
4
|
+
import type { ActorContext, ActorLogic, EventObject, InternalMachineImplementations, MachineConfig, MachineContext, MachineImplementationsSimplified, MachineTypes, NoInfer, StateConfig, StateMachineDefinition, StateValue, TransitionDefinition, PersistedMachineState, ParameterizedObject, AnyActorContext, ProvidedActor, Equals, TODO } from "./types.js";
|
|
5
5
|
export declare const STATE_IDENTIFIER = "#";
|
|
6
6
|
export declare const WILDCARD = "*";
|
|
7
|
-
export declare class StateMachine<TContext extends MachineContext, TEvent extends EventObject
|
|
7
|
+
export declare class StateMachine<TContext extends MachineContext, TEvent extends EventObject, TAction extends ParameterizedObject, TActor extends ProvidedActor, TInput, TResolvedTypesMeta = ResolveTypegenMeta<TypegenDisabled, NoInfer<TEvent>, TAction, TActor>> implements ActorLogic<TEvent, State<TContext, TEvent, TActor, TResolvedTypesMeta>, State<TContext, TEvent, TActor, TResolvedTypesMeta>, PersistedMachineState<State<TContext, TEvent, TActor, TResolvedTypesMeta>>, TODO, TInput, TODO> {
|
|
8
8
|
/**
|
|
9
9
|
* The raw config used to create the machine.
|
|
10
10
|
*/
|
|
@@ -14,7 +14,7 @@ export declare class StateMachine<TContext extends MachineContext, TEvent extend
|
|
|
14
14
|
*/
|
|
15
15
|
version?: string;
|
|
16
16
|
implementations: MachineImplementationsSimplified<TContext, TEvent>;
|
|
17
|
-
types: MachineTypes<TContext, TEvent, TActor>;
|
|
17
|
+
types: MachineTypes<TContext, TEvent, TActor, TInput>;
|
|
18
18
|
__xstatenode: true;
|
|
19
19
|
idMap: Map<string, StateNode<TContext, TEvent>>;
|
|
20
20
|
root: StateNode<TContext, TEvent>;
|
|
@@ -35,7 +35,7 @@ export declare class StateMachine<TContext extends MachineContext, TEvent extend
|
|
|
35
35
|
*
|
|
36
36
|
* @returns A new `StateMachine` instance with the provided implementations.
|
|
37
37
|
*/
|
|
38
|
-
provide(implementations: InternalMachineImplementations<TContext, TEvent, TAction, TActor, TResolvedTypesMeta, true>): StateMachine<TContext, TEvent, TAction, TActor, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta>;
|
|
38
|
+
provide(implementations: InternalMachineImplementations<TContext, TEvent, TAction, TActor, TResolvedTypesMeta, true>): StateMachine<TContext, TEvent, TAction, TActor, TInput, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta>;
|
|
39
39
|
/**
|
|
40
40
|
* Resolves the given `state` to a new `State` instance relative to this machine.
|
|
41
41
|
*
|
|
@@ -70,8 +70,8 @@ export declare class StateMachine<TContext extends MachineContext, TEvent extend
|
|
|
70
70
|
/**
|
|
71
71
|
* Returns the initial `State` instance, with reference to `self` as an `ActorRef`.
|
|
72
72
|
*/
|
|
73
|
-
getInitialState(actorCtx: ActorContext<TEvent, State<TContext, TEvent, TActor, TResolvedTypesMeta>>, input?:
|
|
74
|
-
start(state: State<TContext, TEvent, TActor, TResolvedTypesMeta
|
|
73
|
+
getInitialState(actorCtx: ActorContext<TEvent, State<TContext, TEvent, TActor, TResolvedTypesMeta>>, input?: TInput): State<TContext, TEvent, TActor, TResolvedTypesMeta>;
|
|
74
|
+
start(state: State<TContext, TEvent, TActor, TResolvedTypesMeta>): void;
|
|
75
75
|
getStateNodeById(stateId: string): StateNode<TContext, TEvent>;
|
|
76
76
|
get definition(): StateMachineDefinition<TContext, TEvent>;
|
|
77
77
|
toJSON(): StateMachineDefinition<TContext, TEvent>;
|
|
@@ -95,4 +95,5 @@ export declare class StateMachine<TContext extends MachineContext, TEvent extend
|
|
|
95
95
|
__TActor: TActor;
|
|
96
96
|
/** @deprecated an internal property acting as a "phantom" type, not meant to be used at runtime */
|
|
97
97
|
__TResolvedTypesMeta: TResolvedTypesMeta;
|
|
98
|
+
__TInput: TInput;
|
|
98
99
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { State } from "./State.js";
|
|
2
2
|
import type { StateMachine } from "./StateMachine.js";
|
|
3
|
-
import type { Action, DelayedTransitionDefinition, EventObject, InitialTransitionDefinition, InvokeDefinition, MachineContext, Mapper,
|
|
3
|
+
import type { Action, DelayedTransitionDefinition, EventObject, InitialTransitionDefinition, InvokeDefinition, MachineContext, Mapper, StateNodeConfig, StateNodeDefinition, StateNodesConfig, TransitionDefinition, TransitionDefinitionMap, TODO } from "./types.js";
|
|
4
4
|
interface StateNodeOptions<TContext extends MachineContext, TEvent extends EventObject> {
|
|
5
5
|
_key: string;
|
|
6
6
|
_parent?: StateNode<TContext, TEvent>;
|
|
@@ -59,7 +59,7 @@ export declare class StateNode<TContext extends MachineContext = MachineContext,
|
|
|
59
59
|
/**
|
|
60
60
|
* The root machine node.
|
|
61
61
|
*/
|
|
62
|
-
machine: StateMachine<TContext, TEvent, any, any>;
|
|
62
|
+
machine: StateMachine<TContext, TEvent, any, any, TODO, TODO>;
|
|
63
63
|
/**
|
|
64
64
|
* The meta data associated with this state node, which will be returned in State instances.
|
|
65
65
|
*/
|
|
@@ -67,7 +67,7 @@ export declare class StateNode<TContext extends MachineContext = MachineContext,
|
|
|
67
67
|
/**
|
|
68
68
|
* The output data sent with the "done.state._id_" event if this is a final state node.
|
|
69
69
|
*/
|
|
70
|
-
output?: Mapper<TContext, TEvent, any
|
|
70
|
+
output?: Mapper<TContext, TEvent, any>;
|
|
71
71
|
/**
|
|
72
72
|
* The order this state node appears. Corresponds to the implicit document order.
|
|
73
73
|
*/
|
|
@@ -29,7 +29,7 @@ export declare function sendTo<TContext extends MachineContext, TExpressionEvent
|
|
|
29
29
|
(_: ActionArgs<TContext, TExpressionEvent>): void;
|
|
30
30
|
type: string;
|
|
31
31
|
to: string | TActor | ((args: UnifiedArg<TContext, TExpressionEvent>) => TActor | string);
|
|
32
|
-
event: ((TActor extends import("../types.js").AnyFunction ? ReturnType<TActor> : TActor) extends infer R ? R extends import("../StateMachine.js").StateMachine<infer _ extends MachineContext, infer TEvent_1 extends EventObject, infer __ extends import("../types.js").ParameterizedObject, infer ___ extends import("../types.js").ProvidedActor, infer ____> ? TEvent_1 : R extends import("../State.js").State<infer _TContext extends MachineContext, infer TEvent_2 extends EventObject, infer _TAction extends import("../types.js").ProvidedActor, infer _TActor> ? TEvent_2 : R extends ActorRef<infer TEvent_3 extends EventObject, infer __1> ? TEvent_3 : never : never) | SendExpr<TContext, TExpressionEvent, InferEvent<Cast<(TActor extends import("../types.js").AnyFunction ? ReturnType<TActor> : TActor) extends infer R ? R extends import("../StateMachine.js").StateMachine<infer _ extends MachineContext, infer TEvent_1 extends EventObject, infer __ extends import("../types.js").ParameterizedObject, infer ___ extends import("../types.js").ProvidedActor, infer ____> ? TEvent_1 : R extends import("../State.js").State<infer _TContext extends MachineContext, infer TEvent_2 extends EventObject, infer _TAction extends import("../types.js").ProvidedActor, infer _TActor> ? TEvent_2 : R extends ActorRef<infer TEvent_3 extends EventObject, infer __1> ? TEvent_3 : never : never, EventObject>>>;
|
|
32
|
+
event: ((TActor extends import("../types.js").AnyFunction ? ReturnType<TActor> : TActor) extends infer R ? R extends import("../StateMachine.js").StateMachine<infer _ extends MachineContext, infer TEvent_1 extends EventObject, infer __ extends import("../types.js").ParameterizedObject, infer ___ extends import("../types.js").ProvidedActor, infer ____, infer _____> ? TEvent_1 : R extends import("../State.js").State<infer _TContext extends MachineContext, infer TEvent_2 extends EventObject, infer _TAction extends import("../types.js").ProvidedActor, infer _TActor> ? TEvent_2 : R extends ActorRef<infer TEvent_3 extends EventObject, infer __1> ? TEvent_3 : never : never) | SendExpr<TContext, TExpressionEvent, InferEvent<Cast<(TActor extends import("../types.js").AnyFunction ? ReturnType<TActor> : TActor) extends infer R ? R extends import("../StateMachine.js").StateMachine<infer _ extends MachineContext, infer TEvent_1 extends EventObject, infer __ extends import("../types.js").ParameterizedObject, infer ___ extends import("../types.js").ProvidedActor, infer ____, infer _____> ? TEvent_1 : R extends import("../State.js").State<infer _TContext extends MachineContext, infer TEvent_2 extends EventObject, infer _TAction extends import("../types.js").ProvidedActor, infer _TActor> ? TEvent_2 : R extends ActorRef<infer TEvent_3 extends EventObject, infer __1> ? TEvent_3 : never : never, EventObject>>>;
|
|
33
33
|
id: string | undefined;
|
|
34
34
|
delay: string | number | DelayExpr<TContext, TExpressionEvent> | undefined;
|
|
35
35
|
resolve: typeof resolve;
|
|
@@ -2,7 +2,7 @@ import { ActionArgs, ActorRef, AnyActorContext, AnyState, EventObject, MachineCo
|
|
|
2
2
|
type ResolvableActorRef<TContext extends MachineContext, TExpressionEvent extends EventObject> = string | ActorRef<any> | ((args: UnifiedArg<TContext, TExpressionEvent>) => ActorRef<any> | string);
|
|
3
3
|
declare function resolve(_: AnyActorContext, state: AnyState, args: ActionArgs<any, any>, { actorRef }: {
|
|
4
4
|
actorRef: ResolvableActorRef<any, any>;
|
|
5
|
-
}): (ActorRef<any, any>
|
|
5
|
+
}): (AnyState | ActorRef<any, any>)[];
|
|
6
6
|
declare function execute(actorContext: AnyActorContext, actorRef: ActorRef<any, any> | undefined): void;
|
|
7
7
|
/**
|
|
8
8
|
* Stops an actor.
|
|
@@ -36,7 +36,7 @@ export declare function done(id: string, output?: any): DoneEventObject;
|
|
|
36
36
|
*/
|
|
37
37
|
export declare function doneInvoke(invokeId: string, output?: any): DoneEvent;
|
|
38
38
|
export declare function error(id: string, data?: any): ErrorPlatformEvent & string;
|
|
39
|
-
export declare function createInitEvent(input:
|
|
39
|
+
export declare function createInitEvent(input: unknown): {
|
|
40
40
|
readonly type: "xstate.init";
|
|
41
|
-
readonly input:
|
|
41
|
+
readonly input: unknown;
|
|
42
42
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ActorLogic, EventObject, AnyActorSystem, AnyEventObject, ActorSystem, ActorRefFrom } from "../types.js";
|
|
2
|
-
export interface CallbackInternalState<TEvent extends EventObject> {
|
|
2
|
+
export interface CallbackInternalState<TEvent extends EventObject, TInput = unknown> {
|
|
3
3
|
canceled: boolean;
|
|
4
4
|
receivers: Set<(e: TEvent) => void>;
|
|
5
5
|
dispose: void | (() => void) | Promise<any>;
|
|
6
|
-
input
|
|
6
|
+
input: TInput;
|
|
7
7
|
}
|
|
8
|
-
export type CallbackActorLogic<TEvent extends EventObject, TInput =
|
|
9
|
-
export type CallbackActorRef<TEvent extends EventObject> = ActorRefFrom<CallbackActorLogic<TEvent>>;
|
|
8
|
+
export type CallbackActorLogic<TEvent extends EventObject, TInput = unknown> = ActorLogic<TEvent, undefined, CallbackInternalState<TEvent, TInput>, Pick<CallbackInternalState<TEvent, TInput>, 'input' | 'canceled'>, ActorSystem<any>, TInput, any>;
|
|
9
|
+
export type CallbackActorRef<TEvent extends EventObject, TInput = unknown> = ActorRefFrom<CallbackActorLogic<TEvent, TInput>>;
|
|
10
10
|
export type Receiver<TEvent extends EventObject> = (listener: {
|
|
11
11
|
bivarianceHack(event: TEvent): void;
|
|
12
12
|
}['bivarianceHack']) => void;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { Subscribable, ActorLogic, EventObject, Subscription, AnyActorSystem, ActorRefFrom } from "../types.js";
|
|
2
|
-
export interface ObservableInternalState<T> {
|
|
2
|
+
export interface ObservableInternalState<T, TInput = unknown> {
|
|
3
3
|
subscription: Subscription | undefined;
|
|
4
4
|
status: 'active' | 'done' | 'error' | 'canceled';
|
|
5
5
|
data: T | undefined;
|
|
6
|
-
input
|
|
6
|
+
input: TInput | undefined;
|
|
7
7
|
}
|
|
8
|
-
export type ObservablePersistedState<T> = Omit<ObservableInternalState<T>, 'subscription'>;
|
|
9
|
-
export type ObservableActorLogic<T, TInput> = ActorLogic<
|
|
8
|
+
export type ObservablePersistedState<T, TInput = unknown> = Omit<ObservableInternalState<T, TInput>, 'subscription'>;
|
|
9
|
+
export type ObservableActorLogic<T, TInput> = ActorLogic<{
|
|
10
|
+
type: string;
|
|
11
|
+
[k: string]: unknown;
|
|
12
|
+
}, T | undefined, ObservableInternalState<T, TInput>, ObservablePersistedState<T, TInput>, AnyActorSystem, TInput>;
|
|
10
13
|
export type ObservableActorRef<T> = ActorRefFrom<ObservableActorLogic<T, any>>;
|
|
11
14
|
export declare function fromObservable<T, TInput>(observableCreator: ({ input, system }: {
|
|
12
15
|
input: TInput;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ActorLogic, ActorRefFrom, ActorSystem, AnyActorSystem } from "../types.js";
|
|
2
|
-
export interface PromiseInternalState<T> {
|
|
2
|
+
export interface PromiseInternalState<T, TInput = unknown> {
|
|
3
3
|
status: 'active' | 'error' | 'done' | 'canceled';
|
|
4
4
|
data: T | undefined;
|
|
5
|
-
input
|
|
5
|
+
input: TInput | undefined;
|
|
6
6
|
}
|
|
7
7
|
declare const resolveEventType = "$$xstate.resolve";
|
|
8
8
|
declare const rejectEventType = "$$xstate.reject";
|
|
@@ -18,8 +18,8 @@ export type PromiseActorEvents<T> = {
|
|
|
18
18
|
export type PromiseActorLogic<T, TInput = unknown> = ActorLogic<{
|
|
19
19
|
type: string;
|
|
20
20
|
[k: string]: unknown;
|
|
21
|
-
}, T | undefined, PromiseInternalState<T>, // internal state
|
|
22
|
-
PromiseInternalState<T>, // persisted state
|
|
21
|
+
}, T | undefined, PromiseInternalState<T, TInput>, // internal state
|
|
22
|
+
PromiseInternalState<T, TInput>, // persisted state
|
|
23
23
|
ActorSystem<any>, TInput, // input
|
|
24
24
|
T>;
|
|
25
25
|
export type PromiseActorRef<T> = ActorRefFrom<PromiseActorLogic<T>>;
|