xstate 6.0.0-alpha.1 → 6.0.0-alpha.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"xstate-graph.umd.min.js","sources":["../src/Mailbox.ts","../src/constants.ts","../src/eventUtils.ts","../src/reportUnhandledError.ts","../src/symbolObservable.ts","../src/actions.ts","../src/actors/attached.ts","../src/actors/listener.ts","../src/atom.ts","../src/actors/subscription.ts","../src/transitionActions.ts","../src/stateUtils.ts","../src/delay.ts","../src/utils.ts","../src/State.ts","../src/system.ts","../src/actors/logic.ts","../src/createActor.ts","../src/actors/index.ts","../src/spawn.ts","../src/memo.ts","../src/StateNode.ts","../src/StateMachine.ts","../src/graph/utils.ts","../src/graph/deduplicatePaths.ts","../src/graph/pathGenerators.ts","../src/graph/TestModel.ts","../src/graph/actorScope.ts","../src/graph/graph.ts","../src/graph/adjacency.ts","../src/graph/alterPath.ts","../src/graph/pathFromEvents.ts","../src/graph/shortestPaths.ts","../src/graph/simplePaths.ts","../src/graph/validateMachine.ts"],"sourcesContent":["interface MailboxItem<T> {\n value: T;\n next: MailboxItem<T> | null;\n}\n\nexport class Mailbox<T> {\n private _active: boolean = false;\n private _current: MailboxItem<T> | null = null;\n private _last: MailboxItem<T> | null = null;\n\n constructor(private _process: (ev: T) => void) {}\n\n public start() {\n this._active = true;\n this.flush();\n }\n\n public clear(): void {\n // we can't set _current to null because we might be currently processing\n // and enqueue following clear shouldn't start processing the enqueued item immediately\n if (this._current) {\n this._current.next = null;\n this._last = this._current;\n }\n }\n\n public enqueue(event: T): void {\n const enqueued = {\n value: event,\n next: null\n };\n\n if (this._current) {\n this._last!.next = enqueued;\n this._last = enqueued;\n return;\n }\n\n this._current = enqueued;\n this._last = enqueued;\n\n if (this._active) {\n this.flush();\n }\n }\n\n private flush() {\n while (this._current) {\n // atm the given _process is responsible for implementing proper try/catch handling\n // we assume here that this won't throw in a way that can affect this mailbox\n const consumed = this._current;\n this._process(consumed.value);\n this._current = consumed.next;\n }\n this._last = null;\n }\n}\n","export const STATE_DELIMITER = '.';\nexport const TARGETLESS_KEY = '';\nexport const NULL_EVENT = '';\nexport const STATE_IDENTIFIER = '#';\nexport const WILDCARD = '*';\nexport const XSTATE_INIT = '@xstate.init';\nexport const XSTATE_STOP = '@xstate.stop';\n","import { XSTATE_INIT } from './constants.ts';\nimport { DoneActorEvent, DoneStateEvent, ErrorActorEvent } from './types.ts';\n\n/**\n * Returns an event that represents an implicit event that is sent after the\n * specified `delay`.\n *\n * @param delayRef The delay in milliseconds\n * @param id The state node ID where this event is handled\n */\nexport function createAfterEvent(delayRef: number | string, id: string) {\n return { type: `xstate.after.${delayRef}.${id}` } as const;\n}\n\n/**\n * Returns an event that represents an implicit state-level timeout. Fired when\n * a state's `timeout` duration elapses without the state being exited.\n *\n * @param id The state node ID where this timeout is configured\n */\nexport function createTimeoutEvent(id: string) {\n return { type: `xstate.timeout.${id}` } as const;\n}\n\n/**\n * Returns an event that represents an implicit invoke-level timeout. Fired when\n * an invoked actor has not completed within its `timeout` duration.\n *\n * @param invokeId The invoked actor's ID\n */\nexport function createInvokeTimeoutEvent(invokeId: string) {\n return { type: `xstate.timeout.actor.${invokeId}` } as const;\n}\n\n/**\n * Returns an event that represents that a final state node has been reached in\n * the parent state node.\n *\n * @param id The final state node's parent state node `id`\n * @param output The data to pass into the event\n */\nexport function createDoneStateEvent(\n id: string,\n output?: unknown\n): DoneStateEvent {\n return {\n type: `xstate.done.state.${id}`,\n output\n };\n}\n\n/**\n * Returns an event that represents that an invoked service has terminated.\n *\n * An invoked service is terminated when it has reached a top-level final state\n * node, but not when it is canceled.\n *\n * @param invokeId The invoked service ID\n * @param output The data to pass into the event\n */\nexport function createDoneActorEvent(\n invokeId: string,\n output?: unknown\n): DoneActorEvent {\n return {\n type: `xstate.done.actor.${invokeId}`,\n output,\n actorId: invokeId\n };\n}\n\nexport function createErrorActorEvent(\n id: string,\n error?: unknown\n): ErrorActorEvent {\n return { type: `xstate.error.actor.${id}`, error, actorId: id };\n}\n\nexport function createInitEvent(input: unknown) {\n return { type: XSTATE_INIT, input } as const;\n}\n","/**\n * This function makes sure that unhandled errors are thrown in a separate\n * macrotask. It allows those errors to be detected by global error handlers and\n * reported to bug tracking services without interrupting our own stack of\n * execution.\n *\n * @param err Error to be thrown\n */\nexport function reportUnhandledError(err: unknown) {\n setTimeout(() => {\n throw err;\n });\n}\n","export const symbolObservable: typeof Symbol.observable = (() =>\n (typeof Symbol === 'function' && Symbol.observable) ||\n '@@observable')() as any;\n","import isDevelopment from '#is-development';\nimport { AnyActor, AnyActorScope, EventObject } from './types';\n\nexport const builtInActions = {\n ['@xstate.start']: (actor: AnyActor) => {\n actor.start();\n },\n ['@xstate.raise']: (\n actorScope: AnyActorScope,\n event: EventObject,\n options: { id?: string; delay?: number }\n ) => {\n actorScope.system.scheduler.schedule(\n actorScope.self,\n actorScope.self,\n event,\n options?.delay ?? 0,\n options?.id\n );\n },\n ['@xstate.sendTo']: (\n actorScope: AnyActorScope,\n actor: AnyActor,\n event: EventObject,\n options: { id?: string; delay?: number }\n ) => {\n if (typeof event === 'string') {\n throw new Error(\n isDevelopment\n ? // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Only event objects may be used with sendTo; use sendTo({ type: \"${event}\" }) instead`\n : `Only event objects may be used with sendTo`\n );\n }\n if (options?.delay !== undefined) {\n actorScope.system.scheduler.schedule(\n actorScope.self,\n actor,\n event,\n options?.delay ?? 0,\n options?.id\n );\n } else {\n actorScope.defer(() => {\n actorScope.system._relay(actorScope.self, actor, event);\n });\n }\n },\n ['@xstate.cancel']: (actorScope: AnyActorScope, sendId: string) => {\n actorScope.system.scheduler.cancel(actorScope.self, sendId);\n },\n ['@xstate.stopChild']: (actorScope: AnyActorScope, actor: AnyActor) => {\n actorScope.stopChild(actor);\n }\n};\n","import { XSTATE_STOP } from '../constants.ts';\nimport type { AnyActorSystem } from '../system.ts';\nimport type {\n AnyActor,\n EventObject,\n Snapshot,\n Subscription\n} from '../types.ts';\n\nconst subscriptions = /* #__PURE__ */ new WeakMap<AnyActor, Subscription>();\n\n/**\n * Internal factory for actor logic that attaches to another actor on start\n * (`enq.listen()` / `enq.subscribeTo()`) and detaches when stopped.\n */\nexport function createAttachedLogic(\n attach: (\n input: any,\n scope: { self: AnyActor; system: AnyActorSystem }\n ) => Subscription | undefined\n): any {\n return {\n start: (state: any, { self, system }: any) => {\n // Don't attach if the target doesn't exist, or (for actors) is stopped.\n // Atoms have no `getSnapshot` / lifecycle, so they always attach.\n const target = state.input.actor;\n if (\n !target ||\n (typeof target.getSnapshot === 'function' &&\n target.getSnapshot().status === 'stopped')\n ) {\n return;\n }\n const subscription = attach(state.input, { self, system });\n if (!subscription) {\n return;\n }\n\n // Attached actors are not registered as children (their `input` holds\n // non-serializable function mappers), so a parent stop does not cascade\n // to them. Subscribe to the parent and tear down when it stops/errors,\n // so the subscription never relays to a stopped parent or leaks the\n // source subscription.\n let parentSubscription: Subscription | undefined;\n let torndown = false;\n const teardown = () => {\n if (torndown) {\n return;\n }\n torndown = true;\n subscription.unsubscribe();\n parentSubscription?.unsubscribe();\n };\n\n const parent: AnyActor | undefined = self._parent;\n if (parent) {\n parentSubscription = parent.subscribe({\n complete: teardown,\n error: teardown\n });\n }\n\n subscriptions.set(self, { unsubscribe: teardown });\n },\n transition: (state: any, event: EventObject, { self }: any) => {\n if (event.type === XSTATE_STOP) {\n subscriptions.get(self)?.unsubscribe();\n subscriptions.delete(self);\n return {\n ...state,\n status: 'stopped',\n error: undefined\n };\n }\n return state;\n },\n getInitialSnapshot: (_: unknown, input: unknown) => ({\n status: 'active',\n output: undefined,\n error: undefined,\n input\n }),\n getPersistedSnapshot: (snapshot: Snapshot<unknown>) => snapshot,\n restoreSnapshot: (snapshot: Snapshot<unknown>) => snapshot\n };\n}\n\n/**\n * Relays a mapped event to the attached actor's parent, unless the attached\n * actor has been stopped (the mapper is not called in that case).\n */\nexport function relayMappedToParent(\n self: AnyActor,\n system: AnyActorSystem,\n getEvent: () => EventObject\n): void {\n if (self.getSnapshot().status === 'stopped' || !self._parent) {\n return;\n }\n system._relay(self, self._parent, getEvent());\n}\n","import { AnyActorSystem } from '../system.ts';\nimport { matchesEventDescriptor } from '../utils.ts';\nimport {\n ActorLogic,\n ActorRefFromLogic,\n AnyActor,\n EventObject,\n Snapshot\n} from '../types';\nimport { createAttachedLogic, relayMappedToParent } from './attached.ts';\n\nexport type ListenerSnapshot = Snapshot<undefined> & {\n input: ListenerInput<any, any>;\n};\n\nexport interface ListenerInput<\n TEmitted extends EventObject,\n TMappedEvent extends EventObject\n> {\n actor: AnyActor;\n eventType: string;\n mapper: (event: TEmitted) => TMappedEvent;\n}\n\nexport type ListenerActorLogic<\n TEmitted extends EventObject = EventObject,\n TMappedEvent extends EventObject = EventObject\n> = ActorLogic<\n ListenerSnapshot,\n EventObject,\n ListenerInput<TEmitted, TMappedEvent>,\n AnyActorSystem,\n EventObject\n>;\n\nexport type ListenerActorRef<\n TEmitted extends EventObject = EventObject,\n TMappedEvent extends EventObject = EventObject\n> = ActorRefFromLogic<ListenerActorLogic<TEmitted, TMappedEvent>>;\n\n/**\n * Creates actor logic for listening to emitted events from another actor. Used\n * internally by `enq.listen()`.\n */\nexport function createListenerLogic<\n TEmitted extends EventObject = EventObject,\n TMappedEvent extends EventObject = EventObject\n>(): ListenerActorLogic<TEmitted, TMappedEvent> {\n return createAttachedLogic(\n (\n { actor, eventType, mapper }: ListenerInput<TEmitted, TMappedEvent>,\n { self, system }\n ) => {\n // Determine the subscription type:\n // - For exact matches or '*', subscribe directly\n // - For partial wildcards ('data.*'), subscribe to '*' and filter\n const isPartialWildcard = eventType !== '*' && eventType.endsWith('.*');\n\n return actor.on(isPartialWildcard ? '*' : eventType, (emittedEvent) => {\n if (\n isPartialWildcard &&\n !matchesEventDescriptor(emittedEvent.type, eventType)\n ) {\n return;\n }\n relayMappedToParent(self, system, () =>\n mapper(emittedEvent as TEmitted)\n );\n });\n }\n );\n}\n\n// Singleton logic instance\nexport const listenerLogic = /* #__PURE__ */ createListenerLogic();\n","import {\n createReactiveSystem,\n type ReactiveNode,\n ReactiveFlags\n} from './alien.ts';\nimport { installActorReadHook } from './interop.ts';\nimport { reportUnhandledError } from './reportUnhandledError.ts';\nimport type { AnyActorRef } from './types.ts';\n\ntype Observer<T> = {\n next?: (value: T) => void;\n error?: (err: unknown) => void;\n complete?: () => void;\n};\n\ninterface Subscription {\n unsubscribe(): void;\n}\n\ninterface Readable<T> extends Subscribable<T> {\n get: () => T;\n}\n\ninterface Subscribable<T> {\n subscribe(observer: Observer<T>): Subscription;\n subscribe(\n next: (value: T) => void,\n error?: (error: any) => void,\n complete?: () => void\n ): Subscription;\n}\n\n/**\n * Nominal brand (phantom, compile-time only) marking a value as an XState atom.\n * Real atoms get the runtime brand ({@link $$atom}) in `createAtom`; this type\n * brand keeps atom-only APIs (e.g. `enq.subscribeTo`) from structurally\n * accepting plain readables like `actor.select(...)` that would be dispatched\n * down the non-atom path at runtime.\n */\ndeclare const $$atomBrand: unique symbol;\n\nexport interface BaseAtom<T> extends Subscribable<T>, Readable<T> {\n /** @internal */\n readonly [$$atomBrand]: true;\n}\n\nexport interface Atom<T> extends BaseAtom<T> {\n set: (valueOrFn: T | ((prev: T) => T)) => void;\n}\n\nexport interface ReducerAtom<TState, TEvent> extends BaseAtom<TState> {\n send: (event: TEvent) => void;\n}\n\nexport interface AtomOptions<T> {\n compare?: (a: T, b: T) => boolean;\n}\n\nexport interface AtomConfig<TValue, TInput> {\n createAtom: undefined extends TInput\n ? (input?: TInput) => Atom<TValue>\n : (input: TInput) => Atom<TValue>;\n}\n\nexport type AnyAtomConfig = AtomConfig<any, any>;\n\nexport type ValueFromAtomConfig<TConfig extends AnyAtomConfig> =\n TConfig extends AtomConfig<infer TValue, any> ? TValue : never;\n\nexport type InputFromAtomConfig<TConfig extends AnyAtomConfig> =\n TConfig extends AtomConfig<any, infer TInput> ? TInput : never;\n\nexport type AnyAtom = BaseAtom<any>;\n\nexport interface ReadonlyAtom<T> extends BaseAtom<T> {}\n\n/** Brand marking an object as an atom, so it can be detected structurally. */\nconst $$atom = /* #__PURE__ */ Symbol.for('xstate.atom');\n\n/**\n * Returns `true` if the value is an atom (writable, computed, async, or\n * reducer). Lets actor-consuming APIs (e.g. `enq.subscribeTo`) accept atoms\n * directly.\n */\nexport function isAtom(value: unknown): value is AnyAtom {\n return (\n !!value && typeof value === 'object' && ($$atom as any) in (value as any)\n );\n}\n\ninterface InternalAtom<T> extends ReactiveNode {\n _snapshot: T;\n _update(getValue?: T | ((snapshot: T) => T)): boolean;\n get(): T;\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)): Subscription;\n}\n\nconst queuedEffects: (Effect | undefined)[] = [];\nlet cycle = 0;\n\ntype ReactiveSystem = ReturnType<typeof createReactiveSystem>;\n// Initialized lazily on first atom creation (instead of at module evaluation)\n// so the reactive system stays tree-shakeable for apps that never use atoms —\n// flat dist chunks lose `#__PURE__` annotations, so a top-level call here\n// would be retained by consumer bundlers even when atoms are unused.\nlet link: ReactiveSystem['link'];\nlet unlink: ReactiveSystem['unlink'];\nlet propagate: ReactiveSystem['propagate'];\nlet checkDirty: ReactiveSystem['checkDirty'];\nlet shallowPropagate: ReactiveSystem['shallowPropagate'];\nlet reactiveSystemInstalled = false;\n\nfunction ensureReactiveSystem() {\n if (reactiveSystemInstalled) {\n return;\n }\n reactiveSystemInstalled = true;\n ({ link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(atom: InternalAtom<any>): boolean {\n return atom._update();\n },\n notify(effect: Effect): void {\n queuedEffects[queuedEffectsLength++] = effect;\n effect.flags &= ~ReactiveFlags.Watching;\n },\n unwatched(atom: InternalAtom<any>): void {\n if (atom.depsTail !== undefined) {\n atom.depsTail = undefined;\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty;\n purgeDeps(atom);\n }\n }\n }));\n}\n\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub: ReactiveNode | undefined;\n\nfunction purgeDeps(sub: ReactiveNode) {\n const depsTail = sub.depsTail;\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps;\n while (dep !== undefined) {\n dep = unlink(dep, sub);\n }\n}\n\nfunction flush(): void {\n while (notifyIndex < queuedEffectsLength) {\n const effect = queuedEffects[notifyIndex]!;\n queuedEffects[notifyIndex++] = undefined;\n effect.notify();\n }\n notifyIndex = 0;\n queuedEffectsLength = 0;\n}\n\n/** The current state of an async atom. */\nexport type AsyncAtomState<Data, Error = unknown> =\n | { status: 'pending' }\n | { status: 'done'; data: Data }\n | { status: 'error'; error: Error };\n\n/** Options passed to an async atom getter. */\nexport interface AsyncAtomOptions {\n /** Signal aborted when the async atom recomputes before this run settles. */\n signal: AbortSignal;\n}\n\nfunction compareAsyncAtomState<T>(\n a: AsyncAtomState<T>,\n b: AsyncAtomState<T>\n): boolean {\n if (a.status !== b.status) {\n return false;\n }\n if (a.status === 'done' && b.status === 'done') {\n return Object.is(a.data, b.data);\n }\n if (a.status === 'error' && b.status === 'error') {\n return Object.is(a.error, b.error);\n }\n // both 'pending'\n return true;\n}\n\nfunction updateAsyncAtom<T>(\n atom: InternalAtom<AsyncAtomState<T>>,\n nextValue: AsyncAtomState<T>\n): void {\n if (atom._update(nextValue)) {\n const subs = atom.subs;\n if (subs !== undefined) {\n propagate(subs);\n shallowPropagate(subs);\n flush();\n }\n }\n}\n\n/**\n * Creates a read-only atom whose value is loaded from an async getter.\n *\n * The getter receives an `AbortSignal`; when the async atom recomputes, the\n * previous signal is aborted and stale resolutions are ignored.\n */\nexport function createAsyncAtom<T>(\n getValue: (options: AsyncAtomOptions) => Promise<T>,\n options?: AtomOptions<AsyncAtomState<T>>\n): ReadonlyAtom<AsyncAtomState<T>> {\n const ref: { current?: InternalAtom<AsyncAtomState<T>> } = {};\n let currentController: AbortController | undefined;\n let currentRunId = 0;\n\n const atom = createAtom<AsyncAtomState<T>>(\n () => {\n currentController?.abort();\n\n const controller = new AbortController();\n const runId = ++currentRunId;\n currentController = controller;\n\n getValue({ signal: controller.signal }).then(\n (data) => {\n if (runId !== currentRunId || controller.signal.aborted) {\n return;\n }\n updateAsyncAtom(ref.current!, { status: 'done', data });\n },\n (error) => {\n if (runId !== currentRunId || controller.signal.aborted) {\n return;\n }\n updateAsyncAtom(ref.current!, { status: 'error', error });\n }\n );\n\n return { status: 'pending' } satisfies AsyncAtomState<T>;\n },\n { compare: compareAsyncAtomState, ...options }\n );\n ref.current = atom as unknown as InternalAtom<AsyncAtomState<T>>;\n\n return atom;\n}\n\n/**\n * Mirror atoms that bump a version whenever a tracked actor emits a snapshot,\n * letting computed atoms depend on `actor.get()` reads.\n *\n * The hook is installed lazily on first atom creation (not at module\n * evaluation) so that it remains tree-shakeable for apps that never use atoms —\n * any tracked read necessarily happens inside an atom computation, so first-use\n * installation is always early enough.\n */\nlet actorInteropInstalled = false;\n\nfunction ensureActorInterop() {\n if (actorInteropInstalled) {\n return;\n }\n actorInteropInstalled = true;\n const actorVersions = new WeakMap<AnyActorRef, Atom<number>>();\n installActorReadHook((actorRef) => {\n if (activeSub === undefined) {\n return;\n }\n let version = actorVersions.get(actorRef);\n if (version === undefined) {\n version = createAtom(0);\n actorVersions.set(actorRef, version);\n actorRef.subscribe({\n next: () => version!.set((v) => v + 1),\n error: () => {}\n });\n }\n version.get();\n });\n}\n\n/**\n * Creates an atom.\n *\n * Pass a value for a writable atom or a getter for a computed read-only atom.\n */\nexport function createAtom<T>(\n getValue: (prev?: T) => T,\n options?: AtomOptions<T>\n): ReadonlyAtom<T>;\nexport function createAtom<T>(\n initialValue: T,\n options?: AtomOptions<T>\n): Atom<T>;\nexport function createAtom<T>(\n valueOrFn: T | ((prev?: T) => T),\n optionsOrInput?: AtomOptions<T>\n): Atom<T> | ReadonlyAtom<T> {\n ensureReactiveSystem();\n ensureActorInterop();\n const isComputed = typeof valueOrFn === 'function';\n const getter = valueOrFn as (prev?: T) => T;\n\n // Create plain object atom\n const atom: InternalAtom<T> = {\n _snapshot: isComputed ? undefined! : valueOrFn,\n\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: isComputed ? ReactiveFlags.None : ReactiveFlags.Mutable,\n\n get(): T {\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle);\n }\n return atom._snapshot;\n },\n\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)) {\n const observer =\n typeof observerOrFn === 'function'\n ? { next: observerOrFn }\n : observerOrFn;\n const observed = { current: false };\n const e = effect(() => {\n atom.get();\n if (!observed.current) {\n observed.current = true;\n } else {\n const prevSub = activeSub;\n activeSub = undefined;\n try {\n observer.next?.(atom._snapshot);\n } catch (err) {\n reportUnhandledError(err);\n } finally {\n activeSub = prevSub;\n }\n\n // If the observer synchronously updates any of our deps we'll be\n // marked as dirty preventing this effect from re-running. Request\n // the value again to reconcile any dirty deps.\n atom.get();\n }\n });\n\n return {\n unsubscribe: () => {\n e.stop();\n }\n };\n },\n _update(getValue?: T | ((snapshot: T) => T)): boolean {\n const prevSub = activeSub;\n const compare = optionsOrInput?.compare ?? Object.is;\n activeSub = atom;\n ++cycle;\n atom.depsTail = undefined;\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck;\n }\n try {\n const oldValue = atom._snapshot;\n const newValue =\n typeof getValue === 'function'\n ? (getValue as (snapshot: T) => T)(oldValue)\n : getValue === undefined && isComputed\n ? getter(oldValue)\n : getValue!;\n if (oldValue === undefined || !compare(oldValue, newValue)) {\n atom._snapshot = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n if (isComputed) {\n atom.flags &= ~ReactiveFlags.RecursedCheck;\n }\n purgeDeps(atom);\n }\n }\n };\n\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty;\n atom.get = function (): T {\n const flags = atom.flags;\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(atom.deps!, atom))\n ) {\n if (atom._update()) {\n const subs = atom.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n } else if (flags & ReactiveFlags.Pending) {\n atom.flags = flags & ~ReactiveFlags.Pending;\n }\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle);\n }\n return atom._snapshot;\n };\n } else {\n (atom as unknown as Atom<T>).set = function (\n valueOrFn: T | ((prev: T) => T)\n ): void {\n if (atom._update(valueOrFn)) {\n const subs = atom.subs;\n if (subs !== undefined) {\n propagate(subs);\n shallowPropagate(subs);\n flush();\n }\n }\n };\n }\n\n (atom as any)[$$atom] = true;\n\n return atom as unknown as Atom<T> | ReadonlyAtom<T>;\n}\n\n/**\n * Creates an inert atom config that can be instantiated later.\n *\n * Useful for framework hooks that need to create a stable local atom from\n * component input.\n */\nexport function createAtomConfig<T, TInput>(\n getInitialValue: (input: TInput) => T,\n options?: AtomOptions<T>\n): AtomConfig<T, TInput>;\nexport function createAtomConfig<T>(\n initialValue: T,\n options?: AtomOptions<T>\n): AtomConfig<T, undefined>;\nexport function createAtomConfig<T, TInput>(\n initialValueOrFn: T | ((input: TInput) => T),\n options?: AtomOptions<T>\n): AtomConfig<T, TInput | undefined> {\n return {\n createAtom(input?: TInput) {\n const initialValue =\n typeof initialValueOrFn === 'function'\n ? (initialValueOrFn as (input: TInput) => T)(input as TInput)\n : initialValueOrFn;\n\n return createAtom(initialValue, options);\n }\n };\n}\n\n/** Creates an atom whose updates are handled by a reducer function. */\nexport function createReducerAtom<TState, TEvent>(\n initialValue: TState,\n reducer: (state: TState, event: TEvent) => TState,\n options?: AtomOptions<TState>\n): ReducerAtom<TState, TEvent> {\n const atom = createAtom(initialValue, options);\n\n return {\n [$$atom]: true,\n get: atom.get.bind(atom),\n subscribe: atom.subscribe.bind(atom),\n send(event: TEvent) {\n const prevSub = activeSub;\n activeSub = undefined;\n let nextState: TState;\n try {\n nextState = reducer(atom.get(), event);\n } finally {\n activeSub = prevSub;\n }\n atom.set(nextState);\n }\n } as unknown as ReducerAtom<TState, TEvent>;\n}\n\ninterface Effect extends ReactiveNode {\n notify(): void;\n stop(): void;\n}\n\nfunction effect<T>(fn: () => T): Effect {\n const run = (): T => {\n const prevSub = activeSub;\n activeSub = effectObj;\n ++cycle;\n effectObj.depsTail = undefined;\n effectObj.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck;\n try {\n return fn();\n } finally {\n activeSub = prevSub;\n effectObj.flags &= ~ReactiveFlags.RecursedCheck;\n purgeDeps(effectObj);\n }\n };\n const effectObj: Effect = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n\n notify(): void {\n const flags = this.flags;\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(this.deps!, this))\n ) {\n run();\n } else {\n this.flags = ReactiveFlags.Watching;\n }\n },\n\n stop(): void {\n this.flags = ReactiveFlags.None;\n this.depsTail = undefined;\n purgeDeps(this);\n }\n };\n\n run();\n\n return effectObj;\n}\n","import { AnyActorSystem } from '../system.ts';\nimport {\n ActorLogic,\n ActorRefFromLogic,\n AnyActorRef,\n EventObject,\n Snapshot\n} from '../types';\nimport { createAttachedLogic, relayMappedToParent } from './attached.ts';\nimport { isAtom } from '../atom.ts';\n\nexport type SubscriptionSnapshot = Snapshot<undefined> & {\n input: SubscriptionInput<any, any, any, any>;\n};\n\nexport interface SubscriptionMappers<\n TSnapshot extends Snapshot<unknown>,\n TOutput,\n TMappedEvent extends EventObject\n> {\n snapshot?: (snapshot: TSnapshot) => TMappedEvent;\n done?: (output: TOutput) => TMappedEvent;\n error?: (error: unknown) => TMappedEvent;\n}\n\nexport interface SubscriptionInput<\n TSnapshot extends Snapshot<unknown>,\n TOutput,\n TMappedEvent extends EventObject,\n TMappers extends SubscriptionMappers<TSnapshot, TOutput, TMappedEvent>\n> {\n actor: AnyActorRef;\n mappers: TMappers;\n}\n\nexport type SubscriptionActorLogic<\n TSnapshot extends Snapshot<unknown> = Snapshot<unknown>,\n TOutput = unknown,\n TMappedEvent extends EventObject = EventObject\n> = ActorLogic<\n SubscriptionSnapshot,\n EventObject,\n SubscriptionInput<\n TSnapshot,\n TOutput,\n TMappedEvent,\n SubscriptionMappers<TSnapshot, TOutput, TMappedEvent>\n >,\n AnyActorSystem,\n EventObject\n>;\n\nexport type SubscriptionActorRef<\n TSnapshot extends Snapshot<unknown> = Snapshot<unknown>,\n TOutput = unknown,\n TMappedEvent extends EventObject = EventObject\n> = ActorRefFromLogic<SubscriptionActorLogic<TSnapshot, TOutput, TMappedEvent>>;\n\n/**\n * Creates actor logic for subscribing to lifecycle events (done/error/snapshot)\n * from another actor. Used internally by `enq.subscribeTo()`.\n */\nexport function createSubscriptionLogic<\n TSnapshot extends Snapshot<unknown> = Snapshot<unknown>,\n TOutput = unknown,\n TMappedEvent extends EventObject = EventObject\n>(): SubscriptionActorLogic<TSnapshot, TOutput, TMappedEvent> {\n return createAttachedLogic(({ actor, mappers }, { self, system }) => {\n const { done, error, snapshot: onSnapshot } = mappers;\n\n // Atoms emit a raw value (no `status`) and have no done/error lifecycle —\n // pass the value straight to the `snapshot` mapper.\n if (isAtom(actor)) {\n if (!onSnapshot) {\n return;\n }\n return actor.subscribe((value) =>\n relayMappedToParent(self, system, () => onSnapshot(value as TSnapshot))\n );\n }\n\n return actor.subscribe({\n next: (snapshot: TSnapshot) => {\n if (snapshot.status === 'done' && done) {\n relayMappedToParent(self, system, () =>\n done(snapshot.output as TOutput)\n );\n } else if (snapshot.status === 'error' && error) {\n relayMappedToParent(self, system, () => error(snapshot.error));\n } else if (snapshot.status === 'active' && onSnapshot) {\n relayMappedToParent(self, system, () => onSnapshot(snapshot));\n }\n },\n error: (err: unknown) => {\n if (error) {\n relayMappedToParent(self, system, () => error(err));\n }\n },\n complete: () => {\n // Actor completed without output (stopped); no action needed\n }\n });\n });\n}\n\n// Singleton logic instance\nexport const subscriptionLogic = /* #__PURE__ */ createSubscriptionLogic();\n","import isDevelopment from '#is-development';\nimport { builtInActions } from './actions.ts';\nimport { listenerLogic, type ListenerInput } from './actors/listener.ts';\nimport {\n subscriptionLogic,\n type SubscriptionInput,\n type SubscriptionMappers\n} from './actors/subscription.ts';\nimport { createActor } from './createActor.ts';\nimport { cloneMachineSnapshot } from './State.ts';\nimport type {\n Action,\n AnyAction,\n AnyActor,\n AnyActorScope,\n AnyEventObject,\n AnyMachineSnapshot,\n EnqueueObject,\n EventObject\n} from './types.ts';\n\nfunction pushBuiltInAction(actions: any[], action: any, ...args: any[]) {\n actions.push({ action, args } as AnyAction);\n}\n\nfunction registerSpawnedChild(actor: AnyActor, id: string) {\n return Object.assign(\n function registerChild(args: { children: Record<string, AnyActor> }) {\n return { children: { ...args.children, [id]: actor } };\n },\n { _special: true }\n );\n}\n\nfunction unregisterChild(actor: AnyActor) {\n return Object.assign(\n function removeChild(args: {\n children: Record<string, AnyActor | undefined>;\n }) {\n const children = { ...args.children };\n for (const key of Object.keys(children)) {\n if (children[key] === actor) {\n delete children[key];\n }\n }\n return { children };\n },\n { _special: true }\n );\n}\n\nfunction pushStartedChild(\n actions: any[],\n actor: AnyActor,\n id: string | undefined\n) {\n pushBuiltInAction(actions, builtInActions['@xstate.start'], actor);\n actions.push(registerSpawnedChild(actor, id ?? actor.id));\n}\n\nexport function createTransitionEnqueue(\n actorScope: AnyActorScope,\n actions: any[],\n internalEvents: EventObject[],\n actorSubscriptions = false\n) {\n const props: Partial<EnqueueObject<any, any>> = {\n cancel: (id: string) => {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.cancel'],\n actorScope,\n id\n );\n },\n emit: (emittedEvent) => {\n actions.push(emittedEvent);\n },\n log: (...args) => {\n pushBuiltInAction(actions, actorScope.logger, ...args);\n },\n raise: (raisedEvent, options) => {\n if (typeof raisedEvent === 'string') {\n throw new Error(\n isDevelopment\n ? `Only event objects may be used with raise; use raise({ type: \"${raisedEvent}\" }) instead`\n : `Only event objects may be used with raise`\n );\n }\n if (options?.delay !== undefined) {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.raise'],\n actorScope,\n raisedEvent,\n options\n );\n } else {\n internalEvents.push(raisedEvent);\n }\n },\n spawn: (logic, options) => {\n const actor = createActor(logic, {\n ...options,\n parent: actorScope.self\n });\n pushStartedChild(actions, actor, options?.id);\n return actor;\n },\n sendTo: (actor, event, options) => {\n if (actor) {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.sendTo'],\n actorScope,\n actor,\n event,\n options\n );\n }\n },\n stop: (actor) => {\n if (actor) {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.stopChild'],\n actorScope,\n actor\n );\n actions.push(unregisterChild(actor));\n }\n }\n };\n\n if (actorSubscriptions) {\n Object.assign(props, {\n listen: (actor: any, eventType: string, mapper: any) => {\n const input: ListenerInput<any, any> = {\n actor,\n eventType,\n mapper\n };\n const listenerActor = createActor(listenerLogic, {\n input,\n parent: actorScope.self\n });\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.start'],\n listenerActor\n );\n return listenerActor;\n },\n subscribeTo: (actor: any, mappers: any) => {\n const normalizedMappers: SubscriptionMappers<any, any, any> =\n typeof mappers === 'function' ? { snapshot: mappers } : mappers;\n\n const input: SubscriptionInput<any, any, any, any> = {\n actor,\n mappers: normalizedMappers\n };\n const subscriptionActor = createActor(subscriptionLogic, {\n input,\n parent: actorScope.self\n });\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.start'],\n subscriptionActor\n );\n return subscriptionActor;\n }\n });\n }\n\n return createEnqueueObject(props, (action, ...args) => {\n pushBuiltInAction(actions, action, ...args);\n });\n}\n\nexport function resolveAndExecuteActionsWithContext(\n currentSnapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope,\n actions: AnyAction[]\n): AnyMachineSnapshot {\n let intermediateSnapshot = currentSnapshot;\n\n for (const action of actions) {\n const isInline = typeof action === 'function';\n\n const resolvedAction = isInline\n ? action\n : typeof action === 'object' &&\n 'action' in action &&\n typeof action.action === 'function'\n ? action.action.bind(null, ...action.args)\n : false;\n\n if (!resolvedAction && typeof action === 'object' && action !== null) {\n actorScope.defer(() => {\n actorScope.emit(action);\n });\n }\n\n const actionArgs = {\n context: intermediateSnapshot.context,\n event,\n self: actorScope.self,\n system: actorScope.system,\n children: intermediateSnapshot.children,\n parent: actorScope.self._parent,\n actions: currentSnapshot.machine.implementations.actions,\n actors: currentSnapshot.machine.implementations.actors\n };\n\n let actionParams = undefined;\n\n if (typeof action === 'object' && action !== null) {\n const { type: _, ...emittedEventParams } = action as any;\n actionParams = emittedEventParams;\n }\n\n if (resolvedAction && '_special' in resolvedAction) {\n actorScope.actionExecutor({\n type:\n typeof action === 'object'\n ? 'action' in action && typeof action.action === 'function'\n ? (action.action.name ?? '(anonymous)')\n : ((action as any).type ?? '(anonymous)')\n : action.name || '(anonymous)',\n params: actionParams,\n args: [],\n exec: undefined\n });\n\n const specialAction = resolvedAction as unknown as Action<\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >;\n\n const res = specialAction(actionArgs as any, emptyEnqueueObject);\n\n if (res && ('context' in res || 'children' in res)) {\n intermediateSnapshot = cloneMachineSnapshot(intermediateSnapshot, {\n ...('context' in res ? { context: res.context } : {}),\n ...('children' in res ? { children: res.children } : {})\n });\n }\n continue;\n }\n\n if (!resolvedAction || !('resolve' in resolvedAction)) {\n actorScope.actionExecutor({\n type:\n typeof action === 'object'\n ? 'action' in action && typeof action.action === 'function'\n ? (action.action.name ?? '(anonymous)')\n : (action as AnyEventObject).type\n : action.name || '(anonymous)',\n params: actionParams,\n args:\n typeof action === 'object' && 'action' in action ? action.args : [],\n exec: resolvedAction\n });\n continue;\n }\n }\n\n return intermediateSnapshot;\n}\n\nfunction createEnqueueObject(\n props: Partial<EnqueueObject<any, any>>,\n action: <T extends (...args: any[]) => any>(\n fn: T,\n ...args: Parameters<T>\n ) => void\n): EnqueueObject<any, any> {\n const enqueueFn = (\n fn: (...args: any[]) => any,\n ...args: Parameters<typeof fn>\n ) => {\n action(fn, ...args);\n };\n\n Object.assign(enqueueFn, {\n cancel: () => {},\n emit: () => {},\n log: () => {},\n raise: () => {},\n spawn: () => ({}) as any,\n sendTo: () => {},\n stop: () => {},\n listen: () => ({}) as any,\n subscribeTo: () => ({}) as any,\n ...props\n });\n\n return enqueueFn as any;\n}\n\nconst emptyEnqueueObject = createEnqueueObject({}, () => {});\n","import isDevelopment from '#is-development';\nimport { MachineSnapshot, cloneMachineSnapshot } from './State.ts';\nimport type { StateNode } from './StateNode.ts';\nimport {\n createAfterEvent,\n createDoneStateEvent,\n createInvokeTimeoutEvent,\n createTimeoutEvent\n} from './eventUtils.ts';\nimport {\n XSTATE_INIT,\n STATE_DELIMITER,\n STATE_IDENTIFIER,\n XSTATE_STOP\n} from './constants.ts';\nimport { matchesEventDescriptor } from './utils.ts';\nimport {\n AnyEventObject,\n AnyMachineSnapshot,\n AnyStateNode,\n AnyTransitionDefinition,\n DelayedTransitionDefinition,\n EventObject,\n ExecutableActionObject,\n HistoryValue,\n MachineContext,\n StateValue,\n TransitionDefinition,\n AnyAction,\n AnyTransitionConfig,\n AnyActor,\n AnyActorScope,\n EnqueueObject,\n DoneStateEvent\n} from './types.ts';\nimport {\n resolveOutput,\n normalizeTarget,\n toArray,\n toStatePath,\n isErrorActorEvent,\n resolveReferencedActor,\n toTransitionConfigArray\n} from './utils.ts';\nimport { createActor } from './createActor.ts';\nimport { builtInActions } from './actions.ts';\nimport {\n createTransitionEnqueue,\n resolveAndExecuteActionsWithContext\n} from './transitionActions.ts';\nimport { parseDurationToMilliseconds } from './delay.ts';\n\ntype AnyStateNodeIterable = Iterable<AnyStateNode>;\n\nfunction getConfiguredDelayValue(\n delay: number | string,\n delaySource: Record<string, any>\n) {\n if (typeof delay !== 'string') {\n return delay;\n }\n\n const referencedDelay = delaySource[delay];\n if (referencedDelay !== undefined) {\n return referencedDelay;\n }\n\n return parseDurationToMilliseconds(delay) ?? delay;\n}\n\nfunction resolveDelay(\n delay: number | string | ((args: any) => number),\n delaySource: Record<string, any>,\n args: {\n context: MachineContext;\n event: EventObject;\n stateNode: AnyStateNode;\n }\n) {\n if (typeof delay === 'function') {\n return delay(args);\n }\n\n const configuredDelay = getConfiguredDelayValue(delay, delaySource);\n if (typeof configuredDelay === 'function') {\n return configuredDelay(args);\n }\n\n return configuredDelay;\n}\n\nexport function isAtomicStateNode(stateNode: AnyStateNode) {\n return (\n stateNode.type === 'atomic' ||\n stateNode.type === 'final' ||\n stateNode.type === 'choice'\n );\n}\n\nfunction getChildren(stateNode: AnyStateNode): Array<AnyStateNode> {\n return Object.values(stateNode.states).filter((sn) => sn.type !== 'history');\n}\n\nexport function getProperAncestors(\n stateNode: AnyStateNode,\n toStateNode: AnyStateNode | undefined\n): Array<typeof stateNode> {\n const ancestors: Array<typeof stateNode> = [];\n\n if (toStateNode === stateNode) {\n return ancestors;\n }\n\n // add all ancestors\n let m = stateNode.parent;\n while (m && m !== toStateNode) {\n ancestors.push(m);\n m = m.parent;\n }\n\n return ancestors;\n}\n\nexport function getAllStateNodes(\n stateNodes: Iterable<AnyStateNode>\n): Set<AnyStateNode> {\n const nodeSet = new Set(stateNodes);\n const activeParentSet = new Set<AnyStateNode>();\n for (const stateNode of nodeSet) {\n if (stateNode.parent) {\n activeParentSet.add(stateNode.parent);\n }\n }\n\n // add descendants\n for (const s of nodeSet) {\n // if previously active, add existing child nodes\n if (s.type === 'compound' && !activeParentSet.has(s)) {\n for (const sn of getInitialStateNodes(s)) {\n nodeSet.add(sn);\n }\n continue;\n }\n\n if (s.type === 'parallel') {\n for (const child of getChildren(s)) {\n if (!nodeSet.has(child)) {\n const initialStates = getInitialStateNodes(child);\n for (const initialStateNode of initialStates) {\n nodeSet.add(initialStateNode);\n }\n }\n }\n }\n }\n\n // add all ancestors\n // Stop walking up as soon as we hit a node already in the set: its own\n // ancestor chain is guaranteed to be added when it is visited by this loop\n // (Set iteration visits elements added during iteration), so shared ancestor\n // chains are never re-walked once per descendant.\n for (const s of nodeSet) {\n let m = s.parent;\n\n while (m && !nodeSet.has(m)) {\n nodeSet.add(m);\n m = m.parent;\n }\n }\n\n return nodeSet;\n}\n\nexport function getStateValue(\n rootNode: AnyStateNode,\n stateNodes: AnyStateNodeIterable\n): StateValue {\n const config = getAllStateNodes(stateNodes);\n const adjList = new Map<AnyStateNode, Array<AnyStateNode>>();\n\n for (const s of config) {\n if (!adjList.has(s)) {\n adjList.set(s, []);\n }\n\n if (!s.parent) {\n continue;\n }\n\n if (!adjList.has(s.parent)) {\n adjList.set(s.parent, []);\n }\n\n adjList.get(s.parent)!.push(s);\n }\n\n const getValueFromAdj = (baseNode: AnyStateNode): StateValue => {\n const childStateNodes = adjList.get(baseNode);\n\n if (!childStateNodes) {\n return {}; // todo: fix?\n }\n\n if (baseNode.type === 'compound') {\n const childStateNode = childStateNodes[0];\n if (!childStateNode) {\n return {};\n }\n if (isAtomicStateNode(childStateNode)) {\n return childStateNode.key;\n }\n }\n\n const stateValue: StateValue = {};\n for (const childStateNode of childStateNodes) {\n stateValue[childStateNode.key] = getValueFromAdj(childStateNode);\n }\n\n return stateValue;\n };\n\n return getValueFromAdj(rootNode);\n}\n\nexport function isInFinalState(\n stateNodeSet: Set<AnyStateNode>,\n stateNode: AnyStateNode\n): boolean {\n if (stateNode.type === 'compound') {\n return getChildren(stateNode).some(\n (s) => s.type === 'final' && stateNodeSet.has(s)\n );\n }\n if (stateNode.type === 'parallel') {\n return getChildren(stateNode).every((sn) =>\n isInFinalState(stateNodeSet, sn)\n );\n }\n\n return stateNode.type === 'final';\n}\n\nexport const isStateId = (str: string) => str[0] === STATE_IDENTIFIER;\n\nexport function getCandidates<TEvent extends EventObject>(\n stateNode: StateNode<any, TEvent>,\n receivedEventType: TEvent['type']\n): Array<TransitionDefinition<any, TEvent>> {\n const candidates = stateNode.transitions.get(receivedEventType);\n if (candidates) {\n return candidates;\n }\n\n const matchingDescriptors: string[] = [];\n\n for (const eventDescriptor of stateNode.transitions.keys()) {\n if (matchesEventDescriptor(receivedEventType, eventDescriptor)) {\n matchingDescriptors.push(eventDescriptor);\n }\n }\n\n matchingDescriptors.sort((a, b) => b.length - a.length);\n\n const wildcardCandidates: Array<TransitionDefinition<any, TEvent>> = [];\n for (const descriptor of matchingDescriptors) {\n wildcardCandidates.push(...stateNode.transitions.get(descriptor)!);\n }\n\n return wildcardCandidates;\n}\n\nfunction scheduleDelayedEvent(\n stateNode: AnyStateNode,\n event: AnyEventObject,\n resolveScheduledDelay: (x: {\n context: MachineContext;\n event: EventObject;\n delays: Record<string, any>;\n }) => any\n) {\n const eventType = event.type;\n const oldEntry = stateNode.entry;\n stateNode.entry = (x: any, enq: any) => {\n enq.raise(event as any, {\n id: eventType,\n delay: resolveScheduledDelay(x)\n });\n return typeof oldEntry === 'function' ? oldEntry(x, enq) : undefined;\n };\n const oldExit = stateNode.exit;\n stateNode.exit = (_: any, enq: any) => {\n enq.cancel(eventType);\n return typeof oldExit === 'function' ? oldExit(_, enq) : undefined;\n };\n\n return eventType;\n}\n\n/** All delayed transitions from the config. */\nexport function getDelayedTransitions(\n stateNode: AnyStateNode\n): Array<DelayedTransitionDefinition<MachineContext, EventObject>> {\n const afterConfig = stateNode.config.after;\n const timeoutConfig = (stateNode.config as any).timeout;\n const onTimeoutConfig = (stateNode.config as any).onTimeout;\n const invokeDefs = stateNode.invoke.filter(\n (invokeDef) => invokeDef.timeout !== undefined\n );\n\n if (!afterConfig && timeoutConfig === undefined && invokeDefs.length === 0) {\n return [];\n }\n\n if (isDevelopment && timeoutConfig !== undefined && !onTimeoutConfig) {\n throw new Error(\n `State \"${stateNode.id}\" has \\`timeout\\` but no \\`onTimeout\\` transition.`\n );\n }\n\n if (isDevelopment) {\n for (const invokeDef of invokeDefs) {\n if (!invokeDef.onTimeout) {\n throw new Error(\n `Invoke on state \"${stateNode.id}\" has \\`timeout\\` but no \\`onTimeout\\` transition.`\n );\n }\n }\n }\n\n const mutateEntryExitWithDelay = (delay: string | number) => {\n const afterEvent = createAfterEvent(delay, stateNode.id);\n return scheduleDelayedEvent(stateNode, afterEvent, (x) =>\n resolveDelay(delay, x.delays, {\n context: x.context,\n event: x.event,\n stateNode\n })\n );\n };\n\n const delayedTransitions: Array<\n AnyTransitionConfig & { event: string; delay: any }\n > = [];\n const addDelayedTransitions = (\n transitionsConfig: unknown,\n event: string,\n delay: unknown\n ) => {\n for (const transition of toTransitionConfigArray(\n transitionsConfig as any\n )) {\n delayedTransitions.push({\n ...transition,\n event,\n delay\n });\n }\n };\n\n if (afterConfig) {\n for (const delay of Object.keys(afterConfig)) {\n const configTransition = afterConfig[delay];\n const parsedDelay = Number.isNaN(+delay) ? delay : +delay;\n const eventType = mutateEntryExitWithDelay(parsedDelay);\n const resolvedDelay = getConfiguredDelayValue(\n parsedDelay,\n stateNode.machine.implementations.delays\n );\n\n addDelayedTransitions(configTransition, eventType, resolvedDelay);\n }\n }\n\n // Desugar state-level `timeout` + `onTimeout` into a delayed transition.\n // Uses a dedicated `xstate.timeout.<id>` event so it cannot collide with\n // explicit `after` entries on the same state.\n if (timeoutConfig !== undefined && onTimeoutConfig) {\n const timeoutEvent = createTimeoutEvent(stateNode.id);\n const timeoutEventType = scheduleDelayedEvent(\n stateNode,\n timeoutEvent,\n (x) =>\n resolveDelay(timeoutConfig, x.delays, {\n context: x.context,\n event: x.event,\n stateNode\n }) as number\n );\n\n const resolvedDelay =\n typeof timeoutConfig === 'function'\n ? timeoutConfig\n : getConfiguredDelayValue(\n timeoutConfig,\n stateNode.machine.implementations.delays\n );\n\n addDelayedTransitions(onTimeoutConfig, timeoutEventType, resolvedDelay);\n }\n\n // Desugar invoke-level `timeout` + `onTimeout` into a delayed transition on\n // the enclosing state. Completion transitions cancel this timer separately,\n // so the timeout is cleared even when the parent state stays active.\n for (const invokeDef of invokeDefs) {\n const invokeTimeoutEvent = createInvokeTimeoutEvent(invokeDef.id);\n const invokeTimeout = invokeDef.timeout!;\n const invokeTimeoutEventType = scheduleDelayedEvent(\n stateNode,\n invokeTimeoutEvent,\n (x) =>\n resolveDelay(\n invokeTimeout,\n {},\n {\n context: x.context,\n event: x.event,\n stateNode\n }\n ) as number\n );\n\n const invokeOnTimeout = invokeDef.onTimeout;\n addDelayedTransitions(\n invokeOnTimeout,\n invokeTimeoutEventType,\n invokeTimeout as any\n );\n }\n return delayedTransitions.map((delayedTransition) => ({\n ...formatTransition(\n stateNode,\n delayedTransition.event,\n delayedTransition as AnyTransitionConfig\n ),\n delay: delayedTransition.delay\n }));\n}\n\nexport function formatTransition(\n stateNode: AnyStateNode,\n descriptor: string,\n transitionConfig: AnyTransitionConfig\n): AnyTransitionDefinition {\n const normalizedTarget = normalizeTarget(transitionConfig.target);\n const reenter = transitionConfig.reenter ?? false;\n const target = resolveTarget(stateNode, normalizedTarget);\n\n const transition = {\n ...transitionConfig,\n target,\n source: stateNode,\n reenter,\n eventType: descriptor,\n toJSON: () => ({\n ...transition,\n source: `#${stateNode.id}`,\n target: target ? target.map((t) => `#${t.id}`) : undefined\n })\n };\n\n return transition;\n}\n\n/**\n * Collects route transitions from all descendants with explicit IDs. Called\n * once on the root node to avoid O(N²) repeated traversals.\n */\nexport function formatRouteTransitions(rootStateNode: AnyStateNode): void {\n const routeTransitions: AnyTransitionDefinition[] = [];\n const collectRoutes = (states: Record<string, AnyStateNode>) => {\n Object.values(states).forEach((sn) => {\n if (sn.config.route && sn.config.id) {\n const routeId = sn.config.id;\n const routeConfig = sn.config.route;\n const routeMatches = ({ event }: { event: any }) =>\n event.to === `#${routeId}`;\n\n if (typeof routeConfig === 'function') {\n // Transition-style route: the function is the guard and resolver.\n // Returning undefined/false blocks the route; returning true or a\n // config object allows it.\n routeTransitions.push(\n formatTransition(rootStateNode, 'xstate.route', {\n guard: routeMatches,\n to: (args: any) => {\n const result = routeConfig(args);\n if (!result) {\n return undefined;\n }\n return {\n ...(result === true ? {} : result),\n target: `#${routeId}`\n };\n }\n } as AnyTransitionConfig)\n );\n if (sn.states) {\n collectRoutes(sn.states);\n }\n return;\n }\n\n if ('$unserializable' in routeConfig) {\n throw new Error(\n `State \"${sn.id}\" has a route that is not serializable. Re-provide the route function when reviving this machine.`\n );\n }\n\n // Object-form route. A `guard` (string or function) on the object is\n // only produced by the JSON layer (createMachineFromConfig) —\n // authoring uses the function form above.\n const userGuard = (routeConfig as any).guard;\n\n const transition: AnyTransitionConfig = {\n ...routeConfig,\n guard: userGuard\n ? (args: {\n event: any;\n guards: Record<string, (...a: any[]) => any>;\n }) => {\n if (!routeMatches(args)) return false;\n if (typeof userGuard === 'function') return userGuard(args);\n if (typeof userGuard === 'string') {\n const guardImpl = args.guards?.[userGuard];\n if (!guardImpl) {\n // A typo'd guard name must fail loudly — silently passing\n // would allow the route and corrupt machine behavior.\n throw new Error(\n isDevelopment\n ? `Guard '${userGuard}' is not implemented in machine '${rootStateNode.machine.id}'. Available guards: ${\n Object.keys(args.guards ?? {})\n .map((key) => `'${key}'`)\n .join(', ') || '(none)'\n }.`\n : `Guard '${userGuard}' is not implemented in machine '${rootStateNode.machine.id}'.`\n );\n }\n return guardImpl(args);\n }\n return true;\n }\n : routeMatches,\n target: `#${routeId}`\n };\n\n routeTransitions.push(\n formatTransition(rootStateNode, 'xstate.route', transition)\n );\n }\n if (sn.states) {\n collectRoutes(sn.states);\n }\n });\n };\n collectRoutes(rootStateNode.states);\n if (routeTransitions.length > 0) {\n rootStateNode.transitions.set('xstate.route', routeTransitions as any);\n }\n}\n\nfunction resolveTarget(\n stateNode: AnyStateNode,\n targets: ReadonlyArray<string | AnyStateNode> | undefined\n): ReadonlyArray<AnyStateNode> | undefined {\n if (targets === undefined) {\n // an undefined target signals that the state node should not transition from that state when receiving that event\n return undefined;\n }\n return targets.map((target) => {\n if (typeof target !== 'string') {\n return target;\n }\n if (isStateId(target)) {\n return stateNode.machine.getStateNodeById(target);\n }\n\n const isInternalTarget = target[0] === STATE_DELIMITER;\n // If internal target is defined on machine,\n // do not include machine key on target\n if (isInternalTarget && !stateNode.parent) {\n return getStateNodeByPath(stateNode, target.slice(1));\n }\n const resolvedTarget = isInternalTarget ? stateNode.key + target : target;\n if (stateNode.parent) {\n try {\n const targetStateNode = getStateNodeByPath(\n stateNode.parent,\n resolvedTarget\n );\n return targetStateNode;\n } catch (err: any) {\n throw new Error(\n `Invalid transition definition for state node '${stateNode.id}':\\n${err.message}`\n );\n }\n } else {\n throw new Error(\n isDevelopment\n ? `Invalid target: \"${target}\" is not a valid target from the root node. Did you mean \".${target}\"?`\n : `Invalid target: \"${target}\"`\n );\n }\n });\n}\n\nfunction resolveHistoryDefaultTransition(\n stateNode: AnyStateNode & { type: 'history' }\n): AnyTransitionDefinition {\n const normalizedTarget = normalizeTarget(stateNode.config.target);\n if (!normalizedTarget) {\n return stateNode.parent!.initial as AnyTransitionDefinition;\n }\n return {\n target: normalizedTarget.map((t) =>\n typeof t === 'string' ? getStateNodeByPath(stateNode.parent!, t) : t\n ),\n source: stateNode,\n reenter: false,\n eventType: '' as any\n };\n}\n\nfunction isHistoryNode(\n stateNode: AnyStateNode\n): stateNode is AnyStateNode & { type: 'history' } {\n return stateNode.type === 'history';\n}\n\nfunction getInitialStateNodes(stateNode: AnyStateNode) {\n const set = new Set<AnyStateNode>();\n\n function iter(descStateNode: AnyStateNode): void {\n if (set.has(descStateNode)) {\n return;\n }\n set.add(descStateNode);\n if (descStateNode.type === 'compound') {\n iter(descStateNode.initial.target![0]);\n } else if (descStateNode.type === 'parallel') {\n for (const child of getChildren(descStateNode)) {\n iter(child);\n }\n }\n }\n\n iter(stateNode);\n for (const initialState of set) {\n for (const ancestor of getProperAncestors(initialState, stateNode)) {\n set.add(ancestor);\n }\n }\n\n return set;\n}\n\n/** Returns the child state node from its relative `stateKey`, or throws. */\nfunction getStateNode(stateNode: AnyStateNode, stateKey: string): AnyStateNode {\n if (isStateId(stateKey)) {\n return stateNode.machine.getStateNodeById(stateKey);\n }\n if (!stateNode.states) {\n throw new Error(\n `Unable to retrieve child state '${stateKey}' from '${stateNode.id}'; no child states exist.`\n );\n }\n const result = stateNode.states[stateKey];\n if (!result) {\n throw new Error(\n `Child state '${stateKey}' does not exist on '${stateNode.id}'`\n );\n }\n return result;\n}\n\n/**\n * Returns the relative state node from the given `statePath`, or throws.\n *\n * @param statePath The string or string array relative path to the state node.\n */\nexport function getStateNodeByPath(\n stateNode: AnyStateNode,\n statePath: string | string[]\n): AnyStateNode {\n if (typeof statePath === 'string' && isStateId(statePath)) {\n try {\n return stateNode.machine.getStateNodeById(statePath);\n } catch {\n // try individual paths\n // throw e;\n }\n }\n const arrayStatePath = toStatePath(statePath).slice();\n let currentStateNode: AnyStateNode = stateNode;\n while (arrayStatePath.length) {\n const key = arrayStatePath.shift()!;\n if (!key.length) {\n break;\n }\n currentStateNode = getStateNode(currentStateNode, key);\n }\n return currentStateNode;\n}\n\n/**\n * Returns the state nodes represented by the current state value.\n *\n * @param stateValue The state value or State instance\n */\nexport function getStateNodes(\n stateNode: AnyStateNode,\n stateValue: StateValue\n): Array<AnyStateNode> {\n if (typeof stateValue === 'string') {\n const childStateNode = stateNode.states[stateValue];\n if (!childStateNode) {\n throw new Error(\n `State '${stateValue}' does not exist on '${stateNode.id}'`\n );\n }\n return [stateNode, childStateNode];\n }\n\n const childStateKeys = Object.keys(stateValue);\n const childStateNodes = new Array<AnyStateNode>(childStateKeys.length);\n const allStateNodes: Array<AnyStateNode> = [\n stateNode.machine.root,\n stateNode\n ];\n\n for (let i = 0; i < childStateKeys.length; i++) {\n const subStateNode = getStateNode(stateNode, childStateKeys[i]);\n childStateNodes[i] = subStateNode;\n allStateNodes.push(subStateNode);\n }\n\n for (let i = 0; i < childStateKeys.length; i++) {\n allStateNodes.push(\n ...getStateNodes(childStateNodes[i], stateValue[childStateKeys[i]]!)\n );\n }\n\n return allStateNodes;\n}\n\nexport function transitionNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValue,\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n any,\n any,\n any,\n any,\n any,\n any // TStateSchema\n >,\n event: TEvent,\n self: AnyActor\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n // leaf node\n if (typeof stateValue === 'string') {\n const childStateNode = getStateNode(stateNode, stateValue);\n const next = childStateNode.next(snapshot, event, self);\n\n if (!next || !next.length) {\n return stateNode.next(snapshot, event, self);\n }\n\n return next;\n }\n\n const subStateKeys = Object.keys(stateValue);\n const subStateKey = subStateKeys[0];\n\n if (subStateKeys.length === 1) {\n const childStateNode = getStateNode(stateNode, subStateKey);\n const next = transitionNode(\n childStateNode,\n stateValue[subStateKey]!,\n snapshot,\n event,\n self\n );\n\n if (!next || !next.length) {\n return stateNode.next(snapshot, event, self);\n }\n\n return next;\n }\n\n const allInnerTransitions: Array<TransitionDefinition<TContext, TEvent>> = [];\n\n for (const subStateKey of subStateKeys) {\n const subStateValue = stateValue[subStateKey];\n\n if (!subStateValue) {\n continue;\n }\n\n const subStateNode = getStateNode(stateNode, subStateKey);\n const innerTransitions = transitionNode(\n subStateNode,\n subStateValue,\n snapshot,\n event,\n self\n );\n if (innerTransitions) {\n allInnerTransitions.push(...innerTransitions);\n }\n }\n\n if (!allInnerTransitions.length) {\n return stateNode.next(snapshot, event, self);\n }\n\n return allInnerTransitions;\n}\n\nfunction isDescendant(\n childStateNode: AnyStateNode,\n parentStateNode: AnyStateNode\n): boolean {\n let marker = childStateNode;\n while (marker.parent && marker.parent !== parentStateNode) {\n marker = marker.parent;\n }\n\n return marker.parent === parentStateNode;\n}\n\nfunction hasDescendantState(\n stateNodes: Set<AnyStateNode>,\n parentStateNode: AnyStateNode\n): boolean {\n for (const stateNode of stateNodes) {\n if (isDescendant(stateNode, parentStateNode)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasIntersection<T>(s1: Iterable<T>, s2: Iterable<T>): boolean {\n const s1Size =\n s1 instanceof Set ? s1.size : Array.isArray(s1) ? s1.length : undefined;\n const s2Size =\n s2 instanceof Set ? s2.size : Array.isArray(s2) ? s2.length : undefined;\n\n if (s1Size !== undefined && s2Size !== undefined && s2Size < s1Size) {\n [s1, s2] = [s2, s1];\n }\n\n const set1 = s1 instanceof Set ? s1 : new Set(s1);\n for (const item of s2) {\n if (set1.has(item)) {\n return true;\n }\n }\n return false;\n}\n\nfunction removeConflictingTransitions(\n enabledTransitions: Array<AnyTransitionDefinition>,\n stateNodeSet: Set<AnyStateNode>,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): Array<AnyTransitionDefinition> {\n const filteredTransitions = new Set<AnyTransitionDefinition>();\n const exitSets = new Map<AnyTransitionDefinition, Array<AnyStateNode>>();\n\n const getExitSet = (transition: AnyTransitionDefinition) => {\n let exitSet = exitSets.get(transition);\n if (!exitSet) {\n exitSet = computeExitSet(\n [transition],\n stateNodeSet,\n snapshot,\n event,\n actorScope\n );\n exitSets.set(transition, exitSet);\n }\n\n return exitSet;\n };\n\n for (const t1 of enabledTransitions) {\n let t1Preempted = false;\n const transitionsToRemove = new Set<AnyTransitionDefinition>();\n for (const t2 of filteredTransitions) {\n if (hasIntersection(getExitSet(t1), getExitSet(t2))) {\n if (isDescendant(t1.source, t2.source)) {\n transitionsToRemove.add(t2);\n } else {\n t1Preempted = true;\n break;\n }\n }\n }\n if (!t1Preempted) {\n for (const t3 of transitionsToRemove) {\n filteredTransitions.delete(t3);\n }\n filteredTransitions.add(t1);\n }\n }\n\n return Array.from(filteredTransitions);\n}\n\nfunction getEffectiveTargetStates(\n transition: Pick<AnyTransitionDefinition, 'target' | 'source'>,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): Array<AnyStateNode> {\n const historyValue = snapshot.historyValue;\n const { targets } = getTransitionResult(\n transition,\n snapshot,\n event,\n actorScope\n );\n if (!targets) {\n return [];\n }\n\n const targetSet = new Set<AnyStateNode>();\n\n for (const targetNode of targets) {\n if (isHistoryNode(targetNode)) {\n if (historyValue[targetNode.id]) {\n for (const node of historyValue[targetNode.id]) {\n targetSet.add(node);\n }\n } else {\n for (const node of getEffectiveTargetStates(\n resolveHistoryDefaultTransition(targetNode),\n snapshot,\n event,\n actorScope\n )) {\n targetSet.add(node);\n }\n }\n } else {\n targetSet.add(targetNode);\n }\n }\n\n return [...targetSet];\n}\n\nfunction getTransitionDomain(\n transition: AnyTransitionDefinition,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): AnyStateNode | undefined {\n const targetStates = getEffectiveTargetStates(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n const { reenter } = getTransitionResult(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n if (\n !reenter &&\n targetStates.every(\n (target) =>\n target === transition.source || isDescendant(target, transition.source)\n )\n ) {\n return transition.source;\n }\n\n const [head, ...tail] = targetStates.concat(transition.source);\n // Find the least common ancestor (LCA) of the source and effective targets.\n for (const ancestor of getProperAncestors(head, undefined)) {\n if (tail.every((sn) => isDescendant(sn, ancestor))) {\n return ancestor;\n }\n }\n\n // at this point we know that it's a root transition since LCA couldn't be found\n if (reenter) {\n return;\n }\n\n return transition.source.machine.root;\n}\n\nfunction computeExitSet(\n transitions: Array<AnyTransitionDefinition>,\n stateNodeSet: Set<AnyStateNode>,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): Array<AnyStateNode> {\n const statesToExit = new Set<AnyStateNode>();\n for (const transition of transitions) {\n const { targets } = getTransitionResult(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n if (targets?.length) {\n const domain = getTransitionDomain(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n if (transition.reenter && transition.source === domain) {\n statesToExit.add(domain);\n }\n\n for (const stateNode of stateNodeSet) {\n if (isDescendant(stateNode, domain!)) {\n statesToExit.add(stateNode);\n }\n }\n }\n }\n\n return [...statesToExit];\n}\n\ntype Microstep = readonly [AnyMachineSnapshot, ExecutableActionObject[]];\n\nexport function initialMicrostep(\n root: AnyStateNode,\n preInitialState: AnyMachineSnapshot,\n actorScope: AnyActorScope,\n initEvent: AnyEventObject,\n internalQueue: AnyEventObject[]\n): Microstep {\n return microstep(\n [\n {\n target: [...getInitialStateNodes(root)],\n source: root,\n reenter: true,\n eventType: null as any,\n toJSON: null as any\n } as AnyTransitionDefinition\n ],\n preInitialState,\n actorScope,\n initEvent,\n true,\n internalQueue\n );\n}\n\n/** https://www.w3.org/TR/scxml/#microstepProcedure */\nfunction microstep(\n transitions: Array<AnyTransitionDefinition>,\n currentSnapshot: AnyMachineSnapshot,\n actorScope: AnyActorScope,\n event: AnyEventObject,\n isInitial: boolean,\n internalQueue: Array<AnyEventObject>\n): Microstep {\n const actions: ExecutableActionObject[] = [];\n\n if (!transitions.length) {\n return [currentSnapshot, actions];\n }\n\n const originalExecutor = actorScope.actionExecutor;\n actorScope.actionExecutor = (action) => {\n actions.push(action);\n originalExecutor(action);\n };\n\n try {\n const mutStateNodeSet = new Set(currentSnapshot._nodes as StateNode[]);\n let historyValue = currentSnapshot.historyValue;\n const originalContext = currentSnapshot.context;\n\n const filteredTransitions = removeConflictingTransitions(\n transitions,\n mutStateNodeSet,\n currentSnapshot,\n event,\n actorScope\n );\n const getCurrentTransitionResult = (\n transition: Parameters<typeof getTransitionResult>[0]\n ) => getTransitionResult(transition, currentSnapshot, event, actorScope);\n const getStateActionsAndContext = (\n transitionFn: any,\n context: MachineContext,\n children: AnyMachineSnapshot['children'],\n input: Record<string, unknown> | undefined\n ): [\n actions: any[],\n context: MachineContext | undefined,\n internalEvents: EventObject[] | undefined\n ] => {\n if (transitionFn.length === 2) {\n // enqueue action; retrieve\n const actions: any[] = [];\n const internalEvents: EventObject[] = [];\n let updatedContext: MachineContext | undefined;\n\n const enqueue = createTransitionEnqueue(\n actorScope,\n actions,\n internalEvents,\n true\n );\n\n const res = transitionFn(\n {\n context,\n event,\n parent: actorScope.self._parent,\n self: actorScope.self,\n children,\n system: actorScope.system,\n actions: currentSnapshot.machine.implementations.actions,\n actors: currentSnapshot.machine.implementations.actors,\n guards: currentSnapshot.machine.implementations.guards,\n delays: currentSnapshot.machine.implementations.delays,\n input\n },\n enqueue\n );\n\n if (res?.context) {\n updatedContext = res.context;\n }\n\n return [actions, updatedContext, internalEvents];\n }\n\n // For 1-argument actions, wrap them to include input\n // Preserve _special flag if present (for entry/exit actions)\n const wrappedAction = Object.assign(\n (args: any, enqueue: any) => transitionFn({ ...args, input }, enqueue),\n '_special' in transitionFn ? { _special: true } : {}\n );\n return [[wrappedAction], undefined, undefined];\n };\n\n let nextState = currentSnapshot;\n const exitStates = () => {\n const statesToExit = computeExitSet(\n filteredTransitions,\n mutStateNodeSet,\n currentSnapshot,\n event,\n actorScope\n );\n\n statesToExit.sort((a, b) => b.order - a.order);\n\n let changedHistory: HistoryValue | undefined;\n const currentStateNodes = [...mutStateNodeSet];\n\n // From SCXML algorithm: https://www.w3.org/TR/scxml/#exitStates\n for (const exitStateNode of statesToExit) {\n for (const historyNode of Object.values(exitStateNode.states)) {\n if (historyNode.type !== 'history') {\n continue;\n }\n\n const predicate =\n historyNode.history === 'deep'\n ? (sn: AnyStateNode) =>\n isAtomicStateNode(sn) && isDescendant(sn, exitStateNode)\n : (sn: AnyStateNode) => sn.parent === exitStateNode;\n\n changedHistory ??= { ...historyValue };\n changedHistory[historyNode.id] = currentStateNodes.filter(predicate);\n }\n }\n\n for (const exitStateNode of statesToExit) {\n const stateInput = currentSnapshot._stateInputs?.[exitStateNode.id];\n\n const [exitActions, nextContext, internalEvents] = exitStateNode.exit\n ? getStateActionsAndContext(\n exitStateNode.exit,\n nextState.context,\n currentSnapshot.children,\n stateInput\n )\n : [[]];\n if (internalEvents?.length) {\n internalQueue.push(...internalEvents);\n }\n if (nextContext) {\n nextState = cloneMachineSnapshot(nextState, {\n context: nextContext\n });\n }\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n exitActions\n );\n for (const def of exitStateNode.invoke) {\n const childActor = nextState.children[def.id];\n if (childActor && !childActor._isExternal) {\n actorScope.stopChild(childActor);\n }\n delete nextState.children[def.id];\n }\n\n mutStateNodeSet.delete(exitStateNode);\n }\n\n historyValue = changedHistory || historyValue;\n };\n\n // Exit states\n if (!isInitial) {\n exitStates();\n }\n\n let context = nextState.context;\n const transitionActions: AnyAction[] = [];\n const internalEvents: EventObject[] = [];\n\n for (const t of filteredTransitions) {\n if (t.actions) {\n transitionActions.push(...toArray(t.actions));\n }\n const res = getCurrentTransitionResult(t);\n if (res.context) {\n context = res.context;\n }\n if (res.actions) {\n transitionActions.push(...res.actions);\n }\n if (res.internalEvents) {\n internalEvents.push(...res.internalEvents);\n }\n }\n\n if (internalEvents.length) {\n internalQueue.push(...internalEvents);\n }\n\n const enterStates = () => {\n const getMachineOutput = (rootCompletionNode: AnyStateNode) => {\n const rootNode = nextState.machine.root;\n if (rootNode.output === undefined) {\n return;\n }\n\n let completionOutput: unknown;\n if (\n rootCompletionNode.output !== undefined &&\n rootCompletionNode.parent\n ) {\n completionOutput = resolveOutput(\n rootCompletionNode.output,\n nextState.context,\n event,\n actorScope.self\n );\n } else if (rootCompletionNode.type === 'parallel') {\n const parallelDoneType = `xstate.done.state.${rootCompletionNode.id}`;\n const parallelDoneEvent = internalQueue.find(\n (e) => e.type === parallelDoneType\n ) as DoneStateEvent | undefined;\n completionOutput = parallelDoneEvent?.output;\n }\n\n return resolveOutput(\n rootNode.output,\n nextState.context,\n createDoneStateEvent(rootCompletionNode.id, completionOutput),\n actorScope.self\n );\n };\n\n const statesToEnter = new Set<AnyStateNode>();\n // those are states that were directly targeted or indirectly targeted by the explicit target\n // in other words, those are states for which initial actions should be executed\n // when we target `#deep_child` initial actions of its ancestors shouldn't be executed\n const statesForDefaultEntry = new Set<AnyStateNode>();\n const addAncestorStatesToEnter = (\n ancestors: AnyStateNode[],\n reentrancyDomain: AnyStateNode | undefined\n ) => {\n for (const anc of ancestors) {\n if (!reentrancyDomain || isDescendant(anc, reentrancyDomain)) {\n statesToEnter.add(anc);\n }\n if (anc.type === 'parallel') {\n for (const child of getChildren(anc)) {\n if (!hasDescendantState(statesToEnter, child)) {\n statesToEnter.add(child);\n addDescendantStatesToEnter(child);\n }\n }\n }\n }\n };\n\n const addDescendantStatesToEnter = (stateNode: AnyStateNode) => {\n if (isHistoryNode(stateNode)) {\n if (historyValue[stateNode.id]) {\n const historyStateNodes = historyValue[stateNode.id];\n for (const s of historyStateNodes) {\n statesToEnter.add(s);\n addDescendantStatesToEnter(s);\n }\n for (const s of historyStateNodes) {\n addAncestorStatesToEnter(\n getProperAncestors(s, stateNode.parent),\n undefined\n );\n }\n } else {\n const historyDefaultTransition =\n resolveHistoryDefaultTransition(stateNode);\n const { targets } = getCurrentTransitionResult(\n historyDefaultTransition\n );\n for (const s of targets ?? []) {\n statesToEnter.add(s);\n\n if (historyDefaultTransition === stateNode.parent?.initial) {\n statesForDefaultEntry.add(stateNode.parent);\n }\n\n addDescendantStatesToEnter(s);\n }\n\n for (const s of targets ?? []) {\n addAncestorStatesToEnter(\n getProperAncestors(s, stateNode.parent),\n undefined\n );\n }\n }\n return;\n }\n\n if (stateNode.type === 'compound') {\n const [initialState] = getCurrentTransitionResult(\n stateNode.initial\n ).targets!;\n\n if (!isHistoryNode(initialState)) {\n statesToEnter.add(initialState);\n statesForDefaultEntry.add(initialState);\n }\n addDescendantStatesToEnter(initialState);\n addAncestorStatesToEnter(\n getProperAncestors(initialState, stateNode),\n undefined\n );\n return;\n }\n\n if (stateNode.type === 'parallel') {\n for (const child of getChildren(stateNode)) {\n if (!hasDescendantState(statesToEnter, child)) {\n statesToEnter.add(child);\n statesForDefaultEntry.add(child);\n addDescendantStatesToEnter(child);\n }\n }\n }\n };\n\n for (const transition of filteredTransitions) {\n const domain = getTransitionDomain(\n transition,\n currentSnapshot,\n event,\n actorScope\n );\n\n const { targets, reenter } = getCurrentTransitionResult(transition);\n\n for (const targetNode of targets ?? []) {\n if (\n !isHistoryNode(targetNode) &&\n (transition.source !== targetNode ||\n transition.source !== domain ||\n reenter)\n ) {\n statesToEnter.add(targetNode);\n statesForDefaultEntry.add(targetNode);\n }\n addDescendantStatesToEnter(targetNode);\n }\n const targetStates = getEffectiveTargetStates(\n transition,\n currentSnapshot,\n event,\n actorScope\n );\n for (const s of targetStates) {\n const ancestors = getProperAncestors(s, domain);\n if (domain?.type === 'parallel') {\n ancestors.push(domain);\n }\n addAncestorStatesToEnter(\n ancestors,\n !transition.source.parent && reenter ? undefined : domain\n );\n }\n }\n\n if (isInitial) {\n statesForDefaultEntry.add(currentSnapshot.machine.root);\n }\n\n const stateInputMap: Record<string, Record<string, unknown>> = {\n ...currentSnapshot._stateInputs\n };\n for (const transition of filteredTransitions) {\n const { targets, input } = getCurrentTransitionResult(transition);\n if (input && targets) {\n for (const targetNode of targets) {\n stateInputMap[targetNode.id] = input;\n }\n }\n }\n\n const completedNodes = new Set<AnyStateNode>();\n const children = { ...currentSnapshot.children };\n for (const stateNodeToEnter of [...statesToEnter].sort(\n (a, b) => a.order - b.order\n )) {\n mutStateNodeSet.add(stateNodeToEnter);\n const actions: AnyAction[] = [];\n\n let invoked = false;\n for (const invokeDef of stateNodeToEnter.invoke) {\n invoked = true;\n\n let src = invokeDef.logic;\n if (typeof src === 'function') {\n src = src({\n actors: currentSnapshot.machine.implementations.actors,\n context: currentSnapshot.context,\n event,\n self: actorScope.self\n });\n }\n\n const logic =\n typeof src === 'string'\n ? resolveReferencedActor(currentSnapshot.machine, src)\n : src;\n\n if (!logic) {\n throw new Error(\n `Actor logic '${typeof src === 'string' ? src : 'inline'}' not implemented in machine '${currentSnapshot.machine.id}'`\n );\n }\n\n const input =\n typeof invokeDef.input === 'function'\n ? invokeDef.input({\n self: actorScope.self,\n context: currentSnapshot.context,\n event\n })\n : invokeDef.input;\n\n const actor = createActor(logic, {\n ...invokeDef,\n input,\n parent: actorScope.self,\n syncSnapshot: !!invokeDef.onSnapshot\n });\n\n actions.push({\n action: builtInActions['@xstate.start'],\n args: [actor]\n });\n\n if (invokeDef.id) {\n children[invokeDef.id] = actor;\n }\n }\n\n if (invoked) {\n nextState = cloneMachineSnapshot(nextState, { children });\n }\n let context: MachineContext | undefined;\n\n const stateInput = stateInputMap[stateNodeToEnter.id];\n\n if (stateNodeToEnter.entry) {\n const [resultActions, nextContext, nextInternalEvents] =\n getStateActionsAndContext(\n stateNodeToEnter.entry,\n nextState.context,\n children,\n stateInput\n );\n actions.push(...resultActions);\n if (nextInternalEvents?.length) {\n internalQueue.push(...nextInternalEvents);\n }\n if (nextContext) {\n context = nextContext;\n }\n }\n\n if (statesForDefaultEntry.has(stateNodeToEnter)) {\n const { actions: initialActions, input: initialInput } =\n getTransitionResult(\n stateNodeToEnter.initial,\n nextState,\n event,\n actorScope\n );\n if (initialActions) {\n actions.push(...initialActions);\n }\n if (initialInput && stateNodeToEnter.initial?.target) {\n for (const targetNode of stateNodeToEnter.initial.target) {\n stateInputMap[targetNode.id] = initialInput;\n }\n }\n }\n\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n actions\n );\n\n if (context) {\n nextState.context = context;\n }\n\n if (stateNodeToEnter.type !== 'final') {\n continue;\n }\n\n const parent = stateNodeToEnter.parent;\n let ancestorMarker =\n parent?.type === 'parallel' ? parent : parent?.parent;\n let rootCompletionNode = ancestorMarker || stateNodeToEnter;\n\n if (parent?.type === 'compound') {\n internalQueue.push(\n createDoneStateEvent(\n parent.id,\n stateNodeToEnter.output !== undefined\n ? resolveOutput(\n stateNodeToEnter.output,\n nextState.context,\n event,\n actorScope.self\n )\n : undefined\n )\n );\n }\n\n while (\n ancestorMarker?.type === 'parallel' &&\n !completedNodes.has(ancestorMarker) &&\n isInFinalState(mutStateNodeSet, ancestorMarker)\n ) {\n completedNodes.add(ancestorMarker);\n const regionOutput: Record<string, unknown> = {};\n for (const region of getChildren(ancestorMarker)) {\n if (region.type === 'final') {\n regionOutput[region.key] =\n region.output !== undefined\n ? resolveOutput(\n region.output,\n nextState.context,\n event,\n actorScope.self\n )\n : undefined;\n continue;\n }\n\n if (region.type === 'parallel') {\n const regionDoneType = `xstate.done.state.${region.id}`;\n const regionDoneEvent = internalQueue.find(\n (e) => e.type === regionDoneType\n ) as DoneStateEvent | undefined;\n regionOutput[region.key] = regionDoneEvent?.output;\n continue;\n }\n\n const finalChild = getChildren(region).find(\n (s) => s.type === 'final' && mutStateNodeSet.has(s)\n );\n regionOutput[region.key] =\n finalChild?.output !== undefined\n ? resolveOutput(\n finalChild.output,\n nextState.context,\n event,\n actorScope.self\n )\n : undefined;\n }\n internalQueue.push(\n createDoneStateEvent(ancestorMarker.id, regionOutput)\n );\n rootCompletionNode = ancestorMarker;\n ancestorMarker = ancestorMarker.parent;\n }\n if (ancestorMarker) {\n continue;\n }\n\n nextState = cloneMachineSnapshot(nextState, {\n status: 'done',\n output: getMachineOutput(rootCompletionNode)\n });\n }\n\n const inputChanged =\n JSON.stringify(stateInputMap) !==\n JSON.stringify(currentSnapshot._stateInputs || {});\n if (inputChanged) {\n nextState = cloneMachineSnapshot(nextState, {\n _stateInputs: stateInputMap\n });\n }\n };\n\n // Execute transition content\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n transitionActions\n );\n if (context && context !== currentSnapshot.context) {\n nextState = cloneMachineSnapshot(nextState, { context });\n }\n\n // Enter states\n enterStates();\n\n const nextStateNodes = [...mutStateNodeSet];\n\n if (nextState.status === 'done') {\n const allExitActions: AnyAction[] = [];\n const nextStateNodesToExit = nextStateNodes.sort(\n (a, b) => b.order - a.order\n );\n\n nextStateNodesToExit.forEach((stateNode) => {\n if (stateNode.exit) {\n const stateInput = nextState._stateInputs?.[stateNode.id];\n const [exitActions, , nextInternalEvents] = getStateActionsAndContext(\n stateNode.exit,\n nextState.context,\n nextState.children,\n stateInput\n );\n allExitActions.push(...exitActions);\n if (nextInternalEvents?.length) {\n internalQueue.push(...nextInternalEvents);\n }\n }\n });\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n allExitActions\n );\n }\n\n if (\n historyValue === currentSnapshot.historyValue &&\n currentSnapshot._nodes.length === mutStateNodeSet.size &&\n currentSnapshot._nodes.every((node) =>\n mutStateNodeSet.has(node as StateNode)\n )\n ) {\n // If context was changed (e.g. by entry actions during self-transition),\n // clone to ensure reference inequality for eventless transition re-evaluation\n if (nextState.context !== originalContext) {\n return [cloneMachineSnapshot(nextState), actions];\n }\n return [nextState, actions];\n }\n\n return [\n cloneMachineSnapshot(nextState, {\n _nodes: nextStateNodes,\n historyValue\n }),\n actions\n ];\n } finally {\n actorScope.actionExecutor = originalExecutor;\n }\n}\n\n/**\n * Gets the transition result for a given transition without executing the\n * transition.\n */\nexport function getTransitionResult(\n transition: Pick<AnyTransitionDefinition, 'target' | 'to' | 'source'> & {\n reenter?: AnyTransitionDefinition['reenter'];\n input?: AnyTransitionDefinition['input'];\n },\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): {\n targets: Readonly<AnyStateNode[]> | undefined;\n context: MachineContext | undefined;\n actions: AnyAction[] | undefined;\n reenter?: boolean;\n internalEvents: EventObject[] | undefined;\n input: Record<string, unknown> | undefined;\n} {\n if (transition.to) {\n const actions: AnyAction[] = [];\n const internalEvents: EventObject[] = [];\n const enqueue = createTransitionEnqueue(\n actorScope,\n actions,\n internalEvents\n );\n\n const res = transition.to(\n {\n context: snapshot.context,\n event,\n value: snapshot.value,\n children: snapshot.children,\n parent: actorScope.self._parent,\n self: actorScope.self,\n actions: snapshot.machine.implementations.actions,\n actors: snapshot.machine.implementations.actors,\n guards: snapshot.machine.implementations.guards,\n delays: snapshot.machine.implementations.delays\n },\n enqueue\n );\n\n const targets = res?.target\n ? resolveTarget(transition.source, toArray(res.target) as string[])\n : undefined;\n // Resolve input for .to transitions\n const resolvedInput =\n typeof transition.input === 'function'\n ? transition.input({ context: snapshot.context, event })\n : transition.input;\n\n return {\n targets: targets,\n context: res?.context,\n reenter: res?.reenter,\n actions,\n internalEvents,\n input: resolvedInput\n };\n }\n\n // Resolve input for regular transitions\n const resolvedInput =\n typeof transition.input === 'function'\n ? transition.input({ context: snapshot.context, event })\n : transition.input;\n\n return {\n targets: transition.target as AnyStateNode[] | undefined,\n context: undefined,\n reenter: transition.reenter,\n actions: undefined,\n internalEvents: undefined,\n input: resolvedInput\n };\n}\n\nexport function macrostep(\n snapshot: AnyMachineSnapshot,\n event: EventObject,\n actorScope: AnyActorScope,\n internalQueue: AnyEventObject[]\n): {\n snapshot: typeof snapshot;\n microsteps: Microstep[];\n} {\n let nextSnapshot = snapshot;\n const microsteps: Microstep[] = [];\n\n function addMicrostep(\n step: Microstep,\n transitions: AnyTransitionDefinition[]\n ) {\n // collect microsteps; surfaced on the enclosing '@xstate.transition' event\n // via its `microsteps[]` facet (there is no standalone microstep event)\n const collectedMicrosteps =\n ((actorScope.self as any)._collectedMicrosteps as any[]) || [];\n collectedMicrosteps.push(...transitions);\n (actorScope.self as any)._collectedMicrosteps = collectedMicrosteps;\n microsteps.push(step);\n }\n\n // Handle stop event\n if (event.type === XSTATE_STOP) {\n nextSnapshot = cloneMachineSnapshot(\n stopChildren(nextSnapshot, actorScope),\n {\n status: 'stopped'\n }\n );\n addMicrostep([nextSnapshot, []], []);\n return {\n snapshot: nextSnapshot,\n microsteps\n };\n }\n\n let nextEvent = event;\n\n // Assume the state is at rest (no raised events)\n // Determine the next state based on the next microstep\n if (nextEvent.type !== XSTATE_INIT) {\n const currentEvent = nextEvent;\n const isErr = isErrorActorEvent(currentEvent);\n\n const transitions = nextSnapshot.machine.getTransitionData(\n nextSnapshot as any,\n currentEvent,\n actorScope.self\n );\n\n if (isErr && !transitions.length) {\n // TODO: we should likely only allow transitions selected by very explicit descriptors\n // `*` shouldn't be matched, likely `xstate.error.*` shouldn't be either\n // similarly `xstate.error.actor.*` and `xstate.error.actor.todo.*` have to be considered too\n nextSnapshot = cloneMachineSnapshot<typeof snapshot>(snapshot, {\n status: 'error',\n error: currentEvent.error\n });\n addMicrostep([nextSnapshot, []], []);\n return {\n snapshot: nextSnapshot,\n microsteps\n };\n }\n const step = microstep(\n transitions,\n snapshot,\n actorScope,\n nextEvent,\n false, // isInitial\n internalQueue\n );\n nextSnapshot = step[0];\n addMicrostep(step, transitions);\n }\n\n let shouldSelectEventlessTransitions = true;\n const maxIterations = snapshot.machine.options?.maxIterations ?? Infinity;\n let iterationCount = 0;\n\n let microstepCount = 0;\n while (nextSnapshot.status === 'active') {\n microstepCount++;\n if (microstepCount > 1000) {\n throw new Error('Microstep count exceeded 1000');\n }\n iterationCount++;\n if (iterationCount > maxIterations) {\n throw new Error(\n isDevelopment\n ? `Infinite loop detected: the machine has processed more than ${maxIterations} microsteps without reaching a stable state. This usually happens when there's a cycle of transitions (e.g., eventless transitions or raised events causing state A -> B -> C -> A).`\n : `Infinite loop detected (>${maxIterations} microsteps)`\n );\n }\n\n let enabledTransitions: AnyTransitionDefinition[] =\n shouldSelectEventlessTransitions\n ? selectEventlessTransitions(nextSnapshot, nextEvent, actorScope)\n : [];\n\n // eventless transitions should always be selected after selecting *regular* transitions\n // by assigning `undefined` to `previousState` we ensure that `shouldSelectEventlessTransitions` gets always computed to true in such a case\n const previousState = enabledTransitions.length ? nextSnapshot : undefined;\n\n if (!enabledTransitions.length) {\n if (!internalQueue.length) {\n break;\n }\n nextEvent = internalQueue.shift()!;\n enabledTransitions = nextSnapshot.machine.getTransitionData(\n nextSnapshot as any,\n nextEvent,\n actorScope.self\n );\n }\n\n const step = microstep(\n enabledTransitions,\n nextSnapshot,\n actorScope,\n nextEvent,\n false,\n internalQueue\n );\n nextSnapshot = step[0];\n shouldSelectEventlessTransitions = nextSnapshot !== previousState;\n addMicrostep(step, enabledTransitions);\n }\n\n if (nextSnapshot.status !== 'active' && nextSnapshot.children) {\n stopChildren(nextSnapshot, actorScope);\n }\n\n return {\n snapshot: nextSnapshot,\n microsteps\n };\n}\n\n/**\n * Resolves a partial state value with its full representation in the state\n * node's machine.\n *\n * @param stateValue The partial state value to resolve.\n */\nexport function resolveStateValue(\n rootNode: AnyStateNode,\n stateValue: StateValue\n): StateValue {\n const allStateNodes = getAllStateNodes(getStateNodes(rootNode, stateValue));\n return getStateValue(rootNode, allStateNodes);\n}\n\nfunction createEnqueueObject(\n props: Partial<EnqueueObject<any, any>>,\n action: <T extends (...args: any[]) => any>(\n fn: T,\n ...args: Parameters<T>\n ) => void\n): EnqueueObject<any, any> {\n const enqueueFn = (\n fn: (...args: any[]) => any,\n ...args: Parameters<typeof fn>\n ) => {\n action(fn, ...args);\n };\n\n Object.assign(enqueueFn, {\n cancel: () => {},\n emit: () => {},\n log: () => {},\n raise: () => {},\n spawn: () => ({}) as any,\n sendTo: () => {},\n stop: () => {},\n listen: () => ({}) as any,\n subscribeTo: () => ({}) as any,\n ...props\n });\n\n return enqueueFn as any;\n}\n\nexport function hasEffect(\n transition: AnyTransitionDefinition,\n context: MachineContext,\n event: EventObject,\n snapshot: AnyMachineSnapshot,\n self: AnyActor\n): boolean {\n if (transition.to) {\n return transitionToHasEffect(\n transition.to,\n context,\n event,\n snapshot,\n self,\n snapshot.machine.implementations\n );\n }\n\n return false;\n}\n\nfunction transitionToHasEffect(\n transitionTo: NonNullable<AnyTransitionDefinition['to']>,\n context: MachineContext,\n event: EventObject,\n snapshot: AnyMachineSnapshot,\n self: AnyActor,\n implementations: AnyMachineSnapshot['machine']['implementations']\n) {\n let hasEffect = false;\n let res;\n\n try {\n const triggerEffect = () => {\n hasEffect = true;\n throw new Error('Effect triggered');\n };\n res = transitionTo(\n {\n context,\n event,\n self,\n value: snapshot.value,\n children: snapshot.children,\n parent: {\n send: triggerEffect\n } as any,\n actions: implementations.actions,\n actors: implementations.actors,\n guards: implementations.guards,\n delays: implementations.delays\n },\n createEnqueueObject(\n {\n emit: triggerEffect,\n cancel: triggerEffect,\n log: triggerEffect,\n raise: triggerEffect,\n spawn: triggerEffect,\n sendTo: triggerEffect,\n stop: triggerEffect\n },\n triggerEffect\n )\n );\n } catch (err) {\n if (hasEffect) {\n return true;\n }\n throw err;\n }\n\n return res !== undefined;\n}\n\nfunction stopChildren(\n snapshot: AnyMachineSnapshot,\n actorScope: AnyActorScope\n): AnyMachineSnapshot {\n let children: AnyActor[];\n if (\n !snapshot.children ||\n (children = Object.values(snapshot.children).filter(Boolean) as AnyActor[])\n .length === 0\n ) {\n return snapshot;\n }\n for (const child of children) {\n actorScope.stopChild(child);\n }\n return cloneMachineSnapshot(snapshot, {\n children: {}\n });\n}\n\nfunction selectEventlessTransitions(\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n) {\n const enabledTransitionSet: Set<AnyTransitionDefinition> = new Set();\n const atomicStates = snapshot._nodes.filter(isAtomicStateNode);\n\n for (const atomicStateNode of atomicStates) {\n loop: for (\n let stateNode: AnyStateNode | undefined = atomicStateNode;\n stateNode;\n stateNode = stateNode.parent\n ) {\n if (!stateNode.always) {\n continue;\n }\n for (const transition of stateNode.always) {\n if (\n evaluateCandidate(\n transition,\n event,\n snapshot,\n stateNode,\n actorScope.self\n )\n ) {\n enabledTransitionSet.add(transition);\n break loop;\n }\n }\n }\n }\n\n return removeConflictingTransitions(\n Array.from(enabledTransitionSet),\n new Set(snapshot._nodes),\n snapshot,\n event,\n actorScope\n );\n}\n\nexport function evaluateCandidate(\n candidate: AnyTransitionDefinition,\n event: EventObject,\n snapshot: AnyMachineSnapshot,\n stateNode: AnyStateNode,\n self: AnyActor\n): boolean {\n if (candidate.guard) {\n const guardArgs = {\n context: snapshot.context,\n event,\n self,\n parent: self._parent,\n children: snapshot.children,\n actions: stateNode.machine.implementations.actions,\n actors: stateNode.machine.implementations.actors,\n guards: stateNode.machine.implementations.guards,\n delays: stateNode.machine.implementations.delays,\n _snapshot: snapshot\n };\n const guardConfig = candidate.guard as any;\n const guardParams =\n typeof guardConfig?.params === 'function'\n ? guardConfig.params({ context: snapshot.context, event })\n : guardConfig?.params;\n\n let guardPassed = true;\n if (typeof guardConfig === 'function') {\n guardPassed = guardConfig(guardArgs, guardParams);\n } else if (typeof guardConfig?.type === 'string') {\n const guardImpl =\n stateNode.machine.implementations.guards[guardConfig.type];\n if (!guardImpl) {\n // A typo'd guard name must fail loudly — silently passing would\n // take the guarded transition and corrupt machine behavior.\n throw new Error(\n isDevelopment\n ? `Guard '${guardConfig.type}' is not implemented in machine '${stateNode.machine.id}'. Available guards: ${\n Object.keys(stateNode.machine.implementations.guards)\n .map((key) => `'${key}'`)\n .join(', ') || '(none)'\n }.`\n : `Guard '${guardConfig.type}' is not implemented in machine '${stateNode.machine.id}'.`\n );\n }\n guardPassed = guardImpl(guardArgs, guardParams);\n }\n\n if (!guardPassed) {\n return false;\n }\n }\n\n if (candidate.to) {\n return transitionToHasEffect(\n candidate.to,\n snapshot.context,\n event,\n snapshot,\n self,\n stateNode.machine.implementations\n );\n }\n\n return true;\n}\n","export function parseDurationToMilliseconds(\n duration: string\n): number | undefined {\n const normalizedDuration = duration.trim();\n\n const millisecondsMatch = normalizedDuration.match(/^(\\d+)ms$/i);\n if (millisecondsMatch) {\n return parseInt(millisecondsMatch[1], 10);\n }\n\n const secondsMatch = normalizedDuration.match(/^(\\d*)(\\.?)(\\d*)s$/i);\n if (secondsMatch) {\n const wholePart = secondsMatch[1] ? parseInt(secondsMatch[1], 10) : 0;\n const hasDecimal = !!secondsMatch[2];\n const fracPart = secondsMatch[3]\n ? parseInt(secondsMatch[3].padEnd(3, '0').slice(0, 3), 10)\n : 0;\n\n return wholePart * 1000 + (hasDecimal ? fracPart : 0);\n }\n\n const iso8601DurationMatch = normalizedDuration.match(\n /^P(?:(?<weeks>\\d+(?:[.,]\\d+)?)W)?(?:(?<days>\\d+(?:[.,]\\d+)?)D)?(?:T(?:(?<hours>\\d+(?:[.,]\\d+)?)H)?(?:(?<minutes>\\d+(?:[.,]\\d+)?)M)?(?:(?<seconds>\\d+(?:[.,]\\d+)?)S)?)?$/i\n );\n\n if (!iso8601DurationMatch?.groups) {\n return undefined;\n }\n\n const { weeks, days, hours, minutes, seconds } = iso8601DurationMatch.groups;\n if (!weeks && !days && !hours && !minutes && !seconds) {\n return undefined;\n }\n\n const toNumber = (value: string | undefined) =>\n value ? Number(value.replace(',', '.')) : 0;\n\n return (\n toNumber(weeks) * 7 * 24 * 60 * 60 * 1000 +\n toNumber(days) * 24 * 60 * 60 * 1000 +\n toNumber(hours) * 60 * 60 * 1000 +\n toNumber(minutes) * 60 * 1000 +\n toNumber(seconds) * 1000\n );\n}\n\nexport function parseDelayToMilliseconds(\n delay: string | number | undefined\n): number | undefined {\n if (delay === undefined) {\n return undefined;\n }\n\n if (typeof delay === 'number') {\n return delay;\n }\n\n return parseDurationToMilliseconds(delay);\n}\n","import isDevelopment from '#is-development';\nimport { isMachineSnapshot } from './State.ts';\nimport type { StateNode } from './StateNode.ts';\nimport { TARGETLESS_KEY, WILDCARD } from './constants.ts';\nimport { isStateId } from './stateUtils.ts';\nimport type {\n AnyActor,\n AnyEventObject,\n AnyMachineSnapshot,\n AnyStateMachine,\n AnyTransitionConfig,\n AnyTransitionConfigFunction,\n ErrorActorEvent,\n EventObject,\n InvokeConfig,\n MachineContext,\n Mapper,\n NonReducibleUnknown,\n Observer,\n SingleOrArray,\n StateLike,\n StateValue,\n TransitionConfigTarget\n} from './types.ts';\n\nexport function matchesState(\n parentStateId: StateValue,\n childStateId: StateValue\n): boolean {\n const parentStateValue = toStateValue(parentStateId);\n const childStateValue = toStateValue(childStateId);\n\n if (typeof childStateValue === 'string') {\n if (typeof parentStateValue === 'string') {\n return childStateValue === parentStateValue;\n }\n\n // Parent more specific than child\n return false;\n }\n\n if (typeof parentStateValue === 'string') {\n return parentStateValue in childStateValue;\n }\n\n return Object.keys(parentStateValue).every((key) => {\n if (!(key in childStateValue)) {\n return false;\n }\n\n return matchesState(parentStateValue[key]!, childStateValue[key]!);\n });\n}\n\nexport function checkStateIn(\n snapshot: AnyMachineSnapshot,\n stateValue: StateValue\n) {\n if (typeof stateValue === 'string' && isStateId(stateValue)) {\n const target = snapshot.machine.getStateNodeById(stateValue);\n return snapshot._nodes.some((sn) => sn === target);\n }\n\n return snapshot.matches(stateValue);\n}\n\nexport function toStatePath(stateId: string | string[]): string[] {\n if (isArray(stateId)) {\n return stateId;\n }\n\n const result: string[] = [];\n let segment = '';\n\n for (let i = 0; i < stateId.length; i++) {\n const char = stateId.charCodeAt(i);\n switch (char) {\n // \\\n case 92:\n // consume the next character\n segment += stateId[i + 1];\n // and skip over it\n i++;\n continue;\n // .\n case 46:\n result.push(segment);\n segment = '';\n continue;\n }\n segment += stateId[i];\n }\n\n result.push(segment);\n\n return result;\n}\n\nfunction toStateValue(stateValue: StateLike<any> | StateValue): StateValue {\n if (isMachineSnapshot(stateValue)) {\n return stateValue.value;\n }\n\n if (typeof stateValue !== 'string') {\n return stateValue as StateValue;\n }\n\n const statePath = toStatePath(stateValue);\n\n return pathToStateValue(statePath);\n}\n\nexport function pathToStateValue(statePath: string[]): StateValue {\n if (statePath.length === 1) {\n return statePath[0];\n }\n\n const value: StateValue = {};\n let marker = value;\n\n for (let i = 0; i < statePath.length - 1; i++) {\n if (i === statePath.length - 2) {\n marker[statePath[i]] = statePath[i + 1];\n } else {\n const previous = marker;\n marker = {};\n previous[statePath[i]] = marker;\n }\n }\n\n return value;\n}\n\nexport function mapValues<P, O extends Record<string, unknown>>(\n collection: O,\n iteratee: (item: O[keyof O], key: keyof O, collection: O, i: number) => P\n): { [key in keyof O]: P };\nexport function mapValues(\n collection: Record<string, unknown>,\n iteratee: (\n item: unknown,\n key: string,\n collection: Record<string, unknown>,\n i: number\n ) => unknown\n) {\n const result: Record<string, unknown> = {};\n\n const collectionKeys = Object.keys(collection);\n for (let i = 0; i < collectionKeys.length; i++) {\n const key = collectionKeys[i];\n result[key] = iteratee(collection[key], key, collection, i);\n }\n\n return result;\n}\n\nfunction toArrayStrict<T>(value: readonly T[] | T): readonly T[] {\n if (isArray(value)) {\n return value;\n }\n return [value];\n}\n\nexport function toArray<T>(value: readonly T[] | T | undefined): readonly T[] {\n if (value === undefined) {\n return [];\n }\n return toArrayStrict(value);\n}\n\nexport function resolveOutput<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject\n>(\n mapper:\n | Mapper<TContext, TExpressionEvent, unknown, EventObject>\n | NonReducibleUnknown,\n context: TContext,\n event: TExpressionEvent,\n self: AnyActor\n): unknown {\n if (typeof mapper === 'function') {\n return mapper({ context, event, self });\n }\n\n if (\n isDevelopment &&\n !!mapper &&\n typeof mapper === 'object' &&\n Object.values(mapper).some((val) => typeof val === 'function')\n ) {\n console.warn(\n `Dynamically mapping values to individual properties is deprecated. Use a single function that returns the mapped object instead.\\nFound object containing properties whose values are possibly mapping functions: ${Object.entries(\n mapper\n )\n .filter(([, value]) => typeof value === 'function')\n .map(\n ([key, value]) =>\n `\\n - ${key}: ${(value as () => any)\n .toString()\n .replace(/\\n\\s*/g, '')}`\n )\n .join('')}`\n );\n }\n\n return mapper;\n}\n\nfunction isArray(value: any): value is readonly any[] {\n return Array.isArray(value);\n}\n\nexport function isErrorActorEvent(\n event: AnyEventObject\n): event is ErrorActorEvent {\n return event.type.startsWith('xstate.error.actor');\n}\n\nexport function toTransitionConfigArray(\n configLike: SingleOrArray<\n AnyTransitionConfig | TransitionConfigTarget | AnyTransitionConfigFunction\n >\n): Array<AnyTransitionConfig> {\n return toArrayStrict(configLike).map((transitionLike) => {\n if (\n typeof transitionLike === 'undefined' ||\n typeof transitionLike === 'string'\n ) {\n return { target: transitionLike };\n }\n\n if (typeof transitionLike === 'function') {\n return { to: transitionLike };\n }\n\n return transitionLike;\n });\n}\n\nexport function normalizeTarget<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n target: SingleOrArray<string | StateNode<TContext, TEvent>> | undefined\n): ReadonlyArray<string | StateNode<TContext, TEvent>> | undefined {\n if (target === undefined || target === TARGETLESS_KEY) {\n return undefined;\n }\n return toArray(target);\n}\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void\n): Observer<T> {\n const isObserver = typeof nextHandler === 'object';\n const self = isObserver ? nextHandler : undefined;\n\n return {\n next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(\n self\n )\n };\n}\n\nexport function createInvokeId(stateNodeId: string, index: number): string {\n return `${index}.${stateNodeId}`;\n}\n\nexport function resolveReferencedActor(machine: AnyStateMachine, src: string) {\n const match = src.match(/^xstate\\.invoke\\.(\\d+)\\.(.*)/)!;\n if (!match) {\n return machine.implementations.actors[src];\n }\n const [, indexStr, nodeId] = match;\n const node = machine.getStateNodeById(nodeId);\n const invokeConfig = node.config.invoke!;\n const configSrc = (\n Array.isArray(invokeConfig)\n ? invokeConfig[indexStr as any]\n : (invokeConfig as InvokeConfig<\n any,\n any,\n any,\n any,\n any,\n any,\n any, // TEmitted\n any // TMeta\n >)\n ).src;\n // A referenced actor may itself be registered by name.\n return typeof configSrc === 'string'\n ? machine.implementations.actors[configSrc]\n : configSrc;\n}\n\nexport function getAllOwnEventDescriptors(snapshot: AnyMachineSnapshot) {\n return [...new Set([...snapshot._nodes.flatMap((sn) => sn.ownEvents)])];\n}\n\n/**\n * Checks if an event type matches an event descriptor, supporting wildcards.\n * Event descriptors can be:\n *\n * - Exact matches: \"event.type\"\n * - Wildcard: \"*\"\n * - Partial matches: \"event.*\"\n *\n * @param eventType - The actual event type string\n * @param descriptor - The event descriptor to match against\n * @returns True if the event type matches the descriptor\n */\nexport function matchesEventDescriptor(\n eventType: string,\n descriptor: string\n): boolean {\n if (descriptor === eventType) {\n return true;\n }\n\n if (descriptor === WILDCARD) {\n return true;\n }\n\n if (!descriptor.endsWith('.*')) {\n return false;\n }\n\n if (isDevelopment && /.*\\*.+/.test(descriptor)) {\n console.warn(\n `Wildcards can only be the last token of an event descriptor (e.g., \"event.*\") or the entire event descriptor (\"*\"). Check the \"${descriptor}\" event.`\n );\n }\n\n const partialEventTokens = descriptor.split('.');\n const eventTokens = eventType.split('.');\n\n for (\n let tokenIndex = 0;\n tokenIndex < partialEventTokens.length;\n tokenIndex++\n ) {\n const partialEventToken = partialEventTokens[tokenIndex];\n const eventToken = eventTokens[tokenIndex];\n\n if (partialEventToken === '*') {\n const isLastToken = tokenIndex === partialEventTokens.length - 1;\n\n if (isDevelopment && !isLastToken) {\n console.warn(\n `Infix wildcards in transition events are not allowed. Check the \"${descriptor}\" transition.`\n );\n }\n\n return isLastToken;\n }\n\n if (partialEventToken !== eventToken) {\n return false;\n }\n }\n\n return true;\n}\n","import isDevelopment from '#is-development';\nimport { $$ACTOR_TYPE } from './createActor.ts';\nimport { getStateValue, getTransitionResult, hasEffect } from './stateUtils.ts';\nimport type {\n AnyActorScope,\n AnyActor,\n AnyMachineSnapshot,\n AnyStateMachine,\n EventObject,\n HistoryValue,\n MachineContext,\n StateConfig,\n StateValue,\n AnyActorRef,\n Snapshot,\n MetaObject,\n StateSchema,\n StateId,\n StateIdInputs,\n StateContextFromStateValue,\n SnapshotStatus,\n PersistedHistoryValue,\n AnyStateNode\n} from './types.ts';\nimport { matchesState } from './utils.ts';\nimport { createEmptyActor } from './actors/index.ts';\n\nexport function isMachineSnapshot(value: unknown): value is AnyMachineSnapshot {\n return (\n !!value &&\n typeof value === 'object' &&\n 'machine' in value &&\n 'value' in value\n );\n}\n\nlet emptyCanActor: AnyActor | undefined;\nlet emptyCanActorScope: AnyActorScope | undefined;\n\nfunction getEmptyCanActor() {\n return (emptyCanActor ??= createEmptyActor());\n}\n\nfunction getEmptyCanActorScope(): AnyActorScope {\n if (emptyCanActorScope) {\n return emptyCanActorScope;\n }\n\n const actor = getEmptyCanActor();\n emptyCanActorScope = {\n self: actor,\n logger: () => {},\n id: '',\n sessionId: '',\n defer: () => {},\n system: actor.system,\n stopChild: () => {},\n emit: () => {},\n actionExecutor: () => {}\n };\n return emptyCanActorScope;\n}\n\ninterface MachineSnapshotBase<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n _TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema = StateSchema\n> {\n /** The state machine that produced this state snapshot. */\n machine: AnyStateMachine;\n /** The tags of the active state nodes that represent the current state value. */\n tags: Set<string>;\n /**\n * The current state value.\n *\n * This represents the active state nodes in the state machine.\n *\n * - For atomic state nodes, it is a string.\n * - For compound parent state nodes, it is an object where:\n *\n * - The key is the parent state node's key\n * - The value is the current state value of the active child state node(s)\n *\n * @example\n *\n * ```ts\n * // single-level state node\n * snapshot.value; // => 'yellow'\n *\n * // nested state nodes\n * snapshot.value; // => { red: 'wait' }\n * ```\n */\n value: TStateValue;\n /** The current status of this snapshot. */\n status: SnapshotStatus;\n error: unknown;\n context: TContext;\n\n historyValue: Readonly<HistoryValue>;\n /** The enabled state nodes representative of the state value. */\n _nodes: Array<AnyStateNode>;\n /** An object mapping actor names to spawned/invoked actors. */\n children: TChildren;\n /** @internal */\n _stateInputs: Record<string, Record<string, unknown>>;\n\n /**\n * Whether the current state value is a subset of the given partial state\n * value.\n *\n * @param partialStateValue\n */\n matches<const TTestStateValue extends StateValue>(\n partialStateValue: TTestStateValue\n ): this is MachineSnapshot<\n StateContextFromStateValue<TStateSchema, TContext, TTestStateValue>,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n _TOutput,\n TMeta,\n TStateSchema\n >;\n\n /**\n * Whether the current state nodes has a state node with the specified `tag`.\n *\n * @param tag\n */\n hasTag: (tag: TTag) => boolean;\n\n /**\n * Determines whether sending the `event` will cause a non-forbidden\n * transition to be selected, even if the transitions have no actions nor\n * change the state value.\n *\n * @param event The event to test\n * @returns Whether the event will cause a transition\n */\n can: (event: TEvent) => boolean;\n\n getMeta: () => Record<\n StateId<TStateSchema> & string,\n TMeta | undefined // States might not have meta defined\n >;\n\n /**\n * Returns the inputs for the current active state nodes, keyed by state node\n * id.\n */\n getInputs: () => StateIdInputs<TStateSchema>;\n\n toJSON: () => unknown;\n}\n\ninterface ActiveMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'active';\n output: undefined;\n error: undefined;\n}\n\ninterface DoneMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'done';\n output: TOutput;\n error: undefined;\n}\n\ninterface ErrorMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'error';\n output: undefined;\n error: unknown;\n}\n\ninterface StoppedMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'stopped';\n output: undefined;\n error: undefined;\n}\n\nexport type MachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> =\n | ActiveMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >\n | DoneMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >\n | ErrorMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >\n | StoppedMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >;\n\nconst machineSnapshotMatches = function matches(\n this: AnyMachineSnapshot,\n testValue: StateValue\n) {\n return matchesState(testValue, this.value);\n};\n\nconst machineSnapshotHasTag = function hasTag(\n this: AnyMachineSnapshot,\n tag: string\n) {\n return this.tags.has(tag);\n};\n\nconst machineSnapshotCan = function can(\n this: AnyMachineSnapshot,\n event: EventObject\n) {\n if (isDevelopment && !this.machine) {\n console.warn(\n `state.can(...) used outside of a machine-created State object; this will always return false.`\n );\n }\n\n const emptyActor = getEmptyCanActor();\n const emptyActorScope = getEmptyCanActorScope();\n const transitionData = this.machine.getTransitionData(\n this,\n event,\n emptyActor\n );\n\n if (!transitionData?.length) {\n return false;\n }\n\n // Check that at least one transition is not forbidden\n for (const transition of transitionData) {\n if (transition.target !== undefined) {\n return true;\n }\n\n const res = getTransitionResult(transition, this, event, emptyActorScope);\n if (\n res.targets?.length ||\n res.context ||\n hasEffect(transition, this.context, event, this, emptyActor)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst machineSnapshotToJSON = function toJSON(this: AnyMachineSnapshot) {\n const {\n _nodes: nodes,\n _stateInputs,\n tags,\n machine,\n getMeta,\n getInputs,\n toJSON,\n can,\n hasTag,\n matches,\n ...jsonValues\n } = this;\n return { ...jsonValues, tags: Array.from(tags) };\n};\n\nconst machineSnapshotGetMeta = function getMeta(this: AnyMachineSnapshot) {\n const meta: Record<string, any> = {};\n for (const stateNode of this._nodes) {\n if (stateNode.meta !== undefined) {\n meta[stateNode.id] = stateNode.meta;\n }\n }\n return meta;\n};\n\nconst machineSnapshotGetInputs = function getInputs(this: AnyMachineSnapshot) {\n return this._stateInputs as any;\n};\n\nfunction collectTags(stateNodes: Array<AnyStateNode>): Set<string> {\n const tags = new Set<string>();\n for (const stateNode of stateNodes) {\n for (const tag of stateNode.tags) {\n tags.add(tag);\n }\n }\n return tags;\n}\n\nexport function createMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n>(\n config: StateConfig<TContext, TEvent>,\n machine: AnyStateMachine\n): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n undefined,\n TMeta,\n TStateSchema\n> {\n return {\n status: config.status as never,\n output: config.output,\n error: config.error,\n machine,\n context: config.context,\n _nodes: config._nodes,\n value: (config.value ??\n getStateValue(machine.root, config._nodes)) as never,\n tags: collectTags(config._nodes),\n children: config.children as any,\n historyValue: config.historyValue || {},\n _stateInputs: config._stateInputs || {},\n matches: machineSnapshotMatches as never,\n hasTag: machineSnapshotHasTag,\n can: machineSnapshotCan,\n getMeta: machineSnapshotGetMeta,\n getInputs: machineSnapshotGetInputs,\n toJSON: machineSnapshotToJSON\n };\n}\n\nexport function cloneMachineSnapshot<TState extends AnyMachineSnapshot>(\n snapshot: TState,\n config: Partial<StateConfig<any, any>> = {}\n): TState {\n const configWithSnapshot = {\n ...snapshot,\n ...config\n } as StateConfig<any, any>;\n\n if ((config._nodes ?? snapshot._nodes) === snapshot._nodes) {\n return {\n status: configWithSnapshot.status as never,\n output: configWithSnapshot.output,\n error: configWithSnapshot.error,\n machine: snapshot.machine,\n context: configWithSnapshot.context,\n _nodes: snapshot._nodes,\n value: snapshot.value,\n tags: snapshot.tags,\n children: configWithSnapshot.children as any,\n historyValue: configWithSnapshot.historyValue || {},\n _stateInputs: configWithSnapshot._stateInputs || {},\n matches: machineSnapshotMatches as never,\n hasTag: machineSnapshotHasTag,\n can: machineSnapshotCan,\n getMeta: machineSnapshotGetMeta,\n getInputs: machineSnapshotGetInputs,\n toJSON: machineSnapshotToJSON\n } as unknown as TState;\n }\n\n return createMachineSnapshot(\n {\n ...configWithSnapshot,\n value: undefined\n },\n snapshot.machine\n ) as TState;\n}\n\nfunction serializeHistoryValue(\n historyValue: HistoryValue\n): PersistedHistoryValue {\n const result: PersistedHistoryValue = {};\n\n for (const key in historyValue) {\n const value = historyValue[key];\n if (Array.isArray(value)) {\n result[key] = value.map((item) => ({ id: item.id }));\n }\n }\n\n return result;\n}\n\nexport function getPersistedSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject\n>(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n any // state schema\n >,\n options?: unknown\n): Snapshot<unknown> {\n const {\n _nodes: nodes,\n _stateInputs,\n tags,\n machine,\n children,\n context,\n can,\n hasTag,\n matches,\n getMeta,\n getInputs,\n toJSON,\n ...jsonValues\n } = snapshot;\n\n const childrenJson: Record<string, unknown> = {};\n\n for (const id in children) {\n const child = children[id] as any;\n if (\n isDevelopment &&\n typeof child.src !== 'string' &&\n (!options || !('__unsafeAllowInlineActors' in (options as object)))\n ) {\n throw new Error('An inline child actor cannot be persisted.');\n }\n childrenJson[id as keyof typeof childrenJson] = {\n snapshot: child.getPersistedSnapshot(options),\n src: child.src,\n systemId: child.systemId,\n syncSnapshot: child._syncSnapshot\n };\n }\n\n const persisted: Record<string, unknown> = {\n ...jsonValues,\n context: persistContext(context) as any,\n children: childrenJson,\n historyValue: serializeHistoryValue(jsonValues.historyValue)\n };\n\n if (machine.version !== undefined) {\n persisted.version = machine.version;\n }\n\n return persisted as Snapshot<unknown>;\n}\n\nfunction persistContext(contextPart: Record<string, unknown>) {\n let copy: typeof contextPart | undefined;\n for (const key in contextPart) {\n const value = contextPart[key];\n if (value && typeof value === 'object') {\n if ('sessionId' in value && 'send' in value && 'ref' in value) {\n copy ??= Array.isArray(contextPart)\n ? (contextPart.slice() as typeof contextPart)\n : { ...contextPart };\n copy[key] = {\n xstate$$type: $$ACTOR_TYPE,\n id: (value as any as AnyActor).id\n };\n } else {\n const result = persistContext(value as typeof contextPart);\n if (result !== value) {\n copy ??= Array.isArray(contextPart)\n ? (contextPart.slice() as typeof contextPart)\n : { ...contextPart };\n copy[key] = result;\n }\n }\n }\n }\n return copy ?? contextPart;\n}\n","import { InspectionEvent } from './inspection.ts';\nimport {\n AnyEventObject,\n ActorSystemInfo,\n AnyActor,\n Observer,\n HomomorphicOmit,\n EventObject,\n Subscription,\n TimersRestoreStrategy\n} from './types.ts';\nimport { toObserver } from './utils.ts';\n\ninterface ScheduledEvent {\n id: string;\n event: EventObject;\n startedAt: number; // timestamp\n delay: number;\n source: AnyActor;\n target: AnyActor;\n}\n\nexport interface Clock {\n setTimeout(fn: (...args: any[]) => void, timeout: number): any;\n clearTimeout(id: any): void;\n}\n\ninterface Scheduler {\n schedule(\n source: AnyActor,\n target: AnyActor,\n event: EventObject,\n delay: number,\n id: string | undefined\n ): void;\n cancel(source: AnyActor, id: string): void;\n cancelAll(actor: AnyActor): void;\n}\n\ntype ScheduledEventId = string & { __scheduledEventId: never };\n\nfunction createScheduledEventId(actor: AnyActor, id: string): ScheduledEventId {\n return `${actor.sessionId}.${id}` as ScheduledEventId;\n}\n\nexport interface ActorSystem<T extends ActorSystemInfo> {\n /** @internal */\n children: Map<string, AnyActor>;\n /** @internal */\n reverseKeyedActors: WeakMap<AnyActor, keyof T['actors']>;\n /** @internal */\n keyedActors: Map<keyof T['actors'], AnyActor | undefined>;\n /** @internal */\n _bookId: () => string;\n /** @internal */\n _register: (sessionId: string, actor: AnyActor) => string;\n /** @internal */\n _unregister: (actor: AnyActor) => void;\n /** @internal */\n _set: <K extends keyof T['actors']>(key: K, actor: AnyActor) => void;\n get: <K extends keyof T['actors']>(key: K) => T['actors'][K] | undefined;\n getAll: () => Partial<T['actors']>;\n\n inspect: (\n observer:\n | Observer<InspectionEvent>\n | ((inspectionEvent: InspectionEvent) => void)\n ) => Subscription;\n /** @internal */\n _sendInspectionEvent: (\n event: HomomorphicOmit<InspectionEvent, 'rootId'>\n ) => void;\n /** @internal */\n _relay: (\n source: AnyActor | undefined,\n target: AnyActor,\n event: AnyEventObject\n ) => void;\n scheduler: Scheduler;\n getSnapshot: () => {\n _scheduledEvents: Record<string, ScheduledEvent>;\n };\n /** @internal */\n _snapshot: {\n _scheduledEvents: Record<ScheduledEventId, ScheduledEvent>;\n };\n start: () => void;\n _clock: Clock;\n _logger: (...args: any[]) => void;\n /**\n * How rehydrated actors in this system restore persisted timers.\n *\n * @internal\n */\n _timerStrategy?: TimersRestoreStrategy;\n}\n\nexport type AnyActorSystem = ActorSystem<any>;\n\nexport function createSystem<T extends ActorSystemInfo>(\n rootActor: AnyActor,\n options: {\n clock: Clock;\n logger: (...args: any[]) => void;\n snapshot?: unknown;\n timers?: TimersRestoreStrategy;\n }\n): ActorSystem<T> {\n let idCounter = 0;\n const children = new Map<string, AnyActor>();\n const keyedActors = new Map<keyof T['actors'], AnyActor | undefined>();\n const reverseKeyedActors = new WeakMap<AnyActor, keyof T['actors']>();\n const inspectionObservers = new Set<Observer<InspectionEvent>>();\n const timerMap: { [id: ScheduledEventId]: number } = {};\n const { clock, logger } = options;\n\n // Records a send on the *sender's* transition for the `sent[]` inspection\n // facet. Captures the send when it is initiated (including delayed sends that\n // may never deliver), keyed to the source actor's in-flight transition.\n const recordSent = (\n source: AnyActor | undefined,\n target: AnyActor,\n event: AnyEventObject,\n delay?: number,\n id?: string\n ) => {\n if (!inspectionObservers.size || !source) {\n return;\n }\n const collected = ((source as any)._collectedSent ??= []);\n collected.push({\n targetRef: target,\n targetId: target.id,\n event,\n delay,\n id\n });\n };\n\n const scheduler: Scheduler = {\n schedule: (\n source,\n target,\n event,\n delay,\n id = Math.random().toString(36).slice(2)\n ) => {\n recordSent(source, target, event, delay, id);\n const scheduledEvent: ScheduledEvent = {\n source,\n target,\n event,\n delay,\n id,\n startedAt: Date.now()\n };\n const scheduledEventId = createScheduledEventId(source, id);\n system._snapshot._scheduledEvents[scheduledEventId] = scheduledEvent;\n\n const timeout = clock.setTimeout(() => {\n delete timerMap[scheduledEventId];\n delete system._snapshot._scheduledEvents[scheduledEventId];\n\n // The send was already recorded at schedule time on the sender's\n // transition, so deliver without re-recording.\n deliver(source, target, event);\n }, delay);\n\n timerMap[scheduledEventId] = timeout;\n },\n cancel: (source, id: string) => {\n const scheduledEventId = createScheduledEventId(source, id);\n const timeout = timerMap[scheduledEventId];\n\n delete timerMap[scheduledEventId];\n delete system._snapshot._scheduledEvents[scheduledEventId];\n\n if (timeout !== undefined) {\n clock.clearTimeout(timeout);\n }\n },\n cancelAll: (actor) => {\n for (const scheduledEventId in system._snapshot._scheduledEvents) {\n const scheduledEvent =\n system._snapshot._scheduledEvents[\n scheduledEventId as ScheduledEventId\n ];\n if (scheduledEvent.source === actor) {\n scheduler.cancel(actor, scheduledEvent.id);\n }\n }\n }\n };\n // Delivers an event to the target actor. Used by both `_relay` (which also\n // records the send) and the scheduler's timer (which already recorded it).\n const deliver = (\n source: AnyActor | undefined,\n target: AnyActor,\n event: AnyEventObject\n ) => {\n const targetMachine = (target as any).logic;\n const isInternalEvent =\n typeof targetMachine?.isInternalEventType === 'function' &&\n targetMachine.isInternalEventType(event.type);\n\n if (isInternalEvent && source !== target) {\n throw new Error(\n `Internal event \"${event.type}\" cannot be sent to actor \"${target.id}\" from outside.`\n );\n }\n\n // remember the last source for unified transition inspect event\n (target as any)._lastSourceRef = source;\n target._send(event);\n };\n\n const sendInspectionEvent = (event: InspectionEvent) => {\n if (!inspectionObservers.size) {\n return;\n }\n const resolvedInspectionEvent: InspectionEvent = {\n ...event,\n rootId: rootActor.sessionId!\n };\n inspectionObservers.forEach((observer) =>\n observer.next?.(resolvedInspectionEvent)\n );\n };\n\n const system: ActorSystem<T> = {\n children,\n reverseKeyedActors,\n keyedActors,\n _snapshot: {\n _scheduledEvents:\n (options?.snapshot && (options.snapshot as any).scheduler) ?? {}\n },\n _bookId: () => `x:${idCounter++}`,\n _register: (sessionId, actor) => {\n children.set(sessionId, actor);\n return sessionId;\n },\n _unregister: (actor) => {\n children.delete(actor.sessionId!);\n const systemId = reverseKeyedActors.get(actor);\n\n if (systemId !== undefined) {\n keyedActors.delete(systemId);\n reverseKeyedActors.delete(actor);\n }\n },\n get: (systemId) => {\n return keyedActors.get(systemId) as T['actors'][any] | undefined;\n },\n getAll: () => {\n return Object.fromEntries(keyedActors.entries()) as Partial<T['actors']>;\n },\n _set: (systemId, actor) => {\n const existing = keyedActors.get(systemId);\n if (existing && existing !== actor) {\n throw new Error(\n `Actor with system ID '${systemId as string}' already exists.`\n );\n }\n\n keyedActors.set(systemId, actor);\n reverseKeyedActors.set(actor, systemId);\n },\n inspect: (observerOrFn) => {\n const observer = toObserver(observerOrFn);\n inspectionObservers.add(observer);\n\n return {\n unsubscribe() {\n inspectionObservers.delete(observer);\n }\n };\n },\n _sendInspectionEvent: sendInspectionEvent as any,\n _relay: (source, target, event) => {\n recordSent(source, target, event);\n deliver(source, target, event);\n },\n scheduler,\n getSnapshot: () => {\n return {\n _scheduledEvents: { ...system._snapshot._scheduledEvents }\n };\n },\n start: () => {\n const scheduledEvents = system._snapshot._scheduledEvents;\n system._snapshot._scheduledEvents = {};\n for (const scheduledId in scheduledEvents) {\n const { source, target, event, delay, id } =\n scheduledEvents[scheduledId as ScheduledEventId];\n scheduler.schedule(source, target, event, delay, id);\n }\n },\n _clock: clock,\n _logger: logger,\n _timerStrategy: options.timers\n };\n\n return system;\n}\n","import { XSTATE_STOP } from '../constants.ts';\nimport { createInitEvent } from '../eventUtils.ts';\nimport { StandardSchemaV1 } from '../schema.types.ts';\nimport { AnyActorSystem } from '../system.ts';\nimport {\n ActorLogic,\n ActorRefFromLogic,\n ActorScope,\n AnyActorRef,\n EventObject,\n NonReducibleUnknown,\n Snapshot\n} from '../types.ts';\n\nexport type LogicSnapshot<TContext, TOutput, TInput> = Snapshot<TOutput> & {\n context: TContext;\n input: TInput | undefined;\n effects?: Record<string, LogicEffectState>;\n};\n\nexport type LogicEffectState =\n | { status: 'active' }\n | { status: 'done'; output?: unknown }\n | { status: 'error'; error: unknown };\n\nexport interface LogicArgs<TContext, TEvent extends EventObject, TInput> {\n context: TContext;\n event: TEvent;\n input: TInput;\n system: AnyActorSystem;\n self: LogicActorRef<TContext, unknown, TEvent, TInput>;\n}\n\nexport type LogicEffect<\n TEvent extends EventObject,\n TEmitted extends EventObject\n> =\n | { type: 'emit'; event: TEmitted }\n | { type: 'sendBack'; event: EventObject }\n | { type: 'raise'; event: TEvent }\n | { type: 'effect'; key?: string; exec: () => void | (() => void) }\n | { type: 'cleanupEffects' };\n\nexport interface LogicEnqueue<\n TEvent extends EventObject,\n TEmitted extends EventObject\n> {\n emit: (emitted: TEmitted) => void;\n sendBack: (event: EventObject) => void;\n raise: (event: TEvent) => void;\n effect: {\n (exec: () => void | (() => void)): void;\n (key: string, exec: () => void | (() => void)): void;\n };\n}\n\nexport type LogicPatch<TContext, TOutput, TInput> = Partial<{\n context: TContext;\n input: TInput | undefined;\n status: LogicSnapshot<TContext, TOutput, TInput>['status'];\n output: TOutput;\n error: unknown;\n effects: Record<string, LogicEffectState>;\n}>;\n\nexport type LogicFunction<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput,\n TEmitted extends EventObject\n> = (\n args: LogicArgs<TContext, TEvent, TInput>,\n enq: LogicEnqueue<TEvent, TEmitted>\n) => void | LogicPatch<TContext, TOutput, TInput>;\n\nexport interface LogicConfig<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput,\n TEmitted extends EventObject,\n TInputSchema extends StandardSchemaV1 = StandardSchemaV1,\n TOutputSchema extends StandardSchemaV1 = StandardSchemaV1\n> {\n id?: string;\n schemas?: {\n input?: TInputSchema;\n output?: TOutputSchema;\n };\n context: TContext | ((args: { input: TInput }) => TContext);\n run: LogicFunction<TContext, TOutput, TEvent, TInput, TEmitted>;\n}\n\ninterface LogicTransition<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput,\n TEmitted extends EventObject\n> {\n (\n snapshot: LogicSnapshot<TContext, TOutput, TInput>,\n event: TEvent,\n actorScope: ActorScope<\n LogicSnapshot<TContext, TOutput, TInput>,\n TEvent,\n AnyActorSystem,\n TEmitted\n >\n ): [\n LogicSnapshot<TContext, TOutput, TInput>,\n LogicEffect<TEvent, TEmitted>[]\n ];\n (\n snapshot: LogicSnapshot<TContext, TOutput, TInput>,\n event: TEvent,\n actorScope: ActorScope<\n LogicSnapshot<TContext, TOutput, TInput>,\n TEvent,\n AnyActorSystem,\n TEmitted\n >\n ): LogicSnapshot<TContext, TOutput, TInput>;\n}\n\nexport type LogicActorLogic<\n TContext,\n TOutput,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n> = Omit<\n ActorLogic<\n LogicSnapshot<TContext, TOutput, TInput>,\n TEvent,\n TInput,\n AnyActorSystem,\n TEmitted\n >,\n 'transition'\n> & {\n id?: string;\n transition: LogicTransition<TContext, TOutput, TEvent, TInput, TEmitted>;\n};\n\nexport type LogicActorRef<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput\n> = ActorRefFromLogic<LogicActorLogic<TContext, TOutput, TEvent, TInput>>;\n\nconst effectStates = new WeakMap<\n AnyActorRef,\n Map<PropertyKey, { cleanup?: () => void }>\n>();\n\nexport const XSTATE_LOGIC_EFFECT_RESOLVE = 'xstate.logic.effect.resolve';\nexport const XSTATE_LOGIC_EFFECT_REJECT = 'xstate.logic.effect.reject';\nexport const XSTATE_LOGIC_EFFECT_START = 'xstate.logic.effect.start';\n\nfunction getEffectState(self: AnyActorRef) {\n let state = effectStates.get(self);\n if (!state) {\n state = new Map();\n effectStates.set(self, state);\n }\n return state;\n}\n\nexport function executeLogicEffects(\n effects: readonly unknown[] | undefined,\n actorScope: ActorScope<any, any, any, any>\n) {\n if (!effects?.length) {\n return;\n }\n\n for (const effect of effects as LogicEffect<EventObject, EventObject>[]) {\n switch (effect.type) {\n case 'emit':\n actorScope.emit(effect.event);\n break;\n case 'sendBack': {\n const parent = (actorScope.self as any)._parent;\n if (parent) {\n actorScope.system._relay(actorScope.self, parent, effect.event);\n }\n break;\n }\n case 'raise':\n actorScope.system._relay(\n actorScope.self,\n actorScope.self,\n effect.event\n );\n break;\n case 'effect': {\n if (!effect.key) {\n const cleanup = effect.exec();\n if (typeof cleanup === 'function') {\n getEffectState(actorScope.self).set(Symbol(), { cleanup });\n }\n break;\n }\n\n const state = getEffectState(actorScope.self);\n if (state.has(effect.key)) {\n break;\n }\n const cleanup = effect.exec();\n state.set(effect.key, {\n cleanup: typeof cleanup === 'function' ? cleanup : undefined\n });\n break;\n }\n case 'cleanupEffects': {\n const state = effectStates.get(actorScope.self);\n if (!state) {\n break;\n }\n for (const { cleanup } of state.values()) {\n cleanup?.();\n }\n effectStates.delete(actorScope.self);\n break;\n }\n }\n }\n}\n\nfunction resolveContext<TContext, TInput>(\n context: TContext | ((args: { input: TInput }) => TContext),\n input: TInput\n) {\n return typeof context === 'function'\n ? (context as (args: { input: TInput }) => TContext)({ input })\n : context;\n}\n\nexport function createLogic<\n TContext,\n const TInputSchema extends StandardSchemaV1,\n const TOutputSchema extends StandardSchemaV1,\n TEvent extends EventObject = EventObject,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted,\n TInputSchema,\n TOutputSchema\n > & {\n schemas: {\n input: TInputSchema;\n output: TOutputSchema;\n };\n }\n): LogicActorLogic<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted\n>;\nexport function createLogic<\n TContext,\n TOutput,\n const TInputSchema extends StandardSchemaV1,\n TEvent extends EventObject = EventObject,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<\n TContext,\n TOutput,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted,\n TInputSchema\n > & {\n schemas: {\n input: TInputSchema;\n output?: undefined;\n };\n }\n): LogicActorLogic<\n TContext,\n TOutput,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted\n>;\nexport function createLogic<\n TContext,\n const TOutputSchema extends StandardSchemaV1,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n TInput,\n TEmitted,\n StandardSchemaV1,\n TOutputSchema\n > & {\n schemas: {\n input?: undefined;\n output: TOutputSchema;\n };\n }\n): LogicActorLogic<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n TInput,\n TEmitted\n>;\nexport function createLogic<\n TContext,\n TOutput = unknown,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<TContext, TOutput, TEvent, TInput, TEmitted>\n): LogicActorLogic<TContext, TOutput, TEvent, TInput, TEmitted>;\nexport function createLogic<\n TContext,\n TOutput = unknown,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<TContext, TOutput, TEvent, TInput, TEmitted>\n): LogicActorLogic<TContext, TOutput, TEvent, TInput, TEmitted> {\n const transition = ((snapshot, event, actorScope) => {\n if (snapshot.status !== 'active') {\n return [snapshot, []];\n }\n\n if (event.type === XSTATE_STOP) {\n return [\n {\n ...snapshot,\n status: 'stopped',\n input: undefined\n },\n [{ type: 'cleanupEffects' }]\n ];\n }\n\n if (event.type === XSTATE_LOGIC_EFFECT_START) {\n return [\n {\n ...snapshot,\n effects: {\n ...snapshot.effects,\n [(event as any).key]: { status: 'active' }\n }\n },\n []\n ];\n }\n\n if (event.type === XSTATE_LOGIC_EFFECT_RESOLVE) {\n return [\n {\n ...snapshot,\n effects: {\n ...snapshot.effects,\n [(event as any).key]: {\n status: 'done',\n output: (event as any).output\n }\n }\n },\n []\n ];\n }\n\n if (event.type === XSTATE_LOGIC_EFFECT_REJECT) {\n return [\n {\n ...snapshot,\n effects: {\n ...snapshot.effects,\n [(event as any).key]: {\n status: 'error',\n error: (event as any).error\n }\n }\n },\n []\n ];\n }\n\n const effects: LogicEffect<TEvent, TEmitted>[] = [];\n const trackedEffects: Record<string, LogicEffectState> = {};\n const enqueueEffect = (key: string, exec: () => void | (() => void)) => {\n if (snapshot.effects?.[key]) {\n return;\n }\n effects.push({ type: 'effect', key, exec });\n trackedEffects[key] = { status: 'active' };\n };\n const enq: LogicEnqueue<TEvent, TEmitted> = {\n emit: (emitted) => {\n effects.push({ type: 'emit', event: emitted });\n },\n sendBack: (sentEvent) => {\n effects.push({ type: 'sendBack', event: sentEvent });\n },\n raise: (raisedEvent) => {\n effects.push({ type: 'raise', event: raisedEvent });\n },\n effect: ((keyOrExec, maybeExec) => {\n if (typeof keyOrExec === 'string') {\n enqueueEffect(keyOrExec, maybeExec);\n return;\n }\n effects.push({ type: 'effect', exec: keyOrExec });\n }) as LogicEnqueue<TEvent, TEmitted>['effect']\n };\n\n const patch = config.run(\n {\n context: snapshot.context,\n event,\n input: snapshot.input!,\n system: actorScope.system,\n self: actorScope.self as any,\n emit: actorScope.emit\n } as LogicArgs<TContext, TEvent, TInput>,\n enq\n );\n\n const nextSnapshot = {\n ...snapshot,\n ...(patch || {})\n };\n\n if ('context' in snapshot || patch?.context !== undefined) {\n (nextSnapshot as any).context = patch?.context ?? snapshot.context;\n }\n if (patch?.effects || Object.keys(trackedEffects).length) {\n (nextSnapshot as any).effects = {\n ...snapshot.effects,\n ...patch?.effects,\n ...trackedEffects\n };\n }\n\n return [nextSnapshot, effects];\n }) as LogicTransition<TContext, TOutput, TEvent, TInput, TEmitted>;\n\n const logic: LogicActorLogic<TContext, TOutput, TEvent, TInput, TEmitted> = {\n id: config.id,\n config,\n transition,\n start: (snapshot, actorScope) => {\n const [nextSnapshot, effects] = transition(\n snapshot,\n createInitEvent(snapshot.input) as unknown as TEvent,\n actorScope\n );\n Object.assign(snapshot, nextSnapshot);\n executeLogicEffects(effects, actorScope);\n },\n getInitialSnapshot: (_, input) => {\n const context = resolveContext(config.context, input);\n const snapshot = {\n status: 'active' as const,\n output: undefined,\n error: undefined,\n input\n };\n\n if (context !== undefined) {\n (snapshot as any).context = context;\n }\n\n return {\n ...snapshot\n } as LogicSnapshot<TContext, TOutput, TInput>;\n },\n getPersistedSnapshot: (snapshot) => snapshot,\n restoreSnapshot: (snapshot: any) => snapshot\n };\n\n return logic;\n}\n","import isDevelopment from '#is-development';\nimport type { ActionRecord, SentRecord } from './inspection.ts';\nimport { onActorRead } from './interop.ts';\nimport { Mailbox } from './Mailbox.ts';\nimport { XSTATE_STOP } from './constants.ts';\nimport {\n createDoneActorEvent,\n createErrorActorEvent,\n createInitEvent\n} from './eventUtils.ts';\nimport { reportUnhandledError } from './reportUnhandledError.ts';\nimport { symbolObservable } from './symbolObservable.ts';\nimport { AnyActorSystem, Clock, createSystem } from './system.ts';\nimport { executeLogicEffects } from './actors/logic.ts';\n\n// those are needed to make JSDoc `@link` work properly\nimport type {\n createObservableLogic,\n createEventObservableLogic\n} from './actors/observable.ts';\nimport type { createCallbackLogic } from './actors/callback.ts';\nimport type { createLogic } from './actors/logic.ts';\nimport type { createAsyncLogic } from './actors/promise.ts';\nimport type { createMachine } from './createMachine.ts';\n\nlet executingCustomAction: boolean = false;\n\nimport type {\n ActorScope,\n AnyActor,\n AnyActorLogic,\n EmittedFrom,\n EventFromLogic,\n SendableEventFromLogic,\n InputFrom,\n Snapshot,\n SnapshotFrom,\n AnyTransitionDefinition,\n Readable\n} from './types.ts';\nimport {\n ActorOptions,\n ActorInstance,\n ActorRef,\n EventObject,\n InteropSubscribable,\n Observer,\n PendingEffect,\n Subscription,\n TimersRestoreStrategy\n} from './types.ts';\nimport { toObserver } from './utils.ts';\n\nexport const $$ACTOR_TYPE = 1;\n\n// those values are currently used by @xstate/react directly so it's important to keep the assigned values in sync\nexport enum ProcessingStatus {\n NotStarted = 0,\n Running = 1,\n Stopped = 2\n}\n\nconst defaultOptions = {\n clock: {\n setTimeout: (fn, ms) => {\n return setTimeout(fn, ms);\n },\n clearTimeout: (id) => {\n return clearTimeout(id);\n }\n } as Clock,\n logger: console.log.bind(console)\n};\n\n/**\n * An Actor is a running process that can receive events, send events and change\n * its behavior based on the events it receives, which can cause effects outside\n * of the actor. When you run a state machine, it becomes an actor.\n *\n * An `Actor` is the concrete runtime instance with lifecycle methods and\n * system-owned internals. It also satisfies the narrower `ActorRef` contract,\n * so consumer APIs should accept `ActorRef` when they only need to send events\n * or read snapshots.\n */\nexport class Actor<TLogic extends AnyActorLogic>\n implements\n ActorInstance<\n SnapshotFrom<TLogic>,\n EventFromLogic<TLogic>,\n EmittedFrom<TLogic>,\n SendableEventFromLogic<TLogic>\n >\n{\n /** The current internal state of the actor. */\n private _snapshot!: SnapshotFrom<TLogic>;\n /**\n * The clock that is responsible for setting and clearing timeouts, such as\n * delayed events and transitions.\n */\n public clock: Clock;\n public options: Readonly<ActorOptions<TLogic>>;\n\n /** The unique identifier for this actor relative to its parent. */\n public id: string;\n\n private readonly _boundProcess = this._process.bind(this);\n\n private mailbox: Mailbox<EventFromLogic<TLogic>> = new Mailbox(\n this._boundProcess\n );\n\n private observers: Set<Observer<SnapshotFrom<TLogic>>> = new Set();\n private eventListeners: Map<\n string,\n Set<(emittedEvent: EmittedFrom<TLogic>) => void>\n > = new Map();\n private logger: (...args: any[]) => void;\n\n /** @internal */\n public _processingStatus: ProcessingStatus = ProcessingStatus.NotStarted;\n\n // Actor Ref\n public _parent?: AnyActor;\n /** @internal */\n public _syncSnapshot?: boolean;\n public ref: ActorRef<\n SnapshotFrom<TLogic>,\n EventFromLogic<TLogic>,\n EmittedFrom<TLogic>,\n SendableEventFromLogic<TLogic>\n >;\n // TODO: add typings for system\n private _actorScope: ActorScope<\n SnapshotFrom<TLogic>,\n EventFromLogic<TLogic>,\n AnyActorSystem,\n EmittedFrom<TLogic>,\n SendableEventFromLogic<TLogic>\n >;\n\n /** @internal */\n public _lastSourceRef?: AnyActor;\n /** @internal */\n public _collectedMicrosteps: AnyTransitionDefinition[] = [] as any;\n /** @internal Actions executed during the in-flight transition. */\n public _collectedActions: ActionRecord[] = [];\n /** @internal Events relayed to other actors during the in-flight transition. */\n public _collectedSent: SentRecord[] = [];\n public systemId: string | undefined;\n\n /** The globally unique process ID for this invocation. */\n public sessionId: string;\n\n /** The system to which this actor belongs. */\n public system: AnyActorSystem;\n\n public trigger: {\n [K in SendableEventFromLogic<TLogic>['type']]: {} extends Omit<\n Extract<SendableEventFromLogic<TLogic>, { type: K }>,\n 'type'\n >\n ? () => void\n : (\n payload: Omit<\n Extract<SendableEventFromLogic<TLogic>, { type: K }>,\n 'type'\n >\n ) => void;\n };\n\n public src: string | AnyActorLogic;\n\n /**\n * Creates a new actor instance for the given logic with the provided options,\n * if any.\n *\n * @param logic The logic to create an actor from\n * @param options Actor options\n */\n constructor(\n public logic: TLogic,\n options?: ActorOptions<TLogic>\n ) {\n const resolvedOptions = {\n ...defaultOptions,\n ...options\n };\n\n const { clock, logger, parent, syncSnapshot, id, systemId, inspect } =\n resolvedOptions;\n\n this.system = parent\n ? parent.system\n : createSystem(this, {\n clock,\n logger,\n timers: resolvedOptions.timers\n });\n\n if (inspect && !parent) {\n // Always inspect at the system-level\n this.system.inspect(toObserver(inspect));\n }\n\n this.sessionId = this.system._bookId();\n this.id = id ?? this.sessionId;\n this.logger = options?.logger ?? this.system._logger;\n this.clock = options?.clock ?? this.system._clock;\n this._parent = parent;\n this._syncSnapshot = syncSnapshot;\n this.options = resolvedOptions as ActorOptions<TLogic> &\n typeof defaultOptions;\n this.src = resolvedOptions.src ?? logic;\n this.ref = this;\n this._actorScope = {\n self: this,\n id: this.id,\n sessionId: this.sessionId,\n logger: this.logger,\n defer: (fn) => {\n this._deferred.push(fn);\n },\n system: this.system,\n stopChild: (child) => {\n if (child._parent !== this) {\n throw new Error(\n `Cannot stop child actor ${child.id} of ${this.id} because it is not a child`\n );\n }\n (child as Actor<AnyActorLogic>)._stop();\n },\n emit: (emittedEvent) => {\n const listeners = this.eventListeners.get(emittedEvent.type);\n const wildcardListener = this.eventListeners.get('*');\n if (!listeners && !wildcardListener) {\n return;\n }\n if (listeners) {\n for (const handler of listeners) {\n try {\n handler(emittedEvent);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n }\n if (!wildcardListener) {\n return;\n }\n for (const handler of wildcardListener) {\n try {\n handler(emittedEvent);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n },\n actionExecutor: (action) => {\n const exec = () => {\n // Record every executed action for the '@xstate.transition' inspection\n // event's `actions[]` facet (replaces the v5 '@xstate.action' event).\n this._collectedActions.push({\n type: action.type,\n params: action.params\n });\n if (!action.exec) {\n return;\n }\n const saveExecutingCustomAction = executingCustomAction;\n try {\n executingCustomAction = true;\n\n action.exec();\n } finally {\n executingCustomAction = saveExecutingCustomAction;\n }\n };\n if (this._processingStatus === ProcessingStatus.Running) {\n exec();\n } else {\n this._deferred.push(exec);\n }\n }\n };\n\n // Ensure that the send method is bound to this Actor instance\n // if destructured\n this.send = this.send.bind(this);\n this.trigger = new Proxy({} as Actor<TLogic>['trigger'], {\n get: (_, eventType: string) => {\n return (payload?: any) => {\n this.send({ ...payload, type: eventType });\n };\n }\n });\n\n // unified '@xstate.transition' event replaces '@xstate.actor'\n\n if (systemId) {\n this.systemId = systemId;\n this.system._set(systemId, this);\n }\n\n // prepare to collect initial microsteps during getInitialSnapshot\n this._collectedMicrosteps = [] as any;\n let persistedState = options?.snapshot ?? options?.state;\n if (\n persistedState &&\n typeof persistedState === 'object' &&\n '_pendingEffects' in persistedState\n ) {\n // Pending effects are restored by this actor on `start()`; the logic\n // only sees the rest of the persisted snapshot.\n const { _pendingEffects, ...rest } = persistedState as any;\n this._pendingEffects = _pendingEffects;\n persistedState = rest;\n }\n try {\n this._snapshot = persistedState\n ? this.logic.restoreSnapshot\n ? this.logic.restoreSnapshot(persistedState, this._actorScope)\n : persistedState\n : this.logic.getInitialSnapshot(this._actorScope, this.options?.input);\n } catch (err) {\n // if we get here then it means that we assign a value to this._snapshot that is not of the correct type\n // we can't get the true `TSnapshot & { status: 'error'; }`, it's impossible\n // so right now this is a lie of sorts\n this._snapshot = {\n status: 'error',\n output: undefined,\n error: err\n } as any;\n // discard any functions deferred during the failed initial snapshot\n // computation so they can't run against an inconsistent actor\n this._deferred.length = 0;\n }\n\n if (systemId && (this._snapshot as any).status !== 'active') {\n this.system._unregister(this);\n }\n\n // Announce actor topology: emitted once for every actor (root and every\n // spawned/invoked child) so the actor graph can be drawn before any\n // transitions occur. This is the only place actor identity is announced.\n this.system._sendInspectionEvent({\n type: '@xstate.actor',\n actorRef: this as any,\n parentRef: this._parent,\n id: this.id,\n src: this.src,\n snapshot: this._snapshot\n });\n }\n\n // array of functions to defer\n private _deferred: Array<() => void> = [];\n\n // pending effects (timers) from a persisted snapshot, rescheduled on `start()`\n private _pendingEffects?: PendingEffect[];\n\n private _setErrorSnapshot(\n err: unknown,\n snapshot: SnapshotFrom<TLogic> = this._snapshot\n ) {\n this._snapshot = {\n ...(snapshot as any),\n status: 'error',\n error: err\n };\n }\n\n private _next(snapshot: SnapshotFrom<TLogic>) {\n for (const observer of this.observers) {\n try {\n observer.next?.(snapshot);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n }\n\n private update(snapshot: SnapshotFrom<TLogic>, event: EventObject): void {\n // Update state\n this._snapshot = snapshot;\n\n // Execute deferred effects\n for (let i = 0; i < this._deferred.length; i++) {\n const deferredFn = this._deferred[i];\n try {\n deferredFn();\n } catch (err) {\n // this error can only be caught when executing *initial* actions\n // it's the only time when we call actions provided by the user through those deferreds\n // when the actor is already running we always execute them synchronously while transitioning\n // no \"builtin deferred\" should actually throw an error since they are either safe\n // or the control flow is passed through the mailbox and errors should be caught by the `_process` used by the mailbox\n this._deferred.length = 0;\n this._setErrorSnapshot(err, snapshot);\n break;\n }\n }\n this._deferred.length = 0;\n\n switch ((this._snapshot as any).status) {\n case 'active':\n this._next(snapshot);\n break;\n case 'done': {\n // next observers are meant to be notified about done snapshots\n // this can be seen as something that is different from how observable work\n // but with observables `complete` callback is called without any arguments\n // it's more ergonomic for XState to treat a done snapshot as a \"next\" value\n // and the completion event as something that is separate,\n // something that merely follows emitting that done snapshot\n this._next(snapshot);\n\n this._stopProcedure();\n this._complete();\n const doneEvent = createDoneActorEvent(\n this.id,\n (this._snapshot as any).output\n );\n if (this._parent) {\n this.system._relay(this, this._parent, doneEvent);\n }\n\n break;\n }\n case 'error':\n this._error((this._snapshot as any).error);\n break;\n }\n this.system._sendInspectionEvent({\n type: '@xstate.transition',\n actorRef: this as any,\n event,\n sourceRef: this._lastSourceRef,\n targetRef: this as any,\n snapshot,\n microsteps: this._collectedMicrosteps as any,\n actions: this._collectedActions,\n sent: this._collectedSent,\n eventType: event.type\n });\n // reset facets after emission\n this._collectedMicrosteps = [] as any;\n this._collectedActions = [];\n this._collectedSent = [];\n }\n\n /**\n * Subscribe an observer to an actor’s snapshot values.\n *\n * @remarks\n * The observer will receive the actor’s snapshot value when it is emitted.\n * The observer can be:\n *\n * - A plain function that receives the latest snapshot, or\n * - An observer object whose `.next(snapshot)` method receives the latest\n * snapshot\n *\n * @example\n *\n * ```ts\n * // Observer as a plain function\n * const subscription = actor.subscribe((snapshot) => {\n * console.log(snapshot);\n * });\n * ```\n *\n * @example\n *\n * ```ts\n * // Observer as an object\n * const subscription = actor.subscribe({\n * next(snapshot) {\n * console.log(snapshot);\n * },\n * error(err) {\n * // ...\n * },\n * complete() {\n * // ...\n * }\n * });\n * ```\n *\n * The return value of `actor.subscribe(observer)` is a subscription object\n * that has an `.unsubscribe()` method. You can call\n * `subscription.unsubscribe()` to unsubscribe the observer:\n *\n * @example\n *\n * ```ts\n * const subscription = actor.subscribe((snapshot) => {\n * // ...\n * });\n *\n * // Unsubscribe the observer\n * subscription.unsubscribe();\n * ```\n *\n * When the actor is stopped, all of its observers will automatically be\n * unsubscribed.\n *\n * @param observer - Either a plain function that receives the latest\n * snapshot, or an observer object whose `.next(snapshot)` method receives\n * the latest snapshot\n */\n public subscribe(observer: Observer<SnapshotFrom<TLogic>>): Subscription;\n public subscribe(\n nextListener?: (snapshot: SnapshotFrom<TLogic>) => void,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription;\n public subscribe(\n nextListenerOrObserver?:\n | ((snapshot: SnapshotFrom<TLogic>) => void)\n | Observer<SnapshotFrom<TLogic>>,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription {\n const observer = toObserver(\n nextListenerOrObserver,\n errorListener,\n completeListener\n );\n\n if (this._processingStatus !== ProcessingStatus.Stopped) {\n this.observers.add(observer);\n } else {\n switch ((this._snapshot as any).status) {\n case 'done':\n try {\n observer.complete?.();\n } catch (err) {\n reportUnhandledError(err);\n }\n break;\n case 'error': {\n const err = (this._snapshot as any).error;\n if (!observer.error) {\n reportUnhandledError(err);\n } else {\n try {\n observer.error(err);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n break;\n }\n }\n }\n\n return {\n unsubscribe: () => {\n this.observers.delete(observer);\n }\n };\n }\n\n public on<TType extends EmittedFrom<TLogic>['type'] | '*'>(\n type: TType,\n handler: (\n emitted: EmittedFrom<TLogic> &\n (TType extends '*' ? unknown : { type: TType })\n ) => void\n ): Subscription {\n let listeners = this.eventListeners.get(type);\n if (!listeners) {\n listeners = new Set();\n this.eventListeners.set(type, listeners);\n }\n listeners.add(handler);\n\n return {\n unsubscribe: () => {\n listeners.delete(handler);\n }\n };\n }\n\n public select<TSelected>(\n selector: (snapshot: SnapshotFrom<TLogic>) => TSelected,\n equalityFn: (a: TSelected, b: TSelected) => boolean = Object.is\n ): Readable<TSelected> {\n return {\n subscribe: (\n observerOrFn:\n | Observer<TSelected>\n | ((value: TSelected) => void)\n | undefined,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ) => {\n const observer = toObserver(\n observerOrFn,\n errorListener,\n completeListener\n );\n let selected = selector(this.getSnapshot());\n return this.subscribe({\n next: (snapshot) => {\n const next = selector(snapshot);\n if (!equalityFn(selected, next)) {\n selected = next;\n observer.next?.(next);\n }\n },\n error: observer.error,\n complete: observer.complete\n });\n },\n get: () => selector(this.get())\n };\n }\n\n /** Starts the Actor from the initial state */\n public start(): this {\n if (this._processingStatus === ProcessingStatus.Running) {\n // Do not restart the service if it is already started\n return this;\n }\n\n if (this._syncSnapshot) {\n this.subscribe({\n next: (snapshot: Snapshot<unknown>) => {\n if (snapshot.status === 'active') {\n this.system._relay(this, this._parent!, {\n type: `xstate.snapshot.${this.id}`,\n snapshot\n });\n }\n },\n error: () => {}\n });\n }\n\n this.system._register(this.sessionId, this);\n if (this.systemId) {\n this.system._set(this.systemId, this);\n }\n this._processingStatus = ProcessingStatus.Running;\n\n // TODO: this isn't correct when rehydrating\n const initEvent = createInitEvent(this.options.input);\n // remember source of init as parent for unified transition event\n this._lastSourceRef = this._parent;\n\n const status = (this._snapshot as any).status;\n\n switch (status) {\n case 'done':\n // a state machine can be \"done\" upon initialization (it could reach a final state using initial microsteps)\n // we still need to complete observers, flush deferreds etc\n this.update(\n this._snapshot,\n initEvent as unknown as EventFromLogic<TLogic>\n );\n // TODO: rethink cleanup of observers, mailbox, etc\n return this;\n case 'error':\n this._error((this._snapshot as any).error);\n return this;\n }\n\n if (!this._parent) {\n this.system.start();\n }\n\n if (this.logic.start) {\n try {\n this.logic.start(this._snapshot, this._actorScope);\n } catch (err) {\n this._setErrorSnapshot(err);\n this._error(err);\n return this;\n }\n }\n\n // TODO: this notifies all subscribers but usually this is redundant\n // there is no real change happening here\n // we need to rethink if this needs to be refactored\n this.update(this._snapshot, initEvent as unknown as EventFromLogic<TLogic>);\n\n if (this._pendingEffects) {\n const strategy =\n this.options.timers ?? this.system._timerStrategy ?? 'resume';\n for (const effect of this._pendingEffects) {\n // Re-execute the pending effect with its remaining delay. Only\n // self-targeted raises exist today; other effect types are ignored.\n if (effect.type === '@xstate.raise') {\n this.system.scheduler.schedule(\n this,\n this,\n effect.event,\n resolveRestoredTimerDelay(strategy, effect),\n effect.id\n );\n }\n }\n this._pendingEffects = undefined;\n }\n\n this.mailbox.start();\n\n return this;\n }\n\n private _process(event: EventFromLogic<TLogic>) {\n let nextState: any;\n let caughtError;\n try {\n nextState = this.logic.transition(\n this._snapshot,\n event,\n this._actorScope\n );\n } catch (err) {\n // we wrap it in a box so we can rethrow it later even if falsy value gets caught here\n caughtError = { err };\n }\n\n if (caughtError) {\n const { err } = caughtError;\n\n this._setErrorSnapshot(err);\n this._error(err);\n return;\n }\n\n const [snapshot, effects] = Array.isArray(nextState)\n ? nextState\n : [nextState, undefined];\n\n this.update(snapshot, event);\n executeLogicEffects(effects, this._actorScope);\n if (event.type === XSTATE_STOP) {\n this._stopProcedure();\n this._complete();\n }\n }\n\n /** @internal */\n public _stop(): this {\n if (this._processingStatus === ProcessingStatus.Stopped) {\n return this;\n }\n this.mailbox.clear();\n if (this._processingStatus === ProcessingStatus.NotStarted) {\n this._processingStatus = ProcessingStatus.Stopped;\n return this;\n }\n this.mailbox.enqueue({ type: XSTATE_STOP } as any);\n this.system._unregister(this);\n\n return this;\n }\n\n /** Stops the Actor and unsubscribe all listeners. */\n public stop(): this {\n if (this._parent) {\n throw new Error('A non-root actor cannot be stopped directly.');\n }\n return this._stop();\n }\n private _complete(): void {\n for (const observer of this.observers) {\n try {\n observer.complete?.();\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n this.observers.clear();\n this.eventListeners.clear();\n }\n\n private _error(err: unknown): void {\n this._stopProcedure();\n if (!this.observers.size) {\n if (!this._parent) {\n reportUnhandledError(err);\n }\n this.eventListeners.clear();\n } else {\n let reportError = false;\n\n for (const observer of this.observers) {\n const errorListener = observer.error;\n reportError ||= !errorListener;\n try {\n errorListener?.(err);\n } catch (err2) {\n reportUnhandledError(err2);\n }\n }\n this.observers.clear();\n this.eventListeners.clear();\n if (reportError) {\n reportUnhandledError(err);\n }\n }\n\n if (this._parent) {\n this.system._relay(\n this,\n this._parent,\n createErrorActorEvent(this.id, err)\n );\n }\n }\n // TODO: atm children don't belong entirely to the actor so\n // in a way - it's not even super aware of them\n // so we can't stop them from here but we really should!\n // right now, they are being stopped within the machine's transition\n // but that could throw and leave us with \"orphaned\" active actors\n private _stopProcedure(): void {\n if (this._processingStatus !== ProcessingStatus.Running) {\n // Actor already stopped; do nothing\n return;\n }\n\n // Cancel all delayed events\n this.system.scheduler.cancelAll(this);\n\n // TODO: mailbox.reset\n this.mailbox.clear();\n // TODO: after `stop` we must prepare ourselves for receiving events again\n // events sent *after* stop signal must be queued\n // it seems like this should be the common behavior for all of our consumers\n // so perhaps this should be unified somehow for all of them\n this.mailbox = new Mailbox(this._boundProcess);\n\n this._processingStatus = ProcessingStatus.Stopped;\n this.system._unregister(this);\n }\n\n /** @internal */\n public _send(event: EventFromLogic<TLogic>) {\n if (this._processingStatus === ProcessingStatus.Stopped) {\n // do nothing\n if (isDevelopment) {\n // TODO: circular serialization issues\n // const eventString = ''; //JSON.stringify(event);\n\n console.warn(\n `Event \"${event.type}\" was sent to stopped actor \"${this.id} (${this.sessionId})\". This actor has already reached its final state, and will not transition.`\n );\n }\n return;\n }\n\n this.mailbox.enqueue(event);\n }\n\n /**\n * Sends an event to the running Actor to trigger a transition.\n *\n * @param event The event to send\n */\n public send(event: SendableEventFromLogic<TLogic>) {\n if (isDevelopment && typeof event === 'string') {\n throw new Error(\n `Only event objects may be sent to actors; use .send({ type: \"${event}\" }) instead`\n );\n }\n this.system._relay(undefined, this, event);\n }\n\n public toJSON() {\n return {\n xstate$$type: $$ACTOR_TYPE,\n id: this.id\n };\n }\n\n /**\n * Obtain the internal state of the actor, which can be persisted.\n *\n * @remarks\n * The internal state can be persisted from any actor, not only machines.\n *\n * Note that the persisted state is not the same as the snapshot from\n * {@link Actor.getSnapshot}. Persisted state represents the internal state of\n * the actor, while snapshots represent the actor's last emitted value.\n *\n * Can be restored with {@link ActorOptions.state}\n * @see https://stately.ai/docs/persistence\n */\n public getPersistedSnapshot(): Snapshot<unknown>;\n public getPersistedSnapshot(options?: unknown): Snapshot<unknown> {\n const persisted = this.logic.getPersistedSnapshot(this._snapshot, options);\n\n // Capture this actor's pending self-targeted effects (delayed\n // events/transitions) as serialized action descriptors plus their\n // runtime progress, so they can be restored on `start()`.\n const scheduledEvents = this.system._snapshot._scheduledEvents;\n let pendingEffects: PendingEffect[] | undefined;\n const now = Date.now();\n for (const key in scheduledEvents) {\n const scheduled = scheduledEvents[key as keyof typeof scheduledEvents];\n if (scheduled.source === this && scheduled.target === this) {\n (pendingEffects ??= []).push({\n type: '@xstate.raise',\n event: scheduled.event,\n id: scheduled.id,\n delay: scheduled.delay,\n startedAt: scheduled.startedAt,\n elapsed: Math.max(0, now - scheduled.startedAt)\n });\n }\n }\n\n // If this actor was restored but not yet started, its pending effects\n // are not in the scheduler yet — carry them through as-is.\n pendingEffects ??= this._pendingEffects;\n\n return pendingEffects\n ? ({\n ...(persisted as any),\n _pendingEffects: pendingEffects\n } as Snapshot<unknown>)\n : persisted;\n }\n\n public [symbolObservable](): InteropSubscribable<SnapshotFrom<TLogic>> {\n return this;\n }\n\n /**\n * Read an actor’s snapshot synchronously.\n *\n * @remarks\n * The snapshot represent an actor's last emitted value.\n *\n * When an actor receives an event, its internal state may change. An actor\n * may emit a snapshot when a state transition occurs.\n *\n * Note that some actors, such as callback actors generated with\n * `createCallbackLogic`, will not emit snapshots.\n * @see {@link Actor.subscribe} to subscribe to an actor’s snapshot values.\n * @see {@link Actor.getPersistedSnapshot} to persist the internal state of an actor (which is more than just a snapshot).\n */\n public getSnapshot(): SnapshotFrom<TLogic> {\n return this.get();\n }\n\n /** Read the actor's current snapshot as an atom value. */\n public get(): SnapshotFrom<TLogic> {\n if (isDevelopment && !this._snapshot) {\n throw new Error(\n `Snapshot can't be read while the actor initializes itself`\n );\n }\n onActorRead?.(this);\n return this._snapshot;\n }\n}\n\nfunction resolveRestoredTimerDelay(\n strategy: TimersRestoreStrategy,\n effect: PendingEffect\n): number {\n if (typeof strategy === 'function') {\n return strategy(effect);\n }\n switch (strategy) {\n case 'restart':\n return effect.delay;\n case 'absolute':\n return Math.max(0, effect.startedAt + effect.delay - Date.now());\n case 'resume':\n default:\n return Math.max(0, effect.delay - effect.elapsed);\n }\n}\n\nexport type RequiredActorOptionsKeys<TLogic extends AnyActorLogic> =\n undefined extends InputFrom<TLogic> ? never : 'input';\n\n/**\n * Creates a new actor instance for the given actor logic with the provided\n * options, if any.\n *\n * @remarks\n * When you create an actor from actor logic via `createActor(logic)`, you\n * implicitly create an actor system where the created actor is the root actor.\n * Any actors spawned from this root actor and its descendants are part of that\n * actor system.\n * @example\n *\n * ```ts\n * import { createActor } from 'xstate';\n * import { someActorLogic } from './someActorLogic.ts';\n *\n * // Creating the actor, which implicitly creates an actor system with itself as the root actor\n * const actor = createActor(someActorLogic);\n *\n * actor.subscribe((snapshot) => {\n * console.log(snapshot);\n * });\n *\n * // Actors must be started by calling `actor.start()`, which will also start the actor system.\n * actor.start();\n *\n * // Actors can receive events\n * actor.send({ type: 'someEvent' });\n *\n * // You can stop root actors by calling `actor.stop()`, which will also stop the actor system and all actors in that system.\n * actor.stop();\n * ```\n *\n * @param logic - The actor logic to create an actor from. For a state machine\n * actor logic creator, see {@link createMachine}. Other actor logic creators\n * include {@link createCallbackLogic}, {@link createEventObservableLogic},\n * {@link createObservableLogic}, {@link createLogic}, and\n * {@link createAsyncLogic}.\n * @param options - Actor options\n */\nexport function createActor<TLogic extends AnyActorLogic>(\n logic: TLogic,\n options?: ActorOptions<TLogic> & {\n [K in RequiredActorOptionsKeys<TLogic>]: unknown;\n }\n): Actor<TLogic> {\n return new Actor(logic, options);\n}\n","import { createActor } from '../createActor.ts';\nimport type { ActorFromLogic } from '../types.ts';\nimport { createLogic } from './logic.ts';\nexport {\n createCallbackLogic,\n type CallbackActorLogic,\n type CallbackActorRef,\n type CallbackLogicConfig,\n type CallbackSnapshot,\n type CallbackLogicFunction\n} from './callback.ts';\nexport {\n createObservableLogic,\n createEventObservableLogic,\n type EventObservableLogicConfig,\n type EventObservableLogicFunction,\n type ObservableActorLogic,\n type ObservableActorRef,\n type ObservableLogicConfig,\n type ObservableLogicFunction,\n type ObservableSnapshot\n} from './observable.ts';\nexport {\n createLogic,\n type LogicActorLogic,\n type LogicActorRef,\n type LogicArgs,\n type LogicConfig,\n type LogicEffect,\n type LogicEffectState,\n type LogicEnqueue,\n type LogicFunction,\n type LogicPatch,\n type LogicSnapshot\n} from './logic.ts';\nexport {\n createAsyncLogic,\n type AsyncActorLogic,\n type AsyncActorRef,\n type AsyncSnapshot,\n type LogicArgs as AsyncLogicArgs,\n type LogicConfig as AsyncLogicConfig,\n type LogicEnqueue as AsyncLogicEnqueue,\n type LogicFunction as AsyncLogicFunction,\n TimeoutError\n} from './promise.ts';\nexport {\n createListenerLogic,\n listenerLogic,\n type ListenerActorLogic,\n type ListenerActorRef,\n type ListenerSnapshot,\n type ListenerInput\n} from './listener.ts';\nexport {\n createSubscriptionLogic,\n subscriptionLogic,\n type SubscriptionActorLogic,\n type SubscriptionActorRef,\n type SubscriptionSnapshot,\n type SubscriptionInput,\n type SubscriptionMappers\n} from './subscription.ts';\n\nconst emptyLogic = /* #__PURE__ */ createLogic<undefined, undefined>({\n context: undefined,\n run: () => undefined\n});\n\nexport function createEmptyActor(): ActorFromLogic<typeof emptyLogic> {\n return createActor(emptyLogic);\n}\n","import { ProcessingStatus, createActor } from './createActor.ts';\nimport {\n ActorFromLogic,\n AnyActorLogic,\n AnyActorRef,\n AnyActorScope,\n AnyEventObject,\n AnyMachineSnapshot,\n ConditionalRequired,\n InputFrom,\n IsNotNever,\n TODO,\n type RequiredLogicInput\n} from './types.ts';\nimport { resolveReferencedActor } from './utils.ts';\n\nexport type Spawner = <TLogic extends AnyActorLogic>(\n src: TLogic,\n ...[options]: ConditionalRequired<\n [\n options?: {\n id?: string;\n systemId?: string;\n input?: TLogic extends string ? unknown : InputFrom<TLogic>;\n syncSnapshot?: boolean;\n } & { [K in RequiredLogicInput<TLogic>]: unknown }\n ],\n IsNotNever<RequiredLogicInput<TLogic>>\n >\n) => ActorFromLogic<TLogic>;\n\nexport function createSpawner(\n actorScope: AnyActorScope,\n { machine, context }: AnyMachineSnapshot,\n event: AnyEventObject,\n spawnedChildren: Record<string, AnyActorRef>\n): Spawner {\n const spawn: Spawner = ((src, options) => {\n if (typeof src === 'string') {\n const logic = resolveReferencedActor(machine, src);\n\n if (!logic) {\n throw new Error(\n `Actor logic '${src as string}' not implemented in machine '${machine.id}'`\n );\n }\n\n const actor = createActor(logic, {\n id: options?.id,\n parent: actorScope.self,\n syncSnapshot: options?.syncSnapshot,\n input:\n typeof options?.input === 'function'\n ? options.input({\n context,\n event,\n self: actorScope.self\n })\n : options?.input,\n src,\n systemId: options?.systemId\n }) as any;\n\n spawnedChildren[actor.id] = actor;\n\n return actor;\n } else {\n const actor = createActor(src, {\n id: options?.id,\n parent: actorScope.self,\n syncSnapshot: options?.syncSnapshot,\n input: options?.input,\n src,\n systemId: options?.systemId\n });\n\n return actor;\n }\n }) as Spawner;\n return ((src, options) => {\n const actor = spawn(src, options) as TODO; // TODO: fix types\n spawnedChildren[actor.id] = actor;\n actorScope.defer(() => {\n if (actor._processingStatus === ProcessingStatus.Stopped) {\n return;\n }\n actor.start();\n });\n return actor;\n }) as Spawner;\n}\n","const cache = new WeakMap<any, any>();\n\nexport function memo<T>(object: any, key: string, fn: () => T): T {\n let memoizedData = cache.get(object);\n\n if (!memoizedData) {\n memoizedData = { [key]: fn() };\n cache.set(object, memoizedData);\n } else if (!(key in memoizedData)) {\n memoizedData[key] = fn();\n }\n\n return memoizedData[key];\n}\n","import isDevelopment from '#is-development';\nimport { NULL_EVENT, STATE_DELIMITER } from './constants.ts';\nimport { createInvokeTimeoutEvent } from './eventUtils.ts';\nimport { memo } from './memo.ts';\nimport {\n evaluateCandidate,\n formatTransition,\n getCandidates,\n getDelayedTransitions\n} from './stateUtils.ts';\nimport type {\n DelayedTransitionDefinition,\n EventObject,\n InitialTransitionDefinition,\n MachineContext,\n Mapper,\n StateNodesConfig,\n TransitionDefinition,\n TransitionDefinitionMap,\n AnyStateMachine,\n AnyStateNodeConfig,\n NonReducibleUnknown,\n EventDescriptor,\n AnyActor,\n AnyStateNode,\n AnyEventObject,\n AnyAction,\n AnyTransitionConfig,\n AnyTransitionDefinition,\n AnyMachineSnapshot,\n AnyInvokeDefinition\n} from './types.ts';\nimport {\n createInvokeId,\n mapValues,\n toArray,\n toTransitionConfigArray\n} from './utils.ts';\n\nconst EMPTY_OBJECT = {};\nconst CHOICE_CONFIG_KEYS = [\n 'invoke',\n 'after',\n 'on',\n 'entry',\n 'exit',\n 'always',\n 'states',\n 'initial',\n 'onDone',\n 'timeout',\n 'onTimeout',\n 'history',\n 'target',\n 'output'\n] as const;\n\ninterface StateNodeOptions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n _key: string;\n _parent?: StateNode<TContext, TEvent>;\n _machine: AnyStateMachine;\n}\n\nexport class StateNode<\n TContext extends MachineContext = MachineContext,\n TEvent extends EventObject = EventObject\n> {\n /**\n * The relative key of the state node, which represents its location in the\n * overall state value.\n */\n public key: string;\n /** The unique ID of the state node. */\n public id: string;\n /**\n * The type of this state node:\n *\n * - `'atomic'` - no child state nodes\n * - `'compound'` - nested child state nodes (XOR)\n * - `'parallel'` - orthogonal nested child state nodes (AND)\n * - `'history'` - history state node\n * - `'choice'` - pure routing decision state node\n * - `'final'` - final state node\n */\n public type:\n | 'atomic'\n | 'compound'\n | 'parallel'\n | 'final'\n | 'history'\n | 'choice';\n /** The string path from the root machine node to this node. */\n public path: string[];\n /** The child state nodes. */\n public states: StateNodesConfig<any, any>;\n /**\n * The type of history on this state node. Can be:\n *\n * - `'shallow'` - recalls only top-level historical state value\n * - `'deep'` - recalls historical state value at all levels\n */\n public history: false | 'shallow' | 'deep';\n /** The action(s) to be executed upon entering the state node. */\n public entry: AnyAction | undefined;\n /** The action(s) to be executed upon exiting the state node. */\n public exit: AnyAction | undefined;\n /** The parent state node. */\n public parent?: StateNode<any, any>;\n /** The root machine node. */\n public machine: AnyStateMachine;\n /**\n * The meta data associated with this state node, which will be returned in\n * State instances.\n */\n public meta?: any;\n /**\n * The output data sent with the \"xstate.done.state._id_\" event if this is a\n * final state node.\n */\n public output?:\n | Mapper<MachineContext, EventObject, unknown, EventObject>\n | NonReducibleUnknown;\n\n /**\n * The order this state node appears. Corresponds to the implicit document\n * order.\n */\n public order: number = -1;\n\n public description?: string;\n\n public tags: string[] = [];\n public transitions!: Map<string, AnyTransitionDefinition[]>;\n public always?: Array<AnyTransitionDefinition>;\n public invoke: Array<AnyInvokeDefinition>;\n public on!: TransitionDefinitionMap<any, any>;\n public after!: Array<DelayedTransitionDefinition<any, any>>;\n public events!: Array<EventDescriptor<any>>;\n public ownEvents!: Array<EventDescriptor<any>>;\n\n constructor(\n /** The raw config used to create the machine. */\n public config: AnyStateNodeConfig,\n options: StateNodeOptions<TContext, TEvent>\n ) {\n this.parent = options._parent;\n this.key = options._key;\n this.machine = options._machine;\n this.path = this.parent ? this.parent.path.concat(this.key) : [];\n const firstStateKey = this.config.states\n ? Object.keys(this.config.states)[0]\n : undefined;\n this.id =\n this.config.id || [this.machine.id, ...this.path].join(STATE_DELIMITER);\n this.type =\n this.config.type ||\n (firstStateKey !== undefined\n ? 'compound'\n : this.config.history\n ? 'history'\n : 'atomic');\n this.description = this.config.description;\n\n validateStateNodeConfig(this);\n\n this.order = this.machine.idMap.size;\n this.machine.idMap.set(this.id, this);\n\n this.states = (\n this.config.states\n ? mapValues(\n this.config.states,\n (stateConfig: AnyStateNodeConfig, key) => {\n const stateNode = new StateNode(stateConfig, {\n _parent: this,\n _key: key,\n _machine: this.machine\n });\n return stateNode;\n }\n )\n : EMPTY_OBJECT\n ) as StateNodesConfig<TContext, TEvent>;\n\n if (this.type === 'compound' && !this.config.initial) {\n throw new Error(\n isDevelopment\n ? `No initial state specified for compound state node \"#${\n this.id\n }\". Try adding { initial: \"${firstStateKey}\" } to the state config.`\n : `No initial state specified for compound state node \"#${this.id}\".`\n );\n }\n\n // History config\n this.history =\n this.config.history === true ? 'shallow' : this.config.history || false;\n\n this.entry = this.config.entry as AnyAction | undefined;\n this.exit = this.config.exit as AnyAction | undefined;\n\n if (this.entry) {\n // @ts-expect-error _special is an internal marker not on the Action type\n this.entry._special = true;\n }\n\n if (this.exit) {\n // @ts-expect-error _special is an internal marker not on the Action type\n this.exit._special = true;\n }\n\n this.meta = this.config.meta;\n this.output =\n this.type === 'final' || !this.parent ? this.config.output : undefined;\n this.tags = toArray(config.tags).slice();\n this.invoke = toArray(this.config.invoke).map((invokeConfig, i) => {\n const { src, systemId } = invokeConfig;\n const invokeId = createInvokeId(this.id, i);\n const resolvedId = invokeConfig.id ?? invokeId;\n // Referenced (string) actors keep their logical name so persisted\n // snapshots reference `src: 'fetchUser'` rather than a positional id;\n // only inline logic gets the synthetic source name.\n const sourceName =\n typeof src === 'string' ? src : `xstate.invoke.${invokeId}`;\n\n return {\n ...invokeConfig,\n src: sourceName,\n logic: src,\n id: resolvedId,\n systemId\n } as AnyInvokeDefinition;\n });\n }\n\n /** @internal */\n public _initialize() {\n this.after = getDelayedTransitions(this) as any;\n this.transitions = formatTransitions(this);\n if (this.type === 'choice') {\n this.always = formatChoiceTransitions(this);\n } else if (this.config.always) {\n this.always = mapTransitionConfigs(this.config.always, (transition) =>\n formatTransition(this, NULL_EVENT, transition)\n );\n }\n\n for (const key of Object.keys(this.states)) {\n this.states[key]._initialize();\n }\n\n this._refreshEventMetadata();\n }\n\n /** @internal */\n public _refreshEventMetadata() {\n const on = {} as TransitionDefinitionMap<TContext, TEvent>;\n const ownEvents: EventDescriptor<any>[] = [];\n for (const [descriptor, transitions] of this.transitions) {\n (on as any)[descriptor] = transitions.slice();\n if (\n transitions.some(\n (transition) =>\n transition.target || transition.reenter || transition.to\n )\n ) {\n ownEvents.push(descriptor);\n }\n }\n this.on = on;\n this.ownEvents = ownEvents;\n\n const events = new Set<EventDescriptor<any>>(ownEvents);\n for (const state of Object.values(this.states)) {\n for (const event of state.events) {\n events.add(event);\n }\n }\n this.events = Array.from(events);\n }\n\n public get initial(): InitialTransitionDefinition {\n return memo(this, 'initial', () =>\n formatInitialTransition(this, this.config.initial)\n );\n }\n\n /** @internal */\n public next(\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n self: AnyActor\n ): Array<AnyTransitionDefinition> | undefined {\n const eventType = event.type;\n const candidates: Array<AnyTransitionDefinition> = memo(\n this,\n `candidates-${eventType}`,\n () => getCandidates(this, eventType)\n );\n\n for (const candidate of candidates) {\n const guardPassed = evaluateCandidate(\n candidate,\n event,\n snapshot,\n this,\n self\n );\n\n if (guardPassed) {\n return [candidate];\n }\n }\n\n return undefined;\n }\n}\n\nfunction validateStateNodeConfig(stateNode: AnyStateNode) {\n const config = stateNode.config as any;\n\n if (stateNode.type !== 'choice') {\n if (config.choice !== undefined) {\n throw new Error(\n `State \"${stateNode.id}\" has \\`choice\\`, but \\`choice\\` can only be used with \\`type: 'choice'\\`.`\n );\n }\n return;\n }\n\n if (typeof config.choice !== 'function') {\n throw new Error(\n `Choice state \"${stateNode.id}\" must declare a \\`choice\\` function.`\n );\n }\n\n for (const key of CHOICE_CONFIG_KEYS) {\n if (config[key] !== undefined) {\n throw new Error(\n `Choice state \"${stateNode.id}\" cannot declare \\`${key}\\`.`\n );\n }\n }\n}\n\nfunction formatChoiceTransitions(\n stateNode: AnyStateNode\n): AnyTransitionDefinition[] {\n const choice = (stateNode.config as any).choice;\n const validateChoiceResult = (result: any): AnyTransitionConfig => {\n if (!result || result.target === undefined) {\n throw new Error(\n `Choice state \"${stateNode.id}\" must resolve to a target.`\n );\n }\n for (const key of ['actions', 'to', 'context'] as const) {\n if (result[key] !== undefined) {\n throw new Error(\n `Choice state \"${stateNode.id}\" cannot declare \\`${key}\\` on a choice.`\n );\n }\n }\n return result;\n };\n\n return [\n formatTransition(stateNode, NULL_EVENT, {\n to: (args: any) => validateChoiceResult(choice(args))\n } as AnyTransitionConfig)\n ];\n}\n\nfunction mapTransitionConfigs<T>(\n transitionsConfig: unknown,\n mapper: (transition: AnyTransitionConfig) => T\n): T[] {\n const transitionConfigs = toTransitionConfigArray(transitionsConfig as any);\n const transitions = new Array<T>(transitionConfigs.length);\n\n for (let i = 0; i < transitionConfigs.length; i++) {\n transitions[i] = mapper(transitionConfigs[i]);\n }\n\n return transitions;\n}\n\nfunction formatTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode\n): Map<string, TransitionDefinition<TContext, TEvent>[]> {\n const transitions = new Map<\n string,\n TransitionDefinition<TContext, AnyEventObject>[]\n >();\n if (stateNode.config.on) {\n for (const descriptor of Object.keys(stateNode.config.on)) {\n if (descriptor === NULL_EVENT) {\n throw new Error(\n 'Null events (\"\") cannot be specified as a transition key. Use `always: { ... }` instead.'\n );\n }\n const transitionsConfig = stateNode.config.on[descriptor];\n transitions.set(\n descriptor,\n mapTransitionConfigs(transitionsConfig, (transition) =>\n formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n }\n if (stateNode.config.onDone) {\n const descriptor = `xstate.done.state.${stateNode.id}`;\n transitions.set(\n descriptor,\n mapTransitionConfigs(stateNode.config.onDone, (transition) =>\n formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n const createCancelInvokeTimeoutTransition = (\n descriptor: string,\n timeoutEventType: string\n ): AnyTransitionDefinition =>\n formatTransition(stateNode, descriptor, {\n to: (_args: any, enq: any) => {\n enq.cancel(timeoutEventType);\n return {};\n }\n } as AnyTransitionConfig);\n const formatInvokeCompletionTransition = (\n descriptor: string,\n transitionConfig: AnyTransitionConfig,\n timeoutEventType: string\n ): AnyTransitionDefinition => {\n const { target, to, reenter, ...rest } = transitionConfig;\n\n return formatTransition(stateNode, descriptor, {\n ...rest,\n reenter,\n to: (args: any, enq: any) => {\n if (to) {\n let didEnqueue = false;\n const trackingEnqueue = new Proxy(enq, {\n apply(target, thisArg, argArray) {\n didEnqueue = true;\n return Reflect.apply(target, thisArg, argArray);\n },\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (typeof value !== 'function') {\n return value;\n }\n\n return (...argArray: any[]) => {\n didEnqueue = true;\n return value.apply(target, argArray);\n };\n }\n });\n const result = to(args, trackingEnqueue);\n\n if (result !== undefined || didEnqueue) {\n enq.cancel(timeoutEventType);\n }\n\n return result;\n }\n\n enq.cancel(timeoutEventType);\n return {\n target,\n reenter\n };\n }\n } as AnyTransitionConfig);\n };\n for (const invokeDef of stateNode.invoke) {\n const invokeTimeoutEventType =\n invokeDef.timeout !== undefined\n ? createInvokeTimeoutEvent(invokeDef.id).type\n : undefined;\n\n if (invokeDef.onDone) {\n const descriptor = `xstate.done.actor.${invokeDef.id}`;\n const invokeDoneTransitions = mapTransitionConfigs(\n invokeDef.onDone,\n (transition) =>\n invokeTimeoutEventType\n ? formatInvokeCompletionTransition(\n descriptor,\n transition,\n invokeTimeoutEventType\n )\n : formatTransition(stateNode, descriptor, transition)\n );\n\n if (invokeTimeoutEventType) {\n invokeDoneTransitions.push(\n createCancelInvokeTimeoutTransition(\n descriptor,\n invokeTimeoutEventType\n )\n );\n }\n\n transitions.set(descriptor, invokeDoneTransitions);\n } else if (invokeTimeoutEventType) {\n const descriptor = `xstate.done.actor.${invokeDef.id}`;\n transitions.set(descriptor, [\n createCancelInvokeTimeoutTransition(descriptor, invokeTimeoutEventType)\n ]);\n }\n if (invokeDef.onError) {\n const descriptor = `xstate.error.actor.${invokeDef.id}`;\n transitions.set(\n descriptor,\n mapTransitionConfigs(invokeDef.onError, (transition) =>\n invokeTimeoutEventType\n ? formatInvokeCompletionTransition(\n descriptor,\n transition,\n invokeTimeoutEventType\n )\n : formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n if (invokeDef.onSnapshot) {\n const descriptor = `xstate.snapshot.${invokeDef.id}`;\n transitions.set(\n descriptor,\n mapTransitionConfigs(invokeDef.onSnapshot, (transition) =>\n formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n }\n for (const delayedTransition of stateNode.after) {\n let existing = transitions.get(delayedTransition.eventType);\n if (!existing) {\n existing = [];\n transitions.set(delayedTransition.eventType, existing);\n }\n existing.push(\n delayedTransition as TransitionDefinition<TContext, AnyEventObject>\n );\n }\n return transitions as Map<string, TransitionDefinition<TContext, any>[]>;\n}\n\nfunction formatInitialTransition(\n stateNode: AnyStateNode,\n _target: string | { target: string; input?: any } | undefined\n): InitialTransitionDefinition {\n const targetString =\n typeof _target === 'object' && _target !== null ? _target.target : _target;\n const input =\n typeof _target === 'object' && _target !== null ? _target.input : undefined;\n const resolvedTarget =\n typeof targetString === 'string'\n ? stateNode.states[targetString]\n : undefined;\n if (!resolvedTarget && targetString) {\n throw new Error(\n `Initial state node \"${targetString}\" not found on parent state node #${stateNode.id}`\n );\n }\n const transition: InitialTransitionDefinition = {\n source: stateNode,\n target: resolvedTarget ? [resolvedTarget] : undefined,\n input\n };\n\n return transition;\n}\n","import isDevelopment from '#is-development';\nimport { $$ACTOR_TYPE, createActor } from './createActor.ts';\nimport { createInitEvent } from './eventUtils.ts';\n\nimport { createSpawner } from './spawn.ts';\nimport {\n createMachineSnapshot,\n getPersistedSnapshot,\n MachineSnapshot\n} from './State.ts';\nimport { StateNode } from './StateNode.ts';\nimport {\n formatRouteTransitions,\n getAllStateNodes,\n getStateNodeByPath,\n getStateNodes,\n initialMicrostep,\n isInFinalState,\n isStateId,\n macrostep,\n resolveStateValue,\n transitionNode\n} from './stateUtils.ts';\nimport { resolveAndExecuteActionsWithContext } from './transitionActions.ts';\nimport { AnyActorSystem } from './system.ts';\nimport type {\n ActorLogic,\n ActorScope,\n AnyActor,\n AnyActorLogic,\n AnyActorRef,\n AnyActorScope,\n AnyEventObject,\n AnyTransitionDefinition,\n Equals,\n EventDescriptor,\n EventObject,\n HistoryValue,\n MachineContext,\n MetaObject,\n Snapshot,\n SnapshotFrom,\n StateValue,\n StateSchema,\n SnapshotStatus,\n AnyStateNode\n} from './types.ts';\nimport {\n Implementations,\n Next_MachineConfig,\n MachineOptions\n} from './types.v6.ts';\nimport {\n matchesEventDescriptor,\n resolveReferencedActor,\n toStatePath\n} from './utils.ts';\n\nconst STATE_IDENTIFIER = '#';\n\nexport class StateMachine<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TInput,\n TOutput,\n TEmitted extends EventObject,\n TMeta extends MetaObject,\n TConfig extends StateSchema,\n TActionMap extends Implementations['actions'],\n TActorMap extends Implementations['actors'],\n TGuardMap extends Implementations['guards'],\n TDelayMap extends Implementations['delays']\n> implements\n ActorLogic<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n TEvent,\n TInput,\n AnyActorSystem,\n TEmitted\n >\n{\n /** The machine's own version. */\n public version?: string;\n\n public schemas: unknown;\n\n public implementations: Implementations;\n\n /** Runtime options for machine execution. */\n public options: MachineOptions;\n\n /** @internal */\n public idMap: Map<string, AnyStateNode> = new Map();\n\n public root: StateNode<TContext, TEvent>;\n\n public id: string;\n\n public states: StateNode<TContext, TEvent>['states'];\n public events: Array<EventDescriptor<TEvent>>;\n public internalEventDescriptors: ReadonlyArray<string>;\n constructor(\n /** The raw config used to create the machine. */\n public config: Next_MachineConfig<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any // TEmitted\n > & {\n schemas?: unknown;\n internalEvents?: readonly string[];\n },\n implementations?: Implementations\n ) {\n this.id = config.id || '(machine)';\n this.implementations = {\n actors: config.actors ?? {},\n actions: config.actions ?? {},\n delays: (config.delays ?? {}) as Implementations['delays'],\n guards: config.guards ?? {},\n ...implementations\n };\n if (isDevelopment) {\n // The `@xstate.` prefix is reserved for built-in serialized action and\n // guard descriptors — user implementation names must not collide.\n for (const kind of ['actions', 'guards', 'actors', 'delays'] as const) {\n for (const key of Object.keys(this.implementations[kind])) {\n if (key.startsWith('@xstate.')) {\n throw new Error(\n `Invalid ${kind} name '${key}': the '@xstate.' prefix is reserved for built-in descriptors.`\n );\n }\n }\n }\n }\n this.version = this.config.version;\n this.schemas = this.config.schemas;\n this.internalEventDescriptors = this.config.internalEvents ?? [];\n this.options = {\n maxIterations: Infinity,\n ...this.config.options\n };\n\n this.transition = this.transition.bind(this);\n this.getInitialSnapshot = this.getInitialSnapshot.bind(this);\n this.getPersistedSnapshot = this.getPersistedSnapshot.bind(this);\n this.restoreSnapshot = this.restoreSnapshot.bind(this);\n this.start = this.start.bind(this);\n\n this.root = new StateNode(config as any, {\n _key: this.id,\n _machine: this as any\n });\n\n this.root._initialize();\n formatRouteTransitions(this.root);\n this.root._refreshEventMetadata();\n\n this.states = this.root.states; // TODO: remove!\n this.events = this.root.events;\n\n if (\n isDevelopment &&\n !('output' in this.root) &&\n Object.values(this.states).some(\n (state) => state.type === 'final' && 'output' in state\n )\n ) {\n console.warn(\n 'Missing `machine.output` declaration (top-level final state with output detected)'\n );\n }\n }\n\n /**\n * Clones this state machine with the provided implementations.\n *\n * @param implementations Options (`actions`, `guards`, `actors`, `delays`) to\n * recursively merge with the existing options.\n * @returns A new `StateMachine` instance with the provided implementations.\n */\n public provide(implementations: {\n actions?: Partial<TActionMap>;\n actors?: Partial<TActorMap>;\n guards?: Partial<TGuardMap>;\n delays?: Partial<TDelayMap>;\n }): StateMachine<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TInput,\n TOutput,\n TEmitted,\n TMeta,\n TConfig,\n TActionMap,\n TActorMap,\n TGuardMap,\n TDelayMap\n > {\n const { actions, guards, actors, delays } = this.implementations;\n\n const provided = new StateMachine(this.config, {\n actions: {\n ...actions,\n ...implementations.actions\n } as Implementations['actions'],\n guards: {\n ...guards,\n ...implementations.guards\n } as Implementations['guards'],\n actors: {\n ...actors,\n ...implementations.actors\n } as Implementations['actors'],\n delays: {\n ...delays,\n ...implementations.delays\n } as Implementations['delays']\n }) as unknown as this;\n // Providing implementations does not change the serializable definition.\n provided._json = this._json;\n return provided;\n }\n\n public resolveState(\n config: {\n value: StateValue;\n context?: TContext;\n historyValue?: HistoryValue;\n status?: SnapshotStatus;\n output?: TOutput;\n error?: unknown;\n } & ([TContext] extends [never]\n ? {}\n : Equals<TContext, MachineContext> extends false\n ? { context: unknown }\n : {})\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const resolvedStateValue = resolveStateValue(this.root, config.value);\n const nodeSet = getAllStateNodes(\n getStateNodes(this.root, resolvedStateValue)\n );\n const nodes = [...nodeSet];\n\n return createMachineSnapshot(\n {\n _nodes: nodes,\n value: resolvedStateValue,\n context: config.context || ({} as TContext),\n children: {},\n status: isInFinalState(nodeSet, this.root)\n ? 'done'\n : config.status || 'active',\n output: config.output,\n error: config.error,\n historyValue: config.historyValue\n },\n this\n ) as MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >;\n }\n\n /**\n * Determines the next snapshot given the current `snapshot` and received\n * `event`. Calculates a full macrostep from all microsteps.\n *\n * @param snapshot The current snapshot\n * @param event The received event\n */\n public transition(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n event: TEvent,\n actorScope: ActorScope<typeof snapshot, TEvent, AnyActorSystem, TEmitted>\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n return macrostep(snapshot, event, actorScope, []).snapshot;\n }\n\n /**\n * Determines the next state given the current `state` and `event`. Calculates\n * a microstep.\n *\n * @param state The current state\n * @param event The received event\n */\n public microstep(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n event: TEvent,\n actorScope: AnyActorScope\n ): Array<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >\n > {\n const { microsteps } = macrostep(snapshot, event, actorScope, []);\n const snapshots = new Array(microsteps.length);\n\n for (let i = 0; i < microsteps.length; i++) {\n snapshots[i] = microsteps[i][0];\n }\n\n return snapshots;\n }\n\n public getTransitionData(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n event: TEvent,\n self: AnyActor\n ): Array<AnyTransitionDefinition> {\n return (\n transitionNode(this.root, snapshot.value, snapshot, event, self) || []\n );\n }\n\n public isInternalEventType(eventType: string): boolean {\n for (const descriptor of this.internalEventDescriptors) {\n if (matchesEventDescriptor(eventType, descriptor)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * The initial state _before_ evaluating any microsteps. This \"pre-initial\"\n * state is provided to initial actions executed in the initial state.\n *\n * @internal\n */\n _getPreInitialState(\n actorScope: AnyActorScope,\n initEvent: any\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const { context } = this.config;\n\n const preInitial = createMachineSnapshot(\n {\n context:\n typeof context !== 'function' && context ? context : ({} as TContext),\n _nodes: [this.root],\n children: {},\n status: 'active'\n },\n this\n );\n\n if (typeof context === 'function') {\n const children = {};\n const spawn = createSpawner(actorScope, preInitial, initEvent, children);\n const resolvedContext = context({\n spawn,\n input: initEvent.input,\n self: actorScope.self,\n actors: this.implementations.actors\n });\n const nextState = resolveAndExecuteActionsWithContext(\n preInitial,\n initEvent,\n actorScope,\n []\n ) as any;\n if (resolvedContext) {\n nextState.context = resolvedContext;\n }\n if (Object.keys(children).length > 0) {\n nextState.children = {\n ...nextState.children,\n ...children\n };\n }\n return nextState as SnapshotFrom<this>;\n }\n\n return preInitial as SnapshotFrom<this>;\n }\n\n /**\n * Returns the initial `State` instance, with reference to `self` as an\n * `ActorRef`.\n */\n public getInitialSnapshot(\n actorScope: ActorScope<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n TEvent,\n AnyActorSystem,\n TEmitted\n >,\n input?: TInput\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const initEvent = createInitEvent(input) as unknown as TEvent; // TODO: fix;\n const internalQueue: AnyEventObject[] = [];\n const preInitialState = this._getPreInitialState(actorScope, initEvent);\n const [nextState] = initialMicrostep(\n this.root,\n preInitialState,\n actorScope,\n initEvent,\n internalQueue\n );\n\n const { snapshot: macroState } = macrostep(\n nextState,\n initEvent as AnyEventObject,\n actorScope,\n internalQueue\n );\n\n return macroState as SnapshotFrom<this>;\n }\n\n public start(\n snapshot?: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >\n ): void {\n // Start rehydrated children that were active when persisted. Freshly\n // invoked/spawned children are NOT started here — they start via deferred\n // `@xstate.start` actions so sync start errors route to `onError`.\n if (!snapshot?.children) {\n return;\n }\n for (const child of Object.values(\n snapshot.children as unknown as Record<string, AnyActor>\n )) {\n if (\n (child as any)._rehydrated &&\n (child as any).getSnapshot?.().status === 'active'\n ) {\n (child as any).start();\n }\n }\n }\n\n public getStateNodeById(stateId: string): StateNode<TContext, TEvent> {\n const fullPath = toStatePath(stateId);\n const relativePath = fullPath.slice(1);\n const resolvedStateId = isStateId(fullPath[0])\n ? fullPath[0].slice(STATE_IDENTIFIER.length)\n : fullPath[0];\n\n const stateNode = this.idMap.get(resolvedStateId);\n if (!stateNode) {\n throw new Error(\n `Child state node '#${resolvedStateId}' does not exist on machine '${this.id}'`\n );\n }\n return getStateNodeByPath(stateNode, relativePath) as StateNode<\n TContext,\n TEvent\n >;\n }\n\n public getPersistedSnapshot(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n options?: unknown\n ) {\n return getPersistedSnapshot(snapshot, options);\n }\n\n /**\n * The original JSON definition this machine was created from (set by\n * `createMachineFromConfig`), if any. Used by `serializeMachine` for lossless\n * round-trips.\n *\n * @internal\n */\n public _json?: Record<string, unknown>;\n\n public restoreSnapshot(\n snapshot: Snapshot<unknown>,\n _actorScope: ActorScope<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n TEvent,\n AnyActorSystem,\n TEmitted\n >\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const persistedVersion: string | undefined = (snapshot as any).version;\n if (persistedVersion !== this.version) {\n const migrate = (this.config as any).migrate;\n if (typeof migrate !== 'function') {\n throw new Error(\n isDevelopment\n ? `Persisted snapshot version '${persistedVersion}' does not match machine version '${this.version}' for machine '${this.id}'. Provide a \\`migrate(persistedSnapshot, fromVersion)\\` function in the machine config to migrate old snapshots.`\n : `Persisted snapshot version '${persistedVersion}' does not match machine version '${this.version}'.`\n );\n }\n snapshot = migrate(snapshot, persistedVersion);\n }\n\n const snapshotData = snapshot as any;\n const children: Record<string, AnyActor> = {};\n const snapshotChildren: Record<\n string,\n {\n src: string | AnyActorLogic;\n snapshot: Snapshot<unknown>;\n syncSnapshot?: boolean;\n systemId?: string;\n }\n > = snapshotData.children;\n\n for (const actorId of Object.keys(snapshotChildren)) {\n const actorData = snapshotChildren[actorId];\n const childState = actorData.snapshot;\n const src = actorData.src;\n\n const logic =\n typeof src === 'string' ? resolveReferencedActor(this, src) : src;\n\n if (!logic) {\n continue;\n }\n\n const actor = createActor(logic, {\n id: actorId,\n parent: _actorScope.self,\n syncSnapshot: actorData.syncSnapshot,\n snapshot: childState,\n src,\n systemId: actorData.systemId\n });\n // Mark so `start()` knows to start this child (freshly invoked/spawned\n // children are started via deferred `@xstate.start` actions instead).\n (actor as any)._rehydrated = true;\n\n children[actorId] = actor;\n }\n\n const reviveHistoryValue = (\n historyValue: Record<\n string,\n ({ id: string } | StateNode<TContext, TEvent>)[]\n >\n ): HistoryValue => {\n if (!historyValue || typeof historyValue !== 'object') {\n return {};\n }\n const revived: HistoryValue = {};\n for (const key of Object.keys(historyValue)) {\n const arr = historyValue[key];\n\n for (const item of arr) {\n let resolved: StateNode<TContext, TEvent> | undefined;\n\n if (item instanceof StateNode) {\n resolved = item;\n } else {\n try {\n resolved = this.root.machine.getStateNodeById(item.id);\n } catch {\n if (isDevelopment) {\n console.warn(`Could not resolve StateNode for id: ${item.id}`);\n }\n }\n }\n\n if (!resolved) {\n continue;\n }\n\n revived[key] ??= [];\n revived[key].push(resolved);\n }\n }\n return revived;\n };\n\n const revivedHistoryValue = reviveHistoryValue(snapshotData.historyValue);\n const nodes = Array.from(\n getAllStateNodes(getStateNodes(this.root, snapshotData.value))\n );\n\n const { version: _persistedSnapshotVersion, ...persistedRest } =\n snapshot as any;\n const restoredSnapshot = createMachineSnapshot(\n {\n ...persistedRest,\n children,\n _nodes: nodes,\n value: snapshotData.value,\n historyValue: revivedHistoryValue\n },\n this\n ) as MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >;\n\n const seen = new WeakSet<Record<string, unknown>>();\n\n function reviveContext(contextPart: Record<string, unknown>) {\n if (seen.has(contextPart)) {\n return;\n }\n seen.add(contextPart);\n for (const key of Object.keys(contextPart)) {\n const value: unknown = contextPart[key];\n\n if (value && typeof value === 'object') {\n if ('xstate$$type' in value && value.xstate$$type === $$ACTOR_TYPE) {\n contextPart[key] = children[(value as any).id];\n continue;\n }\n reviveContext(value as typeof contextPart);\n }\n }\n }\n\n reviveContext(restoredSnapshot.context);\n\n return restoredSnapshot;\n }\n}\n","import {\n SerializationConfig,\n StatePath,\n TestMeta,\n TestPathResult\n} from './types.ts';\nimport { AnyMachineSnapshot, MachineContext } from '../index.ts';\n\ninterface TestResultStringOptions extends SerializationConfig<any, any> {\n formatColor: (color: string, string: string) => string;\n}\n\nexport function simpleStringify(value: any): string {\n return JSON.stringify(value);\n}\n\nexport function formatPathTestResult(\n path: StatePath<any, any>,\n testPathResult: TestPathResult,\n options?: Partial<TestResultStringOptions>\n): string {\n const resolvedOptions: TestResultStringOptions = {\n formatColor: (_color, string) => string,\n serializeState: simpleStringify,\n serializeEvent: simpleStringify,\n ...options\n };\n\n const { formatColor, serializeState, serializeEvent } = resolvedOptions;\n\n const { state } = path;\n\n const targetStateString = serializeState(\n state,\n path.steps.length ? path.steps[path.steps.length - 1].event : undefined\n );\n\n let errMessage = '';\n let hasFailed = false;\n errMessage +=\n '\\nPath:\\n' +\n testPathResult.steps\n .map((s, i, steps) => {\n const stateString = serializeState(\n s.step.state,\n i > 0 ? steps[i - 1].step.event : undefined\n );\n const eventString = serializeEvent(s.step.event);\n\n const stateResult = `\\tState: ${\n hasFailed\n ? formatColor('gray', stateString)\n : s.state.error\n ? ((hasFailed = true), formatColor('redBright', stateString))\n : formatColor('greenBright', stateString)\n }`;\n const eventResult = `\\tEvent: ${\n hasFailed\n ? formatColor('gray', eventString)\n : s.event.error\n ? ((hasFailed = true), formatColor('red', eventString))\n : formatColor('green', eventString)\n }`;\n\n return [stateResult, eventResult].join('\\n');\n })\n .concat(\n `\\tState: ${\n hasFailed\n ? formatColor('gray', targetStateString)\n : testPathResult.state.error\n ? formatColor('red', targetStateString)\n : formatColor('green', targetStateString)\n }`\n )\n .join('\\n\\n');\n\n return errMessage;\n}\n\nexport function getDescription<T, TContext extends MachineContext>(\n snapshot: AnyMachineSnapshot\n): string {\n const contextString = !Object.keys(snapshot.context).length\n ? ''\n : `(${JSON.stringify(snapshot.context)})`;\n\n const stateStrings = snapshot._nodes\n .filter((sn) => sn.type === 'atomic' || sn.type === 'final')\n .map(({ id, path }) => {\n const meta = snapshot.getMeta()[id] as TestMeta<T, TContext>;\n if (!meta) {\n return `\"${path.join('.')}\"`;\n }\n\n const { description } = meta;\n\n if (typeof description === 'function') {\n return description(snapshot);\n }\n\n return description ? `\"${description}\"` : JSON.stringify(snapshot.value);\n });\n\n return (\n `state${stateStrings.length === 1 ? '' : 's'} ` +\n stateStrings.join(', ') +\n ` ${contextString}`.trim()\n );\n}\n","import { StatePath } from './index.ts';\nimport { EventObject, Snapshot } from '../index.ts';\nimport { simpleStringify } from './utils.ts';\n\n/**\n * Deduplicates your paths so that A -> B is not executed separately to A -> B\n * -> C\n */\nexport const deduplicatePaths = <\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject\n>(\n paths: StatePath<TSnapshot, TEvent>[],\n serializeEvent: (event: TEvent) => string = simpleStringify\n): StatePath<TSnapshot, TEvent>[] => {\n /** Put all paths on the same level so we can dedup them */\n const allPathsWithEventSequence: Array<{\n path: StatePath<TSnapshot, TEvent>;\n eventSequence: string[];\n }> = [];\n\n paths.forEach((path) => {\n allPathsWithEventSequence.push({\n path,\n eventSequence: path.steps.map((step) => serializeEvent(step.event))\n });\n });\n\n // Sort by path length, descending\n allPathsWithEventSequence.sort(\n (a, z) => z.path.steps.length - a.path.steps.length\n );\n\n const superpathsWithEventSequence: typeof allPathsWithEventSequence = [];\n\n /** Filter out the paths that are subpaths of superpaths */\n pathLoop: for (const pathWithEventSequence of allPathsWithEventSequence) {\n // Check each existing superpath to see if the path is a subpath of it\n superpathLoop: for (const superpathWithEventSequence of superpathsWithEventSequence) {\n // eslint-disable-next-line @typescript-eslint/no-for-in-array\n for (const i in pathWithEventSequence.eventSequence) {\n // Check event sequence to determine if path is subpath, e.g.:\n //\n // This will short-circuit the check\n // ['a', 'b', 'c', 'd'] (superpath)\n // ['a', 'b', 'x'] (path)\n //\n // This will not short-circuit; path is subpath\n // ['a', 'b', 'c', 'd'] (superpath)\n // ['a', 'b', 'c'] (path)\n if (\n pathWithEventSequence.eventSequence[i] !==\n superpathWithEventSequence.eventSequence[i]\n ) {\n // If the path is different from the superpath,\n // continue to the next superpath\n continue superpathLoop;\n }\n }\n\n // If we reached here, path is subpath of superpath\n // Continue & do not add path to superpaths\n continue pathLoop;\n }\n\n // If we reached here, path is not a subpath of any existing superpaths\n // So add it to the superpaths\n superpathsWithEventSequence.push(pathWithEventSequence);\n }\n\n return superpathsWithEventSequence.map((path) => path.path);\n};\n","import { getShortestPaths, getSimplePaths } from './index.ts';\nimport { EventObject, Snapshot } from '../index.ts';\nimport { PathGenerator } from './types.ts';\n\nexport const createShortestPathsGen =\n <\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n >(): PathGenerator<TSnapshot, TEvent, TInput> =>\n (logic, defaultOptions) => {\n const paths = getShortestPaths(logic, defaultOptions);\n\n return paths;\n };\n\nexport const createSimplePathsGen =\n <\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n >(): PathGenerator<TSnapshot, TEvent, TInput> =>\n (logic, defaultOptions) => {\n const paths = getSimplePaths(logic, defaultOptions);\n\n return paths;\n };\n","import {\n getPathsFromEvents,\n getAdjacencyMap,\n joinPaths,\n serializeSnapshot\n} from './index.ts';\nimport type {\n AdjacencyMap,\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n Step,\n TraversalOptions,\n EventExecutor,\n PathGenerator,\n TestModelOptions,\n TestParam,\n TestPath,\n TestPathResult,\n TestStepResult\n} from './types.ts';\nimport {\n EventObject,\n ActorLogic,\n Snapshot,\n isMachineSnapshot,\n __unsafe_getAllOwnEventDescriptors,\n AnyActorRef,\n AnyEventObject,\n AnyStateMachine,\n EventFromLogic,\n MachineContext,\n MachineSnapshot,\n SnapshotFrom,\n StateValue,\n TODO,\n InputFrom\n} from '../index.ts';\nimport { deduplicatePaths } from './deduplicatePaths.ts';\nimport {\n createShortestPathsGen,\n createSimplePathsGen\n} from './pathGenerators.ts';\nimport {\n formatPathTestResult,\n getDescription,\n simpleStringify\n} from './utils.ts';\nimport { validateMachine } from './validateMachine.ts';\n\ntype GetPathOptions<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n> = Partial<TraversalOptions<TSnapshot, TEvent, TInput>> & {\n /**\n * Whether to allow deduplicate paths so that paths that are contained by\n * longer paths are included.\n *\n * @default false\n */\n allowDuplicatePaths?: boolean;\n};\n\n/**\n * Creates a test model that represents an abstract model of a system under test\n * (SUT).\n *\n * The test model is used to generate test paths, which are used to verify that\n * states in the model are reachable in the SUT.\n */\nexport class TestModel<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n> {\n public options: TestModelOptions<TSnapshot, TEvent, TInput>;\n public defaultTraversalOptions?: TraversalOptions<TSnapshot, TEvent, TInput>;\n public getDefaultOptions(): TestModelOptions<TSnapshot, TEvent, TInput> {\n return {\n serializeState: (state) => simpleStringify(state) as SerializedSnapshot,\n serializeEvent: (event) => simpleStringify(event) as SerializedEvent,\n // For non-state-machine test models, we cannot identify\n // separate transitions, so just use event type\n serializeTransition: (state, event) =>\n `${simpleStringify(state)}|${event?.type}`,\n events: [],\n stateMatcher: (_, stateKey) => stateKey === '*',\n logger: {\n log: console.log.bind(console),\n error: console.error.bind(console)\n }\n };\n }\n\n constructor(\n public testLogic: ActorLogic<TSnapshot, TEvent, TInput>,\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ) {\n this.options = {\n ...this.getDefaultOptions(),\n ...options\n };\n }\n\n public getPaths(\n pathGenerator: PathGenerator<TSnapshot, TEvent, TInput>,\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const allowDuplicatePaths = options?.allowDuplicatePaths ?? false;\n const paths = pathGenerator(this.testLogic, this._resolveOptions(options));\n return (allowDuplicatePaths ? paths : deduplicatePaths(paths)).map(\n this._toTestPath\n );\n }\n\n public getShortestPaths(\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n return this.getPaths(createShortestPathsGen(), options);\n }\n\n public getShortestPathsFrom(\n paths: Array<TestPath<TSnapshot, TEvent>>,\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const resultPaths: TestPath<TSnapshot, TEvent>[] = [];\n\n for (const path of paths) {\n const shortestPaths = this.getShortestPaths({\n ...options,\n fromState: path.state\n });\n for (const shortestPath of shortestPaths) {\n resultPaths.push(this._toTestPath(joinPaths(path, shortestPath)));\n }\n }\n\n return resultPaths;\n }\n\n public getSimplePaths(\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n return this.getPaths(createSimplePathsGen(), options);\n }\n\n public getSimplePathsFrom(\n paths: Array<TestPath<TSnapshot, TEvent>>,\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const resultPaths: TestPath<TSnapshot, TEvent>[] = [];\n\n for (const path of paths) {\n const shortestPaths = this.getSimplePaths({\n ...options,\n fromState: path.state\n });\n for (const shortestPath of shortestPaths) {\n resultPaths.push(this._toTestPath(joinPaths(path, shortestPath)));\n }\n }\n\n return resultPaths;\n }\n\n private _toTestPath = (\n statePath: StatePath<TSnapshot, TEvent>\n ): TestPath<TSnapshot, TEvent> => {\n function formatEvent(event: EventObject): string {\n const { type, ...other } = event;\n\n const propertyString = Object.keys(other).length\n ? ` (${JSON.stringify(other)})`\n : '';\n\n return `${type}${propertyString}`;\n }\n\n const eventsString = statePath.steps\n .map((s) => formatEvent(s.event))\n .join(' → ');\n return {\n ...statePath,\n test: (params: TestParam<TSnapshot, TEvent>) =>\n this.testPath(statePath, params),\n description: isMachineSnapshot(statePath.state)\n ? `Reaches ${getDescription(\n statePath.state as any\n ).trim()}: ${eventsString}`\n : JSON.stringify(statePath.state)\n };\n };\n\n public getPathsFromEvents(\n events: TEvent[],\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const paths = getPathsFromEvents(this.testLogic, events, options);\n\n return paths.map(this._toTestPath);\n }\n\n /**\n * An array of adjacencies, which are objects that represent each `state` with\n * the `nextState` given the `event`.\n */\n public getAdjacencyMap(): AdjacencyMap<TSnapshot, TEvent> {\n const adjMap = getAdjacencyMap(this.testLogic, this.options);\n return adjMap;\n }\n\n public async testPath(\n path: StatePath<TSnapshot, TEvent>,\n params: TestParam<TSnapshot, TEvent>,\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ): Promise<TestPathResult> {\n const testPathResult: TestPathResult = {\n steps: [],\n state: {\n error: null\n }\n };\n\n try {\n for (const step of path.steps) {\n const testStepResult: TestStepResult = {\n step,\n state: { error: null },\n event: { error: null }\n };\n\n testPathResult.steps.push(testStepResult);\n\n try {\n await this.testTransition(params, step);\n } catch (err: any) {\n testStepResult.event.error = err;\n\n throw err;\n }\n\n try {\n await this.testState(params, step.state, options);\n } catch (err: any) {\n testStepResult.state.error = err;\n\n throw err;\n }\n }\n } catch (err: any) {\n // TODO: make option\n err.message += formatPathTestResult(path, testPathResult, this.options);\n throw err;\n }\n\n return testPathResult;\n }\n\n public async testState(\n params: TestParam<TSnapshot, TEvent>,\n state: TSnapshot,\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ): Promise<void> {\n const resolvedOptions = this._resolveOptions(options);\n\n const stateTestKeys = this._getStateTestKeys(\n params,\n state,\n resolvedOptions\n );\n\n for (const stateTestKey of stateTestKeys) {\n await params.states?.[stateTestKey](state);\n }\n }\n\n private _getStateTestKeys(\n params: TestParam<TSnapshot, TEvent>,\n state: TSnapshot,\n resolvedOptions: TestModelOptions<TSnapshot, TEvent, TInput>\n ) {\n const states = params.states || {};\n const stateTestKeys = Object.keys(states).filter((stateKey) => {\n return resolvedOptions.stateMatcher(state, stateKey);\n });\n\n // Fallthrough state tests\n if (!stateTestKeys.length && '*' in states) {\n stateTestKeys.push('*');\n }\n\n return stateTestKeys;\n }\n\n private _getEventExec(\n params: TestParam<TSnapshot, TEvent>,\n step: Step<TSnapshot, TEvent>\n ) {\n const eventExec =\n params.events?.[(step.event as any).type as TEvent['type']];\n\n return eventExec;\n }\n\n public async testTransition(\n params: TestParam<TSnapshot, TEvent>,\n step: Step<TSnapshot, TEvent>\n ): Promise<void> {\n const eventExec = this._getEventExec(params, step);\n await (eventExec as EventExecutor<TSnapshot, TEvent>)?.(step);\n }\n\n private _resolveOptions(\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ): TestModelOptions<TSnapshot, TEvent, TInput> {\n return { ...this.defaultTraversalOptions, ...this.options, ...options };\n }\n}\n\nfunction stateValuesEqual(\n a: StateValue | undefined,\n b: StateValue | undefined\n): boolean {\n if (a === b) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n if (typeof a === 'string' || typeof b === 'string') {\n return a === b;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n return (\n aKeys.length === bKeys.length &&\n aKeys.every((key) => stateValuesEqual(a[key], b[key]))\n );\n}\n\nfunction serializeMachineTransition(\n snapshot: MachineSnapshot<\n MachineContext,\n EventObject,\n Record<string, AnyActorRef | undefined>,\n StateValue,\n string,\n unknown,\n TODO, // TMeta\n TODO // TStateSchema\n >,\n event: AnyEventObject | undefined,\n previousSnapshot:\n | MachineSnapshot<\n MachineContext,\n EventObject,\n Record<string, AnyActorRef | undefined>,\n StateValue,\n string,\n unknown,\n TODO, // TMeta\n TODO // TStateSchema\n >\n | undefined,\n { serializeEvent }: { serializeEvent: (event: AnyEventObject) => string }\n): string {\n // TODO: the stateValuesEqual check here is very likely not exactly correct\n // but I'm not sure what the correct check is and what this is trying to do\n if (\n !event ||\n (previousSnapshot &&\n stateValuesEqual(previousSnapshot.value, snapshot.value))\n ) {\n return '';\n }\n\n const prevStateString = previousSnapshot\n ? ` from ${simpleStringify(previousSnapshot.value)}`\n : '';\n\n return ` via ${serializeEvent(event)}${prevStateString}`;\n}\n\n/**\n * Creates a test model that represents an abstract model of a system under test\n * (SUT).\n *\n * The test model is used to generate test paths, which are used to verify that\n * states in the `machine` are reachable in the SUT.\n *\n * @example\n *\n * ```js\n * const toggleModel = createModel(toggleMachine).withEvents({\n * TOGGLE: {\n * exec: async (page) => {\n * await page.click('input');\n * }\n * }\n * });\n * ```\n *\n * @param machine The state machine used to represent the abstract model.\n * @param options Options for the created test model:\n *\n * - `events`: an object mapping string event types (e.g., `SUBMIT`) to an event\n * test config (e.g., `{exec: () => {...}, cases: [...]}`)\n */\nexport function createTestModel<TMachine extends AnyStateMachine>(\n machine: TMachine,\n options?: Partial<\n TestModelOptions<\n SnapshotFrom<TMachine>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n >\n >\n): TestModel<SnapshotFrom<TMachine>, EventFromLogic<TMachine>, unknown> {\n validateMachine(machine);\n\n const serializeEvent = (options?.serializeEvent ?? simpleStringify) as (\n event: AnyEventObject\n ) => string;\n const serializeTransition =\n options?.serializeTransition ?? serializeMachineTransition;\n const { events: getEvents, ...otherOptions } = options ?? {};\n\n const testModel = new TestModel<\n SnapshotFrom<TMachine>,\n EventFromLogic<TMachine>,\n unknown\n >(machine as any, {\n serializeState: (state, event, prevState) => {\n // Only consider the `state` if `serializeTransition()` is opted out (empty string)\n return `${serializeSnapshot(state)}${serializeTransition(\n state,\n event,\n prevState,\n {\n serializeEvent\n }\n )}` as SerializedSnapshot;\n },\n stateMatcher: (state, key) => {\n return key.startsWith('#')\n ? (state as any)._nodes.includes(machine.getStateNodeById(key))\n : (state as any).matches(key);\n },\n events: (state) => {\n const events =\n typeof getEvents === 'function' ? getEvents(state) : (getEvents ?? []);\n\n return __unsafe_getAllOwnEventDescriptors(state).flatMap(\n (eventType: string) => {\n if (events.some((e) => (e as EventObject).type === eventType)) {\n return events.filter((e) => (e as EventObject).type === eventType);\n }\n\n return [{ type: eventType } as any]; // TODO: fix types\n }\n );\n },\n ...otherOptions\n });\n\n return testModel;\n}\n","import { AnyActorScope, createEmptyActor } from '../index.ts';\n\nexport function createMockActorScope(): AnyActorScope {\n const emptyActor = createEmptyActor();\n return {\n self: emptyActor,\n logger: console.log,\n id: '',\n sessionId: Math.random().toString(32).slice(2),\n defer: () => {},\n system: emptyActor.system, // TODO: mock system?\n stopChild: () => {},\n emit: () => {},\n actionExecutor: () => {}\n };\n}\n","import {\n EventObject,\n AnyStateMachine,\n StateMachine,\n StateNode,\n AnyActorLogic,\n EventFromLogic,\n Snapshot,\n __unsafe_getAllOwnEventDescriptors,\n InputFrom\n} from '../index.ts';\nimport type {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n DirectedGraphEdge,\n DirectedGraphNode,\n TraversalOptions,\n AnyStateNode,\n TraversalConfig\n} from './types.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\n/**\n * Returns all state nodes of the given `node`.\n *\n * @param stateNode State node to recursively get child state nodes from\n */\nexport function getStateNodes(stateNode: {\n states: Record<string, AnyStateNode | StateNode<never, EventObject>>;\n}): AnyStateNode[] {\n const { states } = stateNode;\n const nodes = Object.keys(states).reduce((accNodes, stateKey) => {\n const childStateNode = states[stateKey] as AnyStateNode;\n const childStateNodes = getStateNodes(childStateNode);\n\n accNodes.push(childStateNode, ...childStateNodes);\n return accNodes;\n }, [] as AnyStateNode[]);\n\n return nodes;\n}\n\nfunction getChildren(stateNode: AnyStateNode): AnyStateNode[] {\n if (!stateNode.states) {\n return [];\n }\n\n const children = Object.keys(stateNode.states).map((key) => {\n return stateNode.states[key];\n });\n\n return children;\n}\n\nexport function serializeSnapshot(snapshot: Snapshot<any>): SerializedSnapshot {\n const { value, context } = snapshot as any;\n return JSON.stringify({\n value,\n context: Object.keys(context ?? {}).length ? context : undefined\n }) as SerializedSnapshot;\n}\n\nfunction serializeEvent<TEvent extends EventObject>(\n event: TEvent\n): SerializedEvent {\n return JSON.stringify(event) as SerializedEvent;\n}\n\nexport function createDefaultMachineOptions<TMachine extends AnyStateMachine>(\n machine: TMachine,\n options?: TraversalOptions<\n ReturnType<TMachine['transition']>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n >\n): TraversalOptions<\n ReturnType<TMachine['transition']>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n> {\n const { events: getEvents, ...otherOptions } = options ?? {};\n const traversalOptions: TraversalOptions<\n ReturnType<TMachine['transition']>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n > = {\n serializeState: serializeSnapshot,\n serializeEvent,\n events: (state) => {\n const events =\n typeof getEvents === 'function' ? getEvents(state) : (getEvents ?? []);\n return __unsafe_getAllOwnEventDescriptors(state).flatMap((type) => {\n const matchingEvents = events.filter((ev) => (ev as any).type === type);\n if (matchingEvents.length) {\n return matchingEvents;\n }\n return [{ type }];\n }) as any[];\n },\n fromState: machine.getInitialSnapshot(\n createMockActorScope(),\n options?.input\n ) as ReturnType<TMachine['transition']>,\n ...otherOptions\n };\n\n return traversalOptions;\n}\n\nexport function createDefaultLogicOptions(): TraversalOptions<any, any, any> {\n return {\n serializeState: (state) => JSON.stringify(state),\n serializeEvent\n };\n}\n\nexport function toDirectedGraph(\n stateMachine: AnyStateNode | AnyStateMachine\n): DirectedGraphNode {\n const stateNode =\n stateMachine instanceof StateMachine ? stateMachine.root : stateMachine; // TODO: accept only machines\n\n const edges: DirectedGraphEdge[] = [...stateNode.transitions.values()]\n .flat()\n .flatMap((t, transitionIndex) => {\n const targets = t.target ? t.target : [stateNode];\n\n return targets.map((target, targetIndex) => {\n const edge: DirectedGraphEdge = {\n id: `${stateNode.id}:${transitionIndex}:${targetIndex}`,\n source: stateNode,\n target: target as AnyStateNode,\n transition: t,\n label: {\n text: t.eventType,\n toJSON: () => ({ text: t.eventType })\n },\n toJSON: () => {\n const { label } = edge;\n\n return { source: stateNode.id, target: target.id, label };\n }\n };\n\n return edge;\n });\n });\n\n const graph = {\n id: stateNode.id,\n stateNode: stateNode,\n children: getChildren(stateNode).map(toDirectedGraph),\n edges,\n toJSON: () => {\n const { id, children, edges: graphEdges } = graph;\n return { id, children, edges: graphEdges };\n }\n };\n\n return graph;\n}\n\nfunction isMachineLogic(logic: AnyActorLogic): logic is AnyStateMachine {\n return 'getStateNodeById' in logic;\n}\n\nexport function resolveTraversalOptions<TLogic extends AnyActorLogic>(\n logic: TLogic,\n traversalOptions?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >,\n defaultOptions?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >\n): TraversalConfig<ReturnType<TLogic['transition']>, EventFromLogic<TLogic>> {\n const resolvedDefaultOptions =\n defaultOptions ??\n (isMachineLogic(logic)\n ? (createDefaultMachineOptions(\n logic,\n traversalOptions as any\n ) as TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >)\n : undefined);\n const serializeState =\n traversalOptions?.serializeState ??\n resolvedDefaultOptions?.serializeState ??\n ((state) => JSON.stringify(state));\n const traversalConfig: TraversalConfig<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>\n > = {\n serializeState,\n serializeEvent,\n events: [],\n filterEvents: undefined,\n limit: Infinity,\n fromState: undefined,\n toState: undefined,\n // Traversal should not continue past the `toState` predicate\n // since the target state has already been reached at that point\n stopWhen: traversalOptions?.toState,\n ...resolvedDefaultOptions,\n ...traversalOptions\n };\n\n return traversalConfig;\n}\n\nexport function joinPaths<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject\n>(\n headPath: StatePath<TSnapshot, TEvent>,\n tailPath: StatePath<TSnapshot, TEvent>\n): StatePath<TSnapshot, TEvent> {\n const secondPathSource = tailPath.steps[0].state;\n\n if (secondPathSource !== headPath.state) {\n throw new Error(`Paths cannot be joined`);\n }\n\n return {\n state: tailPath.state,\n // e.g. [A, B, C] + [C, D, E] = [A, B, C, D, E]\n steps: headPath.steps.concat(tailPath.steps.slice(1)),\n weight: headPath.weight + tailPath.weight\n };\n}\n","import {\n ActorScope,\n ActorLogic,\n ActorSystem,\n EventObject,\n Snapshot\n} from '../index.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n TraversalOptions,\n AdjacencyMap,\n AdjacencyValue\n} from './types';\nimport { resolveTraversalOptions } from './graph.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nfunction resolveTransitionSnapshot<TSnapshot>(\n result: TSnapshot | [TSnapshot, unknown[]]\n): TSnapshot {\n return Array.isArray(result) ? result[0] : result;\n}\n\nexport function getAdjacencyMap<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n>(\n logic: ActorLogic<TSnapshot, TEvent, TInput, TSystem>,\n options: TraversalOptions<TSnapshot, TEvent, TInput>\n): AdjacencyMap<TSnapshot, TEvent> {\n 'use strict';\n const { transition } = logic;\n const {\n serializeEvent,\n serializeState,\n events: getEvents,\n filterEvents,\n limit,\n fromState: customFromState,\n stopWhen\n } = resolveTraversalOptions(logic, options);\n const actorScope = createMockActorScope() as ActorScope<\n TSnapshot,\n TEvent,\n TSystem\n >;\n const fromState =\n customFromState ??\n logic.getInitialSnapshot(\n actorScope,\n // TODO: fix this\n options.input as TInput\n );\n\n const adj: AdjacencyMap<TSnapshot, TEvent> = {};\n\n let iterations = 0;\n const queue: Array<{\n nextState: TSnapshot;\n event: TEvent | undefined;\n prevState: TSnapshot | undefined;\n }> = [{ nextState: fromState, event: undefined, prevState: undefined }];\n const stateMap = new Map<SerializedSnapshot, TSnapshot>();\n\n while (queue.length) {\n const { nextState: state, event, prevState } = queue.shift()!;\n\n if (iterations++ > limit) {\n throw new Error('Traversal limit exceeded');\n }\n\n const serializedState = serializeState(\n state,\n event,\n prevState\n ) as SerializedSnapshot;\n if (adj[serializedState]) {\n continue;\n }\n stateMap.set(serializedState, state);\n\n adj[serializedState] = {\n state,\n transitions: {}\n };\n\n if (stopWhen && stopWhen(state)) {\n continue;\n }\n\n const events =\n typeof getEvents === 'function' ? getEvents(state) : getEvents;\n\n for (const nextEvent of events) {\n if (filterEvents && !filterEvents(state, nextEvent)) {\n continue;\n }\n\n const nextSnapshot = resolveTransitionSnapshot(\n transition(state, nextEvent, actorScope)\n );\n\n adj[serializedState].transitions[\n serializeEvent(nextEvent) as SerializedEvent\n ] = {\n event: nextEvent,\n state: nextSnapshot\n };\n queue.push({\n nextState: nextSnapshot,\n event: nextEvent,\n prevState: state\n });\n }\n }\n\n return adj;\n}\n\nexport function adjacencyMapToArray<TSnapshot, TEvent>(\n adjMap: AdjacencyMap<TSnapshot, TEvent>\n): Array<{\n state: TSnapshot;\n event: TEvent;\n nextState: TSnapshot;\n}> {\n const adjList: Array<{\n state: TSnapshot;\n event: TEvent;\n nextState: TSnapshot;\n }> = [];\n\n for (const adjValue of Object.values(adjMap)) {\n for (const transition of Object.values(\n (adjValue as AdjacencyValue<TSnapshot, TEvent>).transitions\n )) {\n adjList.push({\n state: (adjValue as AdjacencyValue<TSnapshot, TEvent>).state,\n event: transition.event,\n nextState: transition.state\n });\n }\n }\n\n return adjList;\n}\n","import { XSTATE_INIT } from '../constants.ts';\nimport { StatePath } from './types.ts';\n\n// TODO: rewrite parts of the algorithm leading to this to make this function obsolete\nexport function alterPath<T extends StatePath<any, any>>(path: T): T {\n let steps: T['steps'] = [];\n\n if (!path.steps.length) {\n steps = [\n {\n state: path.state,\n event: { type: XSTATE_INIT }\n }\n ];\n } else {\n for (let i = 0; i < path.steps.length; i++) {\n const step = path.steps[i];\n\n steps.push({\n state: step.state,\n event: i === 0 ? { type: XSTATE_INIT } : path.steps[i - 1].event\n });\n }\n steps.push({\n state: path.state,\n event: path.steps[path.steps.length - 1].event\n });\n }\n return {\n ...path,\n steps\n };\n}\n","import {\n ActorScope,\n ActorLogic,\n ActorSystem,\n AnyStateMachine,\n EventObject,\n Snapshot,\n StateMachine\n} from '../index.ts';\nimport { getAdjacencyMap } from './adjacency.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n Steps,\n TraversalOptions\n} from './types.ts';\nimport {\n resolveTraversalOptions,\n createDefaultMachineOptions,\n createDefaultLogicOptions\n} from './graph.ts';\nimport { alterPath } from './alterPath.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nfunction isMachine(value: any): value is AnyStateMachine {\n return !!value && value instanceof StateMachine;\n}\n\nexport function getPathsFromEvents<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n>(\n logic: ActorLogic<TSnapshot, TEvent, TInput, TSystem>,\n events: TEvent[],\n options?: TraversalOptions<TSnapshot, TEvent, TInput>\n): Array<StatePath<TSnapshot, TEvent>> {\n const resolvedOptions = resolveTraversalOptions(\n logic,\n {\n events,\n ...options\n },\n (isMachine(logic)\n ? createDefaultMachineOptions(logic)\n : createDefaultLogicOptions()) as TraversalOptions<\n TSnapshot,\n TEvent,\n TInput\n >\n );\n const actorScope = createMockActorScope() as ActorScope<\n TSnapshot,\n TEvent,\n TSystem\n >;\n const fromState =\n resolvedOptions.fromState ??\n logic.getInitialSnapshot(\n actorScope,\n // TODO: fix this\n options?.input as TInput\n );\n\n const { serializeState, serializeEvent } = resolvedOptions;\n\n const adjacency = getAdjacencyMap(logic, resolvedOptions);\n\n const stateMap = new Map<SerializedSnapshot, TSnapshot>();\n const steps: Steps<TSnapshot, TEvent> = [];\n\n const serializedFromState = serializeState(\n fromState,\n undefined,\n undefined\n ) as SerializedSnapshot;\n stateMap.set(serializedFromState, fromState);\n\n let stateSerial = serializedFromState;\n\n let state = fromState;\n for (const event of events) {\n steps.push({\n state: stateMap.get(stateSerial)!,\n event\n });\n\n const eventSerial = serializeEvent(event) as SerializedEvent;\n const { state: nextState, event: _nextEvent } =\n adjacency[stateSerial].transitions[eventSerial];\n\n if (!nextState) {\n throw new Error(\n `Invalid transition from ${stateSerial} with ${eventSerial}`\n );\n }\n const prevState = stateMap.get(stateSerial);\n const nextStateSerial = serializeState(\n nextState,\n event,\n prevState\n ) as SerializedSnapshot;\n stateMap.set(nextStateSerial, nextState);\n\n stateSerial = nextStateSerial;\n state = nextState;\n }\n\n // If it is expected to reach a specific state (`toState`) and that state\n // isn't reached, there are no paths\n if (resolvedOptions.toState && !resolvedOptions.toState(state)) {\n return [];\n }\n\n return [\n alterPath({\n state,\n steps,\n weight: steps.length\n })\n ];\n}\n","import { AnyActorLogic, EventFromLogic, InputFrom } from '../index.ts';\nimport { getAdjacencyMap } from './adjacency.ts';\nimport { alterPath } from './alterPath.ts';\nimport { resolveTraversalOptions } from './graph.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n StatePlanMap,\n TraversalOptions\n} from './types.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nexport function getShortestPaths<TLogic extends AnyActorLogic>(\n logic: TLogic,\n options?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >\n): Array<StatePath<ReturnType<TLogic['transition']>, EventFromLogic<TLogic>>> {\n type TInternalState = ReturnType<TLogic['transition']>;\n type TEvent = EventFromLogic<TLogic>;\n\n const resolvedOptions = resolveTraversalOptions(logic, options);\n const serializeState = resolvedOptions.serializeState as (\n ...args: Parameters<typeof resolvedOptions.serializeState>\n ) => SerializedSnapshot;\n const fromState =\n resolvedOptions.fromState ??\n logic.getInitialSnapshot(createMockActorScope(), options?.input);\n const adjacency = getAdjacencyMap(logic, resolvedOptions);\n\n // weight, state, event\n const weightMap = new Map<\n SerializedSnapshot,\n {\n weight: number;\n state: SerializedSnapshot | undefined;\n event: TEvent | undefined;\n }\n >();\n const stateMap = new Map<SerializedSnapshot, TInternalState>();\n const serializedFromState = serializeState(fromState, undefined, undefined);\n stateMap.set(serializedFromState, fromState);\n\n weightMap.set(serializedFromState, {\n weight: 0,\n state: undefined,\n event: undefined\n });\n const unvisited = new Set<SerializedSnapshot>();\n const visited = new Set<SerializedSnapshot>();\n\n unvisited.add(serializedFromState);\n for (const serializedState of unvisited) {\n const prevState = stateMap.get(serializedState);\n const { weight } = weightMap.get(serializedState)!;\n for (const event of Object.keys(\n adjacency[serializedState].transitions\n ) as SerializedEvent[]) {\n const { state: nextState, event: eventObject } =\n adjacency[serializedState].transitions[event];\n const nextSerializedState = serializeState(\n nextState,\n eventObject,\n prevState\n );\n stateMap.set(nextSerializedState, nextState);\n if (!weightMap.has(nextSerializedState)) {\n weightMap.set(nextSerializedState, {\n weight: weight + 1,\n state: serializedState,\n event: eventObject\n });\n } else {\n const { weight: nextWeight } = weightMap.get(nextSerializedState)!;\n if (nextWeight > weight + 1) {\n weightMap.set(nextSerializedState, {\n weight: weight + 1,\n state: serializedState,\n event: eventObject\n });\n }\n }\n if (!visited.has(nextSerializedState)) {\n unvisited.add(nextSerializedState);\n }\n }\n visited.add(serializedState);\n unvisited.delete(serializedState);\n }\n\n const statePlanMap: StatePlanMap<TInternalState, TEvent> = {};\n const paths: Array<StatePath<TInternalState, TEvent>> = [];\n\n weightMap.forEach(\n ({ weight, state: fromState, event: fromEvent }, stateSerial) => {\n const state = stateMap.get(stateSerial)!;\n const steps = !fromState\n ? []\n : statePlanMap[fromState].paths[0].steps.concat({\n state: stateMap.get(fromState)!,\n event: fromEvent!\n });\n\n paths.push({\n state,\n steps,\n weight\n });\n statePlanMap[stateSerial] = {\n state,\n paths: [\n {\n state,\n steps,\n weight\n }\n ]\n };\n }\n );\n\n if (resolvedOptions.toState) {\n return paths\n .filter((path) => resolvedOptions.toState!(path.state))\n .map(alterPath);\n }\n\n return paths.map(alterPath);\n}\n","import { AnyActorLogic, EventFromLogic, InputFrom } from '../index.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n Steps,\n TraversalOptions,\n VisitedContext\n} from './types.ts';\nimport { resolveTraversalOptions } from './graph.ts';\nimport { getAdjacencyMap } from './adjacency.ts';\nimport { alterPath } from './alterPath.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nexport function getSimplePaths<TLogic extends AnyActorLogic>(\n logic: TLogic,\n options?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >\n): Array<StatePath<ReturnType<TLogic['transition']>, EventFromLogic<TLogic>>> {\n type TState = ReturnType<TLogic['transition']>;\n type TEvent = EventFromLogic<TLogic>;\n\n const resolvedOptions = resolveTraversalOptions(logic, options);\n const actorScope = createMockActorScope();\n const fromState =\n resolvedOptions.fromState ??\n logic.getInitialSnapshot(actorScope, options?.input);\n const serializeState = resolvedOptions.serializeState as (\n ...args: Parameters<typeof resolvedOptions.serializeState>\n ) => SerializedSnapshot;\n const adjacency = getAdjacencyMap(logic, resolvedOptions);\n const stateMap = new Map<SerializedSnapshot, TState>();\n const visitCtx: VisitedContext<TState, TEvent> = {\n vertices: new Set(),\n edges: new Set()\n };\n const steps: Steps<TState, TEvent> = [];\n const pathMap: Record<\n SerializedSnapshot,\n { state: TState; paths: Array<StatePath<TState, TEvent>> }\n > = {};\n\n function util(\n fromStateSerial: SerializedSnapshot,\n toStateSerial: SerializedSnapshot\n ) {\n const fromState = stateMap.get(fromStateSerial)!;\n visitCtx.vertices.add(fromStateSerial);\n\n if (fromStateSerial === toStateSerial) {\n if (!pathMap[toStateSerial]) {\n pathMap[toStateSerial] = {\n state: stateMap.get(toStateSerial)!,\n paths: []\n };\n }\n\n const toStatePlan = pathMap[toStateSerial];\n\n const path2: StatePath<TState, TEvent> = {\n state: fromState,\n weight: steps.length,\n steps: [...steps]\n };\n\n toStatePlan.paths.push(path2);\n } else {\n if (!adjacency[fromStateSerial]) {\n return;\n }\n for (const serializedEvent of Object.keys(\n adjacency[fromStateSerial].transitions\n ) as SerializedEvent[]) {\n const { state: nextState, event: subEvent } =\n adjacency[fromStateSerial].transitions[serializedEvent];\n\n if (!(serializedEvent in adjacency[fromStateSerial].transitions)) {\n continue;\n }\n const prevState = stateMap.get(fromStateSerial);\n\n const nextStateSerial = serializeState(nextState, subEvent, prevState);\n stateMap.set(nextStateSerial, nextState);\n\n if (!visitCtx.vertices.has(nextStateSerial)) {\n visitCtx.edges.add(serializedEvent);\n steps.push({\n state: stateMap.get(fromStateSerial)!,\n event: subEvent\n });\n util(nextStateSerial, toStateSerial);\n }\n }\n }\n\n steps.pop();\n visitCtx.vertices.delete(fromStateSerial);\n }\n\n const fromStateSerial = serializeState(fromState, undefined);\n stateMap.set(fromStateSerial, fromState);\n\n for (const nextStateSerial of Object.keys(\n adjacency\n ) as SerializedSnapshot[]) {\n util(fromStateSerial, nextStateSerial);\n }\n\n const simplePaths = Object.values(pathMap).flatMap((p) => p.paths);\n\n if (resolvedOptions.toState) {\n return simplePaths\n .filter((path) => resolvedOptions.toState!(path.state))\n .map(alterPath);\n }\n\n return simplePaths.map(alterPath);\n}\n","import { AnyStateMachine, AnyStateNode } from '../index.ts';\n\nconst validateState = (_state: AnyStateNode) => {\n // TODO\n};\n\nexport const validateMachine = (machine: AnyStateMachine) => {\n validateState(machine.root);\n};\n"],"names":["Mailbox","constructor","_process","this","_active","_current","_last","start","flush","clear","next","enqueue","event","enqueued","value","consumed","XSTATE_INIT","XSTATE_STOP","createInvokeTimeoutEvent","invokeId","type","createDoneStateEvent","id","output","createInitEvent","input","reportUnhandledError","err","setTimeout","symbolObservable","Symbol","observable","builtInActions","actor","@xstate.raise","actorScope","options","system","scheduler","schedule","self","delay","@xstate.sendTo","Error","undefined","defer","_relay","@xstate.cancel","sendId","cancel","@xstate.stopChild","stopChild","subscriptions","WeakMap","createAttachedLogic","attach","state","target","getSnapshot","status","subscription","parentSubscription","torndown","teardown","unsubscribe","parent","_parent","subscribe","complete","error","set","transition","get","delete","getInitialSnapshot","_","getPersistedSnapshot","snapshot","restoreSnapshot","relayMappedToParent","getEvent","createListenerLogic","eventType","mapper","isPartialWildcard","endsWith","on","emittedEvent","matchesEventDescriptor","listenerLogic","$$atom","for","createSubscriptionLogic","mappers","done","onSnapshot","subscriptionLogic","pushBuiltInAction","actions","action","args","push","pushStartedChild","Object","assign","children","_special","registerSpawnedChild","createTransitionEnqueue","internalEvents","actorSubscriptions","props","emit","log","logger","raise","raisedEvent","spawn","logic","createActor","sendTo","stop","key","keys","unregisterChild","listen","listenerActor","subscribeTo","subscriptionActor","createEnqueueObject","resolveAndExecuteActionsWithContext","currentSnapshot","intermediateSnapshot","resolvedAction","bind","actionArgs","context","machine","implementations","actors","actionParams","emittedEventParams","actionExecutor","name","params","exec","res","emptyEnqueueObject","cloneMachineSnapshot","enqueueFn","fn","getConfiguredDelayValue","delaySource","referencedDelay","duration","normalizedDuration","trim","millisecondsMatch","match","parseInt","secondsMatch","wholePart","hasDecimal","fracPart","padEnd","slice","iso8601DurationMatch","groups","weeks","days","hours","minutes","seconds","toNumber","Number","replace","parseDurationToMilliseconds","resolveDelay","configuredDelay","isAtomicStateNode","stateNode","getChildren","values","states","filter","sn","getProperAncestors","toStateNode","ancestors","m","getAllStateNodes","stateNodes","nodeSet","Set","activeParentSet","add","s","has","child","initialStates","getInitialStateNodes","initialStateNode","getStateValue","rootNode","config","adjList","Map","getValueFromAdj","baseNode","childStateNodes","childStateNode","stateValue","isInFinalState","stateNodeSet","some","every","isStateId","str","scheduleDelayedEvent","resolveScheduledDelay","oldEntry","entry","x","enq","oldExit","exit","formatTransition","descriptor","transitionConfig","normalizedTarget","normalizeTarget","reenter","resolveTarget","source","toJSON","map","t","targets","getStateNodeById","isInternalTarget","getStateNodeByPath","resolvedTarget","message","resolveHistoryDefaultTransition","initial","isHistoryNode","iter","descStateNode","initialState","ancestor","getStateNode","stateKey","result","statePath","arrayStatePath","toStatePath","currentStateNode","length","shift","getStateNodes","childStateKeys","Array","allStateNodes","root","i","subStateNode","transitionNode","subStateKeys","subStateKey","allInnerTransitions","subStateValue","innerTransitions","isDescendant","parentStateNode","marker","hasDescendantState","hasIntersection","s1","s2","s1Size","size","isArray","s2Size","set1","item","removeConflictingTransitions","enabledTransitions","filteredTransitions","exitSets","getExitSet","exitSet","computeExitSet","t1","t1Preempted","transitionsToRemove","t2","t3","from","getEffectiveTargetStates","historyValue","getTransitionResult","targetSet","targetNode","node","getTransitionDomain","targetStates","head","tail","concat","transitions","statesToExit","domain","microstep","isInitial","internalQueue","originalExecutor","mutStateNodeSet","_nodes","originalContext","getCurrentTransitionResult","getStateActionsAndContext","transitionFn","updatedContext","guards","delays","nextState","exitStates","changedHistory","sort","a","b","order","currentStateNodes","exitStateNode","historyNode","predicate","history","stateInput","_stateInputs","exitActions","nextContext","def","invoke","childActor","_isExternal","transitionActions","toArray","enterStates","getMachineOutput","rootCompletionNode","completionOutput","resolveOutput","parallelDoneType","parallelDoneEvent","find","e","statesToEnter","statesForDefaultEntry","addAncestorStatesToEnter","reentrancyDomain","anc","addDescendantStatesToEnter","historyStateNodes","historyDefaultTransition","stateInputMap","completedNodes","stateNodeToEnter","invoked","invokeDef","src","resolveReferencedActor","syncSnapshot","resultActions","nextInternalEvents","initialActions","initialInput","ancestorMarker","regionOutput","region","regionDoneType","regionDoneEvent","finalChild","JSON","stringify","nextStateNodes","allExitActions","forEach","to","resolvedInput","macrostep","nextSnapshot","microsteps","addMicrostep","step","collectedMicrosteps","_collectedMicrosteps","stopChildren","nextEvent","currentEvent","isErr","startsWith","isErrorActorEvent","getTransitionData","shouldSelectEventlessTransitions","maxIterations","Infinity","iterationCount","microstepCount","selectEventlessTransitions","previousState","hasEffect","transitionToHasEffect","transitionTo","triggerEffect","send","Boolean","enabledTransitionSet","atomicStates","atomicStateNode","loop","always","evaluateCandidate","candidate","guard","guardArgs","_snapshot","guardConfig","guardParams","guardPassed","guardImpl","isMachineSnapshot","emptyCanActor","emptyCanActorScope","getEmptyCanActor","createEmptyActor","machineSnapshotMatches","testValue","matchesState","machineSnapshotHasTag","tag","tags","machineSnapshotCan","emptyActor","emptyActorScope","sessionId","getEmptyCanActorScope","transitionData","machineSnapshotToJSON","nodes","getMeta","getInputs","can","hasTag","matches","jsonValues","machineSnapshotGetMeta","meta","machineSnapshotGetInputs","collectTags","createMachineSnapshot","configWithSnapshot","serializeHistoryValue","persistContext","contextPart","copy","xstate$$type","$$ACTOR_TYPE","parentStateId","childStateId","parentStateValue","toStateValue","childStateValue","stateId","segment","charCodeAt","previous","pathToStateValue","toArrayStrict","toTransitionConfigArray","configLike","transitionLike","toObserver","nextHandler","errorHandler","completionHandler","isObserver","indexStr","nodeId","invokeConfig","configSrc","getAllOwnEventDescriptors","flatMap","ownEvents","partialEventTokens","split","eventTokens","tokenIndex","partialEventToken","eventToken","createScheduledEventId","effectStates","getEffectState","executeLogicEffects","effects","effect","cleanup","createLogic","trackedEffects","emitted","sendBack","sentEvent","keyOrExec","maybeExec","enqueueEffect","patch","run","resolveContext","executingCustomAction","ProcessingStatus","defaultOptions","clock","ms","clearTimeout","console","Actor","_boundProcess","mailbox","observers","eventListeners","_processingStatus","NotStarted","_syncSnapshot","ref","_actorScope","_lastSourceRef","_collectedActions","_collectedSent","systemId","trigger","_deferred","_pendingEffects","resolvedOptions","inspect","rootActor","idCounter","keyedActors","reverseKeyedActors","inspectionObservers","timerMap","recordSent","targetRef","targetId","Math","random","toString","scheduledEvent","startedAt","Date","now","scheduledEventId","_scheduledEvents","timeout","deliver","cancelAll","targetMachine","isInternalEventType","_send","_bookId","_register","_unregister","getAll","fromEntries","entries","_set","existing","observerOrFn","observer","_sendInspectionEvent","resolvedInspectionEvent","rootId","scheduledEvents","scheduledId","_clock","_logger","_timerStrategy","timers","createSystem","_stop","listeners","wildcardListener","handler","saveExecutingCustomAction","Running","Proxy","payload","persistedState","rest","actorRef","parentRef","_setErrorSnapshot","_next","update","deferredFn","_stopProcedure","_complete","doneEvent","actorId","_error","sourceRef","sent","nextListenerOrObserver","errorListener","completeListener","Stopped","select","selector","equalityFn","is","selected","initEvent","strategy","resolveRestoredTimerDelay","caughtError","reportError","err2","persisted","pendingEffects","scheduled","elapsed","max","emptyLogic","createSpawner","spawnedChildren","cache","memo","object","memoizedData","EMPTY_OBJECT","CHOICE_CONFIG_KEYS","StateNode","path","description","after","events","_key","_machine","firstStateKey","join","choice","validateStateNodeConfig","idMap","collection","iteratee","collectionKeys","mapValues","stateConfig","stateNodeId","resolvedId","sourceName","_initialize","afterConfig","timeoutConfig","onTimeoutConfig","onTimeout","invokeDefs","mutateEntryExitWithDelay","afterEvent","delayedTransitions","addDelayedTransitions","transitionsConfig","configTransition","parsedDelay","isNaN","timeoutEvent","invokeTimeoutEvent","invokeTimeout","invokeTimeoutEventType","delayedTransition","getDelayedTransitions","mapTransitionConfigs","onDone","createCancelInvokeTimeoutTransition","timeoutEventType","_args","formatInvokeCompletionTransition","didEnqueue","trackingEnqueue","apply","thisArg","argArray","Reflect","prop","receiver","invokeDoneTransitions","onError","formatTransitions","validateChoiceResult","formatChoiceTransitions","_refreshEventMetadata","_target","targetString","formatInitialTransition","candidates","receivedEventType","matchingDescriptors","eventDescriptor","wildcardCandidates","getCandidates","transitionConfigs","StateMachine","version","schemas","internalEventDescriptors","_json","rootStateNode","routeTransitions","collectRoutes","route","routeId","routeConfig","routeMatches","userGuard","formatRouteTransitions","provide","provided","resolveState","resolvedStateValue","snapshots","_getPreInitialState","preInitial","resolvedContext","preInitialState","initialMicrostep","macroState","_rehydrated","fullPath","relativePath","resolvedStateId","STATE_IDENTIFIER","childrenJson","persistedVersion","migrate","snapshotData","snapshotChildren","actorData","childState","revivedHistoryValue","revived","arr","resolved","reviveHistoryValue","_persistedSnapshotVersion","persistedRest","restoredSnapshot","seen","WeakSet","reviveContext","simpleStringify","getDescription","contextString","stateStrings","createShortestPathsGen","getShortestPaths","createSimplePathsGen","getSimplePaths","TestModel","getDefaultOptions","serializeState","serializeEvent","serializeTransition","stateMatcher","testLogic","defaultTraversalOptions","_toTestPath","eventsString","steps","other","formatEvent","test","testPath","getPaths","pathGenerator","allowDuplicatePaths","paths","_resolveOptions","deduplicatePaths","allPathsWithEventSequence","eventSequence","z","superpathsWithEventSequence","pathLoop","pathWithEventSequence","superpathLoop","superpathWithEventSequence","getShortestPathsFrom","resultPaths","shortestPaths","fromState","shortestPath","joinPaths","getSimplePathsFrom","getPathsFromEvents","getAdjacencyMap","testPathResult","testStepResult","testTransition","testState","formatColor","_color","string","targetStateString","errMessage","hasFailed","stateString","eventString","formatPathTestResult","stateTestKeys","_getStateTestKeys","stateTestKey","_getEventExec","eventExec","stateValuesEqual","aKeys","bKeys","serializeMachineTransition","previousSnapshot","prevStateString","createMockActorScope","serializeSnapshot","createDefaultMachineOptions","getEvents","otherOptions","__unsafe_getAllOwnEventDescriptors","matchingEvents","ev","createDefaultLogicOptions","resolveTraversalOptions","traversalOptions","resolvedDefaultOptions","isMachineLogic","filterEvents","limit","toState","stopWhen","headPath","tailPath","weight","resolveTransitionSnapshot","customFromState","adj","iterations","queue","prevState","stateMap","serializedState","alterPath","adjacency","serializedFromState","stateSerial","eventSerial","_nextEvent","nextStateSerial","weightMap","unvisited","visited","eventObject","nextSerializedState","nextWeight","statePlanMap","fromEvent","visitCtx","vertices","edges","pathMap","util","fromStateSerial","toStateSerial","toStatePlan","path2","serializedEvent","subEvent","pop","simplePaths","p","adjMap","adjValue","validateMachine","includes","reduce","accNodes","toDirectedGraph","stateMachine","flat","transitionIndex","targetIndex","edge","label","text","graph","graphEdges"],"mappings":"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"}
1
+ {"version":3,"file":"xstate-graph.umd.min.js","sources":["../src/Mailbox.ts","../src/constants.ts","../src/eventUtils.ts","../src/reportUnhandledError.ts","../src/symbolObservable.ts","../src/actions.ts","../src/actors/attached.ts","../src/actors/listener.ts","../src/atom.ts","../src/actors/subscription.ts","../src/transitionActions.ts","../src/stateUtils.ts","../src/delay.ts","../src/utils.ts","../src/State.ts","../src/system.ts","../src/actors/logic.ts","../src/createActor.ts","../src/actors/index.ts","../src/spawn.ts","../src/memo.ts","../src/StateNode.ts","../src/StateMachine.ts","../src/graph/utils.ts","../src/graph/deduplicatePaths.ts","../src/graph/pathGenerators.ts","../src/graph/TestModel.ts","../src/graph/actorScope.ts","../src/graph/graph.ts","../src/graph/adjacency.ts","../src/graph/alterPath.ts","../src/graph/pathFromEvents.ts","../src/graph/shortestPaths.ts","../src/graph/simplePaths.ts","../src/graph/validateMachine.ts"],"sourcesContent":["interface MailboxItem<T> {\n value: T;\n next: MailboxItem<T> | null;\n}\n\nexport class Mailbox<T> {\n private _active: boolean = false;\n private _current: MailboxItem<T> | null = null;\n private _last: MailboxItem<T> | null = null;\n\n constructor(private _process: (ev: T) => void) {}\n\n public start() {\n this._active = true;\n this.flush();\n }\n\n public clear(): void {\n // we can't set _current to null because we might be currently processing\n // and enqueue following clear shouldn't start processing the enqueued item immediately\n if (this._current) {\n this._current.next = null;\n this._last = this._current;\n }\n }\n\n public enqueue(event: T): void {\n const enqueued = {\n value: event,\n next: null\n };\n\n if (this._current) {\n this._last!.next = enqueued;\n this._last = enqueued;\n return;\n }\n\n this._current = enqueued;\n this._last = enqueued;\n\n if (this._active) {\n this.flush();\n }\n }\n\n private flush() {\n while (this._current) {\n // atm the given _process is responsible for implementing proper try/catch handling\n // we assume here that this won't throw in a way that can affect this mailbox\n const consumed = this._current;\n this._process(consumed.value);\n this._current = consumed.next;\n }\n this._last = null;\n }\n}\n","export const STATE_DELIMITER = '.';\nexport const TARGETLESS_KEY = '';\nexport const NULL_EVENT = '';\nexport const STATE_IDENTIFIER = '#';\nexport const WILDCARD = '*';\nexport const XSTATE_INIT = '@xstate.init';\nexport const XSTATE_STOP = '@xstate.stop';\n","import { XSTATE_INIT } from './constants.ts';\nimport { DoneActorEvent, DoneStateEvent, ErrorActorEvent } from './types.ts';\n\n/**\n * Returns an event that represents an implicit event that is sent after the\n * specified `delay`.\n *\n * @param delayRef The delay in milliseconds\n * @param id The state node ID where this event is handled\n */\nexport function createAfterEvent(delayRef: number | string, id: string) {\n return { type: `xstate.after.${delayRef}.${id}` } as const;\n}\n\n/**\n * Returns an event that represents an implicit state-level timeout. Fired when\n * a state's `timeout` duration elapses without the state being exited.\n *\n * @param id The state node ID where this timeout is configured\n */\nexport function createTimeoutEvent(id: string) {\n return { type: `xstate.timeout.${id}` } as const;\n}\n\n/**\n * Returns an event that represents an implicit invoke-level timeout. Fired when\n * an invoked actor has not completed within its `timeout` duration.\n *\n * @param invokeId The invoked actor's ID\n */\nexport function createInvokeTimeoutEvent(invokeId: string) {\n return { type: `xstate.timeout.actor.${invokeId}` } as const;\n}\n\n/**\n * Returns an event that represents that a final state node has been reached in\n * the parent state node.\n *\n * @param id The final state node's parent state node `id`\n * @param output The data to pass into the event\n */\nexport function createDoneStateEvent(\n id: string,\n output?: unknown\n): DoneStateEvent {\n return {\n type: `xstate.done.state.${id}`,\n output\n };\n}\n\n/**\n * Returns an event that represents that an invoked service has terminated.\n *\n * An invoked service is terminated when it has reached a top-level final state\n * node, but not when it is canceled.\n *\n * @param invokeId The invoked service ID\n * @param output The data to pass into the event\n */\nexport function createDoneActorEvent(\n invokeId: string,\n output?: unknown\n): DoneActorEvent {\n return {\n type: `xstate.done.actor.${invokeId}`,\n output,\n actorId: invokeId\n };\n}\n\nexport function createErrorActorEvent(\n id: string,\n error?: unknown\n): ErrorActorEvent {\n return { type: `xstate.error.actor.${id}`, error, actorId: id };\n}\n\nexport function createInitEvent(input: unknown) {\n return { type: XSTATE_INIT, input } as const;\n}\n","/**\n * This function makes sure that unhandled errors are thrown in a separate\n * macrotask. It allows those errors to be detected by global error handlers and\n * reported to bug tracking services without interrupting our own stack of\n * execution.\n *\n * @param err Error to be thrown\n */\nexport function reportUnhandledError(err: unknown) {\n setTimeout(() => {\n throw err;\n });\n}\n","export const symbolObservable: typeof Symbol.observable = (() =>\n (typeof Symbol === 'function' && Symbol.observable) ||\n '@@observable')() as any;\n","import isDevelopment from '#is-development';\nimport { AnyActor, AnyActorScope, EventObject } from './types';\n\nexport const builtInActions = {\n ['@xstate.start']: (actor: AnyActor) => {\n actor.start();\n },\n ['@xstate.raise']: (\n actorScope: AnyActorScope,\n event: EventObject,\n options: { id?: string; delay?: number }\n ) => {\n actorScope.system.scheduler.schedule(\n actorScope.self,\n actorScope.self,\n event,\n options?.delay ?? 0,\n options?.id\n );\n },\n ['@xstate.sendTo']: (\n actorScope: AnyActorScope,\n actor: AnyActor,\n event: EventObject,\n options: { id?: string; delay?: number }\n ) => {\n if (typeof event === 'string') {\n throw new Error(\n isDevelopment\n ? // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Only event objects may be used with sendTo; use sendTo({ type: \"${event}\" }) instead`\n : `Only event objects may be used with sendTo`\n );\n }\n if (options?.delay !== undefined) {\n actorScope.system.scheduler.schedule(\n actorScope.self,\n actor,\n event,\n options?.delay ?? 0,\n options?.id\n );\n } else {\n actorScope.defer(() => {\n actorScope.system._relay(actorScope.self, actor, event);\n });\n }\n },\n ['@xstate.cancel']: (actorScope: AnyActorScope, sendId: string) => {\n actorScope.system.scheduler.cancel(actorScope.self, sendId);\n },\n ['@xstate.stopChild']: (actorScope: AnyActorScope, actor: AnyActor) => {\n actorScope.stopChild(actor);\n }\n};\n","import { XSTATE_STOP } from '../constants.ts';\nimport type { AnyActorSystem } from '../system.ts';\nimport type {\n AnyActor,\n EventObject,\n Snapshot,\n Subscription\n} from '../types.ts';\n\nconst subscriptions = /* #__PURE__ */ new WeakMap<AnyActor, Subscription>();\n\n/**\n * Internal factory for actor logic that attaches to another actor on start\n * (`enq.listen()` / `enq.subscribeTo()`) and detaches when stopped.\n */\nexport function createAttachedLogic(\n attach: (\n input: any,\n scope: { self: AnyActor; system: AnyActorSystem }\n ) => Subscription | undefined\n): any {\n return {\n start: (state: any, { self, system }: any) => {\n // Don't attach if the target doesn't exist, or (for actors) is stopped.\n // Atoms have no `getSnapshot` / lifecycle, so they always attach.\n const target = state.input.actor;\n if (\n !target ||\n (typeof target.getSnapshot === 'function' &&\n target.getSnapshot().status === 'stopped')\n ) {\n return;\n }\n const subscription = attach(state.input, { self, system });\n if (!subscription) {\n return;\n }\n\n // Attached actors are not registered as children (their `input` holds\n // non-serializable function mappers), so a parent stop does not cascade\n // to them. Subscribe to the parent and tear down when it stops/errors,\n // so the subscription never relays to a stopped parent or leaks the\n // source subscription.\n let parentSubscription: Subscription | undefined;\n let torndown = false;\n const teardown = () => {\n if (torndown) {\n return;\n }\n torndown = true;\n subscription.unsubscribe();\n parentSubscription?.unsubscribe();\n };\n\n const parent: AnyActor | undefined = self._parent;\n if (parent) {\n parentSubscription = parent.subscribe({\n complete: teardown,\n error: teardown\n });\n }\n\n subscriptions.set(self, { unsubscribe: teardown });\n },\n transition: (state: any, event: EventObject, { self }: any) => {\n if (event.type === XSTATE_STOP) {\n subscriptions.get(self)?.unsubscribe();\n subscriptions.delete(self);\n return {\n ...state,\n status: 'stopped',\n error: undefined\n };\n }\n return state;\n },\n getInitialSnapshot: (_: unknown, input: unknown) => ({\n status: 'active',\n output: undefined,\n error: undefined,\n input\n }),\n getPersistedSnapshot: (snapshot: Snapshot<unknown>) => snapshot,\n restoreSnapshot: (snapshot: Snapshot<unknown>) => snapshot\n };\n}\n\n/**\n * Relays a mapped event to the attached actor's parent, unless the attached\n * actor has been stopped (the mapper is not called in that case).\n */\nexport function relayMappedToParent(\n self: AnyActor,\n system: AnyActorSystem,\n getEvent: () => EventObject\n): void {\n if (self.getSnapshot().status === 'stopped' || !self._parent) {\n return;\n }\n system._relay(self, self._parent, getEvent());\n}\n","import { AnyActorSystem } from '../system.ts';\nimport { matchesEventDescriptor } from '../utils.ts';\nimport {\n ActorLogic,\n ActorRefFromLogic,\n AnyActor,\n EventObject,\n Snapshot\n} from '../types';\nimport { createAttachedLogic, relayMappedToParent } from './attached.ts';\n\nexport type ListenerSnapshot = Snapshot<undefined> & {\n input: ListenerInput<any, any>;\n};\n\nexport interface ListenerInput<\n TEmitted extends EventObject,\n TMappedEvent extends EventObject\n> {\n actor: AnyActor;\n eventType: string;\n mapper: (event: TEmitted) => TMappedEvent;\n}\n\nexport type ListenerActorLogic<\n TEmitted extends EventObject = EventObject,\n TMappedEvent extends EventObject = EventObject\n> = ActorLogic<\n ListenerSnapshot,\n EventObject,\n ListenerInput<TEmitted, TMappedEvent>,\n AnyActorSystem,\n EventObject\n>;\n\nexport type ListenerActorRef<\n TEmitted extends EventObject = EventObject,\n TMappedEvent extends EventObject = EventObject\n> = ActorRefFromLogic<ListenerActorLogic<TEmitted, TMappedEvent>>;\n\n/**\n * Creates actor logic for listening to emitted events from another actor. Used\n * internally by `enq.listen()`.\n */\nexport function createListenerLogic<\n TEmitted extends EventObject = EventObject,\n TMappedEvent extends EventObject = EventObject\n>(): ListenerActorLogic<TEmitted, TMappedEvent> {\n return createAttachedLogic(\n (\n { actor, eventType, mapper }: ListenerInput<TEmitted, TMappedEvent>,\n { self, system }\n ) => {\n // Determine the subscription type:\n // - For exact matches or '*', subscribe directly\n // - For partial wildcards ('data.*'), subscribe to '*' and filter\n const isPartialWildcard = eventType !== '*' && eventType.endsWith('.*');\n\n return actor.on(isPartialWildcard ? '*' : eventType, (emittedEvent) => {\n if (\n isPartialWildcard &&\n !matchesEventDescriptor(emittedEvent.type, eventType)\n ) {\n return;\n }\n relayMappedToParent(self, system, () =>\n mapper(emittedEvent as TEmitted)\n );\n });\n }\n );\n}\n\n// Singleton logic instance\nexport const listenerLogic = /* #__PURE__ */ createListenerLogic();\n","import {\n createReactiveSystem,\n type ReactiveNode,\n ReactiveFlags\n} from './alien.ts';\nimport { installActorReadHook } from './interop.ts';\nimport { reportUnhandledError } from './reportUnhandledError.ts';\nimport type { AnyActorRef } from './types.ts';\n\ntype Observer<T> = {\n next?: (value: T) => void;\n error?: (err: unknown) => void;\n complete?: () => void;\n};\n\ninterface Subscription {\n unsubscribe(): void;\n}\n\ninterface Readable<T> extends Subscribable<T> {\n get: () => T;\n}\n\ninterface Subscribable<T> {\n subscribe(observer: Observer<T>): Subscription;\n subscribe(\n next: (value: T) => void,\n error?: (error: any) => void,\n complete?: () => void\n ): Subscription;\n}\n\n/**\n * Nominal brand (phantom, compile-time only) marking a value as an XState atom.\n * Real atoms get the runtime brand ({@link $$atom}) in `createAtom`; this type\n * brand keeps atom-only APIs (e.g. `enq.subscribeTo`) from structurally\n * accepting plain readables like `actor.select(...)` that would be dispatched\n * down the non-atom path at runtime.\n */\ndeclare const $$atomBrand: unique symbol;\n\nexport interface BaseAtom<T> extends Subscribable<T>, Readable<T> {\n /** @internal */\n readonly [$$atomBrand]: true;\n}\n\nexport interface Atom<T> extends BaseAtom<T> {\n set: (valueOrFn: T | ((prev: T) => T)) => void;\n}\n\nexport interface ReducerAtom<TState, TEvent> extends BaseAtom<TState> {\n send: (event: TEvent) => void;\n}\n\nexport interface AtomOptions<T> {\n compare?: (a: T, b: T) => boolean;\n}\n\nexport interface AtomConfig<TValue, TInput> {\n createAtom: undefined extends TInput\n ? (input?: TInput) => Atom<TValue>\n : (input: TInput) => Atom<TValue>;\n}\n\nexport type AnyAtomConfig = AtomConfig<any, any>;\n\nexport type ValueFromAtomConfig<TConfig extends AnyAtomConfig> =\n TConfig extends AtomConfig<infer TValue, any> ? TValue : never;\n\nexport type InputFromAtomConfig<TConfig extends AnyAtomConfig> =\n TConfig extends AtomConfig<any, infer TInput> ? TInput : never;\n\nexport type AnyAtom = BaseAtom<any>;\n\nexport interface ReadonlyAtom<T> extends BaseAtom<T> {}\n\n/** Brand marking an object as an atom, so it can be detected structurally. */\nconst $$atom = /* #__PURE__ */ Symbol.for('xstate.atom');\n\n/**\n * Returns `true` if the value is an atom (writable, computed, async, or\n * reducer). Lets actor-consuming APIs (e.g. `enq.subscribeTo`) accept atoms\n * directly.\n */\nexport function isAtom(value: unknown): value is AnyAtom {\n return (\n !!value && typeof value === 'object' && ($$atom as any) in (value as any)\n );\n}\n\ninterface InternalAtom<T> extends ReactiveNode {\n _snapshot: T;\n _update(getValue?: T | ((snapshot: T) => T)): boolean;\n get(): T;\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)): Subscription;\n}\n\nconst queuedEffects: (Effect | undefined)[] = [];\nlet cycle = 0;\n\ntype ReactiveSystem = ReturnType<typeof createReactiveSystem>;\n// Initialized lazily on first atom creation (instead of at module evaluation)\n// so the reactive system stays tree-shakeable for apps that never use atoms —\n// flat dist chunks lose `#__PURE__` annotations, so a top-level call here\n// would be retained by consumer bundlers even when atoms are unused.\nlet link: ReactiveSystem['link'];\nlet unlink: ReactiveSystem['unlink'];\nlet propagate: ReactiveSystem['propagate'];\nlet checkDirty: ReactiveSystem['checkDirty'];\nlet shallowPropagate: ReactiveSystem['shallowPropagate'];\nlet reactiveSystemInstalled = false;\n\nfunction ensureReactiveSystem() {\n if (reactiveSystemInstalled) {\n return;\n }\n reactiveSystemInstalled = true;\n ({ link, unlink, propagate, checkDirty, shallowPropagate } =\n createReactiveSystem({\n update(atom: InternalAtom<any>): boolean {\n return atom._update();\n },\n notify(effect: Effect): void {\n queuedEffects[queuedEffectsLength++] = effect;\n effect.flags &= ~ReactiveFlags.Watching;\n },\n unwatched(atom: InternalAtom<any>): void {\n if (atom.depsTail !== undefined) {\n atom.depsTail = undefined;\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty;\n purgeDeps(atom);\n }\n }\n }));\n}\n\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub: ReactiveNode | undefined;\n\nfunction purgeDeps(sub: ReactiveNode) {\n const depsTail = sub.depsTail;\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps;\n while (dep !== undefined) {\n dep = unlink(dep, sub);\n }\n}\n\nfunction flush(): void {\n while (notifyIndex < queuedEffectsLength) {\n const effect = queuedEffects[notifyIndex]!;\n queuedEffects[notifyIndex++] = undefined;\n effect.notify();\n }\n notifyIndex = 0;\n queuedEffectsLength = 0;\n}\n\n/** The current state of an async atom. */\nexport type AsyncAtomState<Data, Error = unknown> =\n | { status: 'pending' }\n | { status: 'done'; data: Data }\n | { status: 'error'; error: Error };\n\n/** Options passed to an async atom getter. */\nexport interface AsyncAtomOptions {\n /** Signal aborted when the async atom recomputes before this run settles. */\n signal: AbortSignal;\n}\n\nfunction compareAsyncAtomState<T>(\n a: AsyncAtomState<T>,\n b: AsyncAtomState<T>\n): boolean {\n if (a.status !== b.status) {\n return false;\n }\n if (a.status === 'done' && b.status === 'done') {\n return Object.is(a.data, b.data);\n }\n if (a.status === 'error' && b.status === 'error') {\n return Object.is(a.error, b.error);\n }\n // both 'pending'\n return true;\n}\n\nfunction updateAsyncAtom<T>(\n atom: InternalAtom<AsyncAtomState<T>>,\n nextValue: AsyncAtomState<T>\n): void {\n if (atom._update(nextValue)) {\n const subs = atom.subs;\n if (subs !== undefined) {\n propagate(subs);\n shallowPropagate(subs);\n flush();\n }\n }\n}\n\n/**\n * Creates a read-only atom whose value is loaded from an async getter.\n *\n * The getter receives an `AbortSignal`; when the async atom recomputes, the\n * previous signal is aborted and stale resolutions are ignored.\n */\nexport function createAsyncAtom<T>(\n getValue: (options: AsyncAtomOptions) => Promise<T>,\n options?: AtomOptions<AsyncAtomState<T>>\n): ReadonlyAtom<AsyncAtomState<T>> {\n const ref: { current?: InternalAtom<AsyncAtomState<T>> } = {};\n let currentController: AbortController | undefined;\n let currentRunId = 0;\n\n const atom = createAtom<AsyncAtomState<T>>(\n () => {\n currentController?.abort();\n\n const controller = new AbortController();\n const runId = ++currentRunId;\n currentController = controller;\n\n getValue({ signal: controller.signal }).then(\n (data) => {\n if (runId !== currentRunId || controller.signal.aborted) {\n return;\n }\n updateAsyncAtom(ref.current!, { status: 'done', data });\n },\n (error) => {\n if (runId !== currentRunId || controller.signal.aborted) {\n return;\n }\n updateAsyncAtom(ref.current!, { status: 'error', error });\n }\n );\n\n return { status: 'pending' } satisfies AsyncAtomState<T>;\n },\n { compare: compareAsyncAtomState, ...options }\n );\n ref.current = atom as unknown as InternalAtom<AsyncAtomState<T>>;\n\n return atom;\n}\n\n/**\n * Mirror atoms that bump a version whenever a tracked actor emits a snapshot,\n * letting computed atoms depend on `actor.get()` reads.\n *\n * The hook is installed lazily on first atom creation (not at module\n * evaluation) so that it remains tree-shakeable for apps that never use atoms —\n * any tracked read necessarily happens inside an atom computation, so first-use\n * installation is always early enough.\n */\nlet actorInteropInstalled = false;\n\nfunction ensureActorInterop() {\n if (actorInteropInstalled) {\n return;\n }\n actorInteropInstalled = true;\n const actorVersions = new WeakMap<AnyActorRef, Atom<number>>();\n installActorReadHook((actorRef) => {\n if (activeSub === undefined) {\n return;\n }\n let version = actorVersions.get(actorRef);\n if (version === undefined) {\n version = createAtom(0);\n actorVersions.set(actorRef, version);\n actorRef.subscribe({\n next: () => version!.set((v) => v + 1),\n error: () => {}\n });\n }\n version.get();\n });\n}\n\n/**\n * Creates an atom.\n *\n * Pass a value for a writable atom or a getter for a computed read-only atom.\n */\nexport function createAtom<T>(\n getValue: (prev?: T) => T,\n options?: AtomOptions<T>\n): ReadonlyAtom<T>;\nexport function createAtom<T>(\n initialValue: T,\n options?: AtomOptions<T>\n): Atom<T>;\nexport function createAtom<T>(\n valueOrFn: T | ((prev?: T) => T),\n optionsOrInput?: AtomOptions<T>\n): Atom<T> | ReadonlyAtom<T> {\n ensureReactiveSystem();\n ensureActorInterop();\n const isComputed = typeof valueOrFn === 'function';\n const getter = valueOrFn as (prev?: T) => T;\n\n // Create plain object atom\n const atom: InternalAtom<T> = {\n _snapshot: isComputed ? undefined! : valueOrFn,\n\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: isComputed ? ReactiveFlags.None : ReactiveFlags.Mutable,\n\n get(): T {\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle);\n }\n return atom._snapshot;\n },\n\n subscribe(observerOrFn: Observer<T> | ((value: T) => void)) {\n const observer =\n typeof observerOrFn === 'function'\n ? { next: observerOrFn }\n : observerOrFn;\n const observed = { current: false };\n const e = effect(() => {\n atom.get();\n if (!observed.current) {\n observed.current = true;\n } else {\n const prevSub = activeSub;\n activeSub = undefined;\n try {\n observer.next?.(atom._snapshot);\n } catch (err) {\n reportUnhandledError(err);\n } finally {\n activeSub = prevSub;\n }\n\n // If the observer synchronously updates any of our deps we'll be\n // marked as dirty preventing this effect from re-running. Request\n // the value again to reconcile any dirty deps.\n atom.get();\n }\n });\n\n return {\n unsubscribe: () => {\n e.stop();\n }\n };\n },\n _update(getValue?: T | ((snapshot: T) => T)): boolean {\n const prevSub = activeSub;\n const compare = optionsOrInput?.compare ?? Object.is;\n activeSub = atom;\n ++cycle;\n atom.depsTail = undefined;\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.RecursedCheck;\n }\n try {\n const oldValue = atom._snapshot;\n const newValue =\n typeof getValue === 'function'\n ? (getValue as (snapshot: T) => T)(oldValue)\n : getValue === undefined && isComputed\n ? getter(oldValue)\n : getValue!;\n if (oldValue === undefined || !compare(oldValue, newValue)) {\n atom._snapshot = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n if (isComputed) {\n atom.flags &= ~ReactiveFlags.RecursedCheck;\n }\n purgeDeps(atom);\n }\n }\n };\n\n if (isComputed) {\n atom.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty;\n atom.get = function (): T {\n const flags = atom.flags;\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(atom.deps!, atom))\n ) {\n if (atom._update()) {\n const subs = atom.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n } else if (flags & ReactiveFlags.Pending) {\n atom.flags = flags & ~ReactiveFlags.Pending;\n }\n if (activeSub !== undefined) {\n link(atom, activeSub, cycle);\n }\n return atom._snapshot;\n };\n } else {\n (atom as unknown as Atom<T>).set = function (\n valueOrFn: T | ((prev: T) => T)\n ): void {\n if (atom._update(valueOrFn)) {\n const subs = atom.subs;\n if (subs !== undefined) {\n propagate(subs);\n shallowPropagate(subs);\n flush();\n }\n }\n };\n }\n\n (atom as any)[$$atom] = true;\n\n return atom as unknown as Atom<T> | ReadonlyAtom<T>;\n}\n\n/**\n * Creates an inert atom config that can be instantiated later.\n *\n * Useful for framework hooks that need to create a stable local atom from\n * component input.\n */\nexport function createAtomConfig<T, TInput>(\n getInitialValue: (input: TInput) => T,\n options?: AtomOptions<T>\n): AtomConfig<T, TInput>;\nexport function createAtomConfig<T>(\n initialValue: T,\n options?: AtomOptions<T>\n): AtomConfig<T, undefined>;\nexport function createAtomConfig<T, TInput>(\n initialValueOrFn: T | ((input: TInput) => T),\n options?: AtomOptions<T>\n): AtomConfig<T, TInput | undefined> {\n return {\n createAtom(input?: TInput) {\n const initialValue =\n typeof initialValueOrFn === 'function'\n ? (initialValueOrFn as (input: TInput) => T)(input as TInput)\n : initialValueOrFn;\n\n return createAtom(initialValue, options);\n }\n };\n}\n\n/** Creates an atom whose updates are handled by a reducer function. */\nexport function createReducerAtom<TState, TEvent>(\n initialValue: TState,\n reducer: (state: TState, event: TEvent) => TState,\n options?: AtomOptions<TState>\n): ReducerAtom<TState, TEvent> {\n const atom = createAtom(initialValue, options);\n\n return {\n [$$atom]: true,\n get: atom.get.bind(atom),\n subscribe: atom.subscribe.bind(atom),\n send(event: TEvent) {\n const prevSub = activeSub;\n activeSub = undefined;\n let nextState: TState;\n try {\n nextState = reducer(atom.get(), event);\n } finally {\n activeSub = prevSub;\n }\n atom.set(nextState);\n }\n } as unknown as ReducerAtom<TState, TEvent>;\n}\n\ninterface Effect extends ReactiveNode {\n notify(): void;\n stop(): void;\n}\n\nfunction effect<T>(fn: () => T): Effect {\n const run = (): T => {\n const prevSub = activeSub;\n activeSub = effectObj;\n ++cycle;\n effectObj.depsTail = undefined;\n effectObj.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck;\n try {\n return fn();\n } finally {\n activeSub = prevSub;\n effectObj.flags &= ~ReactiveFlags.RecursedCheck;\n purgeDeps(effectObj);\n }\n };\n const effectObj: Effect = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck,\n\n notify(): void {\n const flags = this.flags;\n if (\n flags & ReactiveFlags.Dirty ||\n (flags & ReactiveFlags.Pending && checkDirty(this.deps!, this))\n ) {\n run();\n } else {\n this.flags = ReactiveFlags.Watching;\n }\n },\n\n stop(): void {\n this.flags = ReactiveFlags.None;\n this.depsTail = undefined;\n purgeDeps(this);\n }\n };\n\n run();\n\n return effectObj;\n}\n","import { AnyActorSystem } from '../system.ts';\nimport {\n ActorLogic,\n ActorRefFromLogic,\n AnyActorRef,\n EventObject,\n Snapshot\n} from '../types';\nimport { createAttachedLogic, relayMappedToParent } from './attached.ts';\nimport { isAtom } from '../atom.ts';\n\nexport type SubscriptionSnapshot = Snapshot<undefined> & {\n input: SubscriptionInput<any, any, any, any>;\n};\n\nexport interface SubscriptionMappers<\n TSnapshot extends Snapshot<unknown>,\n TOutput,\n TMappedEvent extends EventObject\n> {\n snapshot?: (snapshot: TSnapshot) => TMappedEvent;\n done?: (output: TOutput) => TMappedEvent;\n error?: (error: unknown) => TMappedEvent;\n}\n\nexport interface SubscriptionInput<\n TSnapshot extends Snapshot<unknown>,\n TOutput,\n TMappedEvent extends EventObject,\n TMappers extends SubscriptionMappers<TSnapshot, TOutput, TMappedEvent>\n> {\n actor: AnyActorRef;\n mappers: TMappers;\n}\n\nexport type SubscriptionActorLogic<\n TSnapshot extends Snapshot<unknown> = Snapshot<unknown>,\n TOutput = unknown,\n TMappedEvent extends EventObject = EventObject\n> = ActorLogic<\n SubscriptionSnapshot,\n EventObject,\n SubscriptionInput<\n TSnapshot,\n TOutput,\n TMappedEvent,\n SubscriptionMappers<TSnapshot, TOutput, TMappedEvent>\n >,\n AnyActorSystem,\n EventObject\n>;\n\nexport type SubscriptionActorRef<\n TSnapshot extends Snapshot<unknown> = Snapshot<unknown>,\n TOutput = unknown,\n TMappedEvent extends EventObject = EventObject\n> = ActorRefFromLogic<SubscriptionActorLogic<TSnapshot, TOutput, TMappedEvent>>;\n\n/**\n * Creates actor logic for subscribing to lifecycle events (done/error/snapshot)\n * from another actor. Used internally by `enq.subscribeTo()`.\n */\nexport function createSubscriptionLogic<\n TSnapshot extends Snapshot<unknown> = Snapshot<unknown>,\n TOutput = unknown,\n TMappedEvent extends EventObject = EventObject\n>(): SubscriptionActorLogic<TSnapshot, TOutput, TMappedEvent> {\n return createAttachedLogic(({ actor, mappers }, { self, system }) => {\n const { done, error, snapshot: onSnapshot } = mappers;\n\n // Atoms emit a raw value (no `status`) and have no done/error lifecycle —\n // pass the value straight to the `snapshot` mapper.\n if (isAtom(actor)) {\n if (!onSnapshot) {\n return;\n }\n return actor.subscribe((value) =>\n relayMappedToParent(self, system, () => onSnapshot(value as TSnapshot))\n );\n }\n\n return actor.subscribe({\n next: (snapshot: TSnapshot) => {\n if (snapshot.status === 'done' && done) {\n relayMappedToParent(self, system, () =>\n done(snapshot.output as TOutput)\n );\n } else if (snapshot.status === 'error' && error) {\n relayMappedToParent(self, system, () => error(snapshot.error));\n } else if (snapshot.status === 'active' && onSnapshot) {\n relayMappedToParent(self, system, () => onSnapshot(snapshot));\n }\n },\n error: (err: unknown) => {\n if (error) {\n relayMappedToParent(self, system, () => error(err));\n }\n },\n complete: () => {\n // Actor completed without output (stopped); no action needed\n }\n });\n });\n}\n\n// Singleton logic instance\nexport const subscriptionLogic = /* #__PURE__ */ createSubscriptionLogic();\n","import isDevelopment from '#is-development';\nimport { builtInActions } from './actions.ts';\nimport { listenerLogic, type ListenerInput } from './actors/listener.ts';\nimport {\n subscriptionLogic,\n type SubscriptionInput,\n type SubscriptionMappers\n} from './actors/subscription.ts';\nimport { createActor } from './createActor.ts';\nimport { cloneMachineSnapshot } from './State.ts';\nimport type {\n Action,\n AnyAction,\n AnyActor,\n AnyActorScope,\n AnyEventObject,\n AnyMachineSnapshot,\n EnqueueObject,\n EventObject\n} from './types.ts';\n\nfunction pushBuiltInAction(actions: any[], action: any, ...args: any[]) {\n actions.push({ action, args } as AnyAction);\n}\n\nfunction registerSpawnedChild(actor: AnyActor, id: string) {\n return Object.assign(\n function registerChild(args: { children: Record<string, AnyActor> }) {\n return { children: { ...args.children, [id]: actor } };\n },\n { _special: true }\n );\n}\n\nfunction unregisterChild(actor: AnyActor) {\n return Object.assign(\n function removeChild(args: {\n children: Record<string, AnyActor | undefined>;\n }) {\n const children = { ...args.children };\n for (const key of Object.keys(children)) {\n if (children[key] === actor) {\n delete children[key];\n }\n }\n return { children };\n },\n { _special: true }\n );\n}\n\nfunction pushStartedChild(\n actions: any[],\n actor: AnyActor,\n id: string | undefined\n) {\n pushBuiltInAction(actions, builtInActions['@xstate.start'], actor);\n actions.push(registerSpawnedChild(actor, id ?? actor.id));\n}\n\nexport function createTransitionEnqueue(\n actorScope: AnyActorScope,\n actions: any[],\n internalEvents: EventObject[],\n actorSubscriptions = false\n) {\n const props: Partial<EnqueueObject<any, any>> = {\n cancel: (id: string) => {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.cancel'],\n actorScope,\n id\n );\n },\n emit: (emittedEvent) => {\n actions.push(emittedEvent);\n },\n log: (...args) => {\n pushBuiltInAction(actions, actorScope.logger, ...args);\n },\n raise: (raisedEvent, options) => {\n if (typeof raisedEvent === 'string') {\n throw new Error(\n isDevelopment\n ? `Only event objects may be used with raise; use raise({ type: \"${raisedEvent}\" }) instead`\n : `Only event objects may be used with raise`\n );\n }\n if (options?.delay !== undefined) {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.raise'],\n actorScope,\n raisedEvent,\n options\n );\n } else {\n internalEvents.push(raisedEvent);\n }\n },\n spawn: (logic, options) => {\n const actor = createActor(logic, {\n ...options,\n parent: actorScope.self\n });\n pushStartedChild(actions, actor, options?.id);\n return actor;\n },\n sendTo: (actor, event, options) => {\n if (actor) {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.sendTo'],\n actorScope,\n actor,\n event,\n options\n );\n }\n },\n stop: (actor) => {\n if (actor) {\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.stopChild'],\n actorScope,\n actor\n );\n actions.push(unregisterChild(actor));\n }\n }\n };\n\n if (actorSubscriptions) {\n Object.assign(props, {\n listen: (actor: any, eventType: string, mapper: any) => {\n const input: ListenerInput<any, any> = {\n actor,\n eventType,\n mapper\n };\n const listenerActor = createActor(listenerLogic, {\n input,\n parent: actorScope.self\n });\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.start'],\n listenerActor\n );\n return listenerActor;\n },\n subscribeTo: (actor: any, mappers: any) => {\n const normalizedMappers: SubscriptionMappers<any, any, any> =\n typeof mappers === 'function' ? { snapshot: mappers } : mappers;\n\n const input: SubscriptionInput<any, any, any, any> = {\n actor,\n mappers: normalizedMappers\n };\n const subscriptionActor = createActor(subscriptionLogic, {\n input,\n parent: actorScope.self\n });\n pushBuiltInAction(\n actions,\n builtInActions['@xstate.start'],\n subscriptionActor\n );\n return subscriptionActor;\n }\n });\n }\n\n return createEnqueueObject(props, (action, ...args) => {\n pushBuiltInAction(actions, action, ...args);\n });\n}\n\nexport function resolveAndExecuteActionsWithContext(\n currentSnapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope,\n actions: AnyAction[]\n): AnyMachineSnapshot {\n let intermediateSnapshot = currentSnapshot;\n\n for (const action of actions) {\n const isInline = typeof action === 'function';\n\n const resolvedAction = isInline\n ? action\n : typeof action === 'object' &&\n 'action' in action &&\n typeof action.action === 'function'\n ? action.action.bind(null, ...action.args)\n : false;\n\n if (!resolvedAction && typeof action === 'object' && action !== null) {\n actorScope.defer(() => {\n actorScope.emit(action);\n });\n }\n\n const actionArgs = {\n context: intermediateSnapshot.context,\n event,\n self: actorScope.self,\n system: actorScope.system,\n children: intermediateSnapshot.children,\n parent: actorScope.self._parent,\n actions: currentSnapshot.machine.implementations.actions,\n actors: currentSnapshot.machine.implementations.actors\n };\n\n let actionParams = undefined;\n\n if (typeof action === 'object' && action !== null) {\n const { type: _, ...emittedEventParams } = action as any;\n actionParams = emittedEventParams;\n }\n\n if (resolvedAction && '_special' in resolvedAction) {\n actorScope.actionExecutor({\n type:\n typeof action === 'object'\n ? 'action' in action && typeof action.action === 'function'\n ? (action.action.name ?? '(anonymous)')\n : ((action as any).type ?? '(anonymous)')\n : action.name || '(anonymous)',\n params: actionParams,\n args: [],\n exec: undefined\n });\n\n const specialAction = resolvedAction as unknown as Action<\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >;\n\n const res = specialAction(actionArgs as any, emptyEnqueueObject);\n\n if (res && ('context' in res || 'children' in res)) {\n intermediateSnapshot = cloneMachineSnapshot(intermediateSnapshot, {\n ...('context' in res ? { context: res.context } : {}),\n ...('children' in res ? { children: res.children } : {})\n });\n }\n continue;\n }\n\n if (!resolvedAction || !('resolve' in resolvedAction)) {\n actorScope.actionExecutor({\n type:\n typeof action === 'object'\n ? 'action' in action && typeof action.action === 'function'\n ? (action.action.name ?? '(anonymous)')\n : (action as AnyEventObject).type\n : action.name || '(anonymous)',\n params: actionParams,\n args:\n typeof action === 'object' && 'action' in action ? action.args : [],\n exec: resolvedAction\n });\n continue;\n }\n }\n\n return intermediateSnapshot;\n}\n\nfunction createEnqueueObject(\n props: Partial<EnqueueObject<any, any>>,\n action: <T extends (...args: any[]) => any>(\n fn: T,\n ...args: Parameters<T>\n ) => void\n): EnqueueObject<any, any> {\n const enqueueFn = (\n fn: (...args: any[]) => any,\n ...args: Parameters<typeof fn>\n ) => {\n action(fn, ...args);\n };\n\n Object.assign(enqueueFn, {\n cancel: () => {},\n emit: () => {},\n log: () => {},\n raise: () => {},\n spawn: () => ({}) as any,\n sendTo: () => {},\n stop: () => {},\n listen: () => ({}) as any,\n subscribeTo: () => ({}) as any,\n ...props\n });\n\n return enqueueFn as any;\n}\n\nconst emptyEnqueueObject = createEnqueueObject({}, () => {});\n","import isDevelopment from '#is-development';\nimport { MachineSnapshot, cloneMachineSnapshot } from './State.ts';\nimport type { StateNode } from './StateNode.ts';\nimport {\n createAfterEvent,\n createDoneStateEvent,\n createInvokeTimeoutEvent,\n createTimeoutEvent\n} from './eventUtils.ts';\nimport {\n XSTATE_INIT,\n STATE_DELIMITER,\n STATE_IDENTIFIER,\n XSTATE_STOP\n} from './constants.ts';\nimport { matchesEventDescriptor } from './utils.ts';\nimport {\n AnyEventObject,\n AnyMachineSnapshot,\n AnyStateNode,\n AnyTransitionDefinition,\n DelayedTransitionDefinition,\n EventObject,\n ExecutableActionObject,\n HistoryValue,\n MachineContext,\n StateValue,\n TransitionDefinition,\n AnyAction,\n AnyTransitionConfig,\n AnyActor,\n AnyActorScope,\n EnqueueObject,\n DoneStateEvent\n} from './types.ts';\nimport {\n resolveOutput,\n normalizeTarget,\n toArray,\n toStatePath,\n isErrorActorEvent,\n resolveReferencedActor,\n toTransitionConfigArray\n} from './utils.ts';\nimport { createActor } from './createActor.ts';\nimport { builtInActions } from './actions.ts';\nimport {\n createTransitionEnqueue,\n resolveAndExecuteActionsWithContext\n} from './transitionActions.ts';\nimport { parseDurationToMilliseconds } from './delay.ts';\n\ntype AnyStateNodeIterable = Iterable<AnyStateNode>;\n\nfunction getConfiguredDelayValue(\n delay: number | string,\n delaySource: Record<string, any>\n) {\n if (typeof delay !== 'string') {\n return delay;\n }\n\n const referencedDelay = delaySource[delay];\n if (referencedDelay !== undefined) {\n return referencedDelay;\n }\n\n return parseDurationToMilliseconds(delay) ?? delay;\n}\n\nfunction resolveDelay(\n delay: number | string | ((args: any) => number),\n delaySource: Record<string, any>,\n args: {\n context: MachineContext;\n event: EventObject;\n stateNode: AnyStateNode;\n }\n) {\n if (typeof delay === 'function') {\n return delay(args);\n }\n\n const configuredDelay = getConfiguredDelayValue(delay, delaySource);\n if (typeof configuredDelay === 'function') {\n return configuredDelay(args);\n }\n\n return configuredDelay;\n}\n\nexport function isAtomicStateNode(stateNode: AnyStateNode) {\n return (\n stateNode.type === 'atomic' ||\n stateNode.type === 'final' ||\n stateNode.type === 'choice'\n );\n}\n\nfunction getChildren(stateNode: AnyStateNode): Array<AnyStateNode> {\n return Object.values(stateNode.states).filter((sn) => sn.type !== 'history');\n}\n\nexport function getProperAncestors(\n stateNode: AnyStateNode,\n toStateNode: AnyStateNode | undefined\n): Array<typeof stateNode> {\n const ancestors: Array<typeof stateNode> = [];\n\n if (toStateNode === stateNode) {\n return ancestors;\n }\n\n // add all ancestors\n let m = stateNode.parent;\n while (m && m !== toStateNode) {\n ancestors.push(m);\n m = m.parent;\n }\n\n return ancestors;\n}\n\nexport function getAllStateNodes(\n stateNodes: Iterable<AnyStateNode>\n): Set<AnyStateNode> {\n const nodeSet = new Set(stateNodes);\n const activeParentSet = new Set<AnyStateNode>();\n for (const stateNode of nodeSet) {\n if (stateNode.parent) {\n activeParentSet.add(stateNode.parent);\n }\n }\n\n // add descendants\n for (const s of nodeSet) {\n // if previously active, add existing child nodes\n if (s.type === 'compound' && !activeParentSet.has(s)) {\n for (const sn of getInitialStateNodes(s)) {\n nodeSet.add(sn);\n }\n continue;\n }\n\n if (s.type === 'parallel') {\n for (const child of getChildren(s)) {\n if (!nodeSet.has(child)) {\n const initialStates = getInitialStateNodes(child);\n for (const initialStateNode of initialStates) {\n nodeSet.add(initialStateNode);\n }\n }\n }\n }\n }\n\n // add all ancestors\n // Stop walking up as soon as we hit a node already in the set: its own\n // ancestor chain is guaranteed to be added when it is visited by this loop\n // (Set iteration visits elements added during iteration), so shared ancestor\n // chains are never re-walked once per descendant.\n for (const s of nodeSet) {\n let m = s.parent;\n\n while (m && !nodeSet.has(m)) {\n nodeSet.add(m);\n m = m.parent;\n }\n }\n\n return nodeSet;\n}\n\nexport function getStateValue(\n rootNode: AnyStateNode,\n stateNodes: AnyStateNodeIterable\n): StateValue {\n const config = getAllStateNodes(stateNodes);\n const adjList = new Map<AnyStateNode, Array<AnyStateNode>>();\n\n for (const s of config) {\n if (!adjList.has(s)) {\n adjList.set(s, []);\n }\n\n if (!s.parent) {\n continue;\n }\n\n if (!adjList.has(s.parent)) {\n adjList.set(s.parent, []);\n }\n\n adjList.get(s.parent)!.push(s);\n }\n\n const getValueFromAdj = (baseNode: AnyStateNode): StateValue => {\n const childStateNodes = adjList.get(baseNode);\n\n if (!childStateNodes) {\n return {}; // todo: fix?\n }\n\n if (baseNode.type === 'compound') {\n const childStateNode = childStateNodes[0];\n if (!childStateNode) {\n return {};\n }\n if (isAtomicStateNode(childStateNode)) {\n return childStateNode.key;\n }\n }\n\n const stateValue: StateValue = {};\n for (const childStateNode of childStateNodes) {\n stateValue[childStateNode.key] = getValueFromAdj(childStateNode);\n }\n\n return stateValue;\n };\n\n return getValueFromAdj(rootNode);\n}\n\nexport function isInFinalState(\n stateNodeSet: Set<AnyStateNode>,\n stateNode: AnyStateNode\n): boolean {\n if (stateNode.type === 'compound') {\n return getChildren(stateNode).some(\n (s) => s.type === 'final' && stateNodeSet.has(s)\n );\n }\n if (stateNode.type === 'parallel') {\n return getChildren(stateNode).every((sn) =>\n isInFinalState(stateNodeSet, sn)\n );\n }\n\n return stateNode.type === 'final';\n}\n\nexport const isStateId = (str: string) => str[0] === STATE_IDENTIFIER;\n\nexport function getCandidates<TEvent extends EventObject>(\n stateNode: StateNode<any, TEvent>,\n receivedEventType: TEvent['type']\n): Array<TransitionDefinition<any, TEvent>> {\n const candidates = stateNode.transitions.get(receivedEventType);\n if (candidates) {\n return candidates;\n }\n\n const matchingDescriptors: string[] = [];\n\n for (const eventDescriptor of stateNode.transitions.keys()) {\n if (matchesEventDescriptor(receivedEventType, eventDescriptor)) {\n matchingDescriptors.push(eventDescriptor);\n }\n }\n\n matchingDescriptors.sort((a, b) => b.length - a.length);\n\n const wildcardCandidates: Array<TransitionDefinition<any, TEvent>> = [];\n for (const descriptor of matchingDescriptors) {\n wildcardCandidates.push(...stateNode.transitions.get(descriptor)!);\n }\n\n return wildcardCandidates;\n}\n\nfunction scheduleDelayedEvent(\n stateNode: AnyStateNode,\n event: AnyEventObject,\n resolveScheduledDelay: (x: {\n context: MachineContext;\n event: EventObject;\n delays: Record<string, any>;\n }) => any\n) {\n const eventType = event.type;\n const oldEntry = stateNode.entry;\n stateNode.entry = (x: any, enq: any) => {\n enq.raise(event as any, {\n id: eventType,\n delay: resolveScheduledDelay(x)\n });\n return typeof oldEntry === 'function' ? oldEntry(x, enq) : undefined;\n };\n const oldExit = stateNode.exit;\n stateNode.exit = (_: any, enq: any) => {\n enq.cancel(eventType);\n return typeof oldExit === 'function' ? oldExit(_, enq) : undefined;\n };\n\n return eventType;\n}\n\n/** All delayed transitions from the config. */\nexport function getDelayedTransitions(\n stateNode: AnyStateNode\n): Array<DelayedTransitionDefinition<MachineContext, EventObject>> {\n const afterConfig = stateNode.config.after;\n const timeoutConfig = (stateNode.config as any).timeout;\n const onTimeoutConfig = (stateNode.config as any).onTimeout;\n const invokeDefs = stateNode.invoke.filter(\n (invokeDef) => invokeDef.timeout !== undefined\n );\n\n if (!afterConfig && timeoutConfig === undefined && invokeDefs.length === 0) {\n return [];\n }\n\n if (isDevelopment && timeoutConfig !== undefined && !onTimeoutConfig) {\n throw new Error(\n `State \"${stateNode.id}\" has \\`timeout\\` but no \\`onTimeout\\` transition.`\n );\n }\n\n if (isDevelopment) {\n for (const invokeDef of invokeDefs) {\n if (!invokeDef.onTimeout) {\n throw new Error(\n `Invoke on state \"${stateNode.id}\" has \\`timeout\\` but no \\`onTimeout\\` transition.`\n );\n }\n }\n }\n\n const mutateEntryExitWithDelay = (delay: string | number) => {\n const afterEvent = createAfterEvent(delay, stateNode.id);\n return scheduleDelayedEvent(stateNode, afterEvent, (x) =>\n resolveDelay(delay, x.delays, {\n context: x.context,\n event: x.event,\n stateNode\n })\n );\n };\n\n const delayedTransitions: Array<\n AnyTransitionConfig & { event: string; delay: any }\n > = [];\n const addDelayedTransitions = (\n transitionsConfig: unknown,\n event: string,\n delay: unknown\n ) => {\n for (const transition of toTransitionConfigArray(\n transitionsConfig as any\n )) {\n delayedTransitions.push({\n ...transition,\n event,\n delay\n });\n }\n };\n\n if (afterConfig) {\n for (const delay of Object.keys(afterConfig)) {\n const configTransition = afterConfig[delay];\n const parsedDelay = Number.isNaN(+delay) ? delay : +delay;\n const eventType = mutateEntryExitWithDelay(parsedDelay);\n const resolvedDelay = getConfiguredDelayValue(\n parsedDelay,\n stateNode.machine.implementations.delays\n );\n\n addDelayedTransitions(configTransition, eventType, resolvedDelay);\n }\n }\n\n // Desugar state-level `timeout` + `onTimeout` into a delayed transition.\n // Uses a dedicated `xstate.timeout.<id>` event so it cannot collide with\n // explicit `after` entries on the same state.\n if (timeoutConfig !== undefined && onTimeoutConfig) {\n const timeoutEvent = createTimeoutEvent(stateNode.id);\n const timeoutEventType = scheduleDelayedEvent(\n stateNode,\n timeoutEvent,\n (x) =>\n resolveDelay(timeoutConfig, x.delays, {\n context: x.context,\n event: x.event,\n stateNode\n }) as number\n );\n\n const resolvedDelay =\n typeof timeoutConfig === 'function'\n ? timeoutConfig\n : getConfiguredDelayValue(\n timeoutConfig,\n stateNode.machine.implementations.delays\n );\n\n addDelayedTransitions(onTimeoutConfig, timeoutEventType, resolvedDelay);\n }\n\n // Desugar invoke-level `timeout` + `onTimeout` into a delayed transition on\n // the enclosing state. Completion transitions cancel this timer separately,\n // so the timeout is cleared even when the parent state stays active.\n for (const invokeDef of invokeDefs) {\n const invokeTimeoutEvent = createInvokeTimeoutEvent(invokeDef.id);\n const invokeTimeout = invokeDef.timeout!;\n const invokeTimeoutEventType = scheduleDelayedEvent(\n stateNode,\n invokeTimeoutEvent,\n (x) =>\n resolveDelay(\n invokeTimeout,\n {},\n {\n context: x.context,\n event: x.event,\n stateNode\n }\n ) as number\n );\n\n const invokeOnTimeout = invokeDef.onTimeout;\n addDelayedTransitions(\n invokeOnTimeout,\n invokeTimeoutEventType,\n invokeTimeout as any\n );\n }\n return delayedTransitions.map((delayedTransition) => ({\n ...formatTransition(\n stateNode,\n delayedTransition.event,\n delayedTransition as AnyTransitionConfig\n ),\n delay: delayedTransition.delay\n }));\n}\n\nexport function formatTransition(\n stateNode: AnyStateNode,\n descriptor: string,\n transitionConfig: AnyTransitionConfig\n): AnyTransitionDefinition {\n const normalizedTarget = normalizeTarget(transitionConfig.target);\n const reenter = transitionConfig.reenter ?? false;\n const target = resolveTarget(stateNode, normalizedTarget);\n\n const transition = {\n ...transitionConfig,\n target,\n source: stateNode,\n reenter,\n eventType: descriptor,\n toJSON: () => ({\n ...transition,\n source: `#${stateNode.id}`,\n target: target ? target.map((t) => `#${t.id}`) : undefined\n })\n };\n\n return transition;\n}\n\n/**\n * Collects route transitions from all descendants with explicit IDs. Called\n * once on the root node to avoid O(N²) repeated traversals.\n */\nexport function formatRouteTransitions(rootStateNode: AnyStateNode): void {\n const routeTransitions: AnyTransitionDefinition[] = [];\n const collectRoutes = (states: Record<string, AnyStateNode>) => {\n Object.values(states).forEach((sn) => {\n if (sn.config.route && sn.config.id) {\n const routeId = sn.config.id;\n const routeConfig = sn.config.route;\n const routeMatches = ({ event }: { event: any }) =>\n event.to === `#${routeId}`;\n\n if (typeof routeConfig === 'function') {\n // Transition-style route: the function is the guard and resolver.\n // Returning undefined/false blocks the route; returning true or a\n // config object allows it.\n routeTransitions.push(\n formatTransition(rootStateNode, 'xstate.route', {\n guard: routeMatches,\n to: (args: any) => {\n const result = routeConfig(args);\n if (!result) {\n return undefined;\n }\n return {\n ...(result === true ? {} : result),\n target: `#${routeId}`\n };\n }\n } as AnyTransitionConfig)\n );\n if (sn.states) {\n collectRoutes(sn.states);\n }\n return;\n }\n\n if ('$unserializable' in routeConfig) {\n throw new Error(\n `State \"${sn.id}\" has a route that is not serializable. Re-provide the route function when reviving this machine.`\n );\n }\n\n // Object-form route. A `guard` (string or function) on the object is\n // only produced by the JSON layer (createMachineFromConfig) —\n // authoring uses the function form above.\n const userGuard = (routeConfig as any).guard;\n\n const transition: AnyTransitionConfig = {\n ...routeConfig,\n guard: userGuard\n ? (args: {\n event: any;\n guards: Record<string, (...a: any[]) => any>;\n }) => {\n if (!routeMatches(args)) return false;\n if (typeof userGuard === 'function') return userGuard(args);\n if (typeof userGuard === 'string') {\n const guardImpl = args.guards?.[userGuard];\n if (!guardImpl) {\n // A typo'd guard name must fail loudly — silently passing\n // would allow the route and corrupt machine behavior.\n throw new Error(\n isDevelopment\n ? `Guard '${userGuard}' is not implemented in machine '${rootStateNode.machine.id}'. Available guards: ${\n Object.keys(args.guards ?? {})\n .map((key) => `'${key}'`)\n .join(', ') || '(none)'\n }.`\n : `Guard '${userGuard}' is not implemented in machine '${rootStateNode.machine.id}'.`\n );\n }\n return guardImpl(args);\n }\n return true;\n }\n : routeMatches,\n target: `#${routeId}`\n };\n\n routeTransitions.push(\n formatTransition(rootStateNode, 'xstate.route', transition)\n );\n }\n if (sn.states) {\n collectRoutes(sn.states);\n }\n });\n };\n collectRoutes(rootStateNode.states);\n if (routeTransitions.length > 0) {\n rootStateNode.transitions.set('xstate.route', routeTransitions as any);\n }\n}\n\nfunction resolveTarget(\n stateNode: AnyStateNode,\n targets: ReadonlyArray<string | AnyStateNode> | undefined\n): ReadonlyArray<AnyStateNode> | undefined {\n if (targets === undefined) {\n // an undefined target signals that the state node should not transition from that state when receiving that event\n return undefined;\n }\n return targets.map((target) => {\n if (typeof target !== 'string') {\n return target;\n }\n if (isStateId(target)) {\n return stateNode.machine.getStateNodeById(target);\n }\n\n const isInternalTarget = target[0] === STATE_DELIMITER;\n // If internal target is defined on machine,\n // do not include machine key on target\n if (isInternalTarget && !stateNode.parent) {\n return getStateNodeByPath(stateNode, target.slice(1));\n }\n const resolvedTarget = isInternalTarget ? stateNode.key + target : target;\n if (stateNode.parent) {\n try {\n const targetStateNode = getStateNodeByPath(\n stateNode.parent,\n resolvedTarget\n );\n return targetStateNode;\n } catch (err: any) {\n throw new Error(\n `Invalid transition definition for state node '${stateNode.id}':\\n${err.message}`\n );\n }\n } else {\n throw new Error(\n isDevelopment\n ? `Invalid target: \"${target}\" is not a valid target from the root node. Did you mean \".${target}\"?`\n : `Invalid target: \"${target}\"`\n );\n }\n });\n}\n\nfunction resolveHistoryDefaultTransition(\n stateNode: AnyStateNode & { type: 'history' }\n): AnyTransitionDefinition {\n const normalizedTarget = normalizeTarget(stateNode.config.target);\n if (!normalizedTarget) {\n return stateNode.parent!.initial as AnyTransitionDefinition;\n }\n return {\n target: normalizedTarget.map((t) =>\n typeof t === 'string' ? getStateNodeByPath(stateNode.parent!, t) : t\n ),\n source: stateNode,\n reenter: false,\n eventType: '' as any\n };\n}\n\nfunction isHistoryNode(\n stateNode: AnyStateNode\n): stateNode is AnyStateNode & { type: 'history' } {\n return stateNode.type === 'history';\n}\n\nfunction getInitialStateNodes(stateNode: AnyStateNode) {\n const set = new Set<AnyStateNode>();\n\n function iter(descStateNode: AnyStateNode): void {\n if (set.has(descStateNode)) {\n return;\n }\n set.add(descStateNode);\n if (descStateNode.type === 'compound') {\n iter(descStateNode.initial.target![0]);\n } else if (descStateNode.type === 'parallel') {\n for (const child of getChildren(descStateNode)) {\n iter(child);\n }\n }\n }\n\n iter(stateNode);\n for (const initialState of set) {\n for (const ancestor of getProperAncestors(initialState, stateNode)) {\n set.add(ancestor);\n }\n }\n\n return set;\n}\n\n/** Returns the child state node from its relative `stateKey`, or throws. */\nfunction getStateNode(stateNode: AnyStateNode, stateKey: string): AnyStateNode {\n if (isStateId(stateKey)) {\n return stateNode.machine.getStateNodeById(stateKey);\n }\n if (!stateNode.states) {\n throw new Error(\n `Unable to retrieve child state '${stateKey}' from '${stateNode.id}'; no child states exist.`\n );\n }\n const result = stateNode.states[stateKey];\n if (!result) {\n throw new Error(\n `Child state '${stateKey}' does not exist on '${stateNode.id}'`\n );\n }\n return result;\n}\n\n/**\n * Returns the relative state node from the given `statePath`, or throws.\n *\n * @param statePath The string or string array relative path to the state node.\n */\nexport function getStateNodeByPath(\n stateNode: AnyStateNode,\n statePath: string | string[]\n): AnyStateNode {\n if (typeof statePath === 'string' && isStateId(statePath)) {\n try {\n return stateNode.machine.getStateNodeById(statePath);\n } catch {\n // try individual paths\n // throw e;\n }\n }\n const arrayStatePath = toStatePath(statePath).slice();\n let currentStateNode: AnyStateNode = stateNode;\n while (arrayStatePath.length) {\n const key = arrayStatePath.shift()!;\n if (!key.length) {\n break;\n }\n currentStateNode = getStateNode(currentStateNode, key);\n }\n return currentStateNode;\n}\n\n/**\n * Returns the state nodes represented by the current state value.\n *\n * @param stateValue The state value or State instance\n */\nexport function getStateNodes(\n stateNode: AnyStateNode,\n stateValue: StateValue\n): Array<AnyStateNode> {\n if (typeof stateValue === 'string') {\n const childStateNode = stateNode.states[stateValue];\n if (!childStateNode) {\n throw new Error(\n `State '${stateValue}' does not exist on '${stateNode.id}'`\n );\n }\n return [stateNode, childStateNode];\n }\n\n const childStateKeys = Object.keys(stateValue);\n const childStateNodes = new Array<AnyStateNode>(childStateKeys.length);\n const allStateNodes: Array<AnyStateNode> = [\n stateNode.machine.root,\n stateNode\n ];\n\n for (let i = 0; i < childStateKeys.length; i++) {\n const subStateNode = getStateNode(stateNode, childStateKeys[i]);\n childStateNodes[i] = subStateNode;\n allStateNodes.push(subStateNode);\n }\n\n for (let i = 0; i < childStateKeys.length; i++) {\n allStateNodes.push(\n ...getStateNodes(childStateNodes[i], stateValue[childStateKeys[i]]!)\n );\n }\n\n return allStateNodes;\n}\n\nexport function transitionNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValue,\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n any,\n any,\n any,\n any,\n any,\n any // TStateSchema\n >,\n event: TEvent,\n self: AnyActor\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n // leaf node\n if (typeof stateValue === 'string') {\n const childStateNode = getStateNode(stateNode, stateValue);\n const next = childStateNode.next(snapshot, event, self);\n\n if (!next || !next.length) {\n return stateNode.next(snapshot, event, self);\n }\n\n return next;\n }\n\n const subStateKeys = Object.keys(stateValue);\n const subStateKey = subStateKeys[0];\n\n if (subStateKeys.length === 1) {\n const childStateNode = getStateNode(stateNode, subStateKey);\n const next = transitionNode(\n childStateNode,\n stateValue[subStateKey]!,\n snapshot,\n event,\n self\n );\n\n if (!next || !next.length) {\n return stateNode.next(snapshot, event, self);\n }\n\n return next;\n }\n\n const allInnerTransitions: Array<TransitionDefinition<TContext, TEvent>> = [];\n\n for (const subStateKey of subStateKeys) {\n const subStateValue = stateValue[subStateKey];\n\n if (!subStateValue) {\n continue;\n }\n\n const subStateNode = getStateNode(stateNode, subStateKey);\n const innerTransitions = transitionNode(\n subStateNode,\n subStateValue,\n snapshot,\n event,\n self\n );\n if (innerTransitions) {\n allInnerTransitions.push(...innerTransitions);\n }\n }\n\n if (!allInnerTransitions.length) {\n return stateNode.next(snapshot, event, self);\n }\n\n return allInnerTransitions;\n}\n\nfunction isDescendant(\n childStateNode: AnyStateNode,\n parentStateNode: AnyStateNode\n): boolean {\n let marker = childStateNode;\n while (marker.parent && marker.parent !== parentStateNode) {\n marker = marker.parent;\n }\n\n return marker.parent === parentStateNode;\n}\n\nfunction hasDescendantState(\n stateNodes: Set<AnyStateNode>,\n parentStateNode: AnyStateNode\n): boolean {\n for (const stateNode of stateNodes) {\n if (isDescendant(stateNode, parentStateNode)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasIntersection<T>(s1: Iterable<T>, s2: Iterable<T>): boolean {\n const s1Size =\n s1 instanceof Set ? s1.size : Array.isArray(s1) ? s1.length : undefined;\n const s2Size =\n s2 instanceof Set ? s2.size : Array.isArray(s2) ? s2.length : undefined;\n\n if (s1Size !== undefined && s2Size !== undefined && s2Size < s1Size) {\n [s1, s2] = [s2, s1];\n }\n\n const set1 = s1 instanceof Set ? s1 : new Set(s1);\n for (const item of s2) {\n if (set1.has(item)) {\n return true;\n }\n }\n return false;\n}\n\nfunction removeConflictingTransitions(\n enabledTransitions: Array<AnyTransitionDefinition>,\n stateNodeSet: Set<AnyStateNode>,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): Array<AnyTransitionDefinition> {\n const filteredTransitions = new Set<AnyTransitionDefinition>();\n const exitSets = new Map<AnyTransitionDefinition, Array<AnyStateNode>>();\n\n const getExitSet = (transition: AnyTransitionDefinition) => {\n let exitSet = exitSets.get(transition);\n if (!exitSet) {\n exitSet = computeExitSet(\n [transition],\n stateNodeSet,\n snapshot,\n event,\n actorScope\n );\n exitSets.set(transition, exitSet);\n }\n\n return exitSet;\n };\n\n for (const t1 of enabledTransitions) {\n let t1Preempted = false;\n const transitionsToRemove = new Set<AnyTransitionDefinition>();\n for (const t2 of filteredTransitions) {\n if (hasIntersection(getExitSet(t1), getExitSet(t2))) {\n if (isDescendant(t1.source, t2.source)) {\n transitionsToRemove.add(t2);\n } else {\n t1Preempted = true;\n break;\n }\n }\n }\n if (!t1Preempted) {\n for (const t3 of transitionsToRemove) {\n filteredTransitions.delete(t3);\n }\n filteredTransitions.add(t1);\n }\n }\n\n return Array.from(filteredTransitions);\n}\n\nfunction getEffectiveTargetStates(\n transition: Pick<AnyTransitionDefinition, 'target' | 'source'>,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): Array<AnyStateNode> {\n const historyValue = snapshot.historyValue;\n const { targets } = getTransitionResult(\n transition,\n snapshot,\n event,\n actorScope\n );\n if (!targets) {\n return [];\n }\n\n const targetSet = new Set<AnyStateNode>();\n\n for (const targetNode of targets) {\n if (isHistoryNode(targetNode)) {\n if (historyValue[targetNode.id]) {\n for (const node of historyValue[targetNode.id]) {\n targetSet.add(node);\n }\n } else {\n for (const node of getEffectiveTargetStates(\n resolveHistoryDefaultTransition(targetNode),\n snapshot,\n event,\n actorScope\n )) {\n targetSet.add(node);\n }\n }\n } else {\n targetSet.add(targetNode);\n }\n }\n\n return [...targetSet];\n}\n\nfunction getTransitionDomain(\n transition: AnyTransitionDefinition,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): AnyStateNode | undefined {\n const targetStates = getEffectiveTargetStates(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n const { reenter } = getTransitionResult(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n if (\n !reenter &&\n targetStates.every(\n (target) =>\n target === transition.source || isDescendant(target, transition.source)\n )\n ) {\n return transition.source;\n }\n\n const [head, ...tail] = targetStates.concat(transition.source);\n // Find the least common ancestor (LCA) of the source and effective targets.\n for (const ancestor of getProperAncestors(head, undefined)) {\n if (tail.every((sn) => isDescendant(sn, ancestor))) {\n return ancestor;\n }\n }\n\n // at this point we know that it's a root transition since LCA couldn't be found\n if (reenter) {\n return;\n }\n\n return transition.source.machine.root;\n}\n\nfunction computeExitSet(\n transitions: Array<AnyTransitionDefinition>,\n stateNodeSet: Set<AnyStateNode>,\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): Array<AnyStateNode> {\n const statesToExit = new Set<AnyStateNode>();\n for (const transition of transitions) {\n const { targets } = getTransitionResult(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n if (targets?.length) {\n const domain = getTransitionDomain(\n transition,\n snapshot,\n event,\n actorScope\n );\n\n if (transition.reenter && transition.source === domain) {\n statesToExit.add(domain);\n }\n\n for (const stateNode of stateNodeSet) {\n if (isDescendant(stateNode, domain!)) {\n statesToExit.add(stateNode);\n }\n }\n }\n }\n\n return [...statesToExit];\n}\n\ntype Microstep = readonly [AnyMachineSnapshot, ExecutableActionObject[]];\n\nexport function initialMicrostep(\n root: AnyStateNode,\n preInitialState: AnyMachineSnapshot,\n actorScope: AnyActorScope,\n initEvent: AnyEventObject,\n internalQueue: AnyEventObject[]\n): Microstep {\n return microstep(\n [\n {\n target: [...getInitialStateNodes(root)],\n source: root,\n reenter: true,\n eventType: null as any,\n toJSON: null as any\n } as AnyTransitionDefinition\n ],\n preInitialState,\n actorScope,\n initEvent,\n true,\n internalQueue\n );\n}\n\n/** https://www.w3.org/TR/scxml/#microstepProcedure */\nfunction microstep(\n transitions: Array<AnyTransitionDefinition>,\n currentSnapshot: AnyMachineSnapshot,\n actorScope: AnyActorScope,\n event: AnyEventObject,\n isInitial: boolean,\n internalQueue: Array<AnyEventObject>\n): Microstep {\n const actions: ExecutableActionObject[] = [];\n\n if (!transitions.length) {\n return [currentSnapshot, actions];\n }\n\n const originalExecutor = actorScope.actionExecutor;\n actorScope.actionExecutor = (action) => {\n actions.push(action);\n originalExecutor(action);\n };\n\n try {\n const mutStateNodeSet = new Set(currentSnapshot._nodes as StateNode[]);\n let historyValue = currentSnapshot.historyValue;\n const originalContext = currentSnapshot.context;\n\n const filteredTransitions = removeConflictingTransitions(\n transitions,\n mutStateNodeSet,\n currentSnapshot,\n event,\n actorScope\n );\n const getCurrentTransitionResult = (\n transition: Parameters<typeof getTransitionResult>[0]\n ) => getTransitionResult(transition, currentSnapshot, event, actorScope);\n const getStateActionsAndContext = (\n transitionFn: any,\n context: MachineContext,\n children: AnyMachineSnapshot['children'],\n input: Record<string, unknown> | undefined\n ): [\n actions: any[],\n context: MachineContext | undefined,\n internalEvents: EventObject[] | undefined\n ] => {\n if (transitionFn.length === 2) {\n // enqueue action; retrieve\n const actions: any[] = [];\n const internalEvents: EventObject[] = [];\n let updatedContext: MachineContext | undefined;\n\n const enqueue = createTransitionEnqueue(\n actorScope,\n actions,\n internalEvents,\n true\n );\n\n const res = transitionFn(\n {\n context,\n event,\n parent: actorScope.self._parent,\n self: actorScope.self,\n children,\n system: actorScope.system,\n actions: currentSnapshot.machine.implementations.actions,\n actors: currentSnapshot.machine.implementations.actors,\n guards: currentSnapshot.machine.implementations.guards,\n delays: currentSnapshot.machine.implementations.delays,\n input\n },\n enqueue\n );\n\n if (res?.context) {\n updatedContext = res.context;\n }\n\n return [actions, updatedContext, internalEvents];\n }\n\n // For 1-argument actions, wrap them to include input\n // Preserve _special flag if present (for entry/exit actions)\n const wrappedAction = Object.assign(\n (args: any, enqueue: any) => transitionFn({ ...args, input }, enqueue),\n '_special' in transitionFn ? { _special: true } : {}\n );\n return [[wrappedAction], undefined, undefined];\n };\n\n let nextState = currentSnapshot;\n const exitStates = () => {\n const statesToExit = computeExitSet(\n filteredTransitions,\n mutStateNodeSet,\n currentSnapshot,\n event,\n actorScope\n );\n\n statesToExit.sort((a, b) => b.order - a.order);\n\n let changedHistory: HistoryValue | undefined;\n const currentStateNodes = [...mutStateNodeSet];\n\n // From SCXML algorithm: https://www.w3.org/TR/scxml/#exitStates\n for (const exitStateNode of statesToExit) {\n for (const historyNode of Object.values(exitStateNode.states)) {\n if (historyNode.type !== 'history') {\n continue;\n }\n\n const predicate =\n historyNode.history === 'deep'\n ? (sn: AnyStateNode) =>\n isAtomicStateNode(sn) && isDescendant(sn, exitStateNode)\n : (sn: AnyStateNode) => sn.parent === exitStateNode;\n\n changedHistory ??= { ...historyValue };\n changedHistory[historyNode.id] = currentStateNodes.filter(predicate);\n }\n }\n\n for (const exitStateNode of statesToExit) {\n const stateInput = currentSnapshot._stateInputs?.[exitStateNode.id];\n\n const [exitActions, nextContext, internalEvents] = exitStateNode.exit\n ? getStateActionsAndContext(\n exitStateNode.exit,\n nextState.context,\n currentSnapshot.children,\n stateInput\n )\n : [[]];\n if (internalEvents?.length) {\n internalQueue.push(...internalEvents);\n }\n if (nextContext) {\n nextState = cloneMachineSnapshot(nextState, {\n context: nextContext\n });\n }\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n exitActions\n );\n for (const def of exitStateNode.invoke) {\n const childActor = nextState.children[def.id];\n if (childActor && !childActor._isExternal) {\n actorScope.stopChild(childActor);\n }\n delete nextState.children[def.id];\n }\n\n mutStateNodeSet.delete(exitStateNode);\n }\n\n historyValue = changedHistory || historyValue;\n };\n\n // Exit states\n if (!isInitial) {\n exitStates();\n }\n\n let context = nextState.context;\n const transitionActions: AnyAction[] = [];\n const internalEvents: EventObject[] = [];\n\n for (const t of filteredTransitions) {\n if (t.actions) {\n transitionActions.push(...toArray(t.actions));\n }\n const res = getCurrentTransitionResult(t);\n if (res.context) {\n context = res.context;\n }\n if (res.actions) {\n transitionActions.push(...res.actions);\n }\n if (res.internalEvents) {\n internalEvents.push(...res.internalEvents);\n }\n }\n\n if (internalEvents.length) {\n internalQueue.push(...internalEvents);\n }\n\n const enterStates = () => {\n const getMachineOutput = (rootCompletionNode: AnyStateNode) => {\n const rootNode = nextState.machine.root;\n if (rootNode.output === undefined) {\n return;\n }\n\n let completionOutput: unknown;\n if (\n rootCompletionNode.output !== undefined &&\n rootCompletionNode.parent\n ) {\n completionOutput = resolveOutput(\n rootCompletionNode.output,\n nextState.context,\n event,\n actorScope.self\n );\n } else if (rootCompletionNode.type === 'parallel') {\n const parallelDoneType = `xstate.done.state.${rootCompletionNode.id}`;\n const parallelDoneEvent = internalQueue.find(\n (e) => e.type === parallelDoneType\n ) as DoneStateEvent | undefined;\n completionOutput = parallelDoneEvent?.output;\n }\n\n return resolveOutput(\n rootNode.output,\n nextState.context,\n createDoneStateEvent(rootCompletionNode.id, completionOutput),\n actorScope.self\n );\n };\n\n const statesToEnter = new Set<AnyStateNode>();\n // those are states that were directly targeted or indirectly targeted by the explicit target\n // in other words, those are states for which initial actions should be executed\n // when we target `#deep_child` initial actions of its ancestors shouldn't be executed\n const statesForDefaultEntry = new Set<AnyStateNode>();\n const addAncestorStatesToEnter = (\n ancestors: AnyStateNode[],\n reentrancyDomain: AnyStateNode | undefined\n ) => {\n for (const anc of ancestors) {\n if (!reentrancyDomain || isDescendant(anc, reentrancyDomain)) {\n statesToEnter.add(anc);\n }\n if (anc.type === 'parallel') {\n for (const child of getChildren(anc)) {\n if (!hasDescendantState(statesToEnter, child)) {\n statesToEnter.add(child);\n addDescendantStatesToEnter(child);\n }\n }\n }\n }\n };\n\n const addDescendantStatesToEnter = (stateNode: AnyStateNode) => {\n if (isHistoryNode(stateNode)) {\n if (historyValue[stateNode.id]) {\n const historyStateNodes = historyValue[stateNode.id];\n for (const s of historyStateNodes) {\n statesToEnter.add(s);\n addDescendantStatesToEnter(s);\n }\n for (const s of historyStateNodes) {\n addAncestorStatesToEnter(\n getProperAncestors(s, stateNode.parent),\n undefined\n );\n }\n } else {\n const historyDefaultTransition =\n resolveHistoryDefaultTransition(stateNode);\n const { targets } = getCurrentTransitionResult(\n historyDefaultTransition\n );\n for (const s of targets ?? []) {\n statesToEnter.add(s);\n\n if (historyDefaultTransition === stateNode.parent?.initial) {\n statesForDefaultEntry.add(stateNode.parent);\n }\n\n addDescendantStatesToEnter(s);\n }\n\n for (const s of targets ?? []) {\n addAncestorStatesToEnter(\n getProperAncestors(s, stateNode.parent),\n undefined\n );\n }\n }\n return;\n }\n\n if (stateNode.type === 'compound') {\n const [initialState] = getCurrentTransitionResult(\n stateNode.initial\n ).targets!;\n\n if (!isHistoryNode(initialState)) {\n statesToEnter.add(initialState);\n statesForDefaultEntry.add(initialState);\n }\n addDescendantStatesToEnter(initialState);\n addAncestorStatesToEnter(\n getProperAncestors(initialState, stateNode),\n undefined\n );\n return;\n }\n\n if (stateNode.type === 'parallel') {\n for (const child of getChildren(stateNode)) {\n if (!hasDescendantState(statesToEnter, child)) {\n statesToEnter.add(child);\n statesForDefaultEntry.add(child);\n addDescendantStatesToEnter(child);\n }\n }\n }\n };\n\n for (const transition of filteredTransitions) {\n const domain = getTransitionDomain(\n transition,\n currentSnapshot,\n event,\n actorScope\n );\n\n const { targets, reenter } = getCurrentTransitionResult(transition);\n\n for (const targetNode of targets ?? []) {\n if (\n !isHistoryNode(targetNode) &&\n (transition.source !== targetNode ||\n transition.source !== domain ||\n reenter)\n ) {\n statesToEnter.add(targetNode);\n statesForDefaultEntry.add(targetNode);\n }\n addDescendantStatesToEnter(targetNode);\n }\n const targetStates = getEffectiveTargetStates(\n transition,\n currentSnapshot,\n event,\n actorScope\n );\n for (const s of targetStates) {\n const ancestors = getProperAncestors(s, domain);\n if (domain?.type === 'parallel') {\n ancestors.push(domain);\n }\n addAncestorStatesToEnter(\n ancestors,\n !transition.source.parent && reenter ? undefined : domain\n );\n }\n }\n\n if (isInitial) {\n statesForDefaultEntry.add(currentSnapshot.machine.root);\n }\n\n const stateInputMap: Record<string, Record<string, unknown>> = {\n ...currentSnapshot._stateInputs\n };\n for (const transition of filteredTransitions) {\n const { targets, input } = getCurrentTransitionResult(transition);\n if (input && targets) {\n for (const targetNode of targets) {\n stateInputMap[targetNode.id] = input;\n }\n }\n }\n\n const completedNodes = new Set<AnyStateNode>();\n const children = { ...currentSnapshot.children };\n for (const stateNodeToEnter of [...statesToEnter].sort(\n (a, b) => a.order - b.order\n )) {\n mutStateNodeSet.add(stateNodeToEnter);\n const actions: AnyAction[] = [];\n\n let invoked = false;\n for (const invokeDef of stateNodeToEnter.invoke) {\n invoked = true;\n\n let src = invokeDef.logic;\n if (typeof src === 'function') {\n src = src({\n actors: currentSnapshot.machine.implementations.actors,\n context: nextState.context,\n event,\n self: actorScope.self\n });\n }\n\n const logic =\n typeof src === 'string'\n ? resolveReferencedActor(currentSnapshot.machine, src)\n : src;\n\n if (!logic) {\n throw new Error(\n `Actor logic '${typeof src === 'string' ? src : 'inline'}' not implemented in machine '${currentSnapshot.machine.id}'`\n );\n }\n\n const input =\n typeof invokeDef.input === 'function'\n ? invokeDef.input({\n self: actorScope.self,\n context: nextState.context,\n event\n })\n : invokeDef.input;\n\n const actor = createActor(logic, {\n ...invokeDef,\n input,\n parent: actorScope.self,\n syncSnapshot: !!invokeDef.onSnapshot\n });\n\n actions.push({\n action: builtInActions['@xstate.start'],\n args: [actor]\n });\n\n if (invokeDef.id) {\n children[invokeDef.id] = actor;\n }\n }\n\n if (invoked) {\n nextState = cloneMachineSnapshot(nextState, { children });\n }\n let context: MachineContext | undefined;\n\n const stateInput = stateInputMap[stateNodeToEnter.id];\n\n if (stateNodeToEnter.entry) {\n const [resultActions, nextContext, nextInternalEvents] =\n getStateActionsAndContext(\n stateNodeToEnter.entry,\n nextState.context,\n children,\n stateInput\n );\n actions.push(...resultActions);\n if (nextInternalEvents?.length) {\n internalQueue.push(...nextInternalEvents);\n }\n if (nextContext) {\n context = nextContext;\n }\n }\n\n if (statesForDefaultEntry.has(stateNodeToEnter)) {\n const { actions: initialActions, input: initialInput } =\n getTransitionResult(\n stateNodeToEnter.initial,\n nextState,\n event,\n actorScope\n );\n if (initialActions) {\n actions.push(...initialActions);\n }\n if (initialInput && stateNodeToEnter.initial?.target) {\n for (const targetNode of stateNodeToEnter.initial.target) {\n stateInputMap[targetNode.id] = initialInput;\n }\n }\n }\n\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n actions\n );\n\n if (context) {\n nextState.context = context;\n }\n\n if (stateNodeToEnter.type !== 'final') {\n continue;\n }\n\n const parent = stateNodeToEnter.parent;\n let ancestorMarker =\n parent?.type === 'parallel' ? parent : parent?.parent;\n let rootCompletionNode = ancestorMarker || stateNodeToEnter;\n\n if (parent?.type === 'compound') {\n internalQueue.push(\n createDoneStateEvent(\n parent.id,\n stateNodeToEnter.output !== undefined\n ? resolveOutput(\n stateNodeToEnter.output,\n nextState.context,\n event,\n actorScope.self\n )\n : undefined\n )\n );\n }\n\n while (\n ancestorMarker?.type === 'parallel' &&\n !completedNodes.has(ancestorMarker) &&\n isInFinalState(mutStateNodeSet, ancestorMarker)\n ) {\n completedNodes.add(ancestorMarker);\n const regionOutput: Record<string, unknown> = {};\n for (const region of getChildren(ancestorMarker)) {\n if (region.type === 'final') {\n regionOutput[region.key] =\n region.output !== undefined\n ? resolveOutput(\n region.output,\n nextState.context,\n event,\n actorScope.self\n )\n : undefined;\n continue;\n }\n\n if (region.type === 'parallel') {\n const regionDoneType = `xstate.done.state.${region.id}`;\n const regionDoneEvent = internalQueue.find(\n (e) => e.type === regionDoneType\n ) as DoneStateEvent | undefined;\n regionOutput[region.key] = regionDoneEvent?.output;\n continue;\n }\n\n const finalChild = getChildren(region).find(\n (s) => s.type === 'final' && mutStateNodeSet.has(s)\n );\n regionOutput[region.key] =\n finalChild?.output !== undefined\n ? resolveOutput(\n finalChild.output,\n nextState.context,\n event,\n actorScope.self\n )\n : undefined;\n }\n internalQueue.push(\n createDoneStateEvent(ancestorMarker.id, regionOutput)\n );\n rootCompletionNode = ancestorMarker;\n ancestorMarker = ancestorMarker.parent;\n }\n if (ancestorMarker) {\n continue;\n }\n\n nextState = cloneMachineSnapshot(nextState, {\n status: 'done',\n output: getMachineOutput(rootCompletionNode)\n });\n }\n\n const inputChanged =\n JSON.stringify(stateInputMap) !==\n JSON.stringify(currentSnapshot._stateInputs || {});\n if (inputChanged) {\n nextState = cloneMachineSnapshot(nextState, {\n _stateInputs: stateInputMap\n });\n }\n };\n\n // Execute transition content\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n transitionActions\n );\n if (context && context !== currentSnapshot.context) {\n nextState = cloneMachineSnapshot(nextState, { context });\n }\n\n // Enter states\n enterStates();\n\n const nextStateNodes = [...mutStateNodeSet];\n\n if (nextState.status === 'done') {\n const allExitActions: AnyAction[] = [];\n const nextStateNodesToExit = nextStateNodes.sort(\n (a, b) => b.order - a.order\n );\n\n nextStateNodesToExit.forEach((stateNode) => {\n if (stateNode.exit) {\n const stateInput = nextState._stateInputs?.[stateNode.id];\n const [exitActions, , nextInternalEvents] = getStateActionsAndContext(\n stateNode.exit,\n nextState.context,\n nextState.children,\n stateInput\n );\n allExitActions.push(...exitActions);\n if (nextInternalEvents?.length) {\n internalQueue.push(...nextInternalEvents);\n }\n }\n });\n nextState = resolveAndExecuteActionsWithContext(\n nextState,\n event,\n actorScope,\n allExitActions\n );\n }\n\n if (\n historyValue === currentSnapshot.historyValue &&\n currentSnapshot._nodes.length === mutStateNodeSet.size &&\n currentSnapshot._nodes.every((node) =>\n mutStateNodeSet.has(node as StateNode)\n )\n ) {\n // If context was changed (e.g. by entry actions during self-transition),\n // clone to ensure reference inequality for eventless transition re-evaluation\n if (nextState.context !== originalContext) {\n return [cloneMachineSnapshot(nextState), actions];\n }\n return [nextState, actions];\n }\n\n return [\n cloneMachineSnapshot(nextState, {\n _nodes: nextStateNodes,\n historyValue\n }),\n actions\n ];\n } finally {\n actorScope.actionExecutor = originalExecutor;\n }\n}\n\n/**\n * Gets the transition result for a given transition without executing the\n * transition.\n */\nexport function getTransitionResult(\n transition: Pick<AnyTransitionDefinition, 'target' | 'to' | 'source'> & {\n reenter?: AnyTransitionDefinition['reenter'];\n input?: AnyTransitionDefinition['input'];\n },\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n): {\n targets: Readonly<AnyStateNode[]> | undefined;\n context: MachineContext | undefined;\n actions: AnyAction[] | undefined;\n reenter?: boolean;\n internalEvents: EventObject[] | undefined;\n input: Record<string, unknown> | undefined;\n} {\n if (transition.to) {\n const actions: AnyAction[] = [];\n const internalEvents: EventObject[] = [];\n const enqueue = createTransitionEnqueue(\n actorScope,\n actions,\n internalEvents\n );\n\n const res = transition.to(\n {\n context: snapshot.context,\n event,\n value: snapshot.value,\n children: snapshot.children,\n parent: actorScope.self._parent,\n self: actorScope.self,\n actions: snapshot.machine.implementations.actions,\n actors: snapshot.machine.implementations.actors,\n guards: snapshot.machine.implementations.guards,\n delays: snapshot.machine.implementations.delays\n },\n enqueue\n );\n\n const targets = res?.target\n ? resolveTarget(transition.source, toArray(res.target) as string[])\n : undefined;\n // Resolve input for .to transitions\n const resolvedInput =\n typeof transition.input === 'function'\n ? transition.input({ context: snapshot.context, event })\n : transition.input;\n\n return {\n targets: targets,\n context: res?.context,\n reenter: res?.reenter,\n actions,\n internalEvents,\n input: resolvedInput\n };\n }\n\n // Resolve input for regular transitions\n const resolvedInput =\n typeof transition.input === 'function'\n ? transition.input({ context: snapshot.context, event })\n : transition.input;\n\n return {\n targets: transition.target as AnyStateNode[] | undefined,\n context: undefined,\n reenter: transition.reenter,\n actions: undefined,\n internalEvents: undefined,\n input: resolvedInput\n };\n}\n\nexport function macrostep(\n snapshot: AnyMachineSnapshot,\n event: EventObject,\n actorScope: AnyActorScope,\n internalQueue: AnyEventObject[]\n): {\n snapshot: typeof snapshot;\n microsteps: Microstep[];\n} {\n let nextSnapshot = snapshot;\n const microsteps: Microstep[] = [];\n\n function addMicrostep(\n step: Microstep,\n transitions: AnyTransitionDefinition[]\n ) {\n // collect microsteps; surfaced on the enclosing '@xstate.transition' event\n // via its `microsteps[]` facet (there is no standalone microstep event)\n const collectedMicrosteps =\n ((actorScope.self as any)._collectedMicrosteps as any[]) || [];\n collectedMicrosteps.push(...transitions);\n (actorScope.self as any)._collectedMicrosteps = collectedMicrosteps;\n microsteps.push(step);\n }\n\n // Handle stop event\n if (event.type === XSTATE_STOP) {\n nextSnapshot = cloneMachineSnapshot(\n stopChildren(nextSnapshot, actorScope),\n {\n status: 'stopped'\n }\n );\n addMicrostep([nextSnapshot, []], []);\n return {\n snapshot: nextSnapshot,\n microsteps\n };\n }\n\n let nextEvent = event;\n\n // Assume the state is at rest (no raised events)\n // Determine the next state based on the next microstep\n if (nextEvent.type !== XSTATE_INIT) {\n const currentEvent = nextEvent;\n const isErr = isErrorActorEvent(currentEvent);\n\n const transitions = nextSnapshot.machine.getTransitionData(\n nextSnapshot as any,\n currentEvent,\n actorScope.self\n );\n\n if (isErr && !transitions.length) {\n // TODO: we should likely only allow transitions selected by very explicit descriptors\n // `*` shouldn't be matched, likely `xstate.error.*` shouldn't be either\n // similarly `xstate.error.actor.*` and `xstate.error.actor.todo.*` have to be considered too\n nextSnapshot = cloneMachineSnapshot<typeof snapshot>(snapshot, {\n status: 'error',\n error: currentEvent.error\n });\n addMicrostep([nextSnapshot, []], []);\n return {\n snapshot: nextSnapshot,\n microsteps\n };\n }\n const step = microstep(\n transitions,\n snapshot,\n actorScope,\n nextEvent,\n false, // isInitial\n internalQueue\n );\n nextSnapshot = step[0];\n addMicrostep(step, transitions);\n }\n\n let shouldSelectEventlessTransitions = true;\n const maxIterations = snapshot.machine.options?.maxIterations ?? Infinity;\n let iterationCount = 0;\n\n let microstepCount = 0;\n while (nextSnapshot.status === 'active') {\n microstepCount++;\n if (microstepCount > 1000) {\n throw new Error('Microstep count exceeded 1000');\n }\n iterationCount++;\n if (iterationCount > maxIterations) {\n throw new Error(\n isDevelopment\n ? `Infinite loop detected: the machine has processed more than ${maxIterations} microsteps without reaching a stable state. This usually happens when there's a cycle of transitions (e.g., eventless transitions or raised events causing state A -> B -> C -> A).`\n : `Infinite loop detected (>${maxIterations} microsteps)`\n );\n }\n\n let enabledTransitions: AnyTransitionDefinition[] =\n shouldSelectEventlessTransitions\n ? selectEventlessTransitions(nextSnapshot, nextEvent, actorScope)\n : [];\n\n // eventless transitions should always be selected after selecting *regular* transitions\n // by assigning `undefined` to `previousState` we ensure that `shouldSelectEventlessTransitions` gets always computed to true in such a case\n const previousState = enabledTransitions.length ? nextSnapshot : undefined;\n\n if (!enabledTransitions.length) {\n if (!internalQueue.length) {\n break;\n }\n nextEvent = internalQueue.shift()!;\n enabledTransitions = nextSnapshot.machine.getTransitionData(\n nextSnapshot as any,\n nextEvent,\n actorScope.self\n );\n }\n\n const step = microstep(\n enabledTransitions,\n nextSnapshot,\n actorScope,\n nextEvent,\n false,\n internalQueue\n );\n nextSnapshot = step[0];\n shouldSelectEventlessTransitions = nextSnapshot !== previousState;\n addMicrostep(step, enabledTransitions);\n }\n\n if (nextSnapshot.status !== 'active' && nextSnapshot.children) {\n stopChildren(nextSnapshot, actorScope);\n }\n\n return {\n snapshot: nextSnapshot,\n microsteps\n };\n}\n\n/**\n * Resolves a partial state value with its full representation in the state\n * node's machine.\n *\n * @param stateValue The partial state value to resolve.\n */\nexport function resolveStateValue(\n rootNode: AnyStateNode,\n stateValue: StateValue\n): StateValue {\n const allStateNodes = getAllStateNodes(getStateNodes(rootNode, stateValue));\n return getStateValue(rootNode, allStateNodes);\n}\n\nfunction createEnqueueObject(\n props: Partial<EnqueueObject<any, any>>,\n action: <T extends (...args: any[]) => any>(\n fn: T,\n ...args: Parameters<T>\n ) => void\n): EnqueueObject<any, any> {\n const enqueueFn = (\n fn: (...args: any[]) => any,\n ...args: Parameters<typeof fn>\n ) => {\n action(fn, ...args);\n };\n\n Object.assign(enqueueFn, {\n cancel: () => {},\n emit: () => {},\n log: () => {},\n raise: () => {},\n spawn: () => ({}) as any,\n sendTo: () => {},\n stop: () => {},\n listen: () => ({}) as any,\n subscribeTo: () => ({}) as any,\n ...props\n });\n\n return enqueueFn as any;\n}\n\nexport function hasEffect(\n transition: AnyTransitionDefinition,\n context: MachineContext,\n event: EventObject,\n snapshot: AnyMachineSnapshot,\n self: AnyActor\n): boolean {\n if (transition.to) {\n return transitionToHasEffect(\n transition.to,\n context,\n event,\n snapshot,\n self,\n snapshot.machine.implementations\n );\n }\n\n return false;\n}\n\nfunction transitionToHasEffect(\n transitionTo: NonNullable<AnyTransitionDefinition['to']>,\n context: MachineContext,\n event: EventObject,\n snapshot: AnyMachineSnapshot,\n self: AnyActor,\n implementations: AnyMachineSnapshot['machine']['implementations']\n) {\n let hasEffect = false;\n let res;\n\n try {\n const triggerEffect = () => {\n hasEffect = true;\n throw new Error('Effect triggered');\n };\n res = transitionTo(\n {\n context,\n event,\n self,\n value: snapshot.value,\n children: snapshot.children,\n parent: {\n send: triggerEffect\n } as any,\n actions: implementations.actions,\n actors: implementations.actors,\n guards: implementations.guards,\n delays: implementations.delays\n },\n createEnqueueObject(\n {\n emit: triggerEffect,\n cancel: triggerEffect,\n log: triggerEffect,\n raise: triggerEffect,\n spawn: triggerEffect,\n sendTo: triggerEffect,\n stop: triggerEffect\n },\n triggerEffect\n )\n );\n } catch (err) {\n if (hasEffect) {\n return true;\n }\n throw err;\n }\n\n return res !== undefined;\n}\n\nfunction stopChildren(\n snapshot: AnyMachineSnapshot,\n actorScope: AnyActorScope\n): AnyMachineSnapshot {\n let children: AnyActor[];\n if (\n !snapshot.children ||\n (children = Object.values(snapshot.children).filter(Boolean) as AnyActor[])\n .length === 0\n ) {\n return snapshot;\n }\n for (const child of children) {\n actorScope.stopChild(child);\n }\n return cloneMachineSnapshot(snapshot, {\n children: {}\n });\n}\n\nfunction selectEventlessTransitions(\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n actorScope: AnyActorScope\n) {\n const enabledTransitionSet: Set<AnyTransitionDefinition> = new Set();\n const atomicStates = snapshot._nodes.filter(isAtomicStateNode);\n\n for (const atomicStateNode of atomicStates) {\n loop: for (\n let stateNode: AnyStateNode | undefined = atomicStateNode;\n stateNode;\n stateNode = stateNode.parent\n ) {\n if (!stateNode.always) {\n continue;\n }\n for (const transition of stateNode.always) {\n if (\n evaluateCandidate(\n transition,\n event,\n snapshot,\n stateNode,\n actorScope.self\n )\n ) {\n enabledTransitionSet.add(transition);\n break loop;\n }\n }\n }\n }\n\n return removeConflictingTransitions(\n Array.from(enabledTransitionSet),\n new Set(snapshot._nodes),\n snapshot,\n event,\n actorScope\n );\n}\n\nexport function evaluateCandidate(\n candidate: AnyTransitionDefinition,\n event: EventObject,\n snapshot: AnyMachineSnapshot,\n stateNode: AnyStateNode,\n self: AnyActor\n): boolean {\n if (candidate.guard) {\n const guardArgs = {\n context: snapshot.context,\n event,\n self,\n parent: self._parent,\n children: snapshot.children,\n actions: stateNode.machine.implementations.actions,\n actors: stateNode.machine.implementations.actors,\n guards: stateNode.machine.implementations.guards,\n delays: stateNode.machine.implementations.delays,\n _snapshot: snapshot\n };\n const guardConfig = candidate.guard as any;\n const guardParams =\n typeof guardConfig?.params === 'function'\n ? guardConfig.params({ context: snapshot.context, event })\n : guardConfig?.params;\n\n let guardPassed = true;\n if (typeof guardConfig === 'function') {\n guardPassed = guardConfig(guardArgs, guardParams);\n } else if (typeof guardConfig?.type === 'string') {\n const guardImpl =\n stateNode.machine.implementations.guards[guardConfig.type];\n if (!guardImpl) {\n // A typo'd guard name must fail loudly — silently passing would\n // take the guarded transition and corrupt machine behavior.\n throw new Error(\n isDevelopment\n ? `Guard '${guardConfig.type}' is not implemented in machine '${stateNode.machine.id}'. Available guards: ${\n Object.keys(stateNode.machine.implementations.guards)\n .map((key) => `'${key}'`)\n .join(', ') || '(none)'\n }.`\n : `Guard '${guardConfig.type}' is not implemented in machine '${stateNode.machine.id}'.`\n );\n }\n guardPassed = guardImpl(guardArgs, guardParams);\n }\n\n if (!guardPassed) {\n return false;\n }\n }\n\n if (candidate.to) {\n return transitionToHasEffect(\n candidate.to,\n snapshot.context,\n event,\n snapshot,\n self,\n stateNode.machine.implementations\n );\n }\n\n return true;\n}\n","export function parseDurationToMilliseconds(\n duration: string\n): number | undefined {\n const normalizedDuration = duration.trim();\n\n const millisecondsMatch = normalizedDuration.match(/^(\\d+)ms$/i);\n if (millisecondsMatch) {\n return parseInt(millisecondsMatch[1], 10);\n }\n\n const secondsMatch = normalizedDuration.match(/^(\\d*)(\\.?)(\\d*)s$/i);\n if (secondsMatch) {\n const wholePart = secondsMatch[1] ? parseInt(secondsMatch[1], 10) : 0;\n const hasDecimal = !!secondsMatch[2];\n const fracPart = secondsMatch[3]\n ? parseInt(secondsMatch[3].padEnd(3, '0').slice(0, 3), 10)\n : 0;\n\n return wholePart * 1000 + (hasDecimal ? fracPart : 0);\n }\n\n const iso8601DurationMatch = normalizedDuration.match(\n /^P(?:(?<weeks>\\d+(?:[.,]\\d+)?)W)?(?:(?<days>\\d+(?:[.,]\\d+)?)D)?(?:T(?:(?<hours>\\d+(?:[.,]\\d+)?)H)?(?:(?<minutes>\\d+(?:[.,]\\d+)?)M)?(?:(?<seconds>\\d+(?:[.,]\\d+)?)S)?)?$/i\n );\n\n if (!iso8601DurationMatch?.groups) {\n return undefined;\n }\n\n const { weeks, days, hours, minutes, seconds } = iso8601DurationMatch.groups;\n if (!weeks && !days && !hours && !minutes && !seconds) {\n return undefined;\n }\n\n const toNumber = (value: string | undefined) =>\n value ? Number(value.replace(',', '.')) : 0;\n\n return (\n toNumber(weeks) * 7 * 24 * 60 * 60 * 1000 +\n toNumber(days) * 24 * 60 * 60 * 1000 +\n toNumber(hours) * 60 * 60 * 1000 +\n toNumber(minutes) * 60 * 1000 +\n toNumber(seconds) * 1000\n );\n}\n\nexport function parseDelayToMilliseconds(\n delay: string | number | undefined\n): number | undefined {\n if (delay === undefined) {\n return undefined;\n }\n\n if (typeof delay === 'number') {\n return delay;\n }\n\n return parseDurationToMilliseconds(delay);\n}\n","import isDevelopment from '#is-development';\nimport { isMachineSnapshot } from './State.ts';\nimport type { StateNode } from './StateNode.ts';\nimport { TARGETLESS_KEY, WILDCARD } from './constants.ts';\nimport { isStateId } from './stateUtils.ts';\nimport type {\n AnyActor,\n AnyEventObject,\n AnyMachineSnapshot,\n AnyStateMachine,\n AnyTransitionConfig,\n AnyTransitionConfigFunction,\n ErrorActorEvent,\n EventObject,\n InvokeConfig,\n MachineContext,\n Mapper,\n NonReducibleUnknown,\n Observer,\n SingleOrArray,\n StateLike,\n StateValue,\n TransitionConfigTarget\n} from './types.ts';\n\nexport function matchesState(\n parentStateId: StateValue,\n childStateId: StateValue\n): boolean {\n const parentStateValue = toStateValue(parentStateId);\n const childStateValue = toStateValue(childStateId);\n\n if (typeof childStateValue === 'string') {\n if (typeof parentStateValue === 'string') {\n return childStateValue === parentStateValue;\n }\n\n // Parent more specific than child\n return false;\n }\n\n if (typeof parentStateValue === 'string') {\n return parentStateValue in childStateValue;\n }\n\n return Object.keys(parentStateValue).every((key) => {\n if (!(key in childStateValue)) {\n return false;\n }\n\n return matchesState(parentStateValue[key]!, childStateValue[key]!);\n });\n}\n\nexport function checkStateIn(\n snapshot: AnyMachineSnapshot,\n stateValue: StateValue\n) {\n if (typeof stateValue === 'string' && isStateId(stateValue)) {\n const target = snapshot.machine.getStateNodeById(stateValue);\n return snapshot._nodes.some((sn) => sn === target);\n }\n\n return snapshot.matches(stateValue);\n}\n\nexport function toStatePath(stateId: string | string[]): string[] {\n if (isArray(stateId)) {\n return stateId;\n }\n\n const result: string[] = [];\n let segment = '';\n\n for (let i = 0; i < stateId.length; i++) {\n const char = stateId.charCodeAt(i);\n switch (char) {\n // \\\n case 92:\n // consume the next character\n segment += stateId[i + 1];\n // and skip over it\n i++;\n continue;\n // .\n case 46:\n result.push(segment);\n segment = '';\n continue;\n }\n segment += stateId[i];\n }\n\n result.push(segment);\n\n return result;\n}\n\nfunction toStateValue(stateValue: StateLike<any> | StateValue): StateValue {\n if (isMachineSnapshot(stateValue)) {\n return stateValue.value;\n }\n\n if (typeof stateValue !== 'string') {\n return stateValue as StateValue;\n }\n\n const statePath = toStatePath(stateValue);\n\n return pathToStateValue(statePath);\n}\n\nexport function pathToStateValue(statePath: string[]): StateValue {\n if (statePath.length === 1) {\n return statePath[0];\n }\n\n const value: StateValue = {};\n let marker = value;\n\n for (let i = 0; i < statePath.length - 1; i++) {\n if (i === statePath.length - 2) {\n marker[statePath[i]] = statePath[i + 1];\n } else {\n const previous = marker;\n marker = {};\n previous[statePath[i]] = marker;\n }\n }\n\n return value;\n}\n\nexport function mapValues<P, O extends Record<string, unknown>>(\n collection: O,\n iteratee: (item: O[keyof O], key: keyof O, collection: O, i: number) => P\n): { [key in keyof O]: P };\nexport function mapValues(\n collection: Record<string, unknown>,\n iteratee: (\n item: unknown,\n key: string,\n collection: Record<string, unknown>,\n i: number\n ) => unknown\n) {\n const result: Record<string, unknown> = {};\n\n const collectionKeys = Object.keys(collection);\n for (let i = 0; i < collectionKeys.length; i++) {\n const key = collectionKeys[i];\n result[key] = iteratee(collection[key], key, collection, i);\n }\n\n return result;\n}\n\nfunction toArrayStrict<T>(value: readonly T[] | T): readonly T[] {\n if (isArray(value)) {\n return value;\n }\n return [value];\n}\n\nexport function toArray<T>(value: readonly T[] | T | undefined): readonly T[] {\n if (value === undefined) {\n return [];\n }\n return toArrayStrict(value);\n}\n\nexport function resolveOutput<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject\n>(\n mapper:\n | Mapper<TContext, TExpressionEvent, unknown, EventObject>\n | NonReducibleUnknown,\n context: TContext,\n event: TExpressionEvent,\n self: AnyActor\n): unknown {\n if (typeof mapper === 'function') {\n return mapper({ context, event, self });\n }\n\n if (\n isDevelopment &&\n !!mapper &&\n typeof mapper === 'object' &&\n Object.values(mapper).some((val) => typeof val === 'function')\n ) {\n console.warn(\n `Dynamically mapping values to individual properties is deprecated. Use a single function that returns the mapped object instead.\\nFound object containing properties whose values are possibly mapping functions: ${Object.entries(\n mapper\n )\n .filter(([, value]) => typeof value === 'function')\n .map(\n ([key, value]) =>\n `\\n - ${key}: ${(value as () => any)\n .toString()\n .replace(/\\n\\s*/g, '')}`\n )\n .join('')}`\n );\n }\n\n return mapper;\n}\n\nfunction isArray(value: any): value is readonly any[] {\n return Array.isArray(value);\n}\n\nexport function isErrorActorEvent(\n event: AnyEventObject\n): event is ErrorActorEvent {\n return event.type.startsWith('xstate.error.actor');\n}\n\nexport function toTransitionConfigArray(\n configLike: SingleOrArray<\n AnyTransitionConfig | TransitionConfigTarget | AnyTransitionConfigFunction\n >\n): Array<AnyTransitionConfig> {\n return toArrayStrict(configLike).map((transitionLike) => {\n if (\n typeof transitionLike === 'undefined' ||\n typeof transitionLike === 'string'\n ) {\n return { target: transitionLike };\n }\n\n if (typeof transitionLike === 'function') {\n return { to: transitionLike };\n }\n\n return transitionLike;\n });\n}\n\nexport function normalizeTarget<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n target: SingleOrArray<string | StateNode<TContext, TEvent>> | undefined\n): ReadonlyArray<string | StateNode<TContext, TEvent>> | undefined {\n if (target === undefined || target === TARGETLESS_KEY) {\n return undefined;\n }\n return toArray(target);\n}\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void\n): Observer<T> {\n const isObserver = typeof nextHandler === 'object';\n const self = isObserver ? nextHandler : undefined;\n\n return {\n next: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n error: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n complete: (isObserver ? nextHandler.complete : completionHandler)?.bind(\n self\n )\n };\n}\n\nexport function createInvokeId(stateNodeId: string, index: number): string {\n return `${index}.${stateNodeId}`;\n}\n\nexport function resolveReferencedActor(machine: AnyStateMachine, src: string) {\n const match = src.match(/^xstate\\.invoke\\.(\\d+)\\.(.*)/)!;\n if (!match) {\n return machine.implementations.actors[src];\n }\n const [, indexStr, nodeId] = match;\n const node = machine.getStateNodeById(nodeId);\n const invokeConfig = node.config.invoke!;\n const configSrc = (\n Array.isArray(invokeConfig)\n ? invokeConfig[indexStr as any]\n : (invokeConfig as InvokeConfig<\n any,\n any,\n any,\n any,\n any,\n any,\n any, // TEmitted\n any // TMeta\n >)\n ).src;\n // A referenced actor may itself be registered by name.\n return typeof configSrc === 'string'\n ? machine.implementations.actors[configSrc]\n : configSrc;\n}\n\nexport function getAllOwnEventDescriptors(snapshot: AnyMachineSnapshot) {\n return [...new Set([...snapshot._nodes.flatMap((sn) => sn.ownEvents)])];\n}\n\n/**\n * Checks if an event type matches an event descriptor, supporting wildcards.\n * Event descriptors can be:\n *\n * - Exact matches: \"event.type\"\n * - Wildcard: \"*\"\n * - Partial matches: \"event.*\"\n *\n * @param eventType - The actual event type string\n * @param descriptor - The event descriptor to match against\n * @returns True if the event type matches the descriptor\n */\nexport function matchesEventDescriptor(\n eventType: string,\n descriptor: string\n): boolean {\n if (descriptor === eventType) {\n return true;\n }\n\n if (descriptor === WILDCARD) {\n return true;\n }\n\n if (!descriptor.endsWith('.*')) {\n return false;\n }\n\n if (isDevelopment && /.*\\*.+/.test(descriptor)) {\n console.warn(\n `Wildcards can only be the last token of an event descriptor (e.g., \"event.*\") or the entire event descriptor (\"*\"). Check the \"${descriptor}\" event.`\n );\n }\n\n const partialEventTokens = descriptor.split('.');\n const eventTokens = eventType.split('.');\n\n for (\n let tokenIndex = 0;\n tokenIndex < partialEventTokens.length;\n tokenIndex++\n ) {\n const partialEventToken = partialEventTokens[tokenIndex];\n const eventToken = eventTokens[tokenIndex];\n\n if (partialEventToken === '*') {\n const isLastToken = tokenIndex === partialEventTokens.length - 1;\n\n if (isDevelopment && !isLastToken) {\n console.warn(\n `Infix wildcards in transition events are not allowed. Check the \"${descriptor}\" transition.`\n );\n }\n\n return isLastToken;\n }\n\n if (partialEventToken !== eventToken) {\n return false;\n }\n }\n\n return true;\n}\n","import isDevelopment from '#is-development';\nimport { $$ACTOR_TYPE } from './createActor.ts';\nimport { getStateValue, getTransitionResult, hasEffect } from './stateUtils.ts';\nimport type {\n AnyActorScope,\n AnyActor,\n AnyMachineSnapshot,\n AnyStateMachine,\n EventObject,\n HistoryValue,\n MachineContext,\n StateConfig,\n StateValue,\n AnyActorRef,\n Snapshot,\n MetaObject,\n StateSchema,\n StateId,\n StateIdInputs,\n StateContextFromStateValue,\n SnapshotStatus,\n PersistedHistoryValue,\n AnyStateNode\n} from './types.ts';\nimport { matchesState } from './utils.ts';\nimport { createEmptyActor } from './actors/index.ts';\n\nexport function isMachineSnapshot(value: unknown): value is AnyMachineSnapshot {\n return (\n !!value &&\n typeof value === 'object' &&\n 'machine' in value &&\n 'value' in value\n );\n}\n\nlet emptyCanActor: AnyActor | undefined;\nlet emptyCanActorScope: AnyActorScope | undefined;\n\nfunction getEmptyCanActor() {\n return (emptyCanActor ??= createEmptyActor());\n}\n\nfunction getEmptyCanActorScope(): AnyActorScope {\n if (emptyCanActorScope) {\n return emptyCanActorScope;\n }\n\n const actor = getEmptyCanActor();\n emptyCanActorScope = {\n self: actor,\n logger: () => {},\n id: '',\n sessionId: '',\n defer: () => {},\n system: actor.system,\n stopChild: () => {},\n emit: () => {},\n actionExecutor: () => {}\n };\n return emptyCanActorScope;\n}\n\ninterface MachineSnapshotBase<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n _TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema = StateSchema\n> {\n /** The state machine that produced this state snapshot. */\n machine: AnyStateMachine;\n /** The tags of the active state nodes that represent the current state value. */\n tags: Set<string>;\n /**\n * The current state value.\n *\n * This represents the active state nodes in the state machine.\n *\n * - For atomic state nodes, it is a string.\n * - For compound parent state nodes, it is an object where:\n *\n * - The key is the parent state node's key\n * - The value is the current state value of the active child state node(s)\n *\n * @example\n *\n * ```ts\n * // single-level state node\n * snapshot.value; // => 'yellow'\n *\n * // nested state nodes\n * snapshot.value; // => { red: 'wait' }\n * ```\n */\n value: TStateValue;\n /** The current status of this snapshot. */\n status: SnapshotStatus;\n error: unknown;\n context: TContext;\n\n historyValue: Readonly<HistoryValue>;\n /** The enabled state nodes representative of the state value. */\n _nodes: Array<AnyStateNode>;\n /** An object mapping actor names to spawned/invoked actors. */\n children: TChildren;\n /** @internal */\n _stateInputs: Record<string, Record<string, unknown>>;\n\n /**\n * Whether the current state value is a subset of the given partial state\n * value.\n *\n * @param partialStateValue\n */\n matches<const TTestStateValue extends StateValue>(\n partialStateValue: TTestStateValue\n ): this is MachineSnapshot<\n StateContextFromStateValue<TStateSchema, TContext, TTestStateValue>,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n _TOutput,\n TMeta,\n TStateSchema\n >;\n\n /**\n * Whether the current state nodes has a state node with the specified `tag`.\n *\n * @param tag\n */\n hasTag: (tag: TTag) => boolean;\n\n /**\n * Determines whether sending the `event` will cause a non-forbidden\n * transition to be selected, even if the transitions have no actions nor\n * change the state value.\n *\n * @param event The event to test\n * @returns Whether the event will cause a transition\n */\n can: (event: TEvent) => boolean;\n\n getMeta: () => Record<\n StateId<TStateSchema> & string,\n TMeta | undefined // States might not have meta defined\n >;\n\n /**\n * Returns the inputs for the current active state nodes, keyed by state node\n * id.\n */\n getInputs: () => StateIdInputs<TStateSchema>;\n\n toJSON: () => unknown;\n}\n\ninterface ActiveMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'active';\n output: undefined;\n error: undefined;\n}\n\ninterface DoneMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'done';\n output: TOutput;\n error: undefined;\n}\n\ninterface ErrorMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'error';\n output: undefined;\n error: unknown;\n}\n\ninterface StoppedMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> extends MachineSnapshotBase<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n > {\n status: 'stopped';\n output: undefined;\n error: undefined;\n}\n\nexport type MachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n> =\n | ActiveMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >\n | DoneMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >\n | ErrorMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >\n | StoppedMachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TStateSchema\n >;\n\nconst machineSnapshotMatches = function matches(\n this: AnyMachineSnapshot,\n testValue: StateValue\n) {\n return matchesState(testValue, this.value);\n};\n\nconst machineSnapshotHasTag = function hasTag(\n this: AnyMachineSnapshot,\n tag: string\n) {\n return this.tags.has(tag);\n};\n\nconst machineSnapshotCan = function can(\n this: AnyMachineSnapshot,\n event: EventObject\n) {\n if (isDevelopment && !this.machine) {\n console.warn(\n `state.can(...) used outside of a machine-created State object; this will always return false.`\n );\n }\n\n const emptyActor = getEmptyCanActor();\n const emptyActorScope = getEmptyCanActorScope();\n const transitionData = this.machine.getTransitionData(\n this,\n event,\n emptyActor\n );\n\n if (!transitionData?.length) {\n return false;\n }\n\n // Check that at least one transition is not forbidden\n for (const transition of transitionData) {\n if (transition.target !== undefined) {\n return true;\n }\n\n const res = getTransitionResult(transition, this, event, emptyActorScope);\n if (\n res.targets?.length ||\n res.context ||\n hasEffect(transition, this.context, event, this, emptyActor)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst machineSnapshotToJSON = function toJSON(this: AnyMachineSnapshot) {\n const {\n _nodes: nodes,\n _stateInputs,\n tags,\n machine,\n getMeta,\n getInputs,\n toJSON,\n can,\n hasTag,\n matches,\n ...jsonValues\n } = this;\n return { ...jsonValues, tags: Array.from(tags) };\n};\n\nconst machineSnapshotGetMeta = function getMeta(this: AnyMachineSnapshot) {\n const meta: Record<string, any> = {};\n for (const stateNode of this._nodes) {\n if (stateNode.meta !== undefined) {\n meta[stateNode.id] = stateNode.meta;\n }\n }\n return meta;\n};\n\nconst machineSnapshotGetInputs = function getInputs(this: AnyMachineSnapshot) {\n return this._stateInputs as any;\n};\n\nfunction collectTags(stateNodes: Array<AnyStateNode>): Set<string> {\n const tags = new Set<string>();\n for (const stateNode of stateNodes) {\n for (const tag of stateNode.tags) {\n tags.add(tag);\n }\n }\n return tags;\n}\n\nexport function createMachineSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TMeta extends MetaObject,\n TStateSchema extends StateSchema\n>(\n config: StateConfig<TContext, TEvent>,\n machine: AnyStateMachine\n): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n undefined,\n TMeta,\n TStateSchema\n> {\n return {\n status: config.status as never,\n output: config.output,\n error: config.error,\n machine,\n context: config.context,\n _nodes: config._nodes,\n value: (config.value ??\n getStateValue(machine.root, config._nodes)) as never,\n tags: collectTags(config._nodes),\n children: config.children as any,\n historyValue: config.historyValue || {},\n _stateInputs: config._stateInputs || {},\n matches: machineSnapshotMatches as never,\n hasTag: machineSnapshotHasTag,\n can: machineSnapshotCan,\n getMeta: machineSnapshotGetMeta,\n getInputs: machineSnapshotGetInputs,\n toJSON: machineSnapshotToJSON\n };\n}\n\nexport function cloneMachineSnapshot<TState extends AnyMachineSnapshot>(\n snapshot: TState,\n config: Partial<StateConfig<any, any>> = {}\n): TState {\n const configWithSnapshot = {\n ...snapshot,\n ...config\n } as StateConfig<any, any>;\n\n if ((config._nodes ?? snapshot._nodes) === snapshot._nodes) {\n return {\n status: configWithSnapshot.status as never,\n output: configWithSnapshot.output,\n error: configWithSnapshot.error,\n machine: snapshot.machine,\n context: configWithSnapshot.context,\n _nodes: snapshot._nodes,\n value: snapshot.value,\n tags: snapshot.tags,\n children: configWithSnapshot.children as any,\n historyValue: configWithSnapshot.historyValue || {},\n _stateInputs: configWithSnapshot._stateInputs || {},\n matches: machineSnapshotMatches as never,\n hasTag: machineSnapshotHasTag,\n can: machineSnapshotCan,\n getMeta: machineSnapshotGetMeta,\n getInputs: machineSnapshotGetInputs,\n toJSON: machineSnapshotToJSON\n } as unknown as TState;\n }\n\n return createMachineSnapshot(\n {\n ...configWithSnapshot,\n value: undefined\n },\n snapshot.machine\n ) as TState;\n}\n\nfunction serializeHistoryValue(\n historyValue: HistoryValue\n): PersistedHistoryValue {\n const result: PersistedHistoryValue = {};\n\n for (const key in historyValue) {\n const value = historyValue[key];\n if (Array.isArray(value)) {\n result[key] = value.map((item) => ({ id: item.id }));\n }\n }\n\n return result;\n}\n\nexport function getPersistedSnapshot<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TOutput,\n TMeta extends MetaObject\n>(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n any // state schema\n >,\n options?: unknown\n): Snapshot<unknown> {\n const {\n _nodes: nodes,\n _stateInputs,\n tags,\n machine,\n children,\n context,\n can,\n hasTag,\n matches,\n getMeta,\n getInputs,\n toJSON,\n ...jsonValues\n } = snapshot;\n\n const childrenJson: Record<string, unknown> = {};\n\n for (const id in children) {\n const child = children[id] as any;\n if (\n isDevelopment &&\n typeof child.src !== 'string' &&\n (!options || !('__unsafeAllowInlineActors' in (options as object)))\n ) {\n throw new Error('An inline child actor cannot be persisted.');\n }\n childrenJson[id as keyof typeof childrenJson] = {\n snapshot: child.getPersistedSnapshot(options),\n src: child.src,\n systemId: child.systemId,\n syncSnapshot: child._syncSnapshot\n };\n }\n\n const persisted: Record<string, unknown> = {\n ...jsonValues,\n context: persistContext(context) as any,\n children: childrenJson,\n historyValue: serializeHistoryValue(jsonValues.historyValue)\n };\n\n if (machine.version !== undefined) {\n persisted.version = machine.version;\n }\n\n return persisted as Snapshot<unknown>;\n}\n\nfunction persistContext(contextPart: Record<string, unknown>) {\n let copy: typeof contextPart | undefined;\n for (const key in contextPart) {\n const value = contextPart[key];\n if (value && typeof value === 'object') {\n if ('sessionId' in value && 'send' in value && 'ref' in value) {\n copy ??= Array.isArray(contextPart)\n ? (contextPart.slice() as typeof contextPart)\n : { ...contextPart };\n copy[key] = {\n xstate$$type: $$ACTOR_TYPE,\n id: (value as any as AnyActor).id\n };\n } else {\n const result = persistContext(value as typeof contextPart);\n if (result !== value) {\n copy ??= Array.isArray(contextPart)\n ? (contextPart.slice() as typeof contextPart)\n : { ...contextPart };\n copy[key] = result;\n }\n }\n }\n }\n return copy ?? contextPart;\n}\n","import { InspectionEvent } from './inspection.ts';\nimport {\n AnyEventObject,\n ActorSystemInfo,\n AnyActor,\n Observer,\n HomomorphicOmit,\n EventObject,\n Subscription,\n TimersRestoreStrategy\n} from './types.ts';\nimport { toObserver } from './utils.ts';\n\ninterface ScheduledEvent {\n id: string;\n event: EventObject;\n startedAt: number; // timestamp\n delay: number;\n source: AnyActor;\n target: AnyActor;\n}\n\nexport interface Clock {\n setTimeout(fn: (...args: any[]) => void, timeout: number): any;\n clearTimeout(id: any): void;\n}\n\ninterface Scheduler {\n schedule(\n source: AnyActor,\n target: AnyActor,\n event: EventObject,\n delay: number,\n id: string | undefined\n ): void;\n cancel(source: AnyActor, id: string): void;\n cancelAll(actor: AnyActor): void;\n}\n\ntype ScheduledEventId = string & { __scheduledEventId: never };\n\nfunction createScheduledEventId(actor: AnyActor, id: string): ScheduledEventId {\n return `${actor.sessionId}.${id}` as ScheduledEventId;\n}\n\nexport interface ActorSystem<T extends ActorSystemInfo> {\n /** @internal */\n children: Map<string, AnyActor>;\n /** @internal */\n reverseKeyedActors: WeakMap<AnyActor, keyof T['actors']>;\n /** @internal */\n keyedActors: Map<keyof T['actors'], AnyActor | undefined>;\n /** @internal */\n _bookId: () => string;\n /** @internal */\n _register: (sessionId: string, actor: AnyActor) => string;\n /** @internal */\n _unregister: (actor: AnyActor) => void;\n /** @internal */\n _set: <K extends keyof T['actors']>(key: K, actor: AnyActor) => void;\n get: <K extends keyof T['actors']>(key: K) => T['actors'][K] | undefined;\n getAll: () => Partial<T['actors']>;\n\n inspect: (\n observer:\n | Observer<InspectionEvent>\n | ((inspectionEvent: InspectionEvent) => void)\n ) => Subscription;\n /** @internal */\n _sendInspectionEvent: (\n event: HomomorphicOmit<InspectionEvent, 'rootId'>\n ) => void;\n /** @internal */\n _relay: (\n source: AnyActor | undefined,\n target: AnyActor,\n event: AnyEventObject\n ) => void;\n scheduler: Scheduler;\n getSnapshot: () => {\n _scheduledEvents: Record<string, ScheduledEvent>;\n };\n /** @internal */\n _snapshot: {\n _scheduledEvents: Record<ScheduledEventId, ScheduledEvent>;\n };\n start: () => void;\n _clock: Clock;\n _logger: (...args: any[]) => void;\n /**\n * How rehydrated actors in this system restore persisted timers.\n *\n * @internal\n */\n _timerStrategy?: TimersRestoreStrategy;\n}\n\nexport type AnyActorSystem = ActorSystem<any>;\n\nexport function createSystem<T extends ActorSystemInfo>(\n rootActor: AnyActor,\n options: {\n clock: Clock;\n logger: (...args: any[]) => void;\n snapshot?: unknown;\n timers?: TimersRestoreStrategy;\n }\n): ActorSystem<T> {\n let idCounter = 0;\n const children = new Map<string, AnyActor>();\n const keyedActors = new Map<keyof T['actors'], AnyActor | undefined>();\n const reverseKeyedActors = new WeakMap<AnyActor, keyof T['actors']>();\n const inspectionObservers = new Set<Observer<InspectionEvent>>();\n const timerMap: { [id: ScheduledEventId]: number } = {};\n const { clock, logger } = options;\n\n // Records a send on the *sender's* transition for the `sent[]` inspection\n // facet. Captures the send when it is initiated (including delayed sends that\n // may never deliver), keyed to the source actor's in-flight transition.\n const recordSent = (\n source: AnyActor | undefined,\n target: AnyActor,\n event: AnyEventObject,\n delay?: number,\n id?: string\n ) => {\n if (!inspectionObservers.size || !source) {\n return;\n }\n const collected = ((source as any)._collectedSent ??= []);\n collected.push({\n targetRef: target,\n targetId: target.id,\n event,\n delay,\n id\n });\n };\n\n const scheduler: Scheduler = {\n schedule: (\n source,\n target,\n event,\n delay,\n id = Math.random().toString(36).slice(2)\n ) => {\n recordSent(source, target, event, delay, id);\n const scheduledEvent: ScheduledEvent = {\n source,\n target,\n event,\n delay,\n id,\n startedAt: Date.now()\n };\n const scheduledEventId = createScheduledEventId(source, id);\n system._snapshot._scheduledEvents[scheduledEventId] = scheduledEvent;\n\n const timeout = clock.setTimeout(() => {\n delete timerMap[scheduledEventId];\n delete system._snapshot._scheduledEvents[scheduledEventId];\n\n // The send was already recorded at schedule time on the sender's\n // transition, so deliver without re-recording.\n deliver(source, target, event);\n }, delay);\n\n timerMap[scheduledEventId] = timeout;\n },\n cancel: (source, id: string) => {\n const scheduledEventId = createScheduledEventId(source, id);\n const timeout = timerMap[scheduledEventId];\n\n delete timerMap[scheduledEventId];\n delete system._snapshot._scheduledEvents[scheduledEventId];\n\n if (timeout !== undefined) {\n clock.clearTimeout(timeout);\n }\n },\n cancelAll: (actor) => {\n for (const scheduledEventId in system._snapshot._scheduledEvents) {\n const scheduledEvent =\n system._snapshot._scheduledEvents[\n scheduledEventId as ScheduledEventId\n ];\n if (scheduledEvent.source === actor) {\n scheduler.cancel(actor, scheduledEvent.id);\n }\n }\n }\n };\n // Delivers an event to the target actor. Used by both `_relay` (which also\n // records the send) and the scheduler's timer (which already recorded it).\n const deliver = (\n source: AnyActor | undefined,\n target: AnyActor,\n event: AnyEventObject\n ) => {\n const targetMachine = (target as any).logic;\n const isInternalEvent =\n typeof targetMachine?.isInternalEventType === 'function' &&\n targetMachine.isInternalEventType(event.type);\n\n if (isInternalEvent && source !== target) {\n throw new Error(\n `Internal event \"${event.type}\" cannot be sent to actor \"${target.id}\" from outside.`\n );\n }\n\n // remember the last source for unified transition inspect event\n (target as any)._lastSourceRef = source;\n target._send(event);\n };\n\n const sendInspectionEvent = (event: InspectionEvent) => {\n if (!inspectionObservers.size) {\n return;\n }\n const resolvedInspectionEvent: InspectionEvent = {\n ...event,\n rootId: rootActor.sessionId!\n };\n inspectionObservers.forEach((observer) =>\n observer.next?.(resolvedInspectionEvent)\n );\n };\n\n const system: ActorSystem<T> = {\n children,\n reverseKeyedActors,\n keyedActors,\n _snapshot: {\n _scheduledEvents:\n (options?.snapshot && (options.snapshot as any).scheduler) ?? {}\n },\n _bookId: () => `x:${idCounter++}`,\n _register: (sessionId, actor) => {\n children.set(sessionId, actor);\n return sessionId;\n },\n _unregister: (actor) => {\n children.delete(actor.sessionId!);\n const systemId = reverseKeyedActors.get(actor);\n\n if (systemId !== undefined) {\n keyedActors.delete(systemId);\n reverseKeyedActors.delete(actor);\n }\n },\n get: (systemId) => {\n return keyedActors.get(systemId) as T['actors'][any] | undefined;\n },\n getAll: () => {\n return Object.fromEntries(keyedActors.entries()) as Partial<T['actors']>;\n },\n _set: (systemId, actor) => {\n const existing = keyedActors.get(systemId);\n if (existing && existing !== actor) {\n throw new Error(\n `Actor with system ID '${systemId as string}' already exists.`\n );\n }\n\n keyedActors.set(systemId, actor);\n reverseKeyedActors.set(actor, systemId);\n },\n inspect: (observerOrFn) => {\n const observer = toObserver(observerOrFn);\n inspectionObservers.add(observer);\n\n return {\n unsubscribe() {\n inspectionObservers.delete(observer);\n }\n };\n },\n _sendInspectionEvent: sendInspectionEvent as any,\n _relay: (source, target, event) => {\n recordSent(source, target, event);\n deliver(source, target, event);\n },\n scheduler,\n getSnapshot: () => {\n return {\n _scheduledEvents: { ...system._snapshot._scheduledEvents }\n };\n },\n start: () => {\n const scheduledEvents = system._snapshot._scheduledEvents;\n system._snapshot._scheduledEvents = {};\n for (const scheduledId in scheduledEvents) {\n const { source, target, event, delay, id } =\n scheduledEvents[scheduledId as ScheduledEventId];\n scheduler.schedule(source, target, event, delay, id);\n }\n },\n _clock: clock,\n _logger: logger,\n _timerStrategy: options.timers\n };\n\n return system;\n}\n","import { XSTATE_STOP } from '../constants.ts';\nimport { createInitEvent } from '../eventUtils.ts';\nimport { StandardSchemaV1 } from '../schema.types.ts';\nimport { AnyActorSystem } from '../system.ts';\nimport {\n ActorLogic,\n ActorRefFromLogic,\n ActorScope,\n AnyActorRef,\n EventObject,\n NonReducibleUnknown,\n Snapshot\n} from '../types.ts';\n\nexport type LogicSnapshot<TContext, TOutput, TInput> = Snapshot<TOutput> & {\n context: TContext;\n input: TInput | undefined;\n effects?: Record<string, LogicEffectState>;\n};\n\nexport type LogicEffectState =\n | { status: 'active' }\n | { status: 'done'; output?: unknown }\n | { status: 'error'; error: unknown };\n\nexport interface LogicArgs<TContext, TEvent extends EventObject, TInput> {\n context: TContext;\n event: TEvent;\n input: TInput;\n system: AnyActorSystem;\n self: LogicActorRef<TContext, unknown, TEvent, TInput>;\n}\n\nexport type LogicEffect<\n TEvent extends EventObject,\n TEmitted extends EventObject\n> =\n | { type: 'emit'; event: TEmitted }\n | { type: 'sendBack'; event: EventObject }\n | { type: 'raise'; event: TEvent }\n | { type: 'effect'; key?: string; exec: () => void | (() => void) }\n | { type: 'cleanupEffects' };\n\nexport interface LogicEnqueue<\n TEvent extends EventObject,\n TEmitted extends EventObject\n> {\n emit: (emitted: TEmitted) => void;\n sendBack: (event: EventObject) => void;\n raise: (event: TEvent) => void;\n effect: {\n (exec: () => void | (() => void)): void;\n (key: string, exec: () => void | (() => void)): void;\n };\n}\n\nexport type LogicPatch<TContext, TOutput, TInput> = Partial<{\n context: TContext;\n input: TInput | undefined;\n status: LogicSnapshot<TContext, TOutput, TInput>['status'];\n output: TOutput;\n error: unknown;\n effects: Record<string, LogicEffectState>;\n}>;\n\nexport type LogicFunction<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput,\n TEmitted extends EventObject\n> = (\n args: LogicArgs<TContext, TEvent, TInput>,\n enq: LogicEnqueue<TEvent, TEmitted>\n) => void | LogicPatch<TContext, TOutput, TInput>;\n\nexport interface LogicConfig<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput,\n TEmitted extends EventObject,\n TInputSchema extends StandardSchemaV1 = StandardSchemaV1,\n TOutputSchema extends StandardSchemaV1 = StandardSchemaV1\n> {\n id?: string;\n schemas?: {\n input?: TInputSchema;\n output?: TOutputSchema;\n };\n context: TContext | ((args: { input: TInput }) => TContext);\n run: LogicFunction<TContext, TOutput, TEvent, TInput, TEmitted>;\n}\n\ninterface LogicTransition<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput,\n TEmitted extends EventObject\n> {\n (\n snapshot: LogicSnapshot<TContext, TOutput, TInput>,\n event: TEvent,\n actorScope: ActorScope<\n LogicSnapshot<TContext, TOutput, TInput>,\n TEvent,\n AnyActorSystem,\n TEmitted\n >\n ): [\n LogicSnapshot<TContext, TOutput, TInput>,\n LogicEffect<TEvent, TEmitted>[]\n ];\n (\n snapshot: LogicSnapshot<TContext, TOutput, TInput>,\n event: TEvent,\n actorScope: ActorScope<\n LogicSnapshot<TContext, TOutput, TInput>,\n TEvent,\n AnyActorSystem,\n TEmitted\n >\n ): LogicSnapshot<TContext, TOutput, TInput>;\n}\n\nexport type LogicActorLogic<\n TContext,\n TOutput,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n> = Omit<\n ActorLogic<\n LogicSnapshot<TContext, TOutput, TInput>,\n TEvent,\n TInput,\n AnyActorSystem,\n TEmitted\n >,\n 'transition'\n> & {\n id?: string;\n transition: LogicTransition<TContext, TOutput, TEvent, TInput, TEmitted>;\n};\n\nexport type LogicActorRef<\n TContext,\n TOutput,\n TEvent extends EventObject,\n TInput\n> = ActorRefFromLogic<LogicActorLogic<TContext, TOutput, TEvent, TInput>>;\n\nconst effectStates = new WeakMap<\n AnyActorRef,\n Map<PropertyKey, { cleanup?: () => void }>\n>();\n\nexport const XSTATE_LOGIC_EFFECT_RESOLVE = 'xstate.logic.effect.resolve';\nexport const XSTATE_LOGIC_EFFECT_REJECT = 'xstate.logic.effect.reject';\nexport const XSTATE_LOGIC_EFFECT_START = 'xstate.logic.effect.start';\n\nfunction getEffectState(self: AnyActorRef) {\n let state = effectStates.get(self);\n if (!state) {\n state = new Map();\n effectStates.set(self, state);\n }\n return state;\n}\n\nexport function executeLogicEffects(\n effects: readonly unknown[] | undefined,\n actorScope: ActorScope<any, any, any, any>\n) {\n if (!effects?.length) {\n return;\n }\n\n for (const effect of effects as LogicEffect<EventObject, EventObject>[]) {\n switch (effect.type) {\n case 'emit':\n actorScope.emit(effect.event);\n break;\n case 'sendBack': {\n const parent = (actorScope.self as any)._parent;\n if (parent) {\n actorScope.system._relay(actorScope.self, parent, effect.event);\n }\n break;\n }\n case 'raise':\n actorScope.system._relay(\n actorScope.self,\n actorScope.self,\n effect.event\n );\n break;\n case 'effect': {\n if (!effect.key) {\n const cleanup = effect.exec();\n if (typeof cleanup === 'function') {\n getEffectState(actorScope.self).set(Symbol(), { cleanup });\n }\n break;\n }\n\n const state = getEffectState(actorScope.self);\n if (state.has(effect.key)) {\n break;\n }\n const cleanup = effect.exec();\n state.set(effect.key, {\n cleanup: typeof cleanup === 'function' ? cleanup : undefined\n });\n break;\n }\n case 'cleanupEffects': {\n const state = effectStates.get(actorScope.self);\n if (!state) {\n break;\n }\n for (const { cleanup } of state.values()) {\n cleanup?.();\n }\n effectStates.delete(actorScope.self);\n break;\n }\n }\n }\n}\n\nfunction resolveContext<TContext, TInput>(\n context: TContext | ((args: { input: TInput }) => TContext),\n input: TInput\n) {\n return typeof context === 'function'\n ? (context as (args: { input: TInput }) => TContext)({ input })\n : context;\n}\n\nexport function createLogic<\n TContext,\n const TInputSchema extends StandardSchemaV1,\n const TOutputSchema extends StandardSchemaV1,\n TEvent extends EventObject = EventObject,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted,\n TInputSchema,\n TOutputSchema\n > & {\n schemas: {\n input: TInputSchema;\n output: TOutputSchema;\n };\n }\n): LogicActorLogic<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted\n>;\nexport function createLogic<\n TContext,\n TOutput,\n const TInputSchema extends StandardSchemaV1,\n TEvent extends EventObject = EventObject,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<\n TContext,\n TOutput,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted,\n TInputSchema\n > & {\n schemas: {\n input: TInputSchema;\n output?: undefined;\n };\n }\n): LogicActorLogic<\n TContext,\n TOutput,\n TEvent,\n StandardSchemaV1.InferOutput<TInputSchema>,\n TEmitted\n>;\nexport function createLogic<\n TContext,\n const TOutputSchema extends StandardSchemaV1,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n TInput,\n TEmitted,\n StandardSchemaV1,\n TOutputSchema\n > & {\n schemas: {\n input?: undefined;\n output: TOutputSchema;\n };\n }\n): LogicActorLogic<\n TContext,\n StandardSchemaV1.InferOutput<TOutputSchema>,\n TEvent,\n TInput,\n TEmitted\n>;\nexport function createLogic<\n TContext,\n TOutput = unknown,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<TContext, TOutput, TEvent, TInput, TEmitted>\n): LogicActorLogic<TContext, TOutput, TEvent, TInput, TEmitted>;\nexport function createLogic<\n TContext,\n TOutput = unknown,\n TEvent extends EventObject = EventObject,\n TInput = NonReducibleUnknown,\n TEmitted extends EventObject = EventObject\n>(\n config: LogicConfig<TContext, TOutput, TEvent, TInput, TEmitted>\n): LogicActorLogic<TContext, TOutput, TEvent, TInput, TEmitted> {\n const transition = ((snapshot, event, actorScope) => {\n if (snapshot.status !== 'active') {\n return [snapshot, []];\n }\n\n if (event.type === XSTATE_STOP) {\n return [\n {\n ...snapshot,\n status: 'stopped',\n input: undefined\n },\n [{ type: 'cleanupEffects' }]\n ];\n }\n\n if (event.type === XSTATE_LOGIC_EFFECT_START) {\n return [\n {\n ...snapshot,\n effects: {\n ...snapshot.effects,\n [(event as any).key]: { status: 'active' }\n }\n },\n []\n ];\n }\n\n if (event.type === XSTATE_LOGIC_EFFECT_RESOLVE) {\n return [\n {\n ...snapshot,\n effects: {\n ...snapshot.effects,\n [(event as any).key]: {\n status: 'done',\n output: (event as any).output\n }\n }\n },\n []\n ];\n }\n\n if (event.type === XSTATE_LOGIC_EFFECT_REJECT) {\n return [\n {\n ...snapshot,\n effects: {\n ...snapshot.effects,\n [(event as any).key]: {\n status: 'error',\n error: (event as any).error\n }\n }\n },\n []\n ];\n }\n\n const effects: LogicEffect<TEvent, TEmitted>[] = [];\n const trackedEffects: Record<string, LogicEffectState> = {};\n const enqueueEffect = (key: string, exec: () => void | (() => void)) => {\n if (snapshot.effects?.[key]) {\n return;\n }\n effects.push({ type: 'effect', key, exec });\n trackedEffects[key] = { status: 'active' };\n };\n const enq: LogicEnqueue<TEvent, TEmitted> = {\n emit: (emitted) => {\n effects.push({ type: 'emit', event: emitted });\n },\n sendBack: (sentEvent) => {\n effects.push({ type: 'sendBack', event: sentEvent });\n },\n raise: (raisedEvent) => {\n effects.push({ type: 'raise', event: raisedEvent });\n },\n effect: ((keyOrExec, maybeExec) => {\n if (typeof keyOrExec === 'string') {\n enqueueEffect(keyOrExec, maybeExec);\n return;\n }\n effects.push({ type: 'effect', exec: keyOrExec });\n }) as LogicEnqueue<TEvent, TEmitted>['effect']\n };\n\n const patch = config.run(\n {\n context: snapshot.context,\n event,\n input: snapshot.input!,\n system: actorScope.system,\n self: actorScope.self as any,\n emit: actorScope.emit\n } as LogicArgs<TContext, TEvent, TInput>,\n enq\n );\n\n const nextSnapshot = {\n ...snapshot,\n ...(patch || {})\n };\n\n if ('context' in snapshot || patch?.context !== undefined) {\n (nextSnapshot as any).context = patch?.context ?? snapshot.context;\n }\n if (patch?.effects || Object.keys(trackedEffects).length) {\n (nextSnapshot as any).effects = {\n ...snapshot.effects,\n ...patch?.effects,\n ...trackedEffects\n };\n }\n\n return [nextSnapshot, effects];\n }) as LogicTransition<TContext, TOutput, TEvent, TInput, TEmitted>;\n\n const logic: LogicActorLogic<TContext, TOutput, TEvent, TInput, TEmitted> = {\n id: config.id,\n config,\n transition,\n start: (snapshot, actorScope) => {\n const [nextSnapshot, effects] = transition(\n snapshot,\n createInitEvent(snapshot.input) as unknown as TEvent,\n actorScope\n );\n Object.assign(snapshot, nextSnapshot);\n executeLogicEffects(effects, actorScope);\n },\n getInitialSnapshot: (_, input) => {\n const context = resolveContext(config.context, input);\n const snapshot = {\n status: 'active' as const,\n output: undefined,\n error: undefined,\n input\n };\n\n if (context !== undefined) {\n (snapshot as any).context = context;\n }\n\n return {\n ...snapshot\n } as LogicSnapshot<TContext, TOutput, TInput>;\n },\n getPersistedSnapshot: (snapshot) => snapshot,\n restoreSnapshot: (snapshot: any) => snapshot\n };\n\n return logic;\n}\n","import isDevelopment from '#is-development';\nimport type { ActionRecord, SentRecord } from './inspection.ts';\nimport { onActorRead } from './interop.ts';\nimport { Mailbox } from './Mailbox.ts';\nimport { XSTATE_STOP } from './constants.ts';\nimport {\n createDoneActorEvent,\n createErrorActorEvent,\n createInitEvent\n} from './eventUtils.ts';\nimport { reportUnhandledError } from './reportUnhandledError.ts';\nimport { symbolObservable } from './symbolObservable.ts';\nimport { AnyActorSystem, Clock, createSystem } from './system.ts';\nimport { executeLogicEffects } from './actors/logic.ts';\n\n// those are needed to make JSDoc `@link` work properly\nimport type {\n createObservableLogic,\n createEventObservableLogic\n} from './actors/observable.ts';\nimport type { createCallbackLogic } from './actors/callback.ts';\nimport type { createLogic } from './actors/logic.ts';\nimport type { createAsyncLogic } from './actors/promise.ts';\nimport type { createMachine } from './createMachine.ts';\n\nlet executingCustomAction: boolean = false;\n\nimport type {\n ActorScope,\n AnyActor,\n AnyActorLogic,\n EmittedFrom,\n EventFromLogic,\n SendableEventFromLogic,\n InputFrom,\n Snapshot,\n SnapshotFrom,\n AnyTransitionDefinition,\n Readable\n} from './types.ts';\nimport {\n ActorOptions,\n ActorInstance,\n ActorRef,\n EventObject,\n InteropSubscribable,\n Observer,\n PendingEffect,\n Subscription,\n TimersRestoreStrategy\n} from './types.ts';\nimport { toObserver } from './utils.ts';\n\nexport const $$ACTOR_TYPE = 1;\n\n// those values are currently used by @xstate/react directly so it's important to keep the assigned values in sync\nexport enum ProcessingStatus {\n NotStarted = 0,\n Running = 1,\n Stopped = 2\n}\n\nconst defaultOptions = {\n clock: {\n setTimeout: (fn, ms) => {\n return setTimeout(fn, ms);\n },\n clearTimeout: (id) => {\n return clearTimeout(id);\n }\n } as Clock,\n logger: console.log.bind(console)\n};\n\n/**\n * An Actor is a running process that can receive events, send events and change\n * its behavior based on the events it receives, which can cause effects outside\n * of the actor. When you run a state machine, it becomes an actor.\n *\n * An `Actor` is the concrete runtime instance with lifecycle methods and\n * system-owned internals. It also satisfies the narrower `ActorRef` contract,\n * so consumer APIs should accept `ActorRef` when they only need to send events\n * or read snapshots.\n */\nexport class Actor<TLogic extends AnyActorLogic>\n implements\n ActorInstance<\n SnapshotFrom<TLogic>,\n EventFromLogic<TLogic>,\n EmittedFrom<TLogic>,\n SendableEventFromLogic<TLogic>\n >\n{\n /** The current internal state of the actor. */\n private _snapshot!: SnapshotFrom<TLogic>;\n /**\n * The clock that is responsible for setting and clearing timeouts, such as\n * delayed events and transitions.\n */\n public clock: Clock;\n public options: Readonly<ActorOptions<TLogic>>;\n\n /** The unique identifier for this actor relative to its parent. */\n public id: string;\n\n private readonly _boundProcess = this._process.bind(this);\n\n private mailbox: Mailbox<EventFromLogic<TLogic>> = new Mailbox(\n this._boundProcess\n );\n\n private observers: Set<Observer<SnapshotFrom<TLogic>>> = new Set();\n private eventListeners: Map<\n string,\n Set<(emittedEvent: EmittedFrom<TLogic>) => void>\n > = new Map();\n private logger: (...args: any[]) => void;\n\n /** @internal */\n public _processingStatus: ProcessingStatus = ProcessingStatus.NotStarted;\n\n // Actor Ref\n public _parent?: AnyActor;\n /** @internal */\n public _syncSnapshot?: boolean;\n public ref: ActorRef<\n SnapshotFrom<TLogic>,\n EventFromLogic<TLogic>,\n EmittedFrom<TLogic>,\n SendableEventFromLogic<TLogic>\n >;\n // TODO: add typings for system\n private _actorScope: ActorScope<\n SnapshotFrom<TLogic>,\n EventFromLogic<TLogic>,\n AnyActorSystem,\n EmittedFrom<TLogic>,\n SendableEventFromLogic<TLogic>\n >;\n\n /** @internal */\n public _lastSourceRef?: AnyActor;\n /** @internal */\n public _collectedMicrosteps: AnyTransitionDefinition[] = [] as any;\n /** @internal Actions executed during the in-flight transition. */\n public _collectedActions: ActionRecord[] = [];\n /** @internal Events relayed to other actors during the in-flight transition. */\n public _collectedSent: SentRecord[] = [];\n public systemId: string | undefined;\n\n /** The globally unique process ID for this invocation. */\n public sessionId: string;\n\n /** The system to which this actor belongs. */\n public system: AnyActorSystem;\n\n public trigger: {\n [K in SendableEventFromLogic<TLogic>['type']]: {} extends Omit<\n Extract<SendableEventFromLogic<TLogic>, { type: K }>,\n 'type'\n >\n ? () => void\n : (\n payload: Omit<\n Extract<SendableEventFromLogic<TLogic>, { type: K }>,\n 'type'\n >\n ) => void;\n };\n\n public src: string | AnyActorLogic;\n\n /**\n * Creates a new actor instance for the given logic with the provided options,\n * if any.\n *\n * @param logic The logic to create an actor from\n * @param options Actor options\n */\n constructor(\n public logic: TLogic,\n options?: ActorOptions<TLogic>\n ) {\n const resolvedOptions = {\n ...defaultOptions,\n ...options\n };\n\n const { clock, logger, parent, syncSnapshot, id, systemId, inspect } =\n resolvedOptions;\n\n this.system = parent\n ? parent.system\n : createSystem(this, {\n clock,\n logger,\n timers: resolvedOptions.timers\n });\n\n if (inspect && !parent) {\n // Always inspect at the system-level\n this.system.inspect(toObserver(inspect));\n }\n\n this.sessionId = this.system._bookId();\n this.id = id ?? this.sessionId;\n this.logger = options?.logger ?? this.system._logger;\n this.clock = options?.clock ?? this.system._clock;\n this._parent = parent;\n this._syncSnapshot = syncSnapshot;\n this.options = resolvedOptions as ActorOptions<TLogic> &\n typeof defaultOptions;\n this.src = resolvedOptions.src ?? logic;\n this.ref = this;\n this._actorScope = {\n self: this,\n id: this.id,\n sessionId: this.sessionId,\n logger: this.logger,\n defer: (fn) => {\n this._deferred.push(fn);\n },\n system: this.system,\n stopChild: (child) => {\n if (child._parent !== this) {\n throw new Error(\n `Cannot stop child actor ${child.id} of ${this.id} because it is not a child`\n );\n }\n (child as Actor<AnyActorLogic>)._stop();\n },\n emit: (emittedEvent) => {\n const listeners = this.eventListeners.get(emittedEvent.type);\n const wildcardListener = this.eventListeners.get('*');\n if (!listeners && !wildcardListener) {\n return;\n }\n if (listeners) {\n for (const handler of listeners) {\n try {\n handler(emittedEvent);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n }\n if (!wildcardListener) {\n return;\n }\n for (const handler of wildcardListener) {\n try {\n handler(emittedEvent);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n },\n actionExecutor: (action) => {\n const exec = () => {\n // Record every executed action for the '@xstate.transition' inspection\n // event's `actions[]` facet (replaces the v5 '@xstate.action' event).\n this._collectedActions.push({\n type: action.type,\n params: action.params\n });\n if (!action.exec) {\n return;\n }\n const saveExecutingCustomAction = executingCustomAction;\n try {\n executingCustomAction = true;\n\n action.exec();\n } finally {\n executingCustomAction = saveExecutingCustomAction;\n }\n };\n if (this._processingStatus === ProcessingStatus.Running) {\n exec();\n } else {\n this._deferred.push(exec);\n }\n }\n };\n\n // Ensure that the send method is bound to this Actor instance\n // if destructured\n this.send = this.send.bind(this);\n this.trigger = new Proxy({} as Actor<TLogic>['trigger'], {\n get: (_, eventType: string) => {\n return (payload?: any) => {\n this.send({ ...payload, type: eventType });\n };\n }\n });\n\n // unified '@xstate.transition' event replaces '@xstate.actor'\n\n if (systemId) {\n this.systemId = systemId;\n this.system._set(systemId, this);\n }\n\n // prepare to collect initial microsteps during getInitialSnapshot\n this._collectedMicrosteps = [] as any;\n let persistedState = options?.snapshot ?? options?.state;\n if (\n persistedState &&\n typeof persistedState === 'object' &&\n '_pendingEffects' in persistedState\n ) {\n // Pending effects are restored by this actor on `start()`; the logic\n // only sees the rest of the persisted snapshot.\n const { _pendingEffects, ...rest } = persistedState as any;\n this._pendingEffects = _pendingEffects;\n persistedState = rest;\n }\n try {\n this._snapshot = persistedState\n ? this.logic.restoreSnapshot\n ? this.logic.restoreSnapshot(persistedState, this._actorScope)\n : persistedState\n : this.logic.getInitialSnapshot(this._actorScope, this.options?.input);\n } catch (err) {\n // if we get here then it means that we assign a value to this._snapshot that is not of the correct type\n // we can't get the true `TSnapshot & { status: 'error'; }`, it's impossible\n // so right now this is a lie of sorts\n this._snapshot = {\n status: 'error',\n output: undefined,\n error: err\n } as any;\n // discard any functions deferred during the failed initial snapshot\n // computation so they can't run against an inconsistent actor\n this._deferred.length = 0;\n }\n\n if (systemId && (this._snapshot as any).status !== 'active') {\n this.system._unregister(this);\n }\n\n // Announce actor topology: emitted once for every actor (root and every\n // spawned/invoked child) so the actor graph can be drawn before any\n // transitions occur. This is the only place actor identity is announced.\n this.system._sendInspectionEvent({\n type: '@xstate.actor',\n actorRef: this as any,\n parentRef: this._parent,\n id: this.id,\n src: this.src,\n snapshot: this._snapshot\n });\n }\n\n // array of functions to defer\n private _deferred: Array<() => void> = [];\n\n // pending effects (timers) from a persisted snapshot, rescheduled on `start()`\n private _pendingEffects?: PendingEffect[];\n\n private _setErrorSnapshot(\n err: unknown,\n snapshot: SnapshotFrom<TLogic> = this._snapshot\n ) {\n this._snapshot = {\n ...(snapshot as any),\n status: 'error',\n error: err\n };\n }\n\n private _next(snapshot: SnapshotFrom<TLogic>) {\n for (const observer of this.observers) {\n try {\n observer.next?.(snapshot);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n }\n\n private update(snapshot: SnapshotFrom<TLogic>, event: EventObject): void {\n // Update state\n this._snapshot = snapshot;\n\n // Execute deferred effects\n for (let i = 0; i < this._deferred.length; i++) {\n const deferredFn = this._deferred[i];\n try {\n deferredFn();\n } catch (err) {\n // this error can only be caught when executing *initial* actions\n // it's the only time when we call actions provided by the user through those deferreds\n // when the actor is already running we always execute them synchronously while transitioning\n // no \"builtin deferred\" should actually throw an error since they are either safe\n // or the control flow is passed through the mailbox and errors should be caught by the `_process` used by the mailbox\n this._deferred.length = 0;\n this._setErrorSnapshot(err, snapshot);\n break;\n }\n }\n this._deferred.length = 0;\n\n switch ((this._snapshot as any).status) {\n case 'active':\n this._next(snapshot);\n break;\n case 'done': {\n // next observers are meant to be notified about done snapshots\n // this can be seen as something that is different from how observable work\n // but with observables `complete` callback is called without any arguments\n // it's more ergonomic for XState to treat a done snapshot as a \"next\" value\n // and the completion event as something that is separate,\n // something that merely follows emitting that done snapshot\n this._next(snapshot);\n\n this._stopProcedure();\n this._complete();\n const doneEvent = createDoneActorEvent(\n this.id,\n (this._snapshot as any).output\n );\n if (this._parent) {\n this.system._relay(this, this._parent, doneEvent);\n }\n\n break;\n }\n case 'error':\n this._error((this._snapshot as any).error);\n break;\n }\n this.system._sendInspectionEvent({\n type: '@xstate.transition',\n actorRef: this as any,\n event,\n sourceRef: this._lastSourceRef,\n targetRef: this as any,\n snapshot,\n microsteps: this._collectedMicrosteps as any,\n actions: this._collectedActions,\n sent: this._collectedSent,\n eventType: event.type\n });\n // reset facets after emission\n this._collectedMicrosteps = [] as any;\n this._collectedActions = [];\n this._collectedSent = [];\n }\n\n /**\n * Subscribe an observer to an actor’s snapshot values.\n *\n * @remarks\n * The observer will receive the actor’s snapshot value when it is emitted.\n * The observer can be:\n *\n * - A plain function that receives the latest snapshot, or\n * - An observer object whose `.next(snapshot)` method receives the latest\n * snapshot\n *\n * @example\n *\n * ```ts\n * // Observer as a plain function\n * const subscription = actor.subscribe((snapshot) => {\n * console.log(snapshot);\n * });\n * ```\n *\n * @example\n *\n * ```ts\n * // Observer as an object\n * const subscription = actor.subscribe({\n * next(snapshot) {\n * console.log(snapshot);\n * },\n * error(err) {\n * // ...\n * },\n * complete() {\n * // ...\n * }\n * });\n * ```\n *\n * The return value of `actor.subscribe(observer)` is a subscription object\n * that has an `.unsubscribe()` method. You can call\n * `subscription.unsubscribe()` to unsubscribe the observer:\n *\n * @example\n *\n * ```ts\n * const subscription = actor.subscribe((snapshot) => {\n * // ...\n * });\n *\n * // Unsubscribe the observer\n * subscription.unsubscribe();\n * ```\n *\n * When the actor is stopped, all of its observers will automatically be\n * unsubscribed.\n *\n * @param observer - Either a plain function that receives the latest\n * snapshot, or an observer object whose `.next(snapshot)` method receives\n * the latest snapshot\n */\n public subscribe(observer: Observer<SnapshotFrom<TLogic>>): Subscription;\n public subscribe(\n nextListener?: (snapshot: SnapshotFrom<TLogic>) => void,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription;\n public subscribe(\n nextListenerOrObserver?:\n | ((snapshot: SnapshotFrom<TLogic>) => void)\n | Observer<SnapshotFrom<TLogic>>,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription {\n const observer = toObserver(\n nextListenerOrObserver,\n errorListener,\n completeListener\n );\n\n if (this._processingStatus !== ProcessingStatus.Stopped) {\n this.observers.add(observer);\n } else {\n switch ((this._snapshot as any).status) {\n case 'done':\n try {\n observer.complete?.();\n } catch (err) {\n reportUnhandledError(err);\n }\n break;\n case 'error': {\n const err = (this._snapshot as any).error;\n if (!observer.error) {\n reportUnhandledError(err);\n } else {\n try {\n observer.error(err);\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n break;\n }\n }\n }\n\n return {\n unsubscribe: () => {\n this.observers.delete(observer);\n }\n };\n }\n\n public on<TType extends EmittedFrom<TLogic>['type'] | '*'>(\n type: TType,\n handler: (\n emitted: EmittedFrom<TLogic> &\n (TType extends '*' ? unknown : { type: TType })\n ) => void\n ): Subscription {\n let listeners = this.eventListeners.get(type);\n if (!listeners) {\n listeners = new Set();\n this.eventListeners.set(type, listeners);\n }\n listeners.add(handler);\n\n return {\n unsubscribe: () => {\n listeners.delete(handler);\n }\n };\n }\n\n public select<TSelected>(\n selector: (snapshot: SnapshotFrom<TLogic>) => TSelected,\n equalityFn: (a: TSelected, b: TSelected) => boolean = Object.is\n ): Readable<TSelected> {\n return {\n subscribe: (\n observerOrFn:\n | Observer<TSelected>\n | ((value: TSelected) => void)\n | undefined,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ) => {\n const observer = toObserver(\n observerOrFn,\n errorListener,\n completeListener\n );\n let selected = selector(this.getSnapshot());\n return this.subscribe({\n next: (snapshot) => {\n const next = selector(snapshot);\n if (!equalityFn(selected, next)) {\n selected = next;\n observer.next?.(next);\n }\n },\n error: observer.error,\n complete: observer.complete\n });\n },\n get: () => selector(this.get())\n };\n }\n\n /** Starts the Actor from the initial state */\n public start(): this {\n if (this._processingStatus === ProcessingStatus.Running) {\n // Do not restart the service if it is already started\n return this;\n }\n\n if (this._syncSnapshot) {\n this.subscribe({\n next: (snapshot: Snapshot<unknown>) => {\n if (snapshot.status === 'active') {\n this.system._relay(this, this._parent!, {\n type: `xstate.snapshot.${this.id}`,\n snapshot\n });\n }\n },\n error: () => {}\n });\n }\n\n this.system._register(this.sessionId, this);\n if (this.systemId) {\n this.system._set(this.systemId, this);\n }\n this._processingStatus = ProcessingStatus.Running;\n\n // TODO: this isn't correct when rehydrating\n const initEvent = createInitEvent(this.options.input);\n // remember source of init as parent for unified transition event\n this._lastSourceRef = this._parent;\n\n const status = (this._snapshot as any).status;\n\n switch (status) {\n case 'done':\n // a state machine can be \"done\" upon initialization (it could reach a final state using initial microsteps)\n // we still need to complete observers, flush deferreds etc\n this.update(\n this._snapshot,\n initEvent as unknown as EventFromLogic<TLogic>\n );\n // TODO: rethink cleanup of observers, mailbox, etc\n return this;\n case 'error':\n this._error((this._snapshot as any).error);\n return this;\n }\n\n if (!this._parent) {\n this.system.start();\n }\n\n if (this.logic.start) {\n try {\n this.logic.start(this._snapshot, this._actorScope);\n } catch (err) {\n this._setErrorSnapshot(err);\n this._error(err);\n return this;\n }\n }\n\n // TODO: this notifies all subscribers but usually this is redundant\n // there is no real change happening here\n // we need to rethink if this needs to be refactored\n this.update(this._snapshot, initEvent as unknown as EventFromLogic<TLogic>);\n\n if (this._pendingEffects) {\n const strategy =\n this.options.timers ?? this.system._timerStrategy ?? 'resume';\n for (const effect of this._pendingEffects) {\n // Re-execute the pending effect with its remaining delay. Only\n // self-targeted raises exist today; other effect types are ignored.\n if (effect.type === '@xstate.raise') {\n this.system.scheduler.schedule(\n this,\n this,\n effect.event,\n resolveRestoredTimerDelay(strategy, effect),\n effect.id\n );\n }\n }\n this._pendingEffects = undefined;\n }\n\n this.mailbox.start();\n\n return this;\n }\n\n private _process(event: EventFromLogic<TLogic>) {\n let nextState: any;\n let caughtError;\n try {\n nextState = this.logic.transition(\n this._snapshot,\n event,\n this._actorScope\n );\n } catch (err) {\n // we wrap it in a box so we can rethrow it later even if falsy value gets caught here\n caughtError = { err };\n }\n\n if (caughtError) {\n const { err } = caughtError;\n\n this._setErrorSnapshot(err);\n this._error(err);\n return;\n }\n\n const [snapshot, effects] = Array.isArray(nextState)\n ? nextState\n : [nextState, undefined];\n\n this.update(snapshot, event);\n executeLogicEffects(effects, this._actorScope);\n if (event.type === XSTATE_STOP) {\n this._stopProcedure();\n this._complete();\n }\n }\n\n /** @internal */\n public _stop(): this {\n if (this._processingStatus === ProcessingStatus.Stopped) {\n return this;\n }\n this.mailbox.clear();\n if (this._processingStatus === ProcessingStatus.NotStarted) {\n this._processingStatus = ProcessingStatus.Stopped;\n return this;\n }\n this.mailbox.enqueue({ type: XSTATE_STOP } as any);\n this.system._unregister(this);\n\n return this;\n }\n\n /** Stops the Actor and unsubscribe all listeners. */\n public stop(): this {\n if (this._parent) {\n throw new Error('A non-root actor cannot be stopped directly.');\n }\n return this._stop();\n }\n private _complete(): void {\n for (const observer of this.observers) {\n try {\n observer.complete?.();\n } catch (err) {\n reportUnhandledError(err);\n }\n }\n this.observers.clear();\n this.eventListeners.clear();\n }\n\n private _error(err: unknown): void {\n this._stopProcedure();\n if (!this.observers.size) {\n if (!this._parent) {\n reportUnhandledError(err);\n }\n this.eventListeners.clear();\n } else {\n let reportError = false;\n\n for (const observer of this.observers) {\n const errorListener = observer.error;\n reportError ||= !errorListener;\n try {\n errorListener?.(err);\n } catch (err2) {\n reportUnhandledError(err2);\n }\n }\n this.observers.clear();\n this.eventListeners.clear();\n if (reportError) {\n reportUnhandledError(err);\n }\n }\n\n if (this._parent) {\n this.system._relay(\n this,\n this._parent,\n createErrorActorEvent(this.id, err)\n );\n }\n }\n // TODO: atm children don't belong entirely to the actor so\n // in a way - it's not even super aware of them\n // so we can't stop them from here but we really should!\n // right now, they are being stopped within the machine's transition\n // but that could throw and leave us with \"orphaned\" active actors\n private _stopProcedure(): void {\n if (this._processingStatus !== ProcessingStatus.Running) {\n // Actor already stopped; do nothing\n return;\n }\n\n // Cancel all delayed events\n this.system.scheduler.cancelAll(this);\n\n // TODO: mailbox.reset\n this.mailbox.clear();\n // TODO: after `stop` we must prepare ourselves for receiving events again\n // events sent *after* stop signal must be queued\n // it seems like this should be the common behavior for all of our consumers\n // so perhaps this should be unified somehow for all of them\n this.mailbox = new Mailbox(this._boundProcess);\n\n this._processingStatus = ProcessingStatus.Stopped;\n this.system._unregister(this);\n }\n\n /** @internal */\n public _send(event: EventFromLogic<TLogic>) {\n if (this._processingStatus === ProcessingStatus.Stopped) {\n // do nothing\n if (isDevelopment) {\n // TODO: circular serialization issues\n // const eventString = ''; //JSON.stringify(event);\n\n console.warn(\n `Event \"${event.type}\" was sent to stopped actor \"${this.id} (${this.sessionId})\". This actor has already reached its final state, and will not transition.`\n );\n }\n return;\n }\n\n this.mailbox.enqueue(event);\n }\n\n /**\n * Sends an event to the running Actor to trigger a transition.\n *\n * @param event The event to send\n */\n public send(event: SendableEventFromLogic<TLogic>) {\n if (isDevelopment && typeof event === 'string') {\n throw new Error(\n `Only event objects may be sent to actors; use .send({ type: \"${event}\" }) instead`\n );\n }\n this.system._relay(undefined, this, event);\n }\n\n public toJSON() {\n return {\n xstate$$type: $$ACTOR_TYPE,\n id: this.id\n };\n }\n\n /**\n * Obtain the internal state of the actor, which can be persisted.\n *\n * @remarks\n * The internal state can be persisted from any actor, not only machines.\n *\n * Note that the persisted state is not the same as the snapshot from\n * {@link Actor.getSnapshot}. Persisted state represents the internal state of\n * the actor, while snapshots represent the actor's last emitted value.\n *\n * Can be restored with {@link ActorOptions.state}\n * @see https://stately.ai/docs/persistence\n */\n public getPersistedSnapshot(): Snapshot<unknown>;\n public getPersistedSnapshot(options?: unknown): Snapshot<unknown> {\n const persisted = this.logic.getPersistedSnapshot(this._snapshot, options);\n\n // Capture this actor's pending self-targeted effects (delayed\n // events/transitions) as serialized action descriptors plus their\n // runtime progress, so they can be restored on `start()`.\n const scheduledEvents = this.system._snapshot._scheduledEvents;\n let pendingEffects: PendingEffect[] | undefined;\n const now = Date.now();\n for (const key in scheduledEvents) {\n const scheduled = scheduledEvents[key as keyof typeof scheduledEvents];\n if (scheduled.source === this && scheduled.target === this) {\n (pendingEffects ??= []).push({\n type: '@xstate.raise',\n event: scheduled.event,\n id: scheduled.id,\n delay: scheduled.delay,\n startedAt: scheduled.startedAt,\n elapsed: Math.max(0, now - scheduled.startedAt)\n });\n }\n }\n\n // If this actor was restored but not yet started, its pending effects\n // are not in the scheduler yet — carry them through as-is.\n pendingEffects ??= this._pendingEffects;\n\n return pendingEffects\n ? ({\n ...(persisted as any),\n _pendingEffects: pendingEffects\n } as Snapshot<unknown>)\n : persisted;\n }\n\n public [symbolObservable](): InteropSubscribable<SnapshotFrom<TLogic>> {\n return this;\n }\n\n /**\n * Read an actor’s snapshot synchronously.\n *\n * @remarks\n * The snapshot represent an actor's last emitted value.\n *\n * When an actor receives an event, its internal state may change. An actor\n * may emit a snapshot when a state transition occurs.\n *\n * Note that some actors, such as callback actors generated with\n * `createCallbackLogic`, will not emit snapshots.\n * @see {@link Actor.subscribe} to subscribe to an actor’s snapshot values.\n * @see {@link Actor.getPersistedSnapshot} to persist the internal state of an actor (which is more than just a snapshot).\n */\n public getSnapshot(): SnapshotFrom<TLogic> {\n return this.get();\n }\n\n /** Read the actor's current snapshot as an atom value. */\n public get(): SnapshotFrom<TLogic> {\n if (isDevelopment && !this._snapshot) {\n throw new Error(\n `Snapshot can't be read while the actor initializes itself`\n );\n }\n onActorRead?.(this);\n return this._snapshot;\n }\n}\n\nfunction resolveRestoredTimerDelay(\n strategy: TimersRestoreStrategy,\n effect: PendingEffect\n): number {\n if (typeof strategy === 'function') {\n return strategy(effect);\n }\n switch (strategy) {\n case 'restart':\n return effect.delay;\n case 'absolute':\n return Math.max(0, effect.startedAt + effect.delay - Date.now());\n case 'resume':\n default:\n return Math.max(0, effect.delay - effect.elapsed);\n }\n}\n\nexport type RequiredActorOptionsKeys<TLogic extends AnyActorLogic> =\n undefined extends InputFrom<TLogic> ? never : 'input';\n\n/**\n * Creates a new actor instance for the given actor logic with the provided\n * options, if any.\n *\n * @remarks\n * When you create an actor from actor logic via `createActor(logic)`, you\n * implicitly create an actor system where the created actor is the root actor.\n * Any actors spawned from this root actor and its descendants are part of that\n * actor system.\n * @example\n *\n * ```ts\n * import { createActor } from 'xstate';\n * import { someActorLogic } from './someActorLogic.ts';\n *\n * // Creating the actor, which implicitly creates an actor system with itself as the root actor\n * const actor = createActor(someActorLogic);\n *\n * actor.subscribe((snapshot) => {\n * console.log(snapshot);\n * });\n *\n * // Actors must be started by calling `actor.start()`, which will also start the actor system.\n * actor.start();\n *\n * // Actors can receive events\n * actor.send({ type: 'someEvent' });\n *\n * // You can stop root actors by calling `actor.stop()`, which will also stop the actor system and all actors in that system.\n * actor.stop();\n * ```\n *\n * @param logic - The actor logic to create an actor from. For a state machine\n * actor logic creator, see {@link createMachine}. Other actor logic creators\n * include {@link createCallbackLogic}, {@link createEventObservableLogic},\n * {@link createObservableLogic}, {@link createLogic}, and\n * {@link createAsyncLogic}.\n * @param options - Actor options\n */\nexport function createActor<TLogic extends AnyActorLogic>(\n logic: TLogic,\n options?: ActorOptions<TLogic> & {\n [K in RequiredActorOptionsKeys<TLogic>]: unknown;\n }\n): Actor<TLogic> {\n return new Actor(logic, options);\n}\n","import { createActor } from '../createActor.ts';\nimport type { ActorFromLogic } from '../types.ts';\nimport { createLogic } from './logic.ts';\nexport {\n createCallbackLogic,\n type CallbackActorLogic,\n type CallbackActorRef,\n type CallbackLogicConfig,\n type CallbackSnapshot,\n type CallbackLogicFunction\n} from './callback.ts';\nexport {\n createObservableLogic,\n createEventObservableLogic,\n type EventObservableLogicConfig,\n type EventObservableLogicFunction,\n type ObservableActorLogic,\n type ObservableActorRef,\n type ObservableLogicConfig,\n type ObservableLogicFunction,\n type ObservableSnapshot\n} from './observable.ts';\nexport {\n createLogic,\n type LogicActorLogic,\n type LogicActorRef,\n type LogicArgs,\n type LogicConfig,\n type LogicEffect,\n type LogicEffectState,\n type LogicEnqueue,\n type LogicFunction,\n type LogicPatch,\n type LogicSnapshot\n} from './logic.ts';\nexport {\n createAsyncLogic,\n type AsyncActorLogic,\n type AsyncActorRef,\n type AsyncSnapshot,\n type LogicArgs as AsyncLogicArgs,\n type LogicConfig as AsyncLogicConfig,\n type LogicEnqueue as AsyncLogicEnqueue,\n type LogicFunction as AsyncLogicFunction,\n TimeoutError\n} from './promise.ts';\nexport {\n createListenerLogic,\n listenerLogic,\n type ListenerActorLogic,\n type ListenerActorRef,\n type ListenerSnapshot,\n type ListenerInput\n} from './listener.ts';\nexport {\n createSubscriptionLogic,\n subscriptionLogic,\n type SubscriptionActorLogic,\n type SubscriptionActorRef,\n type SubscriptionSnapshot,\n type SubscriptionInput,\n type SubscriptionMappers\n} from './subscription.ts';\n\nconst emptyLogic = /* #__PURE__ */ createLogic<undefined, undefined>({\n context: undefined,\n run: () => undefined\n});\n\nexport function createEmptyActor(): ActorFromLogic<typeof emptyLogic> {\n return createActor(emptyLogic);\n}\n","import { ProcessingStatus, createActor } from './createActor.ts';\nimport {\n ActorFromLogic,\n AnyActorLogic,\n AnyActorRef,\n AnyActorScope,\n AnyEventObject,\n AnyMachineSnapshot,\n ConditionalRequired,\n InputFrom,\n IsNotNever,\n TODO,\n type RequiredLogicInput\n} from './types.ts';\nimport { resolveReferencedActor } from './utils.ts';\n\nexport type Spawner = <TLogic extends AnyActorLogic>(\n src: TLogic,\n ...[options]: ConditionalRequired<\n [\n options?: {\n id?: string;\n systemId?: string;\n input?: TLogic extends string ? unknown : InputFrom<TLogic>;\n syncSnapshot?: boolean;\n } & { [K in RequiredLogicInput<TLogic>]: unknown }\n ],\n IsNotNever<RequiredLogicInput<TLogic>>\n >\n) => ActorFromLogic<TLogic>;\n\nexport function createSpawner(\n actorScope: AnyActorScope,\n { machine, context }: AnyMachineSnapshot,\n event: AnyEventObject,\n spawnedChildren: Record<string, AnyActorRef>\n): Spawner {\n const spawn: Spawner = ((src, options) => {\n if (typeof src === 'string') {\n const logic = resolveReferencedActor(machine, src);\n\n if (!logic) {\n throw new Error(\n `Actor logic '${src as string}' not implemented in machine '${machine.id}'`\n );\n }\n\n const actor = createActor(logic, {\n id: options?.id,\n parent: actorScope.self,\n syncSnapshot: options?.syncSnapshot,\n input:\n typeof options?.input === 'function'\n ? options.input({\n context,\n event,\n self: actorScope.self\n })\n : options?.input,\n src,\n systemId: options?.systemId\n }) as any;\n\n spawnedChildren[actor.id] = actor;\n\n return actor;\n } else {\n const actor = createActor(src, {\n id: options?.id,\n parent: actorScope.self,\n syncSnapshot: options?.syncSnapshot,\n input: options?.input,\n src,\n systemId: options?.systemId\n });\n\n return actor;\n }\n }) as Spawner;\n return ((src, options) => {\n const actor = spawn(src, options) as TODO; // TODO: fix types\n spawnedChildren[actor.id] = actor;\n actorScope.defer(() => {\n if (actor._processingStatus === ProcessingStatus.Stopped) {\n return;\n }\n actor.start();\n });\n return actor;\n }) as Spawner;\n}\n","const cache = new WeakMap<any, any>();\n\nexport function memo<T>(object: any, key: string, fn: () => T): T {\n let memoizedData = cache.get(object);\n\n if (!memoizedData) {\n memoizedData = { [key]: fn() };\n cache.set(object, memoizedData);\n } else if (!(key in memoizedData)) {\n memoizedData[key] = fn();\n }\n\n return memoizedData[key];\n}\n","import isDevelopment from '#is-development';\nimport { NULL_EVENT, STATE_DELIMITER } from './constants.ts';\nimport { createInvokeTimeoutEvent } from './eventUtils.ts';\nimport { memo } from './memo.ts';\nimport {\n evaluateCandidate,\n formatTransition,\n getCandidates,\n getDelayedTransitions\n} from './stateUtils.ts';\nimport type {\n DelayedTransitionDefinition,\n EventObject,\n InitialTransitionDefinition,\n MachineContext,\n Mapper,\n StateNodesConfig,\n TransitionDefinition,\n TransitionDefinitionMap,\n AnyStateMachine,\n AnyStateNodeConfig,\n NonReducibleUnknown,\n EventDescriptor,\n AnyActor,\n AnyStateNode,\n AnyEventObject,\n AnyAction,\n AnyTransitionConfig,\n AnyTransitionDefinition,\n AnyMachineSnapshot,\n AnyInvokeDefinition\n} from './types.ts';\nimport {\n createInvokeId,\n mapValues,\n toArray,\n toTransitionConfigArray\n} from './utils.ts';\n\nconst EMPTY_OBJECT = {};\nconst CHOICE_CONFIG_KEYS = [\n 'invoke',\n 'after',\n 'on',\n 'entry',\n 'exit',\n 'always',\n 'states',\n 'initial',\n 'onDone',\n 'timeout',\n 'onTimeout',\n 'history',\n 'target',\n 'output'\n] as const;\n\ninterface StateNodeOptions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n _key: string;\n _parent?: StateNode<TContext, TEvent>;\n _machine: AnyStateMachine;\n}\n\nexport class StateNode<\n TContext extends MachineContext = MachineContext,\n TEvent extends EventObject = EventObject\n> {\n /**\n * The relative key of the state node, which represents its location in the\n * overall state value.\n */\n public key: string;\n /** The unique ID of the state node. */\n public id: string;\n /**\n * The type of this state node:\n *\n * - `'atomic'` - no child state nodes\n * - `'compound'` - nested child state nodes (XOR)\n * - `'parallel'` - orthogonal nested child state nodes (AND)\n * - `'history'` - history state node\n * - `'choice'` - pure routing decision state node\n * - `'final'` - final state node\n */\n public type:\n | 'atomic'\n | 'compound'\n | 'parallel'\n | 'final'\n | 'history'\n | 'choice';\n /** The string path from the root machine node to this node. */\n public path: string[];\n /** The child state nodes. */\n public states: StateNodesConfig<any, any>;\n /**\n * The type of history on this state node. Can be:\n *\n * - `'shallow'` - recalls only top-level historical state value\n * - `'deep'` - recalls historical state value at all levels\n */\n public history: false | 'shallow' | 'deep';\n /** The action(s) to be executed upon entering the state node. */\n public entry: AnyAction | undefined;\n /** The action(s) to be executed upon exiting the state node. */\n public exit: AnyAction | undefined;\n /** The parent state node. */\n public parent?: StateNode<any, any>;\n /** The root machine node. */\n public machine: AnyStateMachine;\n /**\n * The meta data associated with this state node, which will be returned in\n * State instances.\n */\n public meta?: any;\n /**\n * The output data sent with the \"xstate.done.state._id_\" event if this is a\n * final state node.\n */\n public output?:\n | Mapper<MachineContext, EventObject, unknown, EventObject>\n | NonReducibleUnknown;\n\n /**\n * The order this state node appears. Corresponds to the implicit document\n * order.\n */\n public order: number = -1;\n\n public description?: string;\n\n public tags: string[] = [];\n public transitions!: Map<string, AnyTransitionDefinition[]>;\n public always?: Array<AnyTransitionDefinition>;\n public invoke: Array<AnyInvokeDefinition>;\n public on!: TransitionDefinitionMap<any, any>;\n public after!: Array<DelayedTransitionDefinition<any, any>>;\n public events!: Array<EventDescriptor<any>>;\n public ownEvents!: Array<EventDescriptor<any>>;\n\n constructor(\n /** The raw config used to create the machine. */\n public config: AnyStateNodeConfig,\n options: StateNodeOptions<TContext, TEvent>\n ) {\n this.parent = options._parent;\n this.key = options._key;\n this.machine = options._machine;\n this.path = this.parent ? this.parent.path.concat(this.key) : [];\n const firstStateKey = this.config.states\n ? Object.keys(this.config.states)[0]\n : undefined;\n this.id =\n this.config.id || [this.machine.id, ...this.path].join(STATE_DELIMITER);\n this.type =\n this.config.type ||\n (firstStateKey !== undefined\n ? 'compound'\n : this.config.history\n ? 'history'\n : 'atomic');\n this.description = this.config.description;\n\n validateStateNodeConfig(this);\n\n this.order = this.machine.idMap.size;\n this.machine.idMap.set(this.id, this);\n\n this.states = (\n this.config.states\n ? mapValues(\n this.config.states,\n (stateConfig: AnyStateNodeConfig, key) => {\n const stateNode = new StateNode(stateConfig, {\n _parent: this,\n _key: key,\n _machine: this.machine\n });\n return stateNode;\n }\n )\n : EMPTY_OBJECT\n ) as StateNodesConfig<TContext, TEvent>;\n\n if (this.type === 'compound' && !this.config.initial) {\n throw new Error(\n isDevelopment\n ? `No initial state specified for compound state node \"#${\n this.id\n }\". Try adding { initial: \"${firstStateKey}\" } to the state config.`\n : `No initial state specified for compound state node \"#${this.id}\".`\n );\n }\n\n // History config\n this.history =\n this.config.history === true ? 'shallow' : this.config.history || false;\n\n this.entry = this.config.entry as AnyAction | undefined;\n this.exit = this.config.exit as AnyAction | undefined;\n\n if (this.entry) {\n // @ts-expect-error _special is an internal marker not on the Action type\n this.entry._special = true;\n }\n\n if (this.exit) {\n // @ts-expect-error _special is an internal marker not on the Action type\n this.exit._special = true;\n }\n\n this.meta = this.config.meta;\n this.output =\n this.type === 'final' || !this.parent ? this.config.output : undefined;\n this.tags = toArray(config.tags).slice();\n this.invoke = toArray(this.config.invoke).map((invokeConfig, i) => {\n const { src, systemId } = invokeConfig;\n const invokeId = createInvokeId(this.id, i);\n const resolvedId = invokeConfig.id ?? invokeId;\n // Referenced (string) actors keep their logical name so persisted\n // snapshots reference `src: 'fetchUser'` rather than a positional id;\n // only inline logic gets the synthetic source name.\n const sourceName =\n typeof src === 'string' ? src : `xstate.invoke.${invokeId}`;\n\n return {\n ...invokeConfig,\n src: sourceName,\n logic: src,\n id: resolvedId,\n systemId\n } as AnyInvokeDefinition;\n });\n }\n\n /** @internal */\n public _initialize() {\n this.after = getDelayedTransitions(this) as any;\n this.transitions = formatTransitions(this);\n if (this.type === 'choice') {\n this.always = formatChoiceTransitions(this);\n } else if (this.config.always) {\n this.always = mapTransitionConfigs(this.config.always, (transition) =>\n formatTransition(this, NULL_EVENT, transition)\n );\n }\n\n for (const key of Object.keys(this.states)) {\n this.states[key]._initialize();\n }\n\n this._refreshEventMetadata();\n }\n\n /** @internal */\n public _refreshEventMetadata() {\n const on = {} as TransitionDefinitionMap<TContext, TEvent>;\n const ownEvents: EventDescriptor<any>[] = [];\n for (const [descriptor, transitions] of this.transitions) {\n (on as any)[descriptor] = transitions.slice();\n if (\n transitions.some(\n (transition) =>\n transition.target || transition.reenter || transition.to\n )\n ) {\n ownEvents.push(descriptor);\n }\n }\n this.on = on;\n this.ownEvents = ownEvents;\n\n const events = new Set<EventDescriptor<any>>(ownEvents);\n for (const state of Object.values(this.states)) {\n for (const event of state.events) {\n events.add(event);\n }\n }\n this.events = Array.from(events);\n }\n\n public get initial(): InitialTransitionDefinition {\n return memo(this, 'initial', () =>\n formatInitialTransition(this, this.config.initial)\n );\n }\n\n /** @internal */\n public next(\n snapshot: AnyMachineSnapshot,\n event: AnyEventObject,\n self: AnyActor\n ): Array<AnyTransitionDefinition> | undefined {\n const eventType = event.type;\n const candidates: Array<AnyTransitionDefinition> = memo(\n this,\n `candidates-${eventType}`,\n () => getCandidates(this, eventType)\n );\n\n for (const candidate of candidates) {\n const guardPassed = evaluateCandidate(\n candidate,\n event,\n snapshot,\n this,\n self\n );\n\n if (guardPassed) {\n return [candidate];\n }\n }\n\n return undefined;\n }\n}\n\nfunction validateStateNodeConfig(stateNode: AnyStateNode) {\n const config = stateNode.config as any;\n\n if (stateNode.type !== 'choice') {\n if (config.choice !== undefined) {\n throw new Error(\n `State \"${stateNode.id}\" has \\`choice\\`, but \\`choice\\` can only be used with \\`type: 'choice'\\`.`\n );\n }\n return;\n }\n\n if (typeof config.choice !== 'function') {\n throw new Error(\n `Choice state \"${stateNode.id}\" must declare a \\`choice\\` function.`\n );\n }\n\n for (const key of CHOICE_CONFIG_KEYS) {\n if (config[key] !== undefined) {\n throw new Error(\n `Choice state \"${stateNode.id}\" cannot declare \\`${key}\\`.`\n );\n }\n }\n}\n\nfunction formatChoiceTransitions(\n stateNode: AnyStateNode\n): AnyTransitionDefinition[] {\n const choice = (stateNode.config as any).choice;\n const validateChoiceResult = (result: any): AnyTransitionConfig => {\n if (!result || result.target === undefined) {\n throw new Error(\n `Choice state \"${stateNode.id}\" must resolve to a target.`\n );\n }\n for (const key of ['actions', 'to', 'context'] as const) {\n if (result[key] !== undefined) {\n throw new Error(\n `Choice state \"${stateNode.id}\" cannot declare \\`${key}\\` on a choice.`\n );\n }\n }\n return result;\n };\n\n return [\n formatTransition(stateNode, NULL_EVENT, {\n to: (args: any) => validateChoiceResult(choice(args))\n } as AnyTransitionConfig)\n ];\n}\n\nfunction mapTransitionConfigs<T>(\n transitionsConfig: unknown,\n mapper: (transition: AnyTransitionConfig) => T\n): T[] {\n const transitionConfigs = toTransitionConfigArray(transitionsConfig as any);\n const transitions = new Array<T>(transitionConfigs.length);\n\n for (let i = 0; i < transitionConfigs.length; i++) {\n transitions[i] = mapper(transitionConfigs[i]);\n }\n\n return transitions;\n}\n\nfunction formatTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode\n): Map<string, TransitionDefinition<TContext, TEvent>[]> {\n const transitions = new Map<\n string,\n TransitionDefinition<TContext, AnyEventObject>[]\n >();\n if (stateNode.config.on) {\n for (const descriptor of Object.keys(stateNode.config.on)) {\n if (descriptor === NULL_EVENT) {\n throw new Error(\n 'Null events (\"\") cannot be specified as a transition key. Use `always: { ... }` instead.'\n );\n }\n const transitionsConfig = stateNode.config.on[descriptor];\n transitions.set(\n descriptor,\n mapTransitionConfigs(transitionsConfig, (transition) =>\n formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n }\n if (stateNode.config.onDone) {\n const descriptor = `xstate.done.state.${stateNode.id}`;\n transitions.set(\n descriptor,\n mapTransitionConfigs(stateNode.config.onDone, (transition) =>\n formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n const createCancelInvokeTimeoutTransition = (\n descriptor: string,\n timeoutEventType: string\n ): AnyTransitionDefinition =>\n formatTransition(stateNode, descriptor, {\n to: (_args: any, enq: any) => {\n enq.cancel(timeoutEventType);\n return {};\n }\n } as AnyTransitionConfig);\n const formatInvokeCompletionTransition = (\n descriptor: string,\n transitionConfig: AnyTransitionConfig,\n timeoutEventType: string\n ): AnyTransitionDefinition => {\n const { target, to, reenter, ...rest } = transitionConfig;\n\n return formatTransition(stateNode, descriptor, {\n ...rest,\n reenter,\n to: (args: any, enq: any) => {\n if (to) {\n let didEnqueue = false;\n const trackingEnqueue = new Proxy(enq, {\n apply(target, thisArg, argArray) {\n didEnqueue = true;\n return Reflect.apply(target, thisArg, argArray);\n },\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (typeof value !== 'function') {\n return value;\n }\n\n return (...argArray: any[]) => {\n didEnqueue = true;\n return value.apply(target, argArray);\n };\n }\n });\n const result = to(args, trackingEnqueue);\n\n if (result !== undefined || didEnqueue) {\n enq.cancel(timeoutEventType);\n }\n\n return result;\n }\n\n enq.cancel(timeoutEventType);\n return {\n target,\n reenter\n };\n }\n } as AnyTransitionConfig);\n };\n for (const invokeDef of stateNode.invoke) {\n const invokeTimeoutEventType =\n invokeDef.timeout !== undefined\n ? createInvokeTimeoutEvent(invokeDef.id).type\n : undefined;\n\n if (invokeDef.onDone) {\n const descriptor = `xstate.done.actor.${invokeDef.id}`;\n const invokeDoneTransitions = mapTransitionConfigs(\n invokeDef.onDone,\n (transition) =>\n invokeTimeoutEventType\n ? formatInvokeCompletionTransition(\n descriptor,\n transition,\n invokeTimeoutEventType\n )\n : formatTransition(stateNode, descriptor, transition)\n );\n\n if (invokeTimeoutEventType) {\n invokeDoneTransitions.push(\n createCancelInvokeTimeoutTransition(\n descriptor,\n invokeTimeoutEventType\n )\n );\n }\n\n transitions.set(descriptor, invokeDoneTransitions);\n } else if (invokeTimeoutEventType) {\n const descriptor = `xstate.done.actor.${invokeDef.id}`;\n transitions.set(descriptor, [\n createCancelInvokeTimeoutTransition(descriptor, invokeTimeoutEventType)\n ]);\n }\n if (invokeDef.onError) {\n const descriptor = `xstate.error.actor.${invokeDef.id}`;\n transitions.set(\n descriptor,\n mapTransitionConfigs(invokeDef.onError, (transition) =>\n invokeTimeoutEventType\n ? formatInvokeCompletionTransition(\n descriptor,\n transition,\n invokeTimeoutEventType\n )\n : formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n if (invokeDef.onSnapshot) {\n const descriptor = `xstate.snapshot.${invokeDef.id}`;\n transitions.set(\n descriptor,\n mapTransitionConfigs(invokeDef.onSnapshot, (transition) =>\n formatTransition(stateNode, descriptor, transition)\n )\n );\n }\n }\n for (const delayedTransition of stateNode.after) {\n let existing = transitions.get(delayedTransition.eventType);\n if (!existing) {\n existing = [];\n transitions.set(delayedTransition.eventType, existing);\n }\n existing.push(\n delayedTransition as TransitionDefinition<TContext, AnyEventObject>\n );\n }\n return transitions as Map<string, TransitionDefinition<TContext, any>[]>;\n}\n\nfunction formatInitialTransition(\n stateNode: AnyStateNode,\n _target: string | { target: string; input?: any } | undefined\n): InitialTransitionDefinition {\n const targetString =\n typeof _target === 'object' && _target !== null ? _target.target : _target;\n const input =\n typeof _target === 'object' && _target !== null ? _target.input : undefined;\n const resolvedTarget =\n typeof targetString === 'string'\n ? stateNode.states[targetString]\n : undefined;\n if (!resolvedTarget && targetString) {\n throw new Error(\n `Initial state node \"${targetString}\" not found on parent state node #${stateNode.id}`\n );\n }\n const transition: InitialTransitionDefinition = {\n source: stateNode,\n target: resolvedTarget ? [resolvedTarget] : undefined,\n input\n };\n\n return transition;\n}\n","import isDevelopment from '#is-development';\nimport { $$ACTOR_TYPE, createActor } from './createActor.ts';\nimport { createInitEvent } from './eventUtils.ts';\n\nimport { createSpawner } from './spawn.ts';\nimport {\n createMachineSnapshot,\n getPersistedSnapshot,\n MachineSnapshot\n} from './State.ts';\nimport { StateNode } from './StateNode.ts';\nimport {\n formatRouteTransitions,\n getAllStateNodes,\n getStateNodeByPath,\n getStateNodes,\n initialMicrostep,\n isInFinalState,\n isStateId,\n macrostep,\n resolveStateValue,\n transitionNode\n} from './stateUtils.ts';\nimport { resolveAndExecuteActionsWithContext } from './transitionActions.ts';\nimport { AnyActorSystem } from './system.ts';\nimport type {\n ActorLogic,\n ActorScope,\n AnyActor,\n AnyActorLogic,\n AnyActorRef,\n AnyActorScope,\n AnyEventObject,\n AnyTransitionDefinition,\n Equals,\n EventDescriptor,\n EventObject,\n HistoryValue,\n MachineContext,\n MetaObject,\n Snapshot,\n SnapshotFrom,\n StateValue,\n StateSchema,\n SnapshotStatus,\n AnyStateNode\n} from './types.ts';\nimport {\n Implementations,\n Next_MachineConfig,\n MachineOptions\n} from './types.v6.ts';\nimport {\n matchesEventDescriptor,\n resolveReferencedActor,\n toStatePath\n} from './utils.ts';\n\nconst STATE_IDENTIFIER = '#';\n\nexport class StateMachine<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TChildren extends Record<string, AnyActorRef | undefined>,\n TStateValue extends StateValue,\n TTag extends string,\n TInput,\n TOutput,\n TEmitted extends EventObject,\n TMeta extends MetaObject,\n TConfig extends StateSchema,\n TActionMap extends Implementations['actions'],\n TActorMap extends Implementations['actors'],\n TGuardMap extends Implementations['guards'],\n TDelayMap extends Implementations['delays']\n> implements\n ActorLogic<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n TEvent,\n TInput,\n AnyActorSystem,\n TEmitted\n >\n{\n /** The machine's own version. */\n public version?: string;\n\n public schemas: unknown;\n\n public implementations: Implementations;\n\n /** Runtime options for machine execution. */\n public options: MachineOptions;\n\n /** @internal */\n public idMap: Map<string, AnyStateNode> = new Map();\n\n public root: StateNode<TContext, TEvent>;\n\n public id: string;\n\n public states: StateNode<TContext, TEvent>['states'];\n public events: Array<EventDescriptor<TEvent>>;\n public internalEventDescriptors: ReadonlyArray<string>;\n constructor(\n /** The raw config used to create the machine. */\n public config: Next_MachineConfig<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any // TEmitted\n > & {\n schemas?: unknown;\n internalEvents?: readonly string[];\n },\n implementations?: Implementations\n ) {\n this.id = config.id || '(machine)';\n this.implementations = {\n actors: config.actors ?? {},\n actions: config.actions ?? {},\n delays: (config.delays ?? {}) as Implementations['delays'],\n guards: config.guards ?? {},\n ...implementations\n };\n if (isDevelopment) {\n // The `@xstate.` prefix is reserved for built-in serialized action and\n // guard descriptors — user implementation names must not collide.\n for (const kind of ['actions', 'guards', 'actors', 'delays'] as const) {\n for (const key of Object.keys(this.implementations[kind])) {\n if (key.startsWith('@xstate.')) {\n throw new Error(\n `Invalid ${kind} name '${key}': the '@xstate.' prefix is reserved for built-in descriptors.`\n );\n }\n }\n }\n }\n this.version = this.config.version;\n this.schemas = this.config.schemas;\n this.internalEventDescriptors = this.config.internalEvents ?? [];\n this.options = {\n maxIterations: Infinity,\n ...this.config.options\n };\n\n this.transition = this.transition.bind(this);\n this.getInitialSnapshot = this.getInitialSnapshot.bind(this);\n this.getPersistedSnapshot = this.getPersistedSnapshot.bind(this);\n this.restoreSnapshot = this.restoreSnapshot.bind(this);\n this.start = this.start.bind(this);\n\n this.root = new StateNode(config as any, {\n _key: this.id,\n _machine: this as any\n });\n\n this.root._initialize();\n formatRouteTransitions(this.root);\n this.root._refreshEventMetadata();\n\n this.states = this.root.states; // TODO: remove!\n this.events = this.root.events;\n\n if (\n isDevelopment &&\n !('output' in this.root) &&\n Object.values(this.states).some(\n (state) => state.type === 'final' && 'output' in state\n )\n ) {\n console.warn(\n 'Missing `machine.output` declaration (top-level final state with output detected)'\n );\n }\n }\n\n /**\n * Clones this state machine with the provided implementations.\n *\n * @param implementations Options (`actions`, `guards`, `actors`, `delays`) to\n * recursively merge with the existing options.\n * @returns A new `StateMachine` instance with the provided implementations.\n */\n public provide(implementations: {\n actions?: Partial<TActionMap>;\n actors?: Partial<TActorMap>;\n guards?: Partial<TGuardMap>;\n delays?: Partial<TDelayMap>;\n }): StateMachine<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TInput,\n TOutput,\n TEmitted,\n TMeta,\n TConfig,\n TActionMap,\n TActorMap,\n TGuardMap,\n TDelayMap\n > {\n const { actions, guards, actors, delays } = this.implementations;\n\n const provided = new StateMachine(this.config, {\n actions: {\n ...actions,\n ...implementations.actions\n } as Implementations['actions'],\n guards: {\n ...guards,\n ...implementations.guards\n } as Implementations['guards'],\n actors: {\n ...actors,\n ...implementations.actors\n } as Implementations['actors'],\n delays: {\n ...delays,\n ...implementations.delays\n } as Implementations['delays']\n }) as unknown as this;\n // Providing implementations does not change the serializable definition.\n provided._json = this._json;\n return provided;\n }\n\n public resolveState(\n config: {\n value: StateValue;\n context?: TContext;\n historyValue?: HistoryValue;\n status?: SnapshotStatus;\n output?: TOutput;\n error?: unknown;\n } & ([TContext] extends [never]\n ? {}\n : Equals<TContext, MachineContext> extends false\n ? { context: unknown }\n : {})\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const resolvedStateValue = resolveStateValue(this.root, config.value);\n const nodeSet = getAllStateNodes(\n getStateNodes(this.root, resolvedStateValue)\n );\n const nodes = [...nodeSet];\n\n return createMachineSnapshot(\n {\n _nodes: nodes,\n value: resolvedStateValue,\n context: config.context || ({} as TContext),\n children: {},\n status: isInFinalState(nodeSet, this.root)\n ? 'done'\n : config.status || 'active',\n output: config.output,\n error: config.error,\n historyValue: config.historyValue\n },\n this\n ) as MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >;\n }\n\n /**\n * Determines the next snapshot given the current `snapshot` and received\n * `event`. Calculates a full macrostep from all microsteps.\n *\n * @param snapshot The current snapshot\n * @param event The received event\n */\n public transition(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n event: TEvent,\n actorScope: ActorScope<typeof snapshot, TEvent, AnyActorSystem, TEmitted>\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n return macrostep(snapshot, event, actorScope, []).snapshot;\n }\n\n /**\n * Determines the next state given the current `state` and `event`. Calculates\n * a microstep.\n *\n * @param state The current state\n * @param event The received event\n */\n public microstep(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n event: TEvent,\n actorScope: AnyActorScope\n ): Array<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >\n > {\n const { microsteps } = macrostep(snapshot, event, actorScope, []);\n const snapshots = new Array(microsteps.length);\n\n for (let i = 0; i < microsteps.length; i++) {\n snapshots[i] = microsteps[i][0];\n }\n\n return snapshots;\n }\n\n public getTransitionData(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n event: TEvent,\n self: AnyActor\n ): Array<AnyTransitionDefinition> {\n return (\n transitionNode(this.root, snapshot.value, snapshot, event, self) || []\n );\n }\n\n public isInternalEventType(eventType: string): boolean {\n for (const descriptor of this.internalEventDescriptors) {\n if (matchesEventDescriptor(eventType, descriptor)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * The initial state _before_ evaluating any microsteps. This \"pre-initial\"\n * state is provided to initial actions executed in the initial state.\n *\n * @internal\n */\n _getPreInitialState(\n actorScope: AnyActorScope,\n initEvent: any\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const { context } = this.config;\n\n const preInitial = createMachineSnapshot(\n {\n context:\n typeof context !== 'function' && context ? context : ({} as TContext),\n _nodes: [this.root],\n children: {},\n status: 'active'\n },\n this\n );\n\n if (typeof context === 'function') {\n const children = {};\n const spawn = createSpawner(actorScope, preInitial, initEvent, children);\n const resolvedContext = context({\n spawn,\n input: initEvent.input,\n self: actorScope.self,\n actors: this.implementations.actors\n });\n const nextState = resolveAndExecuteActionsWithContext(\n preInitial,\n initEvent,\n actorScope,\n []\n ) as any;\n if (resolvedContext) {\n nextState.context = resolvedContext;\n }\n if (Object.keys(children).length > 0) {\n nextState.children = {\n ...nextState.children,\n ...children\n };\n }\n return nextState as SnapshotFrom<this>;\n }\n\n return preInitial as SnapshotFrom<this>;\n }\n\n /**\n * Returns the initial `State` instance, with reference to `self` as an\n * `ActorRef`.\n */\n public getInitialSnapshot(\n actorScope: ActorScope<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n TEvent,\n AnyActorSystem,\n TEmitted\n >,\n input?: TInput\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const initEvent = createInitEvent(input) as unknown as TEvent; // TODO: fix;\n const internalQueue: AnyEventObject[] = [];\n const preInitialState = this._getPreInitialState(actorScope, initEvent);\n const [nextState] = initialMicrostep(\n this.root,\n preInitialState,\n actorScope,\n initEvent,\n internalQueue\n );\n\n const { snapshot: macroState } = macrostep(\n nextState,\n initEvent as AnyEventObject,\n actorScope,\n internalQueue\n );\n\n return macroState as SnapshotFrom<this>;\n }\n\n public start(\n snapshot?: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >\n ): void {\n // Start rehydrated children that were active when persisted. Freshly\n // invoked/spawned children are NOT started here — they start via deferred\n // `@xstate.start` actions so sync start errors route to `onError`.\n if (!snapshot?.children) {\n return;\n }\n for (const child of Object.values(\n snapshot.children as unknown as Record<string, AnyActor>\n )) {\n if (\n (child as any)._rehydrated &&\n (child as any).getSnapshot?.().status === 'active'\n ) {\n (child as any).start();\n }\n }\n }\n\n public getStateNodeById(stateId: string): StateNode<TContext, TEvent> {\n const fullPath = toStatePath(stateId);\n const relativePath = fullPath.slice(1);\n const resolvedStateId = isStateId(fullPath[0])\n ? fullPath[0].slice(STATE_IDENTIFIER.length)\n : fullPath[0];\n\n const stateNode = this.idMap.get(resolvedStateId);\n if (!stateNode) {\n throw new Error(\n `Child state node '#${resolvedStateId}' does not exist on machine '${this.id}'`\n );\n }\n return getStateNodeByPath(stateNode, relativePath) as StateNode<\n TContext,\n TEvent\n >;\n }\n\n public getPersistedSnapshot(\n snapshot: MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n options?: unknown\n ) {\n return getPersistedSnapshot(snapshot, options);\n }\n\n /**\n * The original JSON definition this machine was created from (set by\n * `createMachineFromConfig`), if any. Used by `serializeMachine` for lossless\n * round-trips.\n *\n * @internal\n */\n public _json?: Record<string, unknown>;\n\n public restoreSnapshot(\n snapshot: Snapshot<unknown>,\n _actorScope: ActorScope<\n MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >,\n TEvent,\n AnyActorSystem,\n TEmitted\n >\n ): MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n > {\n const persistedVersion: string | undefined = (snapshot as any).version;\n if (persistedVersion !== this.version) {\n const migrate = (this.config as any).migrate;\n if (typeof migrate !== 'function') {\n throw new Error(\n isDevelopment\n ? `Persisted snapshot version '${persistedVersion}' does not match machine version '${this.version}' for machine '${this.id}'. Provide a \\`migrate(persistedSnapshot, fromVersion)\\` function in the machine config to migrate old snapshots.`\n : `Persisted snapshot version '${persistedVersion}' does not match machine version '${this.version}'.`\n );\n }\n snapshot = migrate(snapshot, persistedVersion);\n }\n\n const snapshotData = snapshot as any;\n const children: Record<string, AnyActor> = {};\n const snapshotChildren: Record<\n string,\n {\n src: string | AnyActorLogic;\n snapshot: Snapshot<unknown>;\n syncSnapshot?: boolean;\n systemId?: string;\n }\n > = snapshotData.children;\n\n for (const actorId of Object.keys(snapshotChildren)) {\n const actorData = snapshotChildren[actorId];\n const childState = actorData.snapshot;\n const src = actorData.src;\n\n const logic =\n typeof src === 'string' ? resolveReferencedActor(this, src) : src;\n\n if (!logic) {\n continue;\n }\n\n const actor = createActor(logic, {\n id: actorId,\n parent: _actorScope.self,\n syncSnapshot: actorData.syncSnapshot,\n snapshot: childState,\n src,\n systemId: actorData.systemId\n });\n // Mark so `start()` knows to start this child (freshly invoked/spawned\n // children are started via deferred `@xstate.start` actions instead).\n (actor as any)._rehydrated = true;\n\n children[actorId] = actor;\n }\n\n const reviveHistoryValue = (\n historyValue: Record<\n string,\n ({ id: string } | StateNode<TContext, TEvent>)[]\n >\n ): HistoryValue => {\n if (!historyValue || typeof historyValue !== 'object') {\n return {};\n }\n const revived: HistoryValue = {};\n for (const key of Object.keys(historyValue)) {\n const arr = historyValue[key];\n\n for (const item of arr) {\n let resolved: StateNode<TContext, TEvent> | undefined;\n\n if (item instanceof StateNode) {\n resolved = item;\n } else {\n try {\n resolved = this.root.machine.getStateNodeById(item.id);\n } catch {\n if (isDevelopment) {\n console.warn(`Could not resolve StateNode for id: ${item.id}`);\n }\n }\n }\n\n if (!resolved) {\n continue;\n }\n\n revived[key] ??= [];\n revived[key].push(resolved);\n }\n }\n return revived;\n };\n\n const revivedHistoryValue = reviveHistoryValue(snapshotData.historyValue);\n const nodes = Array.from(\n getAllStateNodes(getStateNodes(this.root, snapshotData.value))\n );\n\n const { version: _persistedSnapshotVersion, ...persistedRest } =\n snapshot as any;\n const restoredSnapshot = createMachineSnapshot(\n {\n ...persistedRest,\n children,\n _nodes: nodes,\n value: snapshotData.value,\n historyValue: revivedHistoryValue\n },\n this\n ) as MachineSnapshot<\n TContext,\n TEvent,\n TChildren,\n TStateValue,\n TTag,\n TOutput,\n TMeta,\n TConfig\n >;\n\n const seen = new WeakSet<Record<string, unknown>>();\n\n function reviveContext(contextPart: Record<string, unknown>) {\n if (seen.has(contextPart)) {\n return;\n }\n seen.add(contextPart);\n for (const key of Object.keys(contextPart)) {\n const value: unknown = contextPart[key];\n\n if (value && typeof value === 'object') {\n if ('xstate$$type' in value && value.xstate$$type === $$ACTOR_TYPE) {\n contextPart[key] = children[(value as any).id];\n continue;\n }\n reviveContext(value as typeof contextPart);\n }\n }\n }\n\n reviveContext(restoredSnapshot.context);\n\n return restoredSnapshot;\n }\n}\n","import {\n SerializationConfig,\n StatePath,\n TestMeta,\n TestPathResult\n} from './types.ts';\nimport { AnyMachineSnapshot, MachineContext } from '../index.ts';\n\ninterface TestResultStringOptions extends SerializationConfig<any, any> {\n formatColor: (color: string, string: string) => string;\n}\n\nexport function simpleStringify(value: any): string {\n return JSON.stringify(value);\n}\n\nexport function formatPathTestResult(\n path: StatePath<any, any>,\n testPathResult: TestPathResult,\n options?: Partial<TestResultStringOptions>\n): string {\n const resolvedOptions: TestResultStringOptions = {\n formatColor: (_color, string) => string,\n serializeState: simpleStringify,\n serializeEvent: simpleStringify,\n ...options\n };\n\n const { formatColor, serializeState, serializeEvent } = resolvedOptions;\n\n const { state } = path;\n\n const targetStateString = serializeState(\n state,\n path.steps.length ? path.steps[path.steps.length - 1].event : undefined\n );\n\n let errMessage = '';\n let hasFailed = false;\n errMessage +=\n '\\nPath:\\n' +\n testPathResult.steps\n .map((s, i, steps) => {\n const stateString = serializeState(\n s.step.state,\n i > 0 ? steps[i - 1].step.event : undefined\n );\n const eventString = serializeEvent(s.step.event);\n\n const stateResult = `\\tState: ${\n hasFailed\n ? formatColor('gray', stateString)\n : s.state.error\n ? ((hasFailed = true), formatColor('redBright', stateString))\n : formatColor('greenBright', stateString)\n }`;\n const eventResult = `\\tEvent: ${\n hasFailed\n ? formatColor('gray', eventString)\n : s.event.error\n ? ((hasFailed = true), formatColor('red', eventString))\n : formatColor('green', eventString)\n }`;\n\n return [stateResult, eventResult].join('\\n');\n })\n .concat(\n `\\tState: ${\n hasFailed\n ? formatColor('gray', targetStateString)\n : testPathResult.state.error\n ? formatColor('red', targetStateString)\n : formatColor('green', targetStateString)\n }`\n )\n .join('\\n\\n');\n\n return errMessage;\n}\n\nexport function getDescription<T, TContext extends MachineContext>(\n snapshot: AnyMachineSnapshot\n): string {\n const contextString = !Object.keys(snapshot.context).length\n ? ''\n : `(${JSON.stringify(snapshot.context)})`;\n\n const stateStrings = snapshot._nodes\n .filter((sn) => sn.type === 'atomic' || sn.type === 'final')\n .map(({ id, path }) => {\n const meta = snapshot.getMeta()[id] as TestMeta<T, TContext>;\n if (!meta) {\n return `\"${path.join('.')}\"`;\n }\n\n const { description } = meta;\n\n if (typeof description === 'function') {\n return description(snapshot);\n }\n\n return description ? `\"${description}\"` : JSON.stringify(snapshot.value);\n });\n\n return (\n `state${stateStrings.length === 1 ? '' : 's'} ` +\n stateStrings.join(', ') +\n ` ${contextString}`.trim()\n );\n}\n","import { StatePath } from './index.ts';\nimport { EventObject, Snapshot } from '../index.ts';\nimport { simpleStringify } from './utils.ts';\n\n/**\n * Deduplicates your paths so that A -> B is not executed separately to A -> B\n * -> C\n */\nexport const deduplicatePaths = <\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject\n>(\n paths: StatePath<TSnapshot, TEvent>[],\n serializeEvent: (event: TEvent) => string = simpleStringify\n): StatePath<TSnapshot, TEvent>[] => {\n /** Put all paths on the same level so we can dedup them */\n const allPathsWithEventSequence: Array<{\n path: StatePath<TSnapshot, TEvent>;\n eventSequence: string[];\n }> = [];\n\n paths.forEach((path) => {\n allPathsWithEventSequence.push({\n path,\n eventSequence: path.steps.map((step) => serializeEvent(step.event))\n });\n });\n\n // Sort by path length, descending\n allPathsWithEventSequence.sort(\n (a, z) => z.path.steps.length - a.path.steps.length\n );\n\n const superpathsWithEventSequence: typeof allPathsWithEventSequence = [];\n\n /** Filter out the paths that are subpaths of superpaths */\n pathLoop: for (const pathWithEventSequence of allPathsWithEventSequence) {\n // Check each existing superpath to see if the path is a subpath of it\n superpathLoop: for (const superpathWithEventSequence of superpathsWithEventSequence) {\n // eslint-disable-next-line @typescript-eslint/no-for-in-array\n for (const i in pathWithEventSequence.eventSequence) {\n // Check event sequence to determine if path is subpath, e.g.:\n //\n // This will short-circuit the check\n // ['a', 'b', 'c', 'd'] (superpath)\n // ['a', 'b', 'x'] (path)\n //\n // This will not short-circuit; path is subpath\n // ['a', 'b', 'c', 'd'] (superpath)\n // ['a', 'b', 'c'] (path)\n if (\n pathWithEventSequence.eventSequence[i] !==\n superpathWithEventSequence.eventSequence[i]\n ) {\n // If the path is different from the superpath,\n // continue to the next superpath\n continue superpathLoop;\n }\n }\n\n // If we reached here, path is subpath of superpath\n // Continue & do not add path to superpaths\n continue pathLoop;\n }\n\n // If we reached here, path is not a subpath of any existing superpaths\n // So add it to the superpaths\n superpathsWithEventSequence.push(pathWithEventSequence);\n }\n\n return superpathsWithEventSequence.map((path) => path.path);\n};\n","import { getShortestPaths, getSimplePaths } from './index.ts';\nimport { EventObject, Snapshot } from '../index.ts';\nimport { PathGenerator } from './types.ts';\n\nexport const createShortestPathsGen =\n <\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n >(): PathGenerator<TSnapshot, TEvent, TInput> =>\n (logic, defaultOptions) => {\n const paths = getShortestPaths(logic, defaultOptions);\n\n return paths;\n };\n\nexport const createSimplePathsGen =\n <\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n >(): PathGenerator<TSnapshot, TEvent, TInput> =>\n (logic, defaultOptions) => {\n const paths = getSimplePaths(logic, defaultOptions);\n\n return paths;\n };\n","import {\n getPathsFromEvents,\n getAdjacencyMap,\n joinPaths,\n serializeSnapshot\n} from './index.ts';\nimport type {\n AdjacencyMap,\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n Step,\n TraversalOptions,\n EventExecutor,\n PathGenerator,\n TestModelOptions,\n TestParam,\n TestPath,\n TestPathResult,\n TestStepResult\n} from './types.ts';\nimport {\n EventObject,\n ActorLogic,\n Snapshot,\n isMachineSnapshot,\n __unsafe_getAllOwnEventDescriptors,\n AnyActorRef,\n AnyEventObject,\n AnyStateMachine,\n EventFromLogic,\n MachineContext,\n MachineSnapshot,\n SnapshotFrom,\n StateValue,\n TODO,\n InputFrom\n} from '../index.ts';\nimport { deduplicatePaths } from './deduplicatePaths.ts';\nimport {\n createShortestPathsGen,\n createSimplePathsGen\n} from './pathGenerators.ts';\nimport {\n formatPathTestResult,\n getDescription,\n simpleStringify\n} from './utils.ts';\nimport { validateMachine } from './validateMachine.ts';\n\ntype GetPathOptions<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n> = Partial<TraversalOptions<TSnapshot, TEvent, TInput>> & {\n /**\n * Whether to allow deduplicate paths so that paths that are contained by\n * longer paths are included.\n *\n * @default false\n */\n allowDuplicatePaths?: boolean;\n};\n\n/**\n * Creates a test model that represents an abstract model of a system under test\n * (SUT).\n *\n * The test model is used to generate test paths, which are used to verify that\n * states in the model are reachable in the SUT.\n */\nexport class TestModel<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput\n> {\n public options: TestModelOptions<TSnapshot, TEvent, TInput>;\n public defaultTraversalOptions?: TraversalOptions<TSnapshot, TEvent, TInput>;\n public getDefaultOptions(): TestModelOptions<TSnapshot, TEvent, TInput> {\n return {\n serializeState: (state) => simpleStringify(state) as SerializedSnapshot,\n serializeEvent: (event) => simpleStringify(event) as SerializedEvent,\n // For non-state-machine test models, we cannot identify\n // separate transitions, so just use event type\n serializeTransition: (state, event) =>\n `${simpleStringify(state)}|${event?.type}`,\n events: [],\n stateMatcher: (_, stateKey) => stateKey === '*',\n logger: {\n log: console.log.bind(console),\n error: console.error.bind(console)\n }\n };\n }\n\n constructor(\n public testLogic: ActorLogic<TSnapshot, TEvent, TInput>,\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ) {\n this.options = {\n ...this.getDefaultOptions(),\n ...options\n };\n }\n\n public getPaths(\n pathGenerator: PathGenerator<TSnapshot, TEvent, TInput>,\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const allowDuplicatePaths = options?.allowDuplicatePaths ?? false;\n const paths = pathGenerator(this.testLogic, this._resolveOptions(options));\n return (allowDuplicatePaths ? paths : deduplicatePaths(paths)).map(\n this._toTestPath\n );\n }\n\n public getShortestPaths(\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n return this.getPaths(createShortestPathsGen(), options);\n }\n\n public getShortestPathsFrom(\n paths: Array<TestPath<TSnapshot, TEvent>>,\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const resultPaths: TestPath<TSnapshot, TEvent>[] = [];\n\n for (const path of paths) {\n const shortestPaths = this.getShortestPaths({\n ...options,\n fromState: path.state\n });\n for (const shortestPath of shortestPaths) {\n resultPaths.push(this._toTestPath(joinPaths(path, shortestPath)));\n }\n }\n\n return resultPaths;\n }\n\n public getSimplePaths(\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n return this.getPaths(createSimplePathsGen(), options);\n }\n\n public getSimplePathsFrom(\n paths: Array<TestPath<TSnapshot, TEvent>>,\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const resultPaths: TestPath<TSnapshot, TEvent>[] = [];\n\n for (const path of paths) {\n const shortestPaths = this.getSimplePaths({\n ...options,\n fromState: path.state\n });\n for (const shortestPath of shortestPaths) {\n resultPaths.push(this._toTestPath(joinPaths(path, shortestPath)));\n }\n }\n\n return resultPaths;\n }\n\n private _toTestPath = (\n statePath: StatePath<TSnapshot, TEvent>\n ): TestPath<TSnapshot, TEvent> => {\n function formatEvent(event: EventObject): string {\n const { type, ...other } = event;\n\n const propertyString = Object.keys(other).length\n ? ` (${JSON.stringify(other)})`\n : '';\n\n return `${type}${propertyString}`;\n }\n\n const eventsString = statePath.steps\n .map((s) => formatEvent(s.event))\n .join(' → ');\n return {\n ...statePath,\n test: (params: TestParam<TSnapshot, TEvent>) =>\n this.testPath(statePath, params),\n description: isMachineSnapshot(statePath.state)\n ? `Reaches ${getDescription(\n statePath.state as any\n ).trim()}: ${eventsString}`\n : JSON.stringify(statePath.state)\n };\n };\n\n public getPathsFromEvents(\n events: TEvent[],\n options?: GetPathOptions<TSnapshot, TEvent, TInput>\n ): Array<TestPath<TSnapshot, TEvent>> {\n const paths = getPathsFromEvents(this.testLogic, events, options);\n\n return paths.map(this._toTestPath);\n }\n\n /**\n * An array of adjacencies, which are objects that represent each `state` with\n * the `nextState` given the `event`.\n */\n public getAdjacencyMap(): AdjacencyMap<TSnapshot, TEvent> {\n const adjMap = getAdjacencyMap(this.testLogic, this.options);\n return adjMap;\n }\n\n public async testPath(\n path: StatePath<TSnapshot, TEvent>,\n params: TestParam<TSnapshot, TEvent>,\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ): Promise<TestPathResult> {\n const testPathResult: TestPathResult = {\n steps: [],\n state: {\n error: null\n }\n };\n\n try {\n for (const step of path.steps) {\n const testStepResult: TestStepResult = {\n step,\n state: { error: null },\n event: { error: null }\n };\n\n testPathResult.steps.push(testStepResult);\n\n try {\n await this.testTransition(params, step);\n } catch (err: any) {\n testStepResult.event.error = err;\n\n throw err;\n }\n\n try {\n await this.testState(params, step.state, options);\n } catch (err: any) {\n testStepResult.state.error = err;\n\n throw err;\n }\n }\n } catch (err: any) {\n // TODO: make option\n err.message += formatPathTestResult(path, testPathResult, this.options);\n throw err;\n }\n\n return testPathResult;\n }\n\n public async testState(\n params: TestParam<TSnapshot, TEvent>,\n state: TSnapshot,\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ): Promise<void> {\n const resolvedOptions = this._resolveOptions(options);\n\n const stateTestKeys = this._getStateTestKeys(\n params,\n state,\n resolvedOptions\n );\n\n for (const stateTestKey of stateTestKeys) {\n await params.states?.[stateTestKey](state);\n }\n }\n\n private _getStateTestKeys(\n params: TestParam<TSnapshot, TEvent>,\n state: TSnapshot,\n resolvedOptions: TestModelOptions<TSnapshot, TEvent, TInput>\n ) {\n const states = params.states || {};\n const stateTestKeys = Object.keys(states).filter((stateKey) => {\n return resolvedOptions.stateMatcher(state, stateKey);\n });\n\n // Fallthrough state tests\n if (!stateTestKeys.length && '*' in states) {\n stateTestKeys.push('*');\n }\n\n return stateTestKeys;\n }\n\n private _getEventExec(\n params: TestParam<TSnapshot, TEvent>,\n step: Step<TSnapshot, TEvent>\n ) {\n const eventExec =\n params.events?.[(step.event as any).type as TEvent['type']];\n\n return eventExec;\n }\n\n public async testTransition(\n params: TestParam<TSnapshot, TEvent>,\n step: Step<TSnapshot, TEvent>\n ): Promise<void> {\n const eventExec = this._getEventExec(params, step);\n await (eventExec as EventExecutor<TSnapshot, TEvent>)?.(step);\n }\n\n private _resolveOptions(\n options?: Partial<TestModelOptions<TSnapshot, TEvent, TInput>>\n ): TestModelOptions<TSnapshot, TEvent, TInput> {\n return { ...this.defaultTraversalOptions, ...this.options, ...options };\n }\n}\n\nfunction stateValuesEqual(\n a: StateValue | undefined,\n b: StateValue | undefined\n): boolean {\n if (a === b) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n if (typeof a === 'string' || typeof b === 'string') {\n return a === b;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n return (\n aKeys.length === bKeys.length &&\n aKeys.every((key) => stateValuesEqual(a[key], b[key]))\n );\n}\n\nfunction serializeMachineTransition(\n snapshot: MachineSnapshot<\n MachineContext,\n EventObject,\n Record<string, AnyActorRef | undefined>,\n StateValue,\n string,\n unknown,\n TODO, // TMeta\n TODO // TStateSchema\n >,\n event: AnyEventObject | undefined,\n previousSnapshot:\n | MachineSnapshot<\n MachineContext,\n EventObject,\n Record<string, AnyActorRef | undefined>,\n StateValue,\n string,\n unknown,\n TODO, // TMeta\n TODO // TStateSchema\n >\n | undefined,\n { serializeEvent }: { serializeEvent: (event: AnyEventObject) => string }\n): string {\n // TODO: the stateValuesEqual check here is very likely not exactly correct\n // but I'm not sure what the correct check is and what this is trying to do\n if (\n !event ||\n (previousSnapshot &&\n stateValuesEqual(previousSnapshot.value, snapshot.value))\n ) {\n return '';\n }\n\n const prevStateString = previousSnapshot\n ? ` from ${simpleStringify(previousSnapshot.value)}`\n : '';\n\n return ` via ${serializeEvent(event)}${prevStateString}`;\n}\n\n/**\n * Creates a test model that represents an abstract model of a system under test\n * (SUT).\n *\n * The test model is used to generate test paths, which are used to verify that\n * states in the `machine` are reachable in the SUT.\n *\n * @example\n *\n * ```js\n * const toggleModel = createModel(toggleMachine).withEvents({\n * TOGGLE: {\n * exec: async (page) => {\n * await page.click('input');\n * }\n * }\n * });\n * ```\n *\n * @param machine The state machine used to represent the abstract model.\n * @param options Options for the created test model:\n *\n * - `events`: an object mapping string event types (e.g., `SUBMIT`) to an event\n * test config (e.g., `{exec: () => {...}, cases: [...]}`)\n */\nexport function createTestModel<TMachine extends AnyStateMachine>(\n machine: TMachine,\n options?: Partial<\n TestModelOptions<\n SnapshotFrom<TMachine>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n >\n >\n): TestModel<SnapshotFrom<TMachine>, EventFromLogic<TMachine>, unknown> {\n validateMachine(machine);\n\n const serializeEvent = (options?.serializeEvent ?? simpleStringify) as (\n event: AnyEventObject\n ) => string;\n const serializeTransition =\n options?.serializeTransition ?? serializeMachineTransition;\n const { events: getEvents, ...otherOptions } = options ?? {};\n\n const testModel = new TestModel<\n SnapshotFrom<TMachine>,\n EventFromLogic<TMachine>,\n unknown\n >(machine as any, {\n serializeState: (state, event, prevState) => {\n // Only consider the `state` if `serializeTransition()` is opted out (empty string)\n return `${serializeSnapshot(state)}${serializeTransition(\n state,\n event,\n prevState,\n {\n serializeEvent\n }\n )}` as SerializedSnapshot;\n },\n stateMatcher: (state, key) => {\n return key.startsWith('#')\n ? (state as any)._nodes.includes(machine.getStateNodeById(key))\n : (state as any).matches(key);\n },\n events: (state) => {\n const events =\n typeof getEvents === 'function' ? getEvents(state) : (getEvents ?? []);\n\n return __unsafe_getAllOwnEventDescriptors(state).flatMap(\n (eventType: string) => {\n if (events.some((e) => (e as EventObject).type === eventType)) {\n return events.filter((e) => (e as EventObject).type === eventType);\n }\n\n return [{ type: eventType } as any]; // TODO: fix types\n }\n );\n },\n ...otherOptions\n });\n\n return testModel;\n}\n","import { AnyActorScope, createEmptyActor } from '../index.ts';\n\nexport function createMockActorScope(): AnyActorScope {\n const emptyActor = createEmptyActor();\n return {\n self: emptyActor,\n logger: console.log,\n id: '',\n sessionId: Math.random().toString(32).slice(2),\n defer: () => {},\n system: emptyActor.system, // TODO: mock system?\n stopChild: () => {},\n emit: () => {},\n actionExecutor: () => {}\n };\n}\n","import {\n EventObject,\n AnyStateMachine,\n StateMachine,\n StateNode,\n AnyActorLogic,\n EventFromLogic,\n Snapshot,\n __unsafe_getAllOwnEventDescriptors,\n InputFrom\n} from '../index.ts';\nimport type {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n DirectedGraphEdge,\n DirectedGraphNode,\n TraversalOptions,\n AnyStateNode,\n TraversalConfig\n} from './types.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\n/**\n * Returns all state nodes of the given `node`.\n *\n * @param stateNode State node to recursively get child state nodes from\n */\nexport function getStateNodes(stateNode: {\n states: Record<string, AnyStateNode | StateNode<never, EventObject>>;\n}): AnyStateNode[] {\n const { states } = stateNode;\n const nodes = Object.keys(states).reduce((accNodes, stateKey) => {\n const childStateNode = states[stateKey] as AnyStateNode;\n const childStateNodes = getStateNodes(childStateNode);\n\n accNodes.push(childStateNode, ...childStateNodes);\n return accNodes;\n }, [] as AnyStateNode[]);\n\n return nodes;\n}\n\nfunction getChildren(stateNode: AnyStateNode): AnyStateNode[] {\n if (!stateNode.states) {\n return [];\n }\n\n const children = Object.keys(stateNode.states).map((key) => {\n return stateNode.states[key];\n });\n\n return children;\n}\n\nexport function serializeSnapshot(snapshot: Snapshot<any>): SerializedSnapshot {\n const { value, context } = snapshot as any;\n return JSON.stringify({\n value,\n context: Object.keys(context ?? {}).length ? context : undefined\n }) as SerializedSnapshot;\n}\n\nfunction serializeEvent<TEvent extends EventObject>(\n event: TEvent\n): SerializedEvent {\n return JSON.stringify(event) as SerializedEvent;\n}\n\nexport function createDefaultMachineOptions<TMachine extends AnyStateMachine>(\n machine: TMachine,\n options?: TraversalOptions<\n ReturnType<TMachine['transition']>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n >\n): TraversalOptions<\n ReturnType<TMachine['transition']>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n> {\n const { events: getEvents, ...otherOptions } = options ?? {};\n const traversalOptions: TraversalOptions<\n ReturnType<TMachine['transition']>,\n EventFromLogic<TMachine>,\n InputFrom<TMachine>\n > = {\n serializeState: serializeSnapshot,\n serializeEvent,\n events: (state) => {\n const events =\n typeof getEvents === 'function' ? getEvents(state) : (getEvents ?? []);\n return __unsafe_getAllOwnEventDescriptors(state).flatMap((type) => {\n const matchingEvents = events.filter((ev) => (ev as any).type === type);\n if (matchingEvents.length) {\n return matchingEvents;\n }\n return [{ type }];\n }) as any[];\n },\n fromState: machine.getInitialSnapshot(\n createMockActorScope(),\n options?.input\n ) as ReturnType<TMachine['transition']>,\n ...otherOptions\n };\n\n return traversalOptions;\n}\n\nexport function createDefaultLogicOptions(): TraversalOptions<any, any, any> {\n return {\n serializeState: (state) => JSON.stringify(state),\n serializeEvent\n };\n}\n\nexport function toDirectedGraph(\n stateMachine: AnyStateNode | AnyStateMachine\n): DirectedGraphNode {\n const stateNode =\n stateMachine instanceof StateMachine ? stateMachine.root : stateMachine; // TODO: accept only machines\n\n const edges: DirectedGraphEdge[] = [...stateNode.transitions.values()]\n .flat()\n .flatMap((t, transitionIndex) => {\n const targets = t.target ? t.target : [stateNode];\n\n return targets.map((target, targetIndex) => {\n const edge: DirectedGraphEdge = {\n id: `${stateNode.id}:${transitionIndex}:${targetIndex}`,\n source: stateNode,\n target: target as AnyStateNode,\n transition: t,\n label: {\n text: t.eventType,\n toJSON: () => ({ text: t.eventType })\n },\n toJSON: () => {\n const { label } = edge;\n\n return { source: stateNode.id, target: target.id, label };\n }\n };\n\n return edge;\n });\n });\n\n const graph = {\n id: stateNode.id,\n stateNode: stateNode,\n children: getChildren(stateNode).map(toDirectedGraph),\n edges,\n toJSON: () => {\n const { id, children, edges: graphEdges } = graph;\n return { id, children, edges: graphEdges };\n }\n };\n\n return graph;\n}\n\nfunction isMachineLogic(logic: AnyActorLogic): logic is AnyStateMachine {\n return 'getStateNodeById' in logic;\n}\n\nexport function resolveTraversalOptions<TLogic extends AnyActorLogic>(\n logic: TLogic,\n traversalOptions?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >,\n defaultOptions?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >\n): TraversalConfig<ReturnType<TLogic['transition']>, EventFromLogic<TLogic>> {\n const resolvedDefaultOptions =\n defaultOptions ??\n (isMachineLogic(logic)\n ? (createDefaultMachineOptions(\n logic,\n traversalOptions as any\n ) as TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >)\n : undefined);\n const serializeState =\n traversalOptions?.serializeState ??\n resolvedDefaultOptions?.serializeState ??\n ((state) => JSON.stringify(state));\n const traversalConfig: TraversalConfig<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>\n > = {\n serializeState,\n serializeEvent,\n events: [],\n filterEvents: undefined,\n limit: Infinity,\n fromState: undefined,\n toState: undefined,\n // Traversal should not continue past the `toState` predicate\n // since the target state has already been reached at that point\n stopWhen: traversalOptions?.toState,\n ...resolvedDefaultOptions,\n ...traversalOptions\n };\n\n return traversalConfig;\n}\n\nexport function joinPaths<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject\n>(\n headPath: StatePath<TSnapshot, TEvent>,\n tailPath: StatePath<TSnapshot, TEvent>\n): StatePath<TSnapshot, TEvent> {\n const secondPathSource = tailPath.steps[0].state;\n\n if (secondPathSource !== headPath.state) {\n throw new Error(`Paths cannot be joined`);\n }\n\n return {\n state: tailPath.state,\n // e.g. [A, B, C] + [C, D, E] = [A, B, C, D, E]\n steps: headPath.steps.concat(tailPath.steps.slice(1)),\n weight: headPath.weight + tailPath.weight\n };\n}\n","import {\n ActorScope,\n ActorLogic,\n ActorSystem,\n EventObject,\n Snapshot\n} from '../index.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n TraversalOptions,\n AdjacencyMap,\n AdjacencyValue\n} from './types';\nimport { resolveTraversalOptions } from './graph.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nfunction resolveTransitionSnapshot<TSnapshot>(\n result: TSnapshot | [TSnapshot, unknown[]]\n): TSnapshot {\n return Array.isArray(result) ? result[0] : result;\n}\n\nexport function getAdjacencyMap<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n>(\n logic: ActorLogic<TSnapshot, TEvent, TInput, TSystem>,\n options: TraversalOptions<TSnapshot, TEvent, TInput>\n): AdjacencyMap<TSnapshot, TEvent> {\n 'use strict';\n const { transition } = logic;\n const {\n serializeEvent,\n serializeState,\n events: getEvents,\n filterEvents,\n limit,\n fromState: customFromState,\n stopWhen\n } = resolveTraversalOptions(logic, options);\n const actorScope = createMockActorScope() as ActorScope<\n TSnapshot,\n TEvent,\n TSystem\n >;\n const fromState =\n customFromState ??\n logic.getInitialSnapshot(\n actorScope,\n // TODO: fix this\n options.input as TInput\n );\n\n const adj: AdjacencyMap<TSnapshot, TEvent> = {};\n\n let iterations = 0;\n const queue: Array<{\n nextState: TSnapshot;\n event: TEvent | undefined;\n prevState: TSnapshot | undefined;\n }> = [{ nextState: fromState, event: undefined, prevState: undefined }];\n const stateMap = new Map<SerializedSnapshot, TSnapshot>();\n\n while (queue.length) {\n const { nextState: state, event, prevState } = queue.shift()!;\n\n if (iterations++ > limit) {\n throw new Error('Traversal limit exceeded');\n }\n\n const serializedState = serializeState(\n state,\n event,\n prevState\n ) as SerializedSnapshot;\n if (adj[serializedState]) {\n continue;\n }\n stateMap.set(serializedState, state);\n\n adj[serializedState] = {\n state,\n transitions: {}\n };\n\n if (stopWhen && stopWhen(state)) {\n continue;\n }\n\n const events =\n typeof getEvents === 'function' ? getEvents(state) : getEvents;\n\n for (const nextEvent of events) {\n if (filterEvents && !filterEvents(state, nextEvent)) {\n continue;\n }\n\n const nextSnapshot = resolveTransitionSnapshot(\n transition(state, nextEvent, actorScope)\n );\n\n adj[serializedState].transitions[\n serializeEvent(nextEvent) as SerializedEvent\n ] = {\n event: nextEvent,\n state: nextSnapshot\n };\n queue.push({\n nextState: nextSnapshot,\n event: nextEvent,\n prevState: state\n });\n }\n }\n\n return adj;\n}\n\nexport function adjacencyMapToArray<TSnapshot, TEvent>(\n adjMap: AdjacencyMap<TSnapshot, TEvent>\n): Array<{\n state: TSnapshot;\n event: TEvent;\n nextState: TSnapshot;\n}> {\n const adjList: Array<{\n state: TSnapshot;\n event: TEvent;\n nextState: TSnapshot;\n }> = [];\n\n for (const adjValue of Object.values(adjMap)) {\n for (const transition of Object.values(\n (adjValue as AdjacencyValue<TSnapshot, TEvent>).transitions\n )) {\n adjList.push({\n state: (adjValue as AdjacencyValue<TSnapshot, TEvent>).state,\n event: transition.event,\n nextState: transition.state\n });\n }\n }\n\n return adjList;\n}\n","import { XSTATE_INIT } from '../constants.ts';\nimport { StatePath } from './types.ts';\n\n// TODO: rewrite parts of the algorithm leading to this to make this function obsolete\nexport function alterPath<T extends StatePath<any, any>>(path: T): T {\n let steps: T['steps'] = [];\n\n if (!path.steps.length) {\n steps = [\n {\n state: path.state,\n event: { type: XSTATE_INIT }\n }\n ];\n } else {\n for (let i = 0; i < path.steps.length; i++) {\n const step = path.steps[i];\n\n steps.push({\n state: step.state,\n event: i === 0 ? { type: XSTATE_INIT } : path.steps[i - 1].event\n });\n }\n steps.push({\n state: path.state,\n event: path.steps[path.steps.length - 1].event\n });\n }\n return {\n ...path,\n steps\n };\n}\n","import {\n ActorScope,\n ActorLogic,\n ActorSystem,\n AnyStateMachine,\n EventObject,\n Snapshot,\n StateMachine\n} from '../index.ts';\nimport { getAdjacencyMap } from './adjacency.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n Steps,\n TraversalOptions\n} from './types.ts';\nimport {\n resolveTraversalOptions,\n createDefaultMachineOptions,\n createDefaultLogicOptions\n} from './graph.ts';\nimport { alterPath } from './alterPath.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nfunction isMachine(value: any): value is AnyStateMachine {\n return !!value && value instanceof StateMachine;\n}\n\nexport function getPathsFromEvents<\n TSnapshot extends Snapshot<unknown>,\n TEvent extends EventObject,\n TInput,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n>(\n logic: ActorLogic<TSnapshot, TEvent, TInput, TSystem>,\n events: TEvent[],\n options?: TraversalOptions<TSnapshot, TEvent, TInput>\n): Array<StatePath<TSnapshot, TEvent>> {\n const resolvedOptions = resolveTraversalOptions(\n logic,\n {\n events,\n ...options\n },\n (isMachine(logic)\n ? createDefaultMachineOptions(logic)\n : createDefaultLogicOptions()) as TraversalOptions<\n TSnapshot,\n TEvent,\n TInput\n >\n );\n const actorScope = createMockActorScope() as ActorScope<\n TSnapshot,\n TEvent,\n TSystem\n >;\n const fromState =\n resolvedOptions.fromState ??\n logic.getInitialSnapshot(\n actorScope,\n // TODO: fix this\n options?.input as TInput\n );\n\n const { serializeState, serializeEvent } = resolvedOptions;\n\n const adjacency = getAdjacencyMap(logic, resolvedOptions);\n\n const stateMap = new Map<SerializedSnapshot, TSnapshot>();\n const steps: Steps<TSnapshot, TEvent> = [];\n\n const serializedFromState = serializeState(\n fromState,\n undefined,\n undefined\n ) as SerializedSnapshot;\n stateMap.set(serializedFromState, fromState);\n\n let stateSerial = serializedFromState;\n\n let state = fromState;\n for (const event of events) {\n steps.push({\n state: stateMap.get(stateSerial)!,\n event\n });\n\n const eventSerial = serializeEvent(event) as SerializedEvent;\n const { state: nextState, event: _nextEvent } =\n adjacency[stateSerial].transitions[eventSerial];\n\n if (!nextState) {\n throw new Error(\n `Invalid transition from ${stateSerial} with ${eventSerial}`\n );\n }\n const prevState = stateMap.get(stateSerial);\n const nextStateSerial = serializeState(\n nextState,\n event,\n prevState\n ) as SerializedSnapshot;\n stateMap.set(nextStateSerial, nextState);\n\n stateSerial = nextStateSerial;\n state = nextState;\n }\n\n // If it is expected to reach a specific state (`toState`) and that state\n // isn't reached, there are no paths\n if (resolvedOptions.toState && !resolvedOptions.toState(state)) {\n return [];\n }\n\n return [\n alterPath({\n state,\n steps,\n weight: steps.length\n })\n ];\n}\n","import { AnyActorLogic, EventFromLogic, InputFrom } from '../index.ts';\nimport { getAdjacencyMap } from './adjacency.ts';\nimport { alterPath } from './alterPath.ts';\nimport { resolveTraversalOptions } from './graph.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n StatePlanMap,\n TraversalOptions\n} from './types.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nexport function getShortestPaths<TLogic extends AnyActorLogic>(\n logic: TLogic,\n options?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >\n): Array<StatePath<ReturnType<TLogic['transition']>, EventFromLogic<TLogic>>> {\n type TInternalState = ReturnType<TLogic['transition']>;\n type TEvent = EventFromLogic<TLogic>;\n\n const resolvedOptions = resolveTraversalOptions(logic, options);\n const serializeState = resolvedOptions.serializeState as (\n ...args: Parameters<typeof resolvedOptions.serializeState>\n ) => SerializedSnapshot;\n const fromState =\n resolvedOptions.fromState ??\n logic.getInitialSnapshot(createMockActorScope(), options?.input);\n const adjacency = getAdjacencyMap(logic, resolvedOptions);\n\n // weight, state, event\n const weightMap = new Map<\n SerializedSnapshot,\n {\n weight: number;\n state: SerializedSnapshot | undefined;\n event: TEvent | undefined;\n }\n >();\n const stateMap = new Map<SerializedSnapshot, TInternalState>();\n const serializedFromState = serializeState(fromState, undefined, undefined);\n stateMap.set(serializedFromState, fromState);\n\n weightMap.set(serializedFromState, {\n weight: 0,\n state: undefined,\n event: undefined\n });\n const unvisited = new Set<SerializedSnapshot>();\n const visited = new Set<SerializedSnapshot>();\n\n unvisited.add(serializedFromState);\n for (const serializedState of unvisited) {\n const prevState = stateMap.get(serializedState);\n const { weight } = weightMap.get(serializedState)!;\n for (const event of Object.keys(\n adjacency[serializedState].transitions\n ) as SerializedEvent[]) {\n const { state: nextState, event: eventObject } =\n adjacency[serializedState].transitions[event];\n const nextSerializedState = serializeState(\n nextState,\n eventObject,\n prevState\n );\n stateMap.set(nextSerializedState, nextState);\n if (!weightMap.has(nextSerializedState)) {\n weightMap.set(nextSerializedState, {\n weight: weight + 1,\n state: serializedState,\n event: eventObject\n });\n } else {\n const { weight: nextWeight } = weightMap.get(nextSerializedState)!;\n if (nextWeight > weight + 1) {\n weightMap.set(nextSerializedState, {\n weight: weight + 1,\n state: serializedState,\n event: eventObject\n });\n }\n }\n if (!visited.has(nextSerializedState)) {\n unvisited.add(nextSerializedState);\n }\n }\n visited.add(serializedState);\n unvisited.delete(serializedState);\n }\n\n const statePlanMap: StatePlanMap<TInternalState, TEvent> = {};\n const paths: Array<StatePath<TInternalState, TEvent>> = [];\n\n weightMap.forEach(\n ({ weight, state: fromState, event: fromEvent }, stateSerial) => {\n const state = stateMap.get(stateSerial)!;\n const steps = !fromState\n ? []\n : statePlanMap[fromState].paths[0].steps.concat({\n state: stateMap.get(fromState)!,\n event: fromEvent!\n });\n\n paths.push({\n state,\n steps,\n weight\n });\n statePlanMap[stateSerial] = {\n state,\n paths: [\n {\n state,\n steps,\n weight\n }\n ]\n };\n }\n );\n\n if (resolvedOptions.toState) {\n return paths\n .filter((path) => resolvedOptions.toState!(path.state))\n .map(alterPath);\n }\n\n return paths.map(alterPath);\n}\n","import { AnyActorLogic, EventFromLogic, InputFrom } from '../index.ts';\nimport {\n SerializedEvent,\n SerializedSnapshot,\n StatePath,\n Steps,\n TraversalOptions,\n VisitedContext\n} from './types.ts';\nimport { resolveTraversalOptions } from './graph.ts';\nimport { getAdjacencyMap } from './adjacency.ts';\nimport { alterPath } from './alterPath.ts';\nimport { createMockActorScope } from './actorScope.ts';\n\nexport function getSimplePaths<TLogic extends AnyActorLogic>(\n logic: TLogic,\n options?: TraversalOptions<\n ReturnType<TLogic['transition']>,\n EventFromLogic<TLogic>,\n InputFrom<TLogic>\n >\n): Array<StatePath<ReturnType<TLogic['transition']>, EventFromLogic<TLogic>>> {\n type TState = ReturnType<TLogic['transition']>;\n type TEvent = EventFromLogic<TLogic>;\n\n const resolvedOptions = resolveTraversalOptions(logic, options);\n const actorScope = createMockActorScope();\n const fromState =\n resolvedOptions.fromState ??\n logic.getInitialSnapshot(actorScope, options?.input);\n const serializeState = resolvedOptions.serializeState as (\n ...args: Parameters<typeof resolvedOptions.serializeState>\n ) => SerializedSnapshot;\n const adjacency = getAdjacencyMap(logic, resolvedOptions);\n const stateMap = new Map<SerializedSnapshot, TState>();\n const visitCtx: VisitedContext<TState, TEvent> = {\n vertices: new Set(),\n edges: new Set()\n };\n const steps: Steps<TState, TEvent> = [];\n const pathMap: Record<\n SerializedSnapshot,\n { state: TState; paths: Array<StatePath<TState, TEvent>> }\n > = {};\n\n function util(\n fromStateSerial: SerializedSnapshot,\n toStateSerial: SerializedSnapshot\n ) {\n const fromState = stateMap.get(fromStateSerial)!;\n visitCtx.vertices.add(fromStateSerial);\n\n if (fromStateSerial === toStateSerial) {\n if (!pathMap[toStateSerial]) {\n pathMap[toStateSerial] = {\n state: stateMap.get(toStateSerial)!,\n paths: []\n };\n }\n\n const toStatePlan = pathMap[toStateSerial];\n\n const path2: StatePath<TState, TEvent> = {\n state: fromState,\n weight: steps.length,\n steps: [...steps]\n };\n\n toStatePlan.paths.push(path2);\n } else {\n if (!adjacency[fromStateSerial]) {\n return;\n }\n for (const serializedEvent of Object.keys(\n adjacency[fromStateSerial].transitions\n ) as SerializedEvent[]) {\n const { state: nextState, event: subEvent } =\n adjacency[fromStateSerial].transitions[serializedEvent];\n\n if (!(serializedEvent in adjacency[fromStateSerial].transitions)) {\n continue;\n }\n const prevState = stateMap.get(fromStateSerial);\n\n const nextStateSerial = serializeState(nextState, subEvent, prevState);\n stateMap.set(nextStateSerial, nextState);\n\n if (!visitCtx.vertices.has(nextStateSerial)) {\n visitCtx.edges.add(serializedEvent);\n steps.push({\n state: stateMap.get(fromStateSerial)!,\n event: subEvent\n });\n util(nextStateSerial, toStateSerial);\n }\n }\n }\n\n steps.pop();\n visitCtx.vertices.delete(fromStateSerial);\n }\n\n const fromStateSerial = serializeState(fromState, undefined);\n stateMap.set(fromStateSerial, fromState);\n\n for (const nextStateSerial of Object.keys(\n adjacency\n ) as SerializedSnapshot[]) {\n util(fromStateSerial, nextStateSerial);\n }\n\n const simplePaths = Object.values(pathMap).flatMap((p) => p.paths);\n\n if (resolvedOptions.toState) {\n return simplePaths\n .filter((path) => resolvedOptions.toState!(path.state))\n .map(alterPath);\n }\n\n return simplePaths.map(alterPath);\n}\n","import { AnyStateMachine, AnyStateNode } from '../index.ts';\n\nconst validateState = (_state: AnyStateNode) => {\n // TODO\n};\n\nexport const validateMachine = (machine: AnyStateMachine) => {\n validateState(machine.root);\n};\n"],"names":["Mailbox","constructor","_process","this","_active","_current","_last","start","flush","clear","next","enqueue","event","enqueued","value","consumed","XSTATE_INIT","XSTATE_STOP","createInvokeTimeoutEvent","invokeId","type","createDoneStateEvent","id","output","createInitEvent","input","reportUnhandledError","err","setTimeout","symbolObservable","Symbol","observable","builtInActions","actor","@xstate.raise","actorScope","options","system","scheduler","schedule","self","delay","@xstate.sendTo","Error","undefined","defer","_relay","@xstate.cancel","sendId","cancel","@xstate.stopChild","stopChild","subscriptions","WeakMap","createAttachedLogic","attach","state","target","getSnapshot","status","subscription","parentSubscription","torndown","teardown","unsubscribe","parent","_parent","subscribe","complete","error","set","transition","get","delete","getInitialSnapshot","_","getPersistedSnapshot","snapshot","restoreSnapshot","relayMappedToParent","getEvent","createListenerLogic","eventType","mapper","isPartialWildcard","endsWith","on","emittedEvent","matchesEventDescriptor","listenerLogic","$$atom","for","createSubscriptionLogic","mappers","done","onSnapshot","subscriptionLogic","pushBuiltInAction","actions","action","args","push","pushStartedChild","Object","assign","children","_special","registerSpawnedChild","createTransitionEnqueue","internalEvents","actorSubscriptions","props","emit","log","logger","raise","raisedEvent","spawn","logic","createActor","sendTo","stop","key","keys","unregisterChild","listen","listenerActor","subscribeTo","subscriptionActor","createEnqueueObject","resolveAndExecuteActionsWithContext","currentSnapshot","intermediateSnapshot","resolvedAction","bind","actionArgs","context","machine","implementations","actors","actionParams","emittedEventParams","actionExecutor","name","params","exec","res","emptyEnqueueObject","cloneMachineSnapshot","enqueueFn","fn","getConfiguredDelayValue","delaySource","referencedDelay","duration","normalizedDuration","trim","millisecondsMatch","match","parseInt","secondsMatch","wholePart","hasDecimal","fracPart","padEnd","slice","iso8601DurationMatch","groups","weeks","days","hours","minutes","seconds","toNumber","Number","replace","parseDurationToMilliseconds","resolveDelay","configuredDelay","isAtomicStateNode","stateNode","getChildren","values","states","filter","sn","getProperAncestors","toStateNode","ancestors","m","getAllStateNodes","stateNodes","nodeSet","Set","activeParentSet","add","s","has","child","initialStates","getInitialStateNodes","initialStateNode","getStateValue","rootNode","config","adjList","Map","getValueFromAdj","baseNode","childStateNodes","childStateNode","stateValue","isInFinalState","stateNodeSet","some","every","isStateId","str","scheduleDelayedEvent","resolveScheduledDelay","oldEntry","entry","x","enq","oldExit","exit","formatTransition","descriptor","transitionConfig","normalizedTarget","normalizeTarget","reenter","resolveTarget","source","toJSON","map","t","targets","getStateNodeById","isInternalTarget","getStateNodeByPath","resolvedTarget","message","resolveHistoryDefaultTransition","initial","isHistoryNode","iter","descStateNode","initialState","ancestor","getStateNode","stateKey","result","statePath","arrayStatePath","toStatePath","currentStateNode","length","shift","getStateNodes","childStateKeys","Array","allStateNodes","root","i","subStateNode","transitionNode","subStateKeys","subStateKey","allInnerTransitions","subStateValue","innerTransitions","isDescendant","parentStateNode","marker","hasDescendantState","hasIntersection","s1","s2","s1Size","size","isArray","s2Size","set1","item","removeConflictingTransitions","enabledTransitions","filteredTransitions","exitSets","getExitSet","exitSet","computeExitSet","t1","t1Preempted","transitionsToRemove","t2","t3","from","getEffectiveTargetStates","historyValue","getTransitionResult","targetSet","targetNode","node","getTransitionDomain","targetStates","head","tail","concat","transitions","statesToExit","domain","microstep","isInitial","internalQueue","originalExecutor","mutStateNodeSet","_nodes","originalContext","getCurrentTransitionResult","getStateActionsAndContext","transitionFn","updatedContext","guards","delays","nextState","exitStates","changedHistory","sort","a","b","order","currentStateNodes","exitStateNode","historyNode","predicate","history","stateInput","_stateInputs","exitActions","nextContext","def","invoke","childActor","_isExternal","transitionActions","toArray","enterStates","getMachineOutput","rootCompletionNode","completionOutput","resolveOutput","parallelDoneType","parallelDoneEvent","find","e","statesToEnter","statesForDefaultEntry","addAncestorStatesToEnter","reentrancyDomain","anc","addDescendantStatesToEnter","historyStateNodes","historyDefaultTransition","stateInputMap","completedNodes","stateNodeToEnter","invoked","invokeDef","src","resolveReferencedActor","syncSnapshot","resultActions","nextInternalEvents","initialActions","initialInput","ancestorMarker","regionOutput","region","regionDoneType","regionDoneEvent","finalChild","JSON","stringify","nextStateNodes","allExitActions","forEach","to","resolvedInput","macrostep","nextSnapshot","microsteps","addMicrostep","step","collectedMicrosteps","_collectedMicrosteps","stopChildren","nextEvent","currentEvent","isErr","startsWith","isErrorActorEvent","getTransitionData","shouldSelectEventlessTransitions","maxIterations","Infinity","iterationCount","microstepCount","selectEventlessTransitions","previousState","hasEffect","transitionToHasEffect","transitionTo","triggerEffect","send","Boolean","enabledTransitionSet","atomicStates","atomicStateNode","loop","always","evaluateCandidate","candidate","guard","guardArgs","_snapshot","guardConfig","guardParams","guardPassed","guardImpl","isMachineSnapshot","emptyCanActor","emptyCanActorScope","getEmptyCanActor","createEmptyActor","machineSnapshotMatches","testValue","matchesState","machineSnapshotHasTag","tag","tags","machineSnapshotCan","emptyActor","emptyActorScope","sessionId","getEmptyCanActorScope","transitionData","machineSnapshotToJSON","nodes","getMeta","getInputs","can","hasTag","matches","jsonValues","machineSnapshotGetMeta","meta","machineSnapshotGetInputs","collectTags","createMachineSnapshot","configWithSnapshot","serializeHistoryValue","persistContext","contextPart","copy","xstate$$type","$$ACTOR_TYPE","parentStateId","childStateId","parentStateValue","toStateValue","childStateValue","stateId","segment","charCodeAt","previous","pathToStateValue","toArrayStrict","toTransitionConfigArray","configLike","transitionLike","toObserver","nextHandler","errorHandler","completionHandler","isObserver","indexStr","nodeId","invokeConfig","configSrc","getAllOwnEventDescriptors","flatMap","ownEvents","partialEventTokens","split","eventTokens","tokenIndex","partialEventToken","eventToken","createScheduledEventId","effectStates","getEffectState","executeLogicEffects","effects","effect","cleanup","createLogic","trackedEffects","emitted","sendBack","sentEvent","keyOrExec","maybeExec","enqueueEffect","patch","run","resolveContext","executingCustomAction","ProcessingStatus","defaultOptions","clock","ms","clearTimeout","console","Actor","_boundProcess","mailbox","observers","eventListeners","_processingStatus","NotStarted","_syncSnapshot","ref","_actorScope","_lastSourceRef","_collectedActions","_collectedSent","systemId","trigger","_deferred","_pendingEffects","resolvedOptions","inspect","rootActor","idCounter","keyedActors","reverseKeyedActors","inspectionObservers","timerMap","recordSent","targetRef","targetId","Math","random","toString","scheduledEvent","startedAt","Date","now","scheduledEventId","_scheduledEvents","timeout","deliver","cancelAll","targetMachine","isInternalEventType","_send","_bookId","_register","_unregister","getAll","fromEntries","entries","_set","existing","observerOrFn","observer","_sendInspectionEvent","resolvedInspectionEvent","rootId","scheduledEvents","scheduledId","_clock","_logger","_timerStrategy","timers","createSystem","_stop","listeners","wildcardListener","handler","saveExecutingCustomAction","Running","Proxy","payload","persistedState","rest","actorRef","parentRef","_setErrorSnapshot","_next","update","deferredFn","_stopProcedure","_complete","doneEvent","actorId","_error","sourceRef","sent","nextListenerOrObserver","errorListener","completeListener","Stopped","select","selector","equalityFn","is","selected","initEvent","strategy","resolveRestoredTimerDelay","caughtError","reportError","err2","persisted","pendingEffects","scheduled","elapsed","max","emptyLogic","createSpawner","spawnedChildren","cache","memo","object","memoizedData","EMPTY_OBJECT","CHOICE_CONFIG_KEYS","StateNode","path","description","after","events","_key","_machine","firstStateKey","join","choice","validateStateNodeConfig","idMap","collection","iteratee","collectionKeys","mapValues","stateConfig","stateNodeId","resolvedId","sourceName","_initialize","afterConfig","timeoutConfig","onTimeoutConfig","onTimeout","invokeDefs","mutateEntryExitWithDelay","afterEvent","delayedTransitions","addDelayedTransitions","transitionsConfig","configTransition","parsedDelay","isNaN","timeoutEvent","invokeTimeoutEvent","invokeTimeout","invokeTimeoutEventType","delayedTransition","getDelayedTransitions","mapTransitionConfigs","onDone","createCancelInvokeTimeoutTransition","timeoutEventType","_args","formatInvokeCompletionTransition","didEnqueue","trackingEnqueue","apply","thisArg","argArray","Reflect","prop","receiver","invokeDoneTransitions","onError","formatTransitions","validateChoiceResult","formatChoiceTransitions","_refreshEventMetadata","_target","targetString","formatInitialTransition","candidates","receivedEventType","matchingDescriptors","eventDescriptor","wildcardCandidates","getCandidates","transitionConfigs","StateMachine","version","schemas","internalEventDescriptors","_json","rootStateNode","routeTransitions","collectRoutes","route","routeId","routeConfig","routeMatches","userGuard","formatRouteTransitions","provide","provided","resolveState","resolvedStateValue","snapshots","_getPreInitialState","preInitial","resolvedContext","preInitialState","initialMicrostep","macroState","_rehydrated","fullPath","relativePath","resolvedStateId","STATE_IDENTIFIER","childrenJson","persistedVersion","migrate","snapshotData","snapshotChildren","actorData","childState","revivedHistoryValue","revived","arr","resolved","reviveHistoryValue","_persistedSnapshotVersion","persistedRest","restoredSnapshot","seen","WeakSet","reviveContext","simpleStringify","getDescription","contextString","stateStrings","createShortestPathsGen","getShortestPaths","createSimplePathsGen","getSimplePaths","TestModel","getDefaultOptions","serializeState","serializeEvent","serializeTransition","stateMatcher","testLogic","defaultTraversalOptions","_toTestPath","eventsString","steps","other","formatEvent","test","testPath","getPaths","pathGenerator","allowDuplicatePaths","paths","_resolveOptions","deduplicatePaths","allPathsWithEventSequence","eventSequence","z","superpathsWithEventSequence","pathLoop","pathWithEventSequence","superpathLoop","superpathWithEventSequence","getShortestPathsFrom","resultPaths","shortestPaths","fromState","shortestPath","joinPaths","getSimplePathsFrom","getPathsFromEvents","getAdjacencyMap","testPathResult","testStepResult","testTransition","testState","formatColor","_color","string","targetStateString","errMessage","hasFailed","stateString","eventString","formatPathTestResult","stateTestKeys","_getStateTestKeys","stateTestKey","_getEventExec","eventExec","stateValuesEqual","aKeys","bKeys","serializeMachineTransition","previousSnapshot","prevStateString","createMockActorScope","serializeSnapshot","createDefaultMachineOptions","getEvents","otherOptions","__unsafe_getAllOwnEventDescriptors","matchingEvents","ev","createDefaultLogicOptions","resolveTraversalOptions","traversalOptions","resolvedDefaultOptions","isMachineLogic","filterEvents","limit","toState","stopWhen","headPath","tailPath","weight","resolveTransitionSnapshot","customFromState","adj","iterations","queue","prevState","stateMap","serializedState","alterPath","adjacency","serializedFromState","stateSerial","eventSerial","_nextEvent","nextStateSerial","weightMap","unvisited","visited","eventObject","nextSerializedState","nextWeight","statePlanMap","fromEvent","visitCtx","vertices","edges","pathMap","util","fromStateSerial","toStateSerial","toStatePlan","path2","serializedEvent","subEvent","pop","simplePaths","p","adjMap","adjValue","validateMachine","includes","reduce","accNodes","toDirectedGraph","stateMachine","flat","transitionIndex","targetIndex","edge","label","text","graph","graphEdges"],"mappings":"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"}