xstate 4.30.6 → 4.32.1

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/es/waitFor.js ADDED
@@ -0,0 +1,71 @@
1
+ import { __assign } from './_virtual/_tslib.js';
2
+
3
+ var defaultWaitForOptions = {
4
+ timeout: 10000 // 10 seconds
5
+
6
+ };
7
+ /**
8
+ * Subscribes to an actor ref and waits for its emitted value to satisfy
9
+ * a predicate, and then resolves with that value.
10
+ *
11
+ * @example
12
+ * ```js
13
+ * const state = await waitFor(someService, state => {
14
+ * return state.hasTag('loaded');
15
+ * });
16
+ *
17
+ * state.hasTag('loaded'); // true
18
+ * ```
19
+ *
20
+ * @param actorRef The actor ref to subscribe to
21
+ * @param predicate Determines if a value matches the condition to wait for
22
+ * @param options
23
+ * @returns A promise that eventually resolves to the emitted value
24
+ * that matches the condition
25
+ */
26
+
27
+ function waitFor(actorRef, predicate, options) {
28
+ var resolvedOptions = __assign(__assign({}, defaultWaitForOptions), options);
29
+
30
+ return new Promise(function (res, rej) {
31
+ var done = false;
32
+
33
+ if (process.env.NODE_ENV !== 'production' && resolvedOptions.timeout < 0) {
34
+ console.error('`timeout` passed to `waitFor` is negative and it will reject its internal promise immediately.');
35
+ }
36
+
37
+ var handle = resolvedOptions.timeout === Infinity ? undefined : setTimeout(function () {
38
+ sub.unsubscribe();
39
+ rej(new Error("Timeout of ".concat(resolvedOptions.timeout, " ms exceeded")));
40
+ }, resolvedOptions.timeout);
41
+
42
+ var dispose = function () {
43
+ clearTimeout(handle);
44
+ done = true;
45
+ sub === null || sub === void 0 ? void 0 : sub.unsubscribe();
46
+ };
47
+
48
+ var sub = actorRef.subscribe({
49
+ next: function (emitted) {
50
+ if (predicate(emitted)) {
51
+ dispose();
52
+ res(emitted);
53
+ }
54
+ },
55
+ error: function (err) {
56
+ dispose();
57
+ rej(err);
58
+ },
59
+ complete: function () {
60
+ dispose();
61
+ rej(new Error("Actor terminated without satisfying predicate"));
62
+ }
63
+ });
64
+
65
+ if (done) {
66
+ sub.unsubscribe();
67
+ }
68
+ });
69
+ }
70
+
71
+ export { waitFor };
package/lib/State.d.ts CHANGED
@@ -91,14 +91,14 @@ export declare class State<TContext, TEvent extends EventObject = EventObject, T
91
91
  * @param delimiter The character(s) that separate each subpath in the string state node path.
92
92
  */
93
93
  toStrings(stateValue?: StateValue, delimiter?: string): string[];
94
- toJSON(): Omit<this, "machine" | "tags" | "transitions" | "configuration"> & {
94
+ toJSON(): Omit<this, "machine" | "configuration" | "transitions" | "tags"> & {
95
95
  tags: string[];
96
96
  };
97
97
  /**
98
98
  * Whether the current state value is a subset of the given parent state value.
99
99
  * @param parentStateValue
100
100
  */
101
- matches<TSV extends TResolvedTypesMeta extends TypegenEnabled ? Prop<TResolvedTypesMeta, 'matchesStates'> : never>(parentStateValue: TSV): boolean;
101
+ matches<TSV extends TResolvedTypesMeta extends TypegenEnabled ? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'matchesStates'> : never>(parentStateValue: TSV): boolean;
102
102
  matches<TSV extends TResolvedTypesMeta extends TypegenDisabled ? TTypestate['value'] : never>(parentStateValue: TSV): this is State<(TTypestate extends any ? {
103
103
  value: TSV;
104
104
  context: any;
@@ -109,7 +109,7 @@ export declare class State<TContext, TEvent extends EventObject = EventObject, T
109
109
  * Whether the current state configuration has a state node with the specified `tag`.
110
110
  * @param tag
111
111
  */
112
- hasTag(tag: TResolvedTypesMeta extends TypegenEnabled ? Prop<TResolvedTypesMeta, 'tags'> : string): boolean;
112
+ hasTag(tag: TResolvedTypesMeta extends TypegenEnabled ? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'tags'> : string): boolean;
113
113
  /**
114
114
  * Determines whether sending the `event` will cause a non-forbidden transition
115
115
  * to be selected, even if the transitions have no actions nor
package/lib/StateNode.js CHANGED
@@ -924,7 +924,7 @@ function () {
924
924
  transitions: stateTransition.transitions,
925
925
  children: children,
926
926
  done: isDone,
927
- tags: currentState === null || currentState === void 0 ? void 0 : currentState.tags,
927
+ tags: stateUtils.getTagsFromConfiguration(resolvedConfiguration),
928
928
  machine: this
929
929
  });
930
930
  var didUpdateContext = context !== updatedContext;
@@ -974,7 +974,6 @@ function () {
974
974
  maybeNextState.changed = changed; // Preserve original history after raised events
975
975
 
976
976
  maybeNextState.history = history;
977
- maybeNextState.tags = stateUtils.getTagsFromConfiguration(maybeNextState.configuration);
978
977
  return maybeNextState;
979
978
  };
980
979
  /**
package/lib/actions.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Action, Event, EventObject, SingleOrArray, SendAction, SendActionOptions, CancelAction, ActionObject, ActionType, Assigner, PropertyAssigner, AssignAction, ActionFunction, ActionFunctionMap, ActivityActionObject, ActionTypes, ActivityDefinition, RaiseAction, RaiseActionObject, DoneEvent, ErrorPlatformEvent, DoneEventObject, SendExpr, SendActionObject, PureAction, LogExpr, LogAction, LogActionObject, DelayFunctionMap, SCXML, ExprWithMeta, ChooseCondition, ChooseAction, AnyEventObject, Expr, StopAction, StopActionObject, Cast, ActorRef, EventFrom } from './types';
1
+ import { Action, Event, EventObject, SingleOrArray, SendAction, SendActionOptions, CancelAction, ActionObject, ActionType, Assigner, PropertyAssigner, AssignAction, ActionFunction, ActionFunctionMap, ActivityActionObject, ActionTypes, ActivityDefinition, RaiseAction, RaiseActionObject, DoneEvent, ErrorPlatformEvent, DoneEventObject, SendExpr, SendActionObject, PureAction, LogExpr, LogAction, LogActionObject, DelayFunctionMap, SCXML, ExprWithMeta, ChooseCondition, ChooseAction, AnyEventObject, Expr, StopAction, StopActionObject, Cast, EventFrom, AnyActorRef } from './types';
2
2
  import * as actionTypes from './actionTypes';
3
3
  import { State } from './State';
4
4
  import { StateNode } from './StateNode';
@@ -52,7 +52,7 @@ declare type InferEvent<E extends EventObject> = {
52
52
  * @param options Send action options
53
53
  * @returns An XState send action object
54
54
  */
55
- export declare function sendTo<TContext, TEvent extends EventObject, TActor extends ActorRef<EventObject>>(actor: (ctx: TContext) => TActor, event: EventFrom<TActor> | SendExpr<TContext, TEvent, InferEvent<Cast<EventFrom<TActor>, EventObject>>>, options?: SendActionOptions<TContext, TEvent>): SendAction<TContext, TEvent, any>;
55
+ export declare function sendTo<TContext, TEvent extends EventObject, TActor extends AnyActorRef>(actor: (ctx: TContext) => TActor, event: EventFrom<TActor> | SendExpr<TContext, TEvent, InferEvent<Cast<EventFrom<TActor>, EventObject>>>, options?: SendActionOptions<TContext, TEvent>): SendAction<TContext, TEvent, any>;
56
56
  /**
57
57
  * Sends an update event to this machine's parent.
58
58
  */
@@ -48,7 +48,6 @@ function () {
48
48
  }
49
49
 
50
50
  this.machine = machine;
51
- this.scheduler = new scheduler.Scheduler();
52
51
  this.delayedEventsMap = {};
53
52
  this.listeners = new Set();
54
53
  this.contextListeners = new Set();
@@ -365,12 +364,16 @@ function () {
365
364
 
366
365
  this.listeners.add(listener); // Send current state to listener
367
366
 
368
- if (this.status === exports.InterpreterStatus.Running) {
367
+ if (this.status !== exports.InterpreterStatus.NotStarted) {
369
368
  listener(this.state);
370
369
  }
371
370
 
372
371
  if (resolvedCompleteListener) {
373
- this.onDone(resolvedCompleteListener);
372
+ if (this.status === exports.InterpreterStatus.Stopped) {
373
+ resolvedCompleteListener();
374
+ } else {
375
+ this.onDone(resolvedCompleteListener);
376
+ }
374
377
  }
375
378
 
376
379
  return {
@@ -598,6 +601,7 @@ function () {
598
601
  child.stop();
599
602
  }
600
603
  });
604
+ this.children.clear();
601
605
 
602
606
  try {
603
607
  // Cancel all delayed events
@@ -618,8 +622,12 @@ function () {
618
622
  }
619
623
 
620
624
  this.scheduler.clear();
625
+ this.scheduler = new scheduler.Scheduler({
626
+ deferEvents: this.options.deferEvents
627
+ });
621
628
  this.initialized = false;
622
629
  this.status = exports.InterpreterStatus.Stopped;
630
+ this._initialState = undefined;
623
631
  registry.registry.free(this.sessionId);
624
632
  return this;
625
633
  };
@@ -1,8 +1,11 @@
1
- import { AnyFunction, AssignAction, Assigner, BaseActionObject, Compute, EventObject, ExtractEvent, MachineConfig, Prop, PropertyAssigner, StateMachine, InternalMachineOptions, ServiceMap } from './types';
1
+ import { AnyFunction, AssignAction, Assigner, BaseActionObject, Compute, EventObject, MachineConfig, Prop, PropertyAssigner, StateMachine, InternalMachineOptions, ServiceMap } from './types';
2
2
  import { ResolveTypegenMeta, TypegenConstraint, TypegenDisabled } from './typegenTypes';
3
+ declare type SimplisticExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends {
4
+ type: TEventType;
5
+ } ? TEvent : never;
3
6
  export interface Model<TContext, TEvent extends EventObject, TAction extends BaseActionObject = BaseActionObject, TModelCreators = void> {
4
7
  initialContext: TContext;
5
- assign: <TEventType extends TEvent['type'] = TEvent['type']>(assigner: Assigner<TContext, ExtractEvent<TEvent, TEventType>> | PropertyAssigner<TContext, ExtractEvent<TEvent, TEventType>>, eventType?: TEventType) => AssignAction<TContext, ExtractEvent<TEvent, TEventType>>;
8
+ assign: <TEventType extends TEvent['type'] = TEvent['type']>(assigner: Assigner<TContext, SimplisticExtractEvent<TEvent, TEventType>> | PropertyAssigner<TContext, SimplisticExtractEvent<TEvent, TEventType>>, eventType?: TEventType) => AssignAction<TContext, SimplisticExtractEvent<TEvent, TEventType>>;
6
9
  events: Prop<TModelCreators, 'events'>;
7
10
  actions: Prop<TModelCreators, 'actions'>;
8
11
  reset: () => AssignAction<TContext, any>;
@@ -49,4 +52,5 @@ export interface FinalModelCreators<Self> {
49
52
  export declare type UnionFromCreatorsReturnTypes<TCreators> = {
50
53
  [K in keyof TCreators]: TCreators[K] extends AnyFunction ? ReturnType<TCreators[K]> : never;
51
54
  }[keyof TCreators];
55
+ export {};
52
56
  //# sourceMappingURL=model.types.d.ts.map
package/lib/stateUtils.js CHANGED
@@ -11,6 +11,8 @@ var isLeafNode = function (stateNode) {
11
11
  function getChildren(stateNode) {
12
12
  return Object.keys(stateNode.states).map(function (key) {
13
13
  return stateNode.states[key];
14
+ }).filter(function (sn) {
15
+ return sn.type !== 'history';
14
16
  });
15
17
  }
16
18
  function getAllStateNodes(stateNode) {
@@ -75,10 +77,6 @@ function getConfiguration(prevStateNodes, stateNodes) {
75
77
  for (var _e = (e_3 = void 0, _tslib.__values(getChildren(s))), _f = _e.next(); !_f.done; _f = _e.next()) {
76
78
  var child = _f.value;
77
79
 
78
- if (child.type === 'history') {
79
- continue;
80
- }
81
-
82
80
  if (!configuration.has(child)) {
83
81
  configuration.add(child);
84
82
 
@@ -77,21 +77,27 @@ export interface TypegenMeta extends TypegenEnabled {
77
77
  eventsCausingServices: Record<string, string>;
78
78
  }
79
79
  export interface ResolvedTypegenMeta extends TypegenMeta {
80
- indexedActions: Record<string, BaseActionObject>;
81
- indexedEvents: Record<string, EventObject>;
80
+ resolved: TypegenMeta & {
81
+ indexedActions: Record<string, BaseActionObject>;
82
+ indexedEvents: Record<string, EventObject>;
83
+ };
82
84
  }
83
85
  export declare type TypegenConstraint = TypegenEnabled | TypegenDisabled;
84
- export declare type AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta, TMissingImplementations = Prop<TResolvedTypesMeta, 'missingImplementations'>> = IsAny<TResolvedTypesMeta> extends true ? true : TResolvedTypesMeta extends TypegenEnabled ? IsNever<Values<{
86
+ export declare type AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta, TMissingImplementations = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'missingImplementations'>> = IsAny<TResolvedTypesMeta> extends true ? true : TResolvedTypesMeta extends TypegenEnabled ? IsNever<Values<{
85
87
  [K in keyof TMissingImplementations]: TMissingImplementations[K];
86
88
  }>> extends true ? true : false : true;
87
- export declare type MarkAllImplementationsAsProvided<TResolvedTypesMeta> = TResolvedTypesMeta & {
89
+ interface AllImplementationsProvided {
88
90
  missingImplementations: {
89
91
  actions: never;
90
92
  delays: never;
91
93
  guards: never;
92
94
  services: never;
93
95
  };
94
- };
96
+ }
97
+ export interface MarkAllImplementationsAsProvided<TResolvedTypesMeta> {
98
+ '@@xstate/typegen': Prop<TResolvedTypesMeta, '@@xstate/typegen'>;
99
+ resolved: Prop<TResolvedTypesMeta, 'resolved'> & AllImplementationsProvided;
100
+ }
95
101
  declare type GenerateServiceEvent<TServiceName, TEventType, TServiceMap extends ServiceMap> = TEventType extends any ? {
96
102
  type: TEventType;
97
103
  } & Prop<TServiceMap, TServiceName> : never;
@@ -105,17 +111,23 @@ declare type AllowAllEvents = {
105
111
  eventsCausingGuards: Record<string, string>;
106
112
  eventsCausingServices: Record<string, string>;
107
113
  };
108
- export declare type ResolveTypegenMeta<TTypesMeta extends TypegenConstraint, TEvent extends EventObject, TAction extends BaseActionObject, TServiceMap extends ServiceMap> = TTypesMeta extends TypegenEnabled ? TTypesMeta & {
109
- indexedActions: IndexByType<TAction>;
110
- indexedEvents: MergeWithInternalEvents<IndexByType<(string extends TEvent['type'] ? never : TEvent) | GenerateServiceEvents<TServiceMap, Prop<TTypesMeta, 'invokeSrcNameMap'>>>, Prop<TTypesMeta, 'internalEvents'>>;
111
- } : MarkAllImplementationsAsProvided<TypegenDisabled> & AllowAllEvents & {
112
- indexedActions: IndexByType<TAction>;
113
- indexedEvents: Record<string, TEvent> & {
114
- __XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__: {
115
- data: any;
114
+ export interface ResolveTypegenMeta<TTypesMeta extends TypegenConstraint, TEvent extends EventObject, TAction extends BaseActionObject, TServiceMap extends ServiceMap> {
115
+ '@@xstate/typegen': TTypesMeta['@@xstate/typegen'];
116
+ resolved: {
117
+ enabled: TTypesMeta & {
118
+ indexedActions: IndexByType<TAction>;
119
+ indexedEvents: MergeWithInternalEvents<IndexByType<(string extends TEvent['type'] ? never : TEvent) | GenerateServiceEvents<TServiceMap, Prop<TTypesMeta, 'invokeSrcNameMap'>>>, Prop<TTypesMeta, 'internalEvents'>>;
116
120
  };
117
- };
118
- invokeSrcNameMap: Record<string, '__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__'>;
119
- };
121
+ disabled: TypegenDisabled & AllImplementationsProvided & AllowAllEvents & {
122
+ indexedActions: IndexByType<TAction>;
123
+ indexedEvents: Record<string, TEvent> & {
124
+ __XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__: {
125
+ data: any;
126
+ };
127
+ };
128
+ invokeSrcNameMap: Record<string, '__XSTATE_ALLOW_ANY_INVOKE_DATA_HACK__'>;
129
+ };
130
+ }[IsNever<TTypesMeta> extends true ? 'disabled' : TTypesMeta extends TypegenEnabled ? 'enabled' : 'disabled'];
131
+ }
120
132
  export {};
121
133
  //# sourceMappingURL=typegenTypes.d.ts.map
package/lib/types.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Clock, Interpreter } from './interpreter';
2
2
  import { Model } from './model.types';
3
3
  import { State } from './State';
4
4
  import { StateNode } from './StateNode';
5
- import { MarkAllImplementationsAsProvided, TypegenDisabled, ResolveTypegenMeta, TypegenConstraint, AreAllImplementationsAssumedToBeProvided } from './typegenTypes';
5
+ import { MarkAllImplementationsAsProvided, TypegenDisabled, ResolveTypegenMeta, TypegenConstraint, AreAllImplementationsAssumedToBeProvided, TypegenEnabled } from './typegenTypes';
6
6
  export declare type AnyFunction = (...args: any[]) => any;
7
7
  declare type ReturnTypeOrValue<T> = T extends AnyFunction ? ReturnType<T> : T;
8
8
  export declare type IsNever<T> = [T] extends [never] ? true : false;
@@ -15,9 +15,7 @@ export declare type Merge<M, N> = Omit<M, keyof N> & N;
15
15
  export declare type IndexByType<T extends {
16
16
  type: string;
17
17
  }> = {
18
- [K in T['type']]: Extract<T, {
19
- type: K;
20
- }>;
18
+ [K in T['type']]: T extends any ? (K extends T['type'] ? T : never) : never;
21
19
  };
22
20
  export declare type Equals<A1 extends any, A2 extends any> = (<A>() => A extends A2 ? true : false) extends <A>() => A extends A1 ? true : false ? true : false;
23
21
  export declare type IsAny<T> = Equals<T, any>;
@@ -241,13 +239,7 @@ export declare type StatesDefinition<TContext, TStateSchema extends StateSchema,
241
239
  export declare type TransitionConfigTarget<TContext, TEvent extends EventObject> = string | undefined | StateNode<TContext, any, TEvent>;
242
240
  export declare type TransitionConfigOrTarget<TContext, TEvent extends EventObject> = SingleOrArray<TransitionConfigTarget<TContext, TEvent> | TransitionConfig<TContext, TEvent>>;
243
241
  export declare type TransitionsConfigMap<TContext, TEvent extends EventObject> = {
244
- [K in TEvent['type']]?: TransitionConfigOrTarget<TContext, TEvent extends {
245
- type: K;
246
- } ? TEvent : never>;
247
- } & {
248
- ''?: TransitionConfigOrTarget<TContext, TEvent>;
249
- } & {
250
- '*'?: TransitionConfigOrTarget<TContext, TEvent>;
242
+ [K in TEvent['type'] | '' | '*']?: K extends '' | '*' ? TransitionConfigOrTarget<TContext, TEvent> : TransitionConfigOrTarget<TContext, ExtractEvent<TEvent, K>>;
251
243
  };
252
244
  declare type TransitionsConfigArray<TContext, TEvent extends EventObject> = Array<(TEvent extends EventObject ? TransitionConfig<TContext, TEvent> & {
253
245
  event: TEvent['type'];
@@ -489,16 +481,16 @@ export declare type ActionFunctionMap<TContext, TEvent extends EventObject, TAct
489
481
  export declare type DelayFunctionMap<TContext, TEvent extends EventObject> = Record<string, DelayConfig<TContext, TEvent>>;
490
482
  export declare type ServiceConfig<TContext, TEvent extends EventObject = AnyEventObject> = string | AnyStateMachine | InvokeCreator<TContext, TEvent>;
491
483
  export declare type DelayConfig<TContext, TEvent extends EventObject> = number | DelayExpr<TContext, TEvent>;
492
- declare type MachineOptionsActions<TContext, TResolvedTypesMeta, TEventsCausingActions = Prop<TResolvedTypesMeta, 'eventsCausingActions'>, TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>, TIndexedActions = Prop<TResolvedTypesMeta, 'indexedActions'>> = {
484
+ declare type MachineOptionsActions<TContext, TResolvedTypesMeta, TEventsCausingActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingActions'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, TIndexedActions = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedActions'>> = {
493
485
  [K in keyof TEventsCausingActions]?: ActionObject<TContext, Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>> | ActionFunction<TContext, Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>, Cast<Prop<TIndexedActions, K>, BaseActionObject>>;
494
486
  };
495
- declare type MachineOptionsDelays<TContext, TResolvedTypesMeta, TEventsCausingDelays = Prop<TResolvedTypesMeta, 'eventsCausingDelays'>, TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>> = {
487
+ declare type MachineOptionsDelays<TContext, TResolvedTypesMeta, TEventsCausingDelays = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingDelays'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>> = {
496
488
  [K in keyof TEventsCausingDelays]?: DelayConfig<TContext, Cast<Prop<TIndexedEvents, TEventsCausingDelays[K]>, EventObject>>;
497
489
  };
498
- declare type MachineOptionsGuards<TContext, TResolvedTypesMeta, TEventsCausingGuards = Prop<TResolvedTypesMeta, 'eventsCausingGuards'>, TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>> = {
490
+ declare type MachineOptionsGuards<TContext, TResolvedTypesMeta, TEventsCausingGuards = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingGuards'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>> = {
499
491
  [K in keyof TEventsCausingGuards]?: ConditionPredicate<TContext, Cast<Prop<TIndexedEvents, TEventsCausingGuards[K]>, EventObject>>;
500
492
  };
501
- declare type MachineOptionsServices<TContext, TResolvedTypesMeta, TEventsCausingServices = Prop<TResolvedTypesMeta, 'eventsCausingServices'>, TIndexedEvents = Prop<TResolvedTypesMeta, 'indexedEvents'>, TInvokeSrcNameMap = Prop<TResolvedTypesMeta, 'invokeSrcNameMap'>> = {
493
+ declare type MachineOptionsServices<TContext, TResolvedTypesMeta, TEventsCausingServices = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'eventsCausingServices'>, TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>, TInvokeSrcNameMap = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'invokeSrcNameMap'>> = {
502
494
  [K in keyof TEventsCausingServices]?: AnyStateMachine | InvokeCreator<TContext, Cast<Prop<TIndexedEvents, TEventsCausingServices[K]>, EventObject>, Prop<Prop<TIndexedEvents, Prop<TInvokeSrcNameMap, K>>, 'data'>, EventObject, Cast<TIndexedEvents[keyof TIndexedEvents], EventObject>>;
503
495
  };
504
496
  declare type MakeKeysRequired<T extends string> = {
@@ -519,7 +511,7 @@ declare type GenerateGuardsConfigPart<TContext, TResolvedTypesMeta, TRequireMiss
519
511
  declare type GenerateServicesConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> = MaybeMakeMissingImplementationsRequired<'services', Prop<TMissingImplementations, 'services'>, TRequireMissingImplementations> & {
520
512
  services?: MachineOptionsServices<TContext, TResolvedTypesMeta>;
521
513
  };
522
- export declare type InternalMachineOptions<TContext, TEvent extends EventObject, TResolvedTypesMeta, TRequireMissingImplementations extends boolean = false, TMissingImplementations = Prop<TResolvedTypesMeta, 'missingImplementations'>> = GenerateActionsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateDelaysConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateGuardsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateServicesConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & {
514
+ export declare type InternalMachineOptions<TContext, TEvent extends EventObject, TResolvedTypesMeta, TRequireMissingImplementations extends boolean = false, TMissingImplementations = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'missingImplementations'>> = GenerateActionsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateDelaysConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateGuardsConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & GenerateServicesConfigPart<TContext, TResolvedTypesMeta, TRequireMissingImplementations, TMissingImplementations> & {
523
515
  /**
524
516
  * @deprecated Use `services` instead.
525
517
  */
@@ -988,9 +980,7 @@ export interface Subscribable<T> extends InteropSubscribable<T> {
988
980
  subscribe(next: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
989
981
  }
990
982
  export declare type Spawnable = AnyStateMachine | PromiseLike<any> | InvokeCallback | InteropObservable<any> | Subscribable<any> | Behavior<any>;
991
- export declare type ExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends {
992
- type: TEventType;
993
- } ? TEvent : never;
983
+ export declare type ExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends any ? TEventType extends TEvent['type'] ? TEvent : never : never;
994
984
  export interface BaseActorRef<TEvent extends EventObject> {
995
985
  send: (event: TEvent) => void;
996
986
  }
@@ -1001,6 +991,7 @@ export interface ActorRef<TEvent extends EventObject, TEmitted = any> extends Su
1001
991
  stop?: () => void;
1002
992
  toJSON?: () => any;
1003
993
  }
994
+ export declare type AnyActorRef = ActorRef<any, any>;
1004
995
  /**
1005
996
  * @deprecated Use `ActorRef` instead.
1006
997
  */
@@ -1011,9 +1002,9 @@ export declare type ActorRefWithDeprecatedState<TContext, TEvent extends EventOb
1011
1002
  */
1012
1003
  state: State<TContext, TEvent, any, TTypestate, TResolvedTypesMeta>;
1013
1004
  };
1014
- export declare type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, any, infer TEvent, infer TTypestate, any, any, infer TResolvedTypesMeta> ? ActorRefWithDeprecatedState<TContext, TEvent, TTypestate, MarkAllImplementationsAsProvided<TResolvedTypesMeta>> : R extends Promise<infer U> ? ActorRef<never, U> : R extends Behavior<infer TEvent, infer TEmitted> ? ActorRef<TEvent, TEmitted> : never : never;
1005
+ export declare type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, any, infer TEvent, infer TTypestate, any, any, infer TResolvedTypesMeta> ? ActorRefWithDeprecatedState<TContext, TEvent, TTypestate, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta> : R extends Promise<infer U> ? ActorRef<never, U> : R extends Behavior<infer TEvent, infer TEmitted> ? ActorRef<TEvent, TEmitted> : never : never;
1015
1006
  export declare type AnyInterpreter = Interpreter<any, any, any, any, any>;
1016
- export declare type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TStateSchema, infer TEvent, infer TTypestate, any, any, infer TResolvedTypesMeta> ? Interpreter<TContext, TStateSchema, TEvent, TTypestate, MarkAllImplementationsAsProvided<TResolvedTypesMeta>> : never;
1007
+ export declare type InterpreterFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, infer TStateSchema, infer TEvent, infer TTypestate, any, any, infer TResolvedTypesMeta> ? Interpreter<TContext, TStateSchema, TEvent, TTypestate, AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false ? MarkAllImplementationsAsProvided<TResolvedTypesMeta> : TResolvedTypesMeta> : never;
1017
1008
  export declare type MachineOptionsFrom<T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine), TRequireMissingImplementations extends boolean = false> = ReturnTypeOrValue<T> extends StateMachine<infer TContext, any, infer TEvent, any, any, any, infer TResolvedTypesMeta> ? InternalMachineOptions<TContext, TEvent, TResolvedTypesMeta, TRequireMissingImplementations> : never;
1018
1009
  export declare type __ResolvedTypesMetaFrom<T> = T extends StateMachine<any, any, any, any, any, any, infer TResolvedTypesMeta> ? TResolvedTypesMeta : never;
1019
1010
  export interface ActorContext<TEvent extends EventObject, TEmitted> {
@@ -1027,11 +1018,14 @@ export interface Behavior<TEvent extends EventObject, TEmitted = any> {
1027
1018
  initialState: TEmitted;
1028
1019
  start?: (actorCtx: ActorContext<TEvent, TEmitted>) => TEmitted;
1029
1020
  }
1030
- export declare type EmittedFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends ActorRef<infer _, infer TEmitted> ? TEmitted : R extends Behavior<infer _, infer TEmitted> ? TEmitted : R extends ActorContext<infer _, infer TEmitted> ? TEmitted : never : never;
1021
+ export declare type EmittedFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends Interpreter<infer _, infer __, infer ___, infer ____, infer _____> ? R['initialState'] : R extends ActorRef<infer _, infer TEmitted> ? TEmitted : R extends Behavior<infer _, infer TEmitted> ? TEmitted : R extends ActorContext<infer _, infer TEmitted> ? TEmitted : never : never;
1031
1022
  declare type ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer _, infer __, infer TEvent, infer ___, infer ____, infer _____, infer ______> ? TEvent : R extends Model<infer _, infer TEvent, infer __, infer ___> ? TEvent : R extends State<infer _, infer TEvent, infer __, infer ___, infer ____> ? TEvent : R extends Interpreter<infer _, infer __, infer TEvent, infer ___, infer ____> ? TEvent : R extends ActorRef<infer TEvent, infer _> ? TEvent : never : never;
1032
- export declare type EventFrom<T, K extends Prop<TEvent, 'type'> = never, TEvent = ResolveEventType<T>> = IsNever<K> extends true ? TEvent : Extract<TEvent, {
1033
- type: K;
1034
- }>;
1023
+ export declare type EventFrom<T, K extends Prop<TEvent, 'type'> = never, TEvent extends EventObject = ResolveEventType<T>> = IsNever<K> extends true ? TEvent : ExtractEvent<TEvent, K>;
1035
1024
  export declare type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R ? R extends StateMachine<infer TContext, infer _, infer __, infer ___, infer ____, infer _____, infer ______> ? TContext : R extends Model<infer TContext, infer _, infer __, infer ___> ? TContext : R extends State<infer TContext, infer _, infer __, infer ___, infer ____> ? TContext : R extends Interpreter<infer TContext, infer _, infer __, infer ___, infer ____> ? TContext : never : never;
1025
+ declare type Matches<TypegenEnabledArg, TypegenDisabledArg> = {
1026
+ (stateValue: TypegenEnabledArg): any;
1027
+ (stateValue: TypegenDisabledArg): any;
1028
+ };
1029
+ export declare type StateValueFrom<TMachine extends AnyStateMachine> = StateFrom<TMachine>['matches'] extends Matches<infer TypegenEnabledArg, infer TypegenDisabledArg> ? TMachine['__TResolvedTypesMeta'] extends TypegenEnabled ? TypegenEnabledArg : TypegenDisabledArg : never;
1036
1030
  export {};
1037
1031
  //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,32 @@
1
+ import { ActorRef, EmittedFrom } from '.';
2
+ interface WaitForOptions {
3
+ /**
4
+ * How long to wait before rejecting, if no emitted
5
+ * state satisfies the predicate.
6
+ *
7
+ * @default 10_000 (10 seconds)
8
+ */
9
+ timeout: number;
10
+ }
11
+ /**
12
+ * Subscribes to an actor ref and waits for its emitted value to satisfy
13
+ * a predicate, and then resolves with that value.
14
+ *
15
+ * @example
16
+ * ```js
17
+ * const state = await waitFor(someService, state => {
18
+ * return state.hasTag('loaded');
19
+ * });
20
+ *
21
+ * state.hasTag('loaded'); // true
22
+ * ```
23
+ *
24
+ * @param actorRef The actor ref to subscribe to
25
+ * @param predicate Determines if a value matches the condition to wait for
26
+ * @param options
27
+ * @returns A promise that eventually resolves to the emitted value
28
+ * that matches the condition
29
+ */
30
+ export declare function waitFor<TActorRef extends ActorRef<any, any>>(actorRef: TActorRef, predicate: (emitted: EmittedFrom<TActorRef>) => boolean, options?: Partial<WaitForOptions>): Promise<EmittedFrom<TActorRef>>;
31
+ export {};
32
+ //# sourceMappingURL=waitFor.d.ts.map
package/lib/waitFor.js ADDED
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _tslib = require('./_virtual/_tslib.js');
6
+
7
+ var defaultWaitForOptions = {
8
+ timeout: 10000 // 10 seconds
9
+
10
+ };
11
+ /**
12
+ * Subscribes to an actor ref and waits for its emitted value to satisfy
13
+ * a predicate, and then resolves with that value.
14
+ *
15
+ * @example
16
+ * ```js
17
+ * const state = await waitFor(someService, state => {
18
+ * return state.hasTag('loaded');
19
+ * });
20
+ *
21
+ * state.hasTag('loaded'); // true
22
+ * ```
23
+ *
24
+ * @param actorRef The actor ref to subscribe to
25
+ * @param predicate Determines if a value matches the condition to wait for
26
+ * @param options
27
+ * @returns A promise that eventually resolves to the emitted value
28
+ * that matches the condition
29
+ */
30
+
31
+ function waitFor(actorRef, predicate, options) {
32
+ var resolvedOptions = _tslib.__assign(_tslib.__assign({}, defaultWaitForOptions), options);
33
+
34
+ return new Promise(function (res, rej) {
35
+ var done = false;
36
+
37
+ if (process.env.NODE_ENV !== 'production' && resolvedOptions.timeout < 0) {
38
+ console.error('`timeout` passed to `waitFor` is negative and it will reject its internal promise immediately.');
39
+ }
40
+
41
+ var handle = resolvedOptions.timeout === Infinity ? undefined : setTimeout(function () {
42
+ sub.unsubscribe();
43
+ rej(new Error("Timeout of ".concat(resolvedOptions.timeout, " ms exceeded")));
44
+ }, resolvedOptions.timeout);
45
+
46
+ var dispose = function () {
47
+ clearTimeout(handle);
48
+ done = true;
49
+ sub === null || sub === void 0 ? void 0 : sub.unsubscribe();
50
+ };
51
+
52
+ var sub = actorRef.subscribe({
53
+ next: function (emitted) {
54
+ if (predicate(emitted)) {
55
+ dispose();
56
+ res(emitted);
57
+ }
58
+ },
59
+ error: function (err) {
60
+ dispose();
61
+ rej(err);
62
+ },
63
+ complete: function () {
64
+ dispose();
65
+ rej(new Error("Actor terminated without satisfying predicate"));
66
+ }
67
+ });
68
+
69
+ if (done) {
70
+ sub.unsubscribe();
71
+ }
72
+ });
73
+ }
74
+
75
+ exports.waitFor = waitFor;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xstate",
3
- "version": "4.30.6",
3
+ "version": "4.32.1",
4
4
  "description": "Finite State Machines and Statecharts for the Modern Web.",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",