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.
Files changed (40) hide show
  1. package/actions/dist/xstate-actions.cjs.js +1 -1
  2. package/actions/dist/xstate-actions.development.cjs.js +1 -1
  3. package/actions/dist/xstate-actions.development.esm.js +1 -1
  4. package/actions/dist/xstate-actions.esm.js +1 -1
  5. package/actions/dist/xstate-actions.umd.min.js +1 -1
  6. package/actions/dist/xstate-actions.umd.min.js.map +1 -1
  7. package/actors/dist/xstate-actors.cjs.js +1 -1
  8. package/actors/dist/xstate-actors.development.cjs.js +1 -1
  9. package/actors/dist/xstate-actors.development.esm.js +1 -1
  10. package/actors/dist/xstate-actors.esm.js +1 -1
  11. package/actors/dist/xstate-actors.umd.min.js +1 -1
  12. package/actors/dist/xstate-actors.umd.min.js.map +1 -1
  13. package/dist/{actions-b299d008.development.esm.js → actions-49f0501e.development.esm.js} +136 -63
  14. package/dist/{actions-a8a9433c.esm.js → actions-5039c951.esm.js} +134 -64
  15. package/dist/{actions-d1c41ed3.development.cjs.js → actions-a95d2e66.development.cjs.js} +136 -62
  16. package/dist/{actions-069d9805.cjs.js → actions-c619a105.cjs.js} +134 -63
  17. package/dist/declarations/src/Machine.d.ts +2 -2
  18. package/dist/declarations/src/State.d.ts +4 -7
  19. package/dist/declarations/src/StateMachine.d.ts +7 -6
  20. package/dist/declarations/src/StateNode.d.ts +3 -3
  21. package/dist/declarations/src/actions/send.d.ts +1 -1
  22. package/dist/declarations/src/actions/stop.d.ts +1 -1
  23. package/dist/declarations/src/actions.d.ts +2 -2
  24. package/dist/declarations/src/actors/callback.d.ts +4 -4
  25. package/dist/declarations/src/actors/observable.d.ts +7 -4
  26. package/dist/declarations/src/actors/promise.d.ts +4 -4
  27. package/dist/declarations/src/types.d.ts +41 -29
  28. package/dist/declarations/src/utils.d.ts +2 -2
  29. package/dist/xstate.cjs.js +11 -10
  30. package/dist/xstate.development.cjs.js +11 -10
  31. package/dist/xstate.development.esm.js +12 -11
  32. package/dist/xstate.esm.js +12 -11
  33. package/dist/xstate.umd.min.js +1 -1
  34. package/dist/xstate.umd.min.js.map +1 -1
  35. package/guards/dist/xstate-guards.cjs.js +1 -1
  36. package/guards/dist/xstate-guards.development.cjs.js +1 -1
  37. package/guards/dist/xstate-guards.development.esm.js +1 -1
  38. package/guards/dist/xstate-guards.esm.js +1 -1
  39. package/guards/dist/xstate-guards.umd.min.js.map +1 -1
  40. 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
- const result = {};
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 : null;
482
+ const self = isObserver ? nextHandler : undefined;
484
483
  return {
485
- next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),
486
- error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),
487
- complete: ((isObserver ? nextHandler.complete : completionHandler) || noop).bind(self)
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
- const logic = {
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
- }) => input
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
- const logic = {
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
- observer.next?.(snapshot);
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.observers.add(observer);
1115
- if (this.status === ActorStatus.Stopped) {
1116
- observer.complete?.();
1117
- this.observers.delete(observer);
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
- this.logic.start(this._state, this._actorContext);
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
- const nextState = this.logic.transition(this._state, event, this._actorContext);
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
- // TODO: properly handle errors
1163
- if (this.observers.size > 0) {
1164
- this.observers.forEach(observer => {
1165
- observer.error?.(err);
1166
- });
1167
- this.stop();
1168
- } else {
1169
- throw err;
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
- observer.complete?.();
1247
+ try {
1248
+ observer.complete?.();
1249
+ } catch (err) {
1250
+ reportUnhandledError(err);
1251
+ }
1200
1252
  }
1201
1253
  this.observers.clear();
1202
1254
  }
1203
- _error(data) {
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?.(data);
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, AnyEventObject, MachineContext, InternalMachineImplementations, ParameterizedObject, ProvidedActor } from "./types.js";
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 Required<ProvidedActor>> = {
5
- [K in TActor['id']]?: ActorRefFrom<(TActor & {
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<Extract<TActor, {
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 = EventObject, TAction extends ParameterizedObject = ParameterizedObject, TActor extends ProvidedActor = ProvidedActor, 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>>> {
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?: any): State<TContext, TEvent, TActor, TResolvedTypesMeta>;
74
- start(state: State<TContext, TEvent, TActor, TResolvedTypesMeta>, actorCtx: ActorContext<TEvent, State<TContext, TEvent, TActor, TResolvedTypesMeta>>): void;
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, PropertyMapper, StateNodeConfig, StateNodeDefinition, StateNodesConfig, TransitionDefinition, TransitionDefinitionMap, TODO } from "./types.js";
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> | PropertyMapper<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> | AnyState)[];
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: any): {
39
+ export declare function createInitEvent(input: unknown): {
40
40
  readonly type: "xstate.init";
41
- readonly input: any;
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?: any;
6
+ input: TInput;
7
7
  }
8
- export type CallbackActorLogic<TEvent extends EventObject, TInput = any> = ActorLogic<TEvent, undefined, CallbackInternalState<TEvent>, CallbackInternalState<TEvent>, ActorSystem<any>, TInput, any>;
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?: any;
6
+ input: TInput | undefined;
7
7
  }
8
- export type ObservablePersistedState<T> = Omit<ObservableInternalState<T>, 'subscription'>;
9
- export type ObservableActorLogic<T, TInput> = ActorLogic<EventObject, T | undefined, ObservableInternalState<T>, ObservablePersistedState<T>, AnyActorSystem, TInput>;
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?: any;
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>>;