xstate 4.19.2 → 4.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.spawnBehavior = exports.fromPromise = exports.fromReducer = void 0;
4
+ var actions_1 = require("./actions");
5
+ var Actor_1 = require("./Actor");
6
+ var utils_1 = require("./utils");
7
+ /**
8
+ * Returns an actor behavior from a reducer and its initial state.
9
+ *
10
+ * @param transition The pure reducer that returns the next state given the current state and event.
11
+ * @param initialState The initial state of the reducer.
12
+ * @returns An actor behavior
13
+ */
14
+ function fromReducer(transition, initialState) {
15
+ return {
16
+ transition: transition,
17
+ initialState: initialState
18
+ };
19
+ }
20
+ exports.fromReducer = fromReducer;
21
+ function fromPromise(promiseFn) {
22
+ var initialState = {
23
+ error: undefined,
24
+ data: undefined,
25
+ status: 'pending'
26
+ };
27
+ return {
28
+ transition: function (state, event, _a) {
29
+ var parent = _a.parent, id = _a.id, observers = _a.observers;
30
+ switch (event.type) {
31
+ case 'fulfill':
32
+ parent === null || parent === void 0 ? void 0 : parent.send(actions_1.doneInvoke(id, event.data));
33
+ return {
34
+ error: undefined,
35
+ data: event.data,
36
+ status: 'fulfilled'
37
+ };
38
+ case 'reject':
39
+ parent === null || parent === void 0 ? void 0 : parent.send(actions_1.error(id, event.error));
40
+ observers.forEach(function (observer) {
41
+ observer.error(event.error);
42
+ });
43
+ return {
44
+ error: event.error,
45
+ data: undefined,
46
+ status: 'rejected'
47
+ };
48
+ default:
49
+ return state;
50
+ }
51
+ },
52
+ initialState: initialState,
53
+ start: function (_a) {
54
+ var self = _a.self;
55
+ promiseFn().then(function (data) {
56
+ self.send({ type: 'fulfill', data: data });
57
+ }, function (reason) {
58
+ self.send({ type: 'reject', error: reason });
59
+ });
60
+ return initialState;
61
+ }
62
+ };
63
+ }
64
+ exports.fromPromise = fromPromise;
65
+ function spawnBehavior(behavior, options) {
66
+ if (options === void 0) { options = {}; }
67
+ var state = behavior.initialState;
68
+ var observers = new Set();
69
+ var mailbox = [];
70
+ var flushing = false;
71
+ var flush = function () {
72
+ if (flushing) {
73
+ return;
74
+ }
75
+ flushing = true;
76
+ while (mailbox.length > 0) {
77
+ var event_1 = mailbox.shift();
78
+ state = behavior.transition(state, event_1, actorCtx);
79
+ observers.forEach(function (observer) { return observer.next(state); });
80
+ }
81
+ flushing = false;
82
+ };
83
+ var actor = Actor_1.toActorRef({
84
+ id: options.id,
85
+ send: function (event) {
86
+ mailbox.push(event);
87
+ flush();
88
+ },
89
+ getSnapshot: function () { return state; },
90
+ subscribe: function (next, handleError, complete) {
91
+ var observer = utils_1.toObserver(next, handleError, complete);
92
+ observers.add(observer);
93
+ observer.next(state);
94
+ return {
95
+ unsubscribe: function () {
96
+ observers.delete(observer);
97
+ }
98
+ };
99
+ }
100
+ });
101
+ var actorCtx = {
102
+ parent: options.parent,
103
+ self: actor,
104
+ id: options.id || 'anonymous',
105
+ observers: observers
106
+ };
107
+ state = behavior.start ? behavior.start(actorCtx) : state;
108
+ return actor;
109
+ }
110
+ exports.spawnBehavior = spawnBehavior;
@@ -1,6 +1,5 @@
1
- import { StateMachine, Event, EventObject, DefaultContext, StateSchema, StateValue, InterpreterOptions, SingleOrArray, DoneEvent, MachineOptions, SCXML, EventData, Observer, Spawnable, Typestate } from './types';
1
+ import { StateMachine, Event, EventObject, DefaultContext, StateSchema, StateValue, InterpreterOptions, SingleOrArray, DoneEvent, MachineOptions, SCXML, EventData, Observer, Spawnable, Typestate, ActorRef, ActorRefFrom, Behavior, Subscription } from './types';
2
2
  import { State } from './State';
3
- import { ActorRefFrom, SpawnedActorRef, Subscription } from '.';
4
3
  export declare type StateListener<TContext, TEvent extends EventObject, TStateSchema extends StateSchema<TContext> = any, TTypestate extends Typestate<TContext> = {
5
4
  value: any;
6
5
  context: TContext;
@@ -25,7 +24,7 @@ export declare enum InterpreterStatus {
25
24
  export declare class Interpreter<TContext, TStateSchema extends StateSchema = any, TEvent extends EventObject = EventObject, TTypestate extends Typestate<TContext> = {
26
25
  value: any;
27
26
  context: TContext;
28
- }> implements SpawnedActorRef<TEvent, State<TContext, TEvent, TStateSchema, TTypestate>> {
27
+ }> implements ActorRef<TEvent, State<TContext, TEvent, TStateSchema, TTypestate>> {
29
28
  machine: StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
30
29
  /**
31
30
  * The default interpreter options:
@@ -64,7 +63,7 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
64
63
  * The globally unique process ID for this invocation.
65
64
  */
66
65
  sessionId: string;
67
- children: Map<string | number, SpawnedActorRef<any>>;
66
+ children: Map<string | number, ActorRef<any>>;
68
67
  private forwardTo;
69
68
  private devTools?;
70
69
  /**
@@ -165,12 +164,13 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
165
164
  private exec;
166
165
  private removeChild;
167
166
  private stopChild;
168
- spawn(entity: Spawnable, name: string, options?: SpawnOptions): SpawnedActorRef<any>;
167
+ spawn(entity: Spawnable, name: string, options?: SpawnOptions): ActorRef<any>;
169
168
  spawnMachine<TChildContext, TChildStateSchema, TChildEvent extends EventObject>(machine: StateMachine<TChildContext, TChildStateSchema, TChildEvent>, options?: {
170
169
  id?: string;
171
170
  autoForward?: boolean;
172
171
  sync?: boolean;
173
- }): SpawnedActorRef<TChildEvent, State<TChildContext, TChildEvent>>;
172
+ }): ActorRef<TChildEvent, State<TChildContext, TChildEvent>>;
173
+ private spawnBehavior;
174
174
  private spawnPromise;
175
175
  private spawnCallback;
176
176
  private spawnObservable;
@@ -183,8 +183,9 @@ export declare class Interpreter<TContext, TStateSchema extends StateSchema = an
183
183
  };
184
184
  getSnapshot(): State<TContext, TEvent, TStateSchema, TTypestate>;
185
185
  }
186
+ export declare function spawn<T extends Behavior<any, any>>(entity: T, nameOrOptions?: string | SpawnOptions): ActorRefFrom<T>;
186
187
  export declare function spawn<TC, TE extends EventObject>(entity: StateMachine<TC, any, TE>, nameOrOptions?: string | SpawnOptions): ActorRefFrom<StateMachine<TC, any, TE>>;
187
- export declare function spawn(entity: Spawnable, nameOrOptions?: string | SpawnOptions): SpawnedActorRef<any>;
188
+ export declare function spawn(entity: Spawnable, nameOrOptions?: string | SpawnOptions): ActorRef<any>;
188
189
  /**
189
190
  * Creates a new Interpreter instance for the given machine with the provided options, if any.
190
191
  *
@@ -56,6 +56,7 @@ var stateUtils_1 = require("./stateUtils");
56
56
  var registry_1 = require("./registry");
57
57
  var devTools_1 = require("./devTools");
58
58
  var serviceScope = require("./serviceScope");
59
+ var behaviors_1 = require("./behaviors");
59
60
  var DEFAULT_SPAWN_OPTIONS = { sync: false, autoForward: false };
60
61
  var InterpreterStatus;
61
62
  (function (InterpreterStatus) {
@@ -725,31 +726,28 @@ var Interpreter = /** @class */ (function () {
725
726
  var resolvedData = data
726
727
  ? utils_1.mapContext(data, context, _event)
727
728
  : undefined;
729
+ if (typeof serviceCreator === 'string') {
730
+ // TODO: warn
731
+ return;
732
+ }
728
733
  var source = utils_1.isFunction(serviceCreator)
729
734
  ? serviceCreator(context, _event.data, {
730
735
  data: resolvedData,
731
736
  src: invokeSource
732
737
  })
733
738
  : serviceCreator;
734
- if (utils_1.isPromiseLike(source)) {
735
- this.spawnPromise(Promise.resolve(source), id);
736
- }
737
- else if (utils_1.isFunction(source)) {
738
- this.spawnCallback(source, id);
739
- }
740
- else if (utils_1.isObservable(source)) {
741
- this.spawnObservable(source, id);
739
+ if (!source) {
740
+ // TODO: warn?
741
+ return;
742
742
  }
743
- else if (utils_1.isMachine(source)) {
744
- // TODO: try/catch here
745
- this.spawnMachine(resolvedData ? source.withContext(resolvedData) : source, {
746
- id: id,
743
+ var options = void 0;
744
+ if (utils_1.isMachine(source)) {
745
+ source = resolvedData ? source.withContext(resolvedData) : source;
746
+ options = {
747
747
  autoForward: autoForward
748
- });
749
- }
750
- else {
751
- // service is string
748
+ };
752
749
  }
750
+ this.spawn(source, id, options);
753
751
  }
754
752
  else {
755
753
  this.spawnActivity(activity);
@@ -808,6 +806,9 @@ var Interpreter = /** @class */ (function () {
808
806
  else if (utils_1.isMachine(entity)) {
809
807
  return this.spawnMachine(entity, __assign(__assign({}, options), { id: name }));
810
808
  }
809
+ else if (utils_1.isBehavior(entity)) {
810
+ return this.spawnBehavior(entity, name);
811
+ }
811
812
  else {
812
813
  throw new Error("Unable to spawn entity \"" + name + "\" of type \"" + typeof entity + "\".");
813
814
  }
@@ -838,10 +839,15 @@ var Interpreter = /** @class */ (function () {
838
839
  .start();
839
840
  return actor;
840
841
  };
842
+ Interpreter.prototype.spawnBehavior = function (behavior, id) {
843
+ var actorRef = behaviors_1.spawnBehavior(behavior, { id: id, parent: this });
844
+ this.children.set(id, actorRef);
845
+ return actorRef;
846
+ };
841
847
  Interpreter.prototype.spawnPromise = function (promise, id) {
842
848
  var _this = this;
843
849
  var canceled = false;
844
- var resolvedData = undefined;
850
+ var resolvedData;
845
851
  promise.then(function (response) {
846
852
  if (!canceled) {
847
853
  resolvedData = response;
@@ -912,7 +918,7 @@ var Interpreter = /** @class */ (function () {
912
918
  var canceled = false;
913
919
  var receivers = new Set();
914
920
  var listeners = new Set();
915
- var emitted = undefined;
921
+ var emitted;
916
922
  var receive = function (e) {
917
923
  emitted = e;
918
924
  listeners.forEach(function (listener) { return listener(e); });
@@ -962,7 +968,7 @@ var Interpreter = /** @class */ (function () {
962
968
  };
963
969
  Interpreter.prototype.spawnObservable = function (source, id) {
964
970
  var _this = this;
965
- var emitted = undefined;
971
+ var emitted;
966
972
  var subscription = source.subscribe(function (value) {
967
973
  emitted = value;
968
974
  _this.send(utils_1.toSCXMLEvent(value, { origin: id }));
@@ -1052,6 +1058,9 @@ var Interpreter = /** @class */ (function () {
1052
1058
  return this;
1053
1059
  };
1054
1060
  Interpreter.prototype.getSnapshot = function () {
1061
+ if (this.status === InterpreterStatus.NotStarted) {
1062
+ return this.initialState;
1063
+ }
1055
1064
  return this._state;
1056
1065
  };
1057
1066
  /**
package/lib/model.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { AssignAction, Assigner, PropertyAssigner, ExtractEvent, EventObject } from './types';
1
+ import type { AssignAction, Assigner, PropertyAssigner, ExtractEvent, EventObject, MachineConfig, StateMachine, MachineOptions } from './types';
2
2
  declare type AnyFunction = (...args: any[]) => any;
3
3
  declare type Cast<A1 extends any, A2 extends any> = A1 extends A2 ? A1 : A2;
4
4
  declare type Compute<A extends any> = {
@@ -10,6 +10,7 @@ export interface Model<TContext, TEvent extends EventObject, TModelCreators = vo
10
10
  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>>;
11
11
  events: Prop<TModelCreators, 'events'>;
12
12
  reset: () => AssignAction<TContext, any>;
13
+ createMachine: (config: MachineConfig<TContext, any, TEvent>, implementations?: Partial<MachineOptions<TContext, TEvent>>) => StateMachine<TContext, any, TEvent, any>;
13
14
  }
14
15
  export declare type ModelContextFrom<TModel extends Model<any, any, any>> = TModel extends Model<infer TContext, any, any> ? TContext : never;
15
16
  export declare type ModelEventsFrom<TModel extends Model<any, any, any>> = TModel extends Model<any, infer TEvent, any> ? TEvent : never;
package/lib/model.js CHANGED
@@ -34,6 +34,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.createModel = void 0;
36
36
  var actions_1 = require("./actions");
37
+ var Machine_1 = require("./Machine");
37
38
  var utils_1 = require("./utils");
38
39
  function createModel(initialContext, creators) {
39
40
  var eventCreators = creators === null || creators === void 0 ? void 0 : creators.events;
@@ -49,7 +50,10 @@ function createModel(initialContext, creators) {
49
50
  return (__assign(__assign({}, fn.apply(void 0, __spreadArray([], __read(args)))), { type: eventType }));
50
51
  }; })
51
52
  : undefined),
52
- reset: function () { return actions_1.assign(initialContext); }
53
+ reset: function () { return actions_1.assign(initialContext); },
54
+ createMachine: function (config, implementations) {
55
+ return Machine_1.createMachine('context' in config ? config : __assign(__assign({}, config), { context: initialContext }), implementations);
56
+ }
53
57
  };
54
58
  return model;
55
59
  }
@@ -10,5 +10,6 @@ export declare function getValue<TC, TE extends EventObject>(rootNode: StateNode
10
10
  export declare function has<T>(iterable: Iterable<T>, item: T): boolean;
11
11
  export declare function nextEvents<TC, TE extends EventObject>(configuration: Array<StateNode<TC, any, TE>>): Array<TE['type']>;
12
12
  export declare function isInFinalState<TC, TE extends EventObject>(configuration: Array<StateNode<TC, any, TE, any>>, stateNode: StateNode<TC, any, TE, any>): boolean;
13
+ export declare function getMeta(configuration?: StateNode[]): Record<string, any>;
13
14
  export {};
14
15
  //# sourceMappingURL=stateUtils.d.ts.map
package/lib/stateUtils.js CHANGED
@@ -32,7 +32,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
32
32
  return to;
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.isInFinalState = exports.nextEvents = exports.has = exports.getValue = exports.getAdjList = exports.getConfiguration = exports.getAllStateNodes = exports.getChildren = exports.isLeafNode = void 0;
35
+ exports.getMeta = exports.isInFinalState = exports.nextEvents = exports.has = exports.getValue = exports.getAdjList = exports.getConfiguration = exports.getAllStateNodes = exports.getChildren = exports.isLeafNode = void 0;
36
36
  var utils_1 = require("./utils");
37
37
  var isLeafNode = function (stateNode) {
38
38
  return stateNode.type === 'atomic' || stateNode.type === 'final';
@@ -225,3 +225,13 @@ function isInFinalState(configuration, stateNode) {
225
225
  return false;
226
226
  }
227
227
  exports.isInFinalState = isInFinalState;
228
+ function getMeta(configuration) {
229
+ if (configuration === void 0) { configuration = []; }
230
+ return configuration.reduce(function (acc, stateNode) {
231
+ if (stateNode.meta !== undefined) {
232
+ acc[stateNode.id] = stateNode.meta;
233
+ }
234
+ return acc;
235
+ }, {});
236
+ }
237
+ exports.getMeta = getMeta;
package/lib/types.d.ts CHANGED
@@ -134,7 +134,7 @@ export interface PayloadSender<TEvent extends EventObject> {
134
134
  <K extends TEvent['type']>(eventType: K, payload: NeverIfEmpty<ExtractExtraParameters<TEvent, K>>): void;
135
135
  }
136
136
  export declare type Receiver<TEvent extends EventObject> = (listener: (event: TEvent) => void) => void;
137
- export declare type InvokeCallback<TEvent extends EventObject = AnyEventObject> = (callback: Sender<TEvent>, onReceive: Receiver<TEvent>) => any;
137
+ export declare type InvokeCallback<TEvent extends EventObject = AnyEventObject, TSentEvent extends EventObject = AnyEventObject> = (callback: Sender<TSentEvent>, onReceive: Receiver<TEvent>) => (() => void) | Promise<any> | void;
138
138
  export interface InvokeMeta {
139
139
  data: any;
140
140
  src: InvokeSourceDefinition;
@@ -152,7 +152,7 @@ export interface InvokeMeta {
152
152
  * @param context The current machine `context`
153
153
  * @param event The event that invoked the service
154
154
  */
155
- export declare type InvokeCreator<TContext, TEvent extends EventObject = AnyEventObject, TFinalContext = any> = (context: TContext, event: TEvent, meta: InvokeMeta) => PromiseLike<TFinalContext> | StateMachine<TFinalContext, any, any> | Subscribable<EventObject> | InvokeCallback<TEvent>;
155
+ export declare type InvokeCreator<TContext, TEvent extends EventObject, TFinalContext = any> = (context: TContext, event: TEvent, meta: InvokeMeta) => PromiseLike<TFinalContext> | StateMachine<TFinalContext, any, any> | Subscribable<EventObject> | InvokeCallback<any, TEvent> | Behavior<any>;
156
156
  export interface InvokeDefinition<TContext, TEvent extends EventObject> extends ActivityDefinition<TContext, TEvent> {
157
157
  /**
158
158
  * The source of the machine to be invoked, or the machine itself.
@@ -490,6 +490,8 @@ export interface StateMachine<TContext, TStateSchema extends StateSchema, TEvent
490
490
  }> extends StateNode<TContext, TStateSchema, TEvent, TTypestate> {
491
491
  id: string;
492
492
  states: StateNode<TContext, TStateSchema, TEvent>['states'];
493
+ withConfig(options: Partial<MachineOptions<TContext, TEvent>>, context?: TContext): StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
494
+ withContext(context: TContext): StateMachine<TContext, TStateSchema, TEvent, TTypestate>;
493
495
  }
494
496
  export declare type StateFrom<TMachine extends StateMachine<any, any, any>> = ReturnType<TMachine['transition']>;
495
497
  export interface ActionMap<TContext, TEvent extends EventObject> {
@@ -876,23 +878,42 @@ export interface Subscribable<T> {
876
878
  subscribe(observer: Observer<T>): Subscription;
877
879
  subscribe(next: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
878
880
  }
879
- export declare type Spawnable = StateMachine<any, any, any> | Promise<any> | InvokeCallback | Subscribable<any>;
881
+ export declare type Spawnable = StateMachine<any, any, any> | PromiseLike<any> | InvokeCallback | Subscribable<any> | Behavior<any>;
880
882
  export declare type ExtractEvent<TEvent extends EventObject, TEventType extends TEvent['type']> = TEvent extends {
881
883
  type: TEventType;
882
884
  } ? TEvent : never;
885
+ export interface BaseActorRef<TEvent extends EventObject> {
886
+ send: (event: TEvent) => void;
887
+ }
883
888
  export interface ActorRef<TEvent extends EventObject, TEmitted = any> extends Subscribable<TEmitted> {
884
889
  send: Sender<TEvent>;
885
- }
886
- export interface SpawnedActorRef<TEvent extends EventObject, TEmitted = any> extends ActorRef<TEvent, TEmitted> {
887
890
  id: string;
888
891
  getSnapshot: () => TEmitted | undefined;
889
892
  stop?: () => void;
890
893
  toJSON?: () => any;
891
894
  }
892
- export declare type ActorRefFrom<T extends StateMachine<any, any, any> | Promise<any>> = T extends StateMachine<infer TContext, any, infer TEvent, infer TTypestate> ? SpawnedActorRef<TEvent, State<TContext, TEvent, any, TTypestate>> & {
895
+ /**
896
+ * @deprecated Use `ActorRef` instead.
897
+ */
898
+ export declare type SpawnedActorRef<TEvent extends EventObject, TEmitted = any> = ActorRef<TEvent, TEmitted>;
899
+ export declare type ActorRefFrom<T extends StateMachine<any, any, any> | Promise<any> | Behavior<any>> = T extends StateMachine<infer TContext, any, infer TEvent, infer TTypestate> ? ActorRef<TEvent, State<TContext, TEvent, any, TTypestate>> & {
900
+ /**
901
+ * @deprecated Use `.getSnapshot()` instead.
902
+ */
893
903
  state: State<TContext, TEvent, any, TTypestate>;
894
- } : T extends Promise<infer U> ? SpawnedActorRef<never, U> : never;
904
+ } : T extends Promise<infer U> ? ActorRef<never, U> : T extends Behavior<infer TEvent, infer TEmitted> ? ActorRef<TEvent, TEmitted> : never;
895
905
  export declare type AnyInterpreter = Interpreter<any, any, any, any>;
896
906
  export declare type InterpreterFrom<T extends StateMachine<any, any, any, any>> = T extends StateMachine<infer TContext, infer TStateSchema, infer TEvent, infer TTypestate> ? Interpreter<TContext, TStateSchema, TEvent, TTypestate> : never;
907
+ export interface ActorContext<TEvent extends EventObject, TEmitted> {
908
+ parent?: ActorRef<any, any>;
909
+ self: ActorRef<TEvent, TEmitted>;
910
+ id: string;
911
+ observers: Set<Observer<TEmitted>>;
912
+ }
913
+ export interface Behavior<TEvent extends EventObject, TEmitted = any> {
914
+ transition: (state: TEmitted, event: TEvent, actorCtx: ActorContext<TEvent, TEmitted>) => TEmitted;
915
+ initialState: TEmitted;
916
+ start?: (actorCtx: ActorContext<TEvent, TEmitted>) => TEmitted;
917
+ }
897
918
  export {};
898
919
  //# sourceMappingURL=types.d.ts.map
package/lib/utils.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { Event, StateValue, ActionType, Action, EventObject, PropertyMapper, Mapper, EventType, HistoryValue, AssignAction, Condition, Subscribable, StateMachine, ConditionPredicate, SCXML, StateLike, EventData, TransitionConfig, TransitionConfigTarget, NullEvent, SingleOrArray, Guard, InvokeSourceDefinition } from './types';
1
+ import { Event, StateValue, ActionType, Action, EventObject, PropertyMapper, Mapper, EventType, HistoryValue, AssignAction, Condition, Subscribable, StateMachine, ConditionPredicate, SCXML, StateLike, EventData, TransitionConfig, TransitionConfigTarget, NullEvent, SingleOrArray, Guard, InvokeSourceDefinition, Observer, Behavior } from './types';
2
2
  import { StateNode } from './StateNode';
3
- import { Observer, State } from '.';
3
+ import { State } from './State';
4
4
  import { Actor } from './Actor';
5
5
  export declare function keys<T extends object>(value: T): Array<keyof T & string>;
6
6
  export declare function matchesState(parentStateId: StateValue, childStateId: StateValue, delimiter?: string): boolean;
@@ -40,6 +40,7 @@ export declare function toArray<T>(value: T[] | T | undefined): T[];
40
40
  export declare function mapContext<TContext, TEvent extends EventObject>(mapper: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>, context: TContext, _event: SCXML.Event<TEvent>): any;
41
41
  export declare function isBuiltInEvent(eventType: EventType): boolean;
42
42
  export declare function isPromiseLike(value: any): value is PromiseLike<any>;
43
+ export declare function isBehavior(value: any): value is Behavior<any, any>;
43
44
  export declare function partition<T, A extends T, B extends T>(items: T[], predicate: (item: T) => item is A): [A[], B[]];
44
45
  export declare function updateHistoryStates(hist: HistoryValue, stateValue: StateValue): Record<string, HistoryValue | undefined>;
45
46
  export declare function updateHistoryValue(hist: HistoryValue, stateValue: StateValue): HistoryValue;
package/lib/utils.js CHANGED
@@ -43,7 +43,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
43
43
  return to;
44
44
  };
45
45
  Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.toObserver = exports.toInvokeSource = exports.evaluateGuard = exports.reportUnhandledExceptionOnInvocation = exports.normalizeTarget = exports.toTransitionConfigArray = exports.toSCXMLEvent = exports.toEventObject = exports.uniqueId = exports.isActor = exports.isMachine = exports.symbolObservable = exports.isObservable = exports.toGuard = exports.isString = exports.isFunction = exports.isArray = exports.warn = exports.updateContext = exports.updateHistoryValue = exports.updateHistoryStates = exports.partition = exports.isPromiseLike = exports.isBuiltInEvent = exports.mapContext = exports.toArray = exports.toArrayStrict = exports.flatten = exports.pathsToStateValue = exports.toStatePaths = exports.nestedPath = exports.path = exports.mapFilterValues = exports.mapValues = exports.pathToStateValue = exports.toStateValue = exports.isStateLike = exports.toStatePath = exports.getActionType = exports.getEventType = exports.matchesState = exports.keys = void 0;
46
+ exports.toObserver = exports.toInvokeSource = exports.evaluateGuard = exports.reportUnhandledExceptionOnInvocation = exports.normalizeTarget = exports.toTransitionConfigArray = exports.toSCXMLEvent = exports.toEventObject = exports.uniqueId = exports.isActor = exports.isMachine = exports.symbolObservable = exports.isObservable = exports.toGuard = exports.isString = exports.isFunction = exports.isArray = exports.warn = exports.updateContext = exports.updateHistoryValue = exports.updateHistoryStates = exports.partition = exports.isBehavior = exports.isPromiseLike = exports.isBuiltInEvent = exports.mapContext = exports.toArray = exports.toArrayStrict = exports.flatten = exports.pathsToStateValue = exports.toStatePaths = exports.nestedPath = exports.path = exports.mapFilterValues = exports.mapValues = exports.pathToStateValue = exports.toStateValue = exports.isStateLike = exports.toStatePath = exports.getActionType = exports.getEventType = exports.matchesState = exports.keys = void 0;
47
47
  var constants_1 = require("./constants");
48
48
  var environment_1 = require("./environment");
49
49
  function keys(value) {
@@ -345,6 +345,13 @@ function isPromiseLike(value) {
345
345
  return false;
346
346
  }
347
347
  exports.isPromiseLike = isPromiseLike;
348
+ function isBehavior(value) {
349
+ return (value !== null &&
350
+ typeof value === 'object' &&
351
+ 'transition' in value &&
352
+ typeof value.transition === 'function');
353
+ }
354
+ exports.isBehavior = isBehavior;
348
355
  function partition(items, predicate) {
349
356
  var e_6, _a;
350
357
  var _b = __read([[], []], 2), truthy = _b[0], falsy = _b[1];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xstate",
3
- "version": "4.19.2",
3
+ "version": "4.22.0",
4
4
  "description": "Finite State Machines and Statecharts for the Modern Web.",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -66,7 +66,7 @@
66
66
  "rxjs": "^6.5.1",
67
67
  "ts-jest": "^26.5.6",
68
68
  "tslib": "^2.2.0",
69
- "typescript": "^4.2.4",
69
+ "typescript": "^4.3.2",
70
70
  "xml-js": "^1.6.11"
71
71
  }
72
72
  }