@vielzeug/clockwork 2.2.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,14 @@
1
1
  # @vielzeug/clockwork
2
2
 
3
- > Framework-neutral typed finite state machines for TypeScript.
3
+ > Framework-neutral finite state machines with pure transitions and actors
4
4
 
5
- Clockwork separates pure transition decisions from actor-owned runtime work. Define a machine once, then create independent actors for effects, timers, invokes, subscriptions, and disposal.
5
+ ## Installation
6
+
7
+ ```sh
8
+ pnpm add @vielzeug/clockwork
9
+ npm install @vielzeug/clockwork
10
+ yarn add @vielzeug/clockwork
11
+ ```
6
12
 
7
13
  ## Quick Start
8
14
 
@@ -33,88 +39,14 @@ console.log(actor.snapshot);
33
39
  actor.dispose();
34
40
  ```
35
41
 
36
- ## Design
37
-
38
- - **Pure machine** — `transition(snapshot, event)` returns only the next snapshot and result type; it never starts runtime work.
39
- - **Independent actors** — `createActor()` owns an event queue, invokes, timers, subscriptions, and cancellation.
40
- - **Typed definitions** — `defineMachine<Context, Event>()(definition)` accepts a non-array record context and narrows events in guards and reducers.
41
- - **Post-commit effects** — actors notify subscribers, then run exit, transition, and entry effects.
42
- - **Flat states** — one explicit state map; compose machines instead of nesting state trees.
43
- - **No runtime dependencies** — works in browser, Node, workers, SSR, and any framework.
44
-
45
- ## Core API
46
-
47
- | Export | Purpose |
48
- | --- | --- |
49
- | `defineMachine<Context, Event>()(definition)` | Compile and validate a machine definition |
50
- | `machine.transition(snapshot, event)` | Run pure transition logic |
51
- | `machine.createActor(options?)` | Create an owned runtime actor |
52
- | `Actor` | Runtime resource with a readonly snapshot, subscriptions, and disposal |
53
- | `ClockworkError` | Validation error with stable `code` |
54
-
55
- ## Async invokes and timers
56
-
57
- State nodes may declare `invoke` tasks and `after` timers. Both begin when an actor enters a state and are cancelled when it exits or disposes. Fresh actors run entry effects and resources; restored actors start only the restored state's invokes and timers. Invokes convert completion or failure into regular machine events.
58
-
59
- ```ts
60
- import { defineMachine } from '@vielzeug/clockwork';
61
-
62
- type Event = { type: 'LOAD' } | { result: string; type: 'DONE' } | { message: string; type: 'FAIL' };
63
-
64
- const loader = defineMachine<{ data: string }, Event>()({
65
- context: { data: '' },
66
- initial: 'idle',
67
- states: {
68
- idle: { on: { LOAD: { target: 'loading' } } },
69
- loading: {
70
- invoke: [{
71
- src: async ({ signal }) => fetch('/api/data', { signal }).then((response) => response.text()),
72
- onDone: ({ result }) => ({ result, type: 'DONE' }),
73
- onError: ({ error }) => ({ message: String(error), type: 'FAIL' }),
74
- }],
75
- on: {
76
- DONE: { reduce: ({ event }) => ({ data: event.result }), target: 'ready' },
77
- FAIL: { target: 'error' },
78
- },
79
- },
80
- ready: {},
81
- error: {},
82
- },
83
- });
84
- ```
85
-
86
- ## Observability
87
-
88
- `actor.subscribe(listener)` observes committed snapshots. It does not modify actor behavior or trace dispatches and runtime errors.
89
-
90
- ```ts
91
- import { defineMachine } from '@vielzeug/clockwork';
92
-
93
- const machine = defineMachine<Record<string, never>, { type: 'NEXT' }>()({
94
- initial: 'idle',
95
- states: { idle: { on: { NEXT: { target: 'idle' } } } },
96
- });
97
- const actor = machine.createActor();
98
- const stop = actor.subscribe((snapshot) => console.debug(snapshot.state));
99
-
100
- actor.send({ type: 'NEXT' });
101
- stop();
102
- actor.dispose();
103
- ```
104
-
105
- ## Installation
106
-
107
- ```sh
108
- pnpm add @vielzeug/clockwork
109
- ```
110
-
111
42
  ## Documentation
112
43
 
113
- - [Full Guide](https://vielzeug.dev/clockwork/)
114
- - [Usage Guide](https://vielzeug.dev/clockwork/usage/)
115
- - [API Reference](https://vielzeug.dev/clockwork/api/)
116
- - [Examples](https://vielzeug.dev/clockwork/examples/)
44
+ - [Overview](https://vielzeug.dev/clockwork/)
45
+ - [Usage Guide](https://vielzeug.dev/clockwork/usage)
46
+ - [API Reference](https://vielzeug.dev/clockwork/api)
47
+ - [Examples](https://vielzeug.dev/clockwork/examples)
48
+ - [Migration Guide](https://vielzeug.dev/clockwork/migration)
117
49
 
118
50
  ## License
119
51
 
120
- MIT
52
+ MIT © [Helmuth Saatkamp](https://github.com/helmuthdu) — part of the [Vielzeug](https://github.com/helmuthdu/vielzeug) monorepo.
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class extends Error{code;details;constructor(e,t,n={},r){super(t,r),this.name=new.target.name,this.code=e,this.details=Object.freeze({...n}),Object.setPrototypeOf(this,new.target.prototype)}};function t(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}var n=e=>typeof e==`object`&&!!e,r=(t,n,r)=>{throw new e(t,n,r)},i=(e,t,n)=>(Array.isArray(e)||r(`INVALID_DEFINITION`,t,n),e),a=(e,t,n)=>i(e,`${t} must be an array`,{...n,phase:t}).map((e,i)=>(typeof e!=`function`&&r(`INVALID_EFFECT`,`${t} entry at index ${i} must be a function`,{...n,index:i,phase:t}),e)),o=(e,t,n)=>typeof t!=`string`||!e.has(t)?r(`UNKNOWN_TARGET`,`target "${String(t)}" is not a declared state`,{...n,target:t}):t,s=(e,t,i)=>{let s=n(e)?e:r(`INVALID_TRANSITION`,`a transition must be an object`,i),c=o(t,s.target,i);return s.guard!==void 0&&typeof s.guard!=`function`&&r(`INVALID_TRANSITION`,`transition guard must be a function`,{...i,phase:`guard`}),s.reduce!==void 0&&typeof s.reduce!=`function`&&r(`INVALID_TRANSITION`,`transition reducer must be a function`,{...i,phase:`reduce`}),{effects:s.effects===void 0?void 0:a(s.effects,`effects`,i),guard:s.guard,reduce:s.reduce,target:c}},c=(e,t,n)=>{let i=Array.isArray(e)?e:[e];return i.length===0&&r(`INVALID_TRANSITION`,`a transition array must not be empty`,n),i.map((e,r)=>s(e,t,{...n,transitionIndex:r}))},l=(e,t,i,s)=>{let c=n(e)?e:r(`INVALID_TRANSITION`,`state "${s}" after entries must be objects`,{index:i,state:s}),l=c.delay;(typeof l!=`number`||!Number.isFinite(l)||l<0)&&r(`INVALID_AFTER_DELAY`,`state "${s}" after delay must be a finite number greater than or equal to 0`,{delay:l,index:i,state:s});let u={delay:l,index:i,state:s};return c.guard!==void 0&&typeof c.guard!=`function`&&r(`INVALID_TRANSITION`,`after guard must be a function`,{...u,phase:`guard`}),c.reduce!==void 0&&typeof c.reduce!=`function`&&r(`INVALID_TRANSITION`,`after reducer must be a function`,{...u,phase:`reduce`}),{definition:{delay:l,effects:c.effects===void 0?void 0:a(c.effects,`effects`,u),guard:c.guard,reduce:c.reduce,target:o(t,c.target,u)}}},u=(e,t)=>i(e,`state "${t}" invoke must be an array`,{state:t}).map((e,i)=>{let a=n(e)?e:r(`INVALID_INVOKE`,`invoke entry must be an object`,{index:i,state:t});return typeof a.src!=`function`&&r(`INVALID_INVOKE`,`invoke src must be a function`,{index:i,phase:`src`,state:t}),a.onDone!==void 0&&typeof a.onDone!=`function`&&r(`INVALID_INVOKE`,`invoke onDone must be a function`,{index:i,phase:`onDone`,state:t}),a.onError!==void 0&&typeof a.onError!=`function`&&r(`INVALID_INVOKE`,`invoke onError must be a function`,{index:i,phase:`onError`,state:t}),a}),d=e=>{let o=e,s=n(o)?o:r(`INVALID_DEFINITION`,`machine definition must be an object`,{}),d=n(s.states)?s.states:r(`INVALID_DEFINITION`,`machine states must be an object`,{}),f=Object.entries(d),p=new Map(f);(typeof s.initial!=`string`||!p.has(s.initial))&&r(`INVALID_INITIAL_STATE`,`initial state "${String(s.initial)}" is not declared`,{initial:s.initial}),s.context!==void 0&&!t(s.context)&&r(`INVALID_CONTEXT`,`machine context must be a non-array object record`,{});let m=new Map;for(let[e,t]of f){let o=n(t)?t:r(`INVALID_DEFINITION`,`state "${e}" must be an object`,{state:e});(`states`in o||`initial`in o)&&r(`INVALID_DEFINITION`,`state "${e}" must be flat and cannot declare child states`,{state:e});let s=new Map;if(o.on!==void 0){let t=n(o.on)?o.on:r(`INVALID_TRANSITION`,`state "${e}" on must be an object`,{state:e});for(let[n,r]of Object.entries(t))s.set(n,c(r,p,{state:e,type:n}))}let d=o.after===void 0?[]:i(o.after,`state "${e}" after must be an array`,{state:e}).map((t,n)=>l(t,p,n,e));m.set(e,{after:d,entry:o.entry===void 0?[]:a(o.entry,`entry`,{state:e}),exit:o.exit===void 0?[]:a(o.exit,`exit`,{state:e}),invoke:o.invoke===void 0?[]:u(o.invoke,e),on:s})}return{context:s.context??{},initial:s.initial,states:m}},f=(e,t)=>({context:t,state:e}),p=t=>{throw new e(`INVALID_SNAPSHOT_STATE`,`snapshot state "${String(t)}" is not declared`,{state:t})},m=e=>typeof e==`object`&&!!e&&typeof e.type==`string`,h=(e,t)=>e.states.get(t)??p(t),g=(e,t,n)=>{let r=h(e,t.state);if(n.kind===`after`){if(!r.after.includes(n.after))return;let{definition:e}=n.after;return!e.guard||e.guard({context:t.context,event:void 0})?{event:void 0,transition:e}:void 0}let i=r.on.get(n.event.type);if(i)for(let e of i){let r=e.guard;if(!r||r({context:t.context,event:n.event}))return{event:n.event,transition:e}}},_=(n,r,i)=>{let a=g(n,r,i);if(!a)return{event:i.kind===`event`?i.event:void 0,result:{snapshot:r,type:`ignored`}};let o=a.transition.reduce,s=o?o({context:r.context,event:a.event}):r.context;if(!t(s))throw new e(`INVALID_CONTEXT`,`a reducer must return a non-array object record`,{state:r.state});return{event:a.event,result:{snapshot:f(a.transition.target,s),type:`transition`},transition:a.transition}},v=(e,t,n)=>g(e,t,{event:n,kind:`event`})!==void 0,y=(n,r,i={})=>{if(i.maxTransitions!==void 0&&(!Number.isInteger(i.maxTransitions)||i.maxTransitions<1))throw new e(`INVALID_MAX_TRANSITIONS`,`maxTransitions must be a positive integer`,{maxTransitions:i.maxTransitions});let a=i.snapshot??r;if(!t(a.context))throw new e(`INVALID_CONTEXT`,`snapshot context must be a non-array object record`,{});n.states.has(a.state)||p(a.state);let o=new Set,s=new AbortController,c=new Set,l=new Set,u=[],d=i.maxTransitions??1e3,f=!1,g=!1,y=()=>{for(let e of c)clearTimeout(e);c.clear();for(let e of l)e.abort();l.clear()},b=()=>{f||(f=!0,u.length=0,y(),o.clear(),s.abort())},x=(e,t)=>{let n=`dispose`;if(i.onError)try{n=i.onError(e,t)}catch(e){throw b(),e}n!==`continue`&&b()},S=e=>{if(!f){if(g){u.push(e);return}g=!0;try{D(e),O()}finally{g=!1}}},C=e=>{f||m(e)&&S({event:e,kind:`event`})},w=(e,t,n)=>{for(let r of e){if(f)return;try{r({context:a.context,event:n,send:C,signal:s.signal})}catch(e){x(e,{event:n,phase:`effect`,state:t})}}},T=(e,t)=>{let r=h(n,e);for(let e of r.after){let t=setTimeout(()=>{c.delete(t),S({after:e,kind:`after`})},e.definition.delay);c.add(t)}for(let n of r.invoke){let r=new AbortController;l.add(r);let i=a.context,o=t;Promise.resolve().then(()=>n.src({context:i,event:o,signal:r.signal})).then(t=>{if(l.delete(r),!(f||r.signal.aborted||!n.onDone))try{C(n.onDone({context:i,result:t}))}catch(t){x(t,{event:o,phase:`invoke`,state:e})}},t=>{if(l.delete(r),!(f||r.signal.aborted))try{n.onError?C(n.onError({context:i,error:t})):x(t,{event:o,phase:`invoke`,state:e})}catch(t){x(t,{event:o,phase:`invoke`,state:e})}})}},E=e=>{for(let t of o){if(f)return;try{t(a)}catch(t){x(t,{event:e,phase:`subscriber`,state:a.state})}}},D=e=>{let t=a,r;try{r=_(n,a,e)}catch(t){x(t,{event:e.kind===`event`?e.event:void 0,phase:`transition`,state:a.state});return}if(r.result.type===`ignored`||!r.transition)return;let i=h(n,t.state);a=r.result.snapshot,y(),T(a.state,r.event),E(r.event),w(i.exit,t.state,r.event),w(r.transition.effects??[],t.state,r.event),w(h(n,a.state).entry,a.state,r.event)},O=()=>{let t=0;for(;u.length>0&&!f;){if(t+=1,t>d){x(new e(`INVALID_TRANSITION_LIMIT`,`maximum queued transitions exceeded`,{maxTransitions:d}),{phase:`transition`,state:a.state});return}let n=u.shift();n&&D(n)}};return T(a.state,void 0),i.snapshot||w(h(n,a.state).entry,a.state,void 0),{can:e=>!f&&v(n,a,e),get disposalSignal(){return s.signal},dispose:b,get disposed(){return f},send:C,get snapshot(){return a},subscribe(e){return f?()=>void 0:(o.add(e),()=>o.delete(e))},[Symbol.dispose]:b}},b=()=>e=>{let t=d(e),n=f(t.initial,t.context);return{can:(e,n)=>v(t,e,n),createActor:e=>y(t,n,e),initialSnapshot:n,transition:(e,n)=>_(t,e,{event:n,kind:`event`}).result}};exports.ClockworkError=e,exports.defineMachine=b;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class e extends Error{static errorName=`ClockworkError`;code;details;constructor(t,n,r={},i){super(n,i),this.name=e.errorName,this.code=t,this.details=Object.freeze({...r}),Object.setPrototypeOf(this,new.target.prototype)}};function t(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}var n=2147483647,r=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null},i=(t,n,r)=>{throw new e(t,n,r)},a=(e,t,n)=>(Array.isArray(e)||i(`INVALID_DEFINITION`,t,n),e),o=(e,t,n)=>a(e,`${t} must be an array`,{...n,phase:t}).map((e,r)=>(typeof e!=`function`&&i(`INVALID_EFFECT`,`${t} entry at index ${r} must be a function`,{...n,index:r,phase:t}),e)),s=(e,t,n)=>typeof t!=`string`||!e.has(t)?i(`UNKNOWN_TARGET`,`target "${String(t)}" is not a declared state`,{...n,target:t}):t,c=(e,t,n)=>{let a=r(e)?e:i(`INVALID_TRANSITION`,`a transition must be an object`,n),c=s(t,a.target,n);return a.guard!==void 0&&typeof a.guard!=`function`&&i(`INVALID_TRANSITION`,`transition guard must be a function`,{...n,phase:`guard`}),a.reduce!==void 0&&typeof a.reduce!=`function`&&i(`INVALID_TRANSITION`,`transition reducer must be a function`,{...n,phase:`reduce`}),{effects:a.effects===void 0?void 0:o(a.effects,`effects`,n),guard:a.guard,reduce:a.reduce,target:c}},l=(e,t,n)=>{let r=Array.isArray(e)?e:[e];return r.length===0&&i(`INVALID_TRANSITION`,`a transition array must not be empty`,n),r.map((e,r)=>c(e,t,{...n,transitionIndex:r}))},u=(e,t,a,c)=>{let l=r(e)?e:i(`INVALID_TRANSITION`,`state "${c}" after entries must be objects`,{index:a,state:c}),u=l.delay;(typeof u!=`number`||!Number.isFinite(u)||u<0||u>n)&&i(`INVALID_AFTER_DELAY`,`state "${c}" after delay must be between 0 and ${n}`,{delay:u,index:a,state:c});let d={delay:u,index:a,state:c};return l.guard!==void 0&&typeof l.guard!=`function`&&i(`INVALID_TRANSITION`,`after guard must be a function`,{...d,phase:`guard`}),l.reduce!==void 0&&typeof l.reduce!=`function`&&i(`INVALID_TRANSITION`,`after reducer must be a function`,{...d,phase:`reduce`}),{definition:{delay:u,effects:l.effects===void 0?void 0:o(l.effects,`effects`,d),guard:l.guard,reduce:l.reduce,target:s(t,l.target,d)}}},d=(e,t)=>a(e,`state "${t}" invoke must be an array`,{state:t}).map((e,n)=>{let a=r(e)?e:i(`INVALID_INVOKE`,`invoke entry must be an object`,{index:n,state:t});return typeof a.src!=`function`&&i(`INVALID_INVOKE`,`invoke src must be a function`,{index:n,phase:`src`,state:t}),a.onDone!==void 0&&typeof a.onDone!=`function`&&i(`INVALID_INVOKE`,`invoke onDone must be a function`,{index:n,phase:`onDone`,state:t}),a.onError!==void 0&&typeof a.onError!=`function`&&i(`INVALID_INVOKE`,`invoke onError must be a function`,{index:n,phase:`onError`,state:t}),{onDone:a.onDone,onError:a.onError,src:a.src}}),f=e=>{let n=e,s=r(n)?n:i(`INVALID_DEFINITION`,`machine definition must be an object`,{}),c=r(s.states)?s.states:i(`INVALID_DEFINITION`,`machine states must be an object`,{}),f=Object.entries(c),p=new Map(f);(typeof s.initial!=`string`||!p.has(s.initial))&&i(`INVALID_INITIAL_STATE`,`initial state "${String(s.initial)}" is not declared`,{initial:s.initial}),s.context!==void 0&&!t(s.context)&&i(`INVALID_CONTEXT`,`machine context must be a non-array object record`,{});let m=new Map;for(let[e,t]of f){let n=r(t)?t:i(`INVALID_DEFINITION`,`state "${e}" must be an object`,{state:e});(`states`in n||`initial`in n)&&i(`INVALID_DEFINITION`,`state "${e}" must be flat and cannot declare child states`,{state:e});let s=new Map;if(n.on!==void 0){let t=r(n.on)?n.on:i(`INVALID_TRANSITION`,`state "${e}" on must be an object`,{state:e});for(let[n,r]of Object.entries(t))s.set(n,l(r,p,{state:e,type:n}))}let c=n.after===void 0?[]:a(n.after,`state "${e}" after must be an array`,{state:e}).map((t,n)=>u(t,p,n,e));m.set(e,{after:c,entry:n.entry===void 0?[]:o(n.entry,`entry`,{state:e}),exit:n.exit===void 0?[]:o(n.exit,`exit`,{state:e}),invoke:n.invoke===void 0?[]:d(n.invoke,e),on:s})}return{context:s.context??{},initial:s.initial,states:m}},p=(e,t)=>{let n=Object.assign(Object.create(Object.getPrototypeOf(t)),t);return Object.freeze({context:Object.freeze(n),state:e})},m=e=>Object.isFrozen(e)&&Object.isFrozen(e.context)?e:p(e.state,e.context),h=t=>{throw new e(`INVALID_SNAPSHOT_STATE`,`snapshot state "${String(t)}" is not declared`,{state:t})},g=e=>{try{return typeof e==`object`&&!!e&&typeof e.type==`string`}catch{return!1}},_=(e,t)=>e.states.get(t)??h(t),v=(n,r)=>{if(!t(r.context))throw new e(`INVALID_CONTEXT`,`snapshot context must be a non-array object record`,{});_(n,r.state)},y=(e,t,n)=>{v(e,t);let r=_(e,t.state);if(n.kind===`after`){if(!r.after.includes(n.after))return;let{definition:e}=n.after;return!e.guard||e.guard({context:t.context,event:void 0})?{event:void 0,transition:e}:void 0}let i=r.on.get(n.event.type);if(i)for(let e of i){let r=e.guard;if(!r||r({context:t.context,event:n.event}))return{event:n.event,transition:e}}},b=(n,r,i)=>{let a=y(n,r,i);if(!a)return{event:i.kind===`event`?i.event:void 0,result:{snapshot:m(r),type:`ignored`}};let o=a.transition.reduce,s=o?o({context:r.context,event:a.event}):r.context;if(!t(s))throw new e(`INVALID_CONTEXT`,`a reducer must return a non-array object record`,{state:r.state});return{event:a.event,result:{snapshot:p(a.transition.target,s),type:`transition`},transition:a.transition}},x=(e,t,n)=>y(e,t,{event:n,kind:`event`})!==void 0,S=(t,n,r={})=>{if(r.maxTransitions!==void 0&&(!Number.isInteger(r.maxTransitions)||r.maxTransitions<1))throw new e(`INVALID_MAX_TRANSITIONS`,`maxTransitions must be a positive integer`,{maxTransitions:r.maxTransitions});let i=r.snapshot??n;v(t,i);let a=p(i.state,i.context),o=new Set,s=new AbortController,c=new Set,l=new Set,u=[],d=r.maxTransitions??1e3,f=!1,m=!1,h=()=>{for(let e of c)clearTimeout(e);c.clear();for(let e of l)e.abort();l.clear()},y=()=>{f||(f=!0,u.length=0,h(),o.clear(),s.abort())},S=(e,t)=>{try{r.onError?.(e,t)}catch{}},C=(e,t)=>{S(e,t),y()},w=e=>{if(!f){if(m){u.push(e);return}m=!0;try{k(e),A()}finally{m=!1}}},T=e=>{f||g(e)&&w({event:e,kind:`event`})},E=(e,t,n)=>{for(let r of e){if(f)return;try{r({context:a.context,event:n,send:T,signal:s.signal})}catch(e){C(e,{event:n,phase:`effect`,state:t})}}},D=(e,n)=>{let r=_(t,e);for(let e of r.after){let t=setTimeout(()=>{c.delete(t),w({after:e,kind:`after`})},e.definition.delay);c.add(t)}for(let t of r.invoke){let r=new AbortController;l.add(r);let i=a.context,o=n;Promise.resolve().then(()=>t.src({context:i,event:o,signal:r.signal})).then(n=>{if(l.delete(r),!(f||r.signal.aborted||!t.onDone))try{T(t.onDone({context:i,result:n}))}catch(t){C(t,{event:o,phase:`invoke`,state:e})}},n=>{if(l.delete(r),!(f||r.signal.aborted))try{t.onError?T(t.onError({context:i,error:n})):C(n,{event:o,phase:`invoke`,state:e})}catch(t){C(t,{event:o,phase:`invoke`,state:e})}})}},O=e=>{for(let t of[...o]){if(f)return;try{t(a)}catch(t){S(t,{event:e,phase:`subscriber`,state:a.state})}}},k=e=>{let n=a,r;try{r=b(t,a,e)}catch(t){C(t,{event:e.kind===`event`?e.event:void 0,phase:`transition`,state:a.state});return}if(r.result.type===`ignored`||!r.transition)return;let i=_(t,n.state);a=r.result.snapshot,h(),D(a.state,r.event),O(r.event),E(i.exit,n.state,r.event),E(r.transition.effects??[],n.state,r.event),E(_(t,a.state).entry,a.state,r.event)},A=()=>{let t=0;for(;u.length>0&&!f;){if(t+=1,t>d){C(new e(`INVALID_TRANSITION_LIMIT`,`maximum queued transitions exceeded`,{maxTransitions:d}),{phase:`transition`,state:a.state});return}let n=u.shift();n&&k(n)}};return D(a.state,void 0),r.snapshot||E(_(t,a.state).entry,a.state,void 0),{can:e=>{if(f)return!1;try{return g(e)?x(t,a,e):!1}catch(t){return C(t,{event:e,phase:`transition`,state:a.state}),!1}},get disposalSignal(){return s.signal},dispose:y,get disposed(){return f},send:T,get snapshot(){return a},subscribe(e){return f?()=>void 0:(o.add(e),()=>o.delete(e))},[Symbol.dispose]:y}},C=()=>e=>{let t=f(e),n=p(t.initial,t.context);return{can:(e,n)=>x(t,e,n),createActor:e=>S(t,n,e),initialSnapshot:n,transition:(e,n)=>b(t,e,{event:n,kind:`event`}).result}};exports.ClockworkError=e,exports.defineMachine=C;
2
2
  //# sourceMappingURL=clockwork.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"clockwork.cjs","names":[],"sources":["../src/errors.ts","../src/_context.ts","../src/_dev.ts","../src/definition.ts","../src/interpret.ts"],"sourcesContent":["export type ClockworkErrorCode =\n | 'INVALID_AFTER_DELAY'\n | 'INVALID_CONTEXT'\n | 'INVALID_DEFINITION'\n | 'INVALID_EFFECT'\n | 'INVALID_INITIAL_STATE'\n | 'INVALID_INVOKE'\n | 'INVALID_MAX_TRANSITIONS'\n | 'INVALID_SNAPSHOT_STATE'\n | 'INVALID_TRANSITION'\n | 'INVALID_TRANSITION_LIMIT'\n | 'UNKNOWN_TARGET';\n\n/** A Clockwork failure with a stable machine-readable code and contextual details. */\nexport class ClockworkError extends Error {\n readonly code: ClockworkErrorCode;\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(code: ClockworkErrorCode, message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n this.code = code;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function isContextRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { isContextRecord } from './_context.js';\nimport { ClockworkError } from './errors.js';\nimport type { After, Effect, Invoke, MachineConfig, MachineEvent, Transition } from './types.js';\n\nexport type CompiledAfter<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly definition: After<State, Context, Event>;\n};\n\nexport type CompiledState<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: readonly CompiledAfter<State, Context, Event>[];\n readonly entry: readonly Effect<Context, Event>[];\n readonly exit: readonly Effect<Context, Event>[];\n readonly invoke: readonly Invoke<Context, Event>[];\n readonly on: ReadonlyMap<string, readonly Transition<State, Context, Event>[]>;\n};\n\nexport type CompiledMachine<\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n> = {\n readonly context: Context;\n readonly initial: State;\n readonly states: ReadonlyMap<State, CompiledState<State, Context, Event>>;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;\n\nconst fail = (code: ClockworkError['code'], message: string, details: Record<string, unknown>): never => {\n throw new ClockworkError(code, message, details);\n};\n\nconst array = (value: unknown, message: string, details: Record<string, unknown>): readonly unknown[] => {\n if (!Array.isArray(value)) fail('INVALID_DEFINITION', message, details);\n\n return value as readonly unknown[];\n};\n\nconst functions = <Value>(\n value: unknown,\n phase: 'effects' | 'entry' | 'exit',\n details: Record<string, unknown>,\n): readonly Value[] => {\n const values = array(value, `${phase} must be an array`, { ...details, phase });\n\n return values.map((candidate, index) => {\n if (typeof candidate !== 'function') {\n fail('INVALID_EFFECT', `${phase} entry at index ${index} must be a function`, { ...details, index, phase });\n }\n\n return candidate as Value;\n });\n};\n\nconst validateTarget = <State extends string>(\n states: ReadonlyMap<State, unknown>,\n target: unknown,\n details: Record<string, unknown>,\n): State => {\n if (typeof target !== 'string' || !states.has(target as State)) {\n return fail('UNKNOWN_TARGET', `target \"${String(target)}\" is not a declared state`, { ...details, target });\n }\n\n return target as State;\n};\n\nconst compileTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): Transition<State, Context, Event> => {\n const transition = isRecord(input) ? input : fail('INVALID_TRANSITION', 'a transition must be an object', details);\n const target = validateTarget(states, transition.target, details);\n\n if (transition.guard !== undefined && typeof transition.guard !== 'function') {\n fail('INVALID_TRANSITION', 'transition guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (transition.reduce !== undefined && typeof transition.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'transition reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n effects:\n transition.effects === undefined\n ? undefined\n : functions<Effect<Context, Event>>(transition.effects, 'effects', details),\n guard: transition.guard as Transition<State, Context, Event>['guard'],\n reduce: transition.reduce as Transition<State, Context, Event>['reduce'],\n target,\n };\n};\n\nconst compileTransitions = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): readonly Transition<State, Context, Event>[] => {\n const values = Array.isArray(input) ? input : [input];\n\n if (values.length === 0) fail('INVALID_TRANSITION', 'a transition array must not be empty', details);\n\n return values.map((value, transitionIndex) =>\n compileTransition<State, Context, Event>(value, states, { ...details, transitionIndex }),\n );\n};\n\nconst compileAfter = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n index: number,\n state: State,\n): CompiledAfter<State, Context, Event> => {\n const after = isRecord(input)\n ? input\n : fail('INVALID_TRANSITION', `state \"${state}\" after entries must be objects`, { index, state });\n const delay = after.delay;\n\n if (typeof delay !== 'number' || !Number.isFinite(delay) || delay < 0) {\n fail('INVALID_AFTER_DELAY', `state \"${state}\" after delay must be a finite number greater than or equal to 0`, {\n delay,\n index,\n state,\n });\n }\n\n const details = { delay, index, state };\n\n if (after.guard !== undefined && typeof after.guard !== 'function') {\n fail('INVALID_TRANSITION', 'after guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (after.reduce !== undefined && typeof after.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'after reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n definition: {\n delay: delay as number,\n effects:\n after.effects === undefined ? undefined : functions<Effect<Context, Event>>(after.effects, 'effects', details),\n guard: after.guard as After<State, Context, Event>['guard'],\n reduce: after.reduce as After<State, Context, Event>['reduce'],\n target: validateTarget(states, after.target, details),\n },\n };\n};\n\nconst compileInvokes = <Context extends Record<string, unknown>, Event extends MachineEvent>(\n value: unknown,\n state: string,\n): readonly Invoke<Context, Event>[] =>\n array(value, `state \"${state}\" invoke must be an array`, { state }).map((value, index) => {\n const candidate = isRecord(value)\n ? value\n : fail('INVALID_INVOKE', 'invoke entry must be an object', { index, state });\n\n if (typeof candidate.src !== 'function') {\n fail('INVALID_INVOKE', 'invoke src must be a function', { index, phase: 'src', state });\n }\n\n if (candidate.onDone !== undefined && typeof candidate.onDone !== 'function') {\n fail('INVALID_INVOKE', 'invoke onDone must be a function', { index, phase: 'onDone', state });\n }\n\n if (candidate.onError !== undefined && typeof candidate.onError !== 'function') {\n fail('INVALID_INVOKE', 'invoke onError must be a function', { index, phase: 'onError', state });\n }\n\n return candidate as unknown as Invoke<Context, Event>;\n });\n\n/** Validates and structurally compiles a flat machine definition once. */\nexport const compileDefinition = <\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n>(\n definition: MachineConfig<State, Context, Event>,\n): CompiledMachine<State, Context, Event> => {\n const raw = definition as unknown;\n const machine = isRecord(raw) ? raw : fail('INVALID_DEFINITION', 'machine definition must be an object', {});\n const rawStates = isRecord(machine.states)\n ? machine.states\n : fail('INVALID_DEFINITION', 'machine states must be an object', {});\n const rawStateEntries = Object.entries(rawStates) as [State, unknown][];\n const rawStateMap = new Map<State, unknown>(rawStateEntries);\n\n if (typeof machine.initial !== 'string' || !rawStateMap.has(machine.initial as State)) {\n fail('INVALID_INITIAL_STATE', `initial state \"${String(machine.initial)}\" is not declared`, {\n initial: machine.initial,\n });\n }\n\n if (machine.context !== undefined && !isContextRecord(machine.context)) {\n fail('INVALID_CONTEXT', 'machine context must be a non-array object record', {});\n }\n\n const states = new Map<State, CompiledState<State, Context, Event>>();\n\n for (const [state, rawNodeValue] of rawStateEntries) {\n const rawNode = isRecord(rawNodeValue)\n ? rawNodeValue\n : fail('INVALID_DEFINITION', `state \"${state}\" must be an object`, { state });\n\n if ('states' in rawNode || 'initial' in rawNode) {\n fail('INVALID_DEFINITION', `state \"${state}\" must be flat and cannot declare child states`, { state });\n }\n\n const on = new Map<string, readonly Transition<State, Context, Event>[]>();\n\n if (rawNode.on !== undefined) {\n const rawOn = isRecord(rawNode.on)\n ? rawNode.on\n : fail('INVALID_TRANSITION', `state \"${state}\" on must be an object`, { state });\n\n for (const [type, transition] of Object.entries(rawOn)) {\n on.set(type, compileTransitions<State, Context, Event>(transition, rawStateMap, { state, type }));\n }\n }\n\n const after =\n rawNode.after === undefined\n ? []\n : array(rawNode.after, `state \"${state}\" after must be an array`, { state }).map((entry, index) =>\n compileAfter<State, Context, Event>(entry, rawStateMap, index, state),\n );\n\n states.set(state, {\n after,\n entry: rawNode.entry === undefined ? [] : functions<Effect<Context, Event>>(rawNode.entry, 'entry', { state }),\n exit: rawNode.exit === undefined ? [] : functions<Effect<Context, Event>>(rawNode.exit, 'exit', { state }),\n invoke: rawNode.invoke === undefined ? [] : compileInvokes<Context, Event>(rawNode.invoke, state),\n on,\n });\n }\n\n return {\n context: (machine.context ?? {}) as Context,\n initial: machine.initial as State,\n states,\n };\n};\n","import { isContextRecord } from './_context.js';\nimport { warn } from './_dev.js';\nimport { type CompiledAfter, type CompiledMachine, type CompiledState, compileDefinition } from './definition.js';\nimport { ClockworkError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n Effect,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n Transition,\n TransitionResult,\n} from './types.js';\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: CompiledAfter<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: Transition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: Transition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => ({ context, state });\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkError('INVALID_SNAPSHOT_STATE', `snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent =>\n typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n\nconst stateNode = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n state: State,\n): CompiledState<State, Context, Event> => machine.states.get(state) ?? invalidSnapshot(state);\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n const state = stateNode(machine, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!state.after.includes(runtimeEvent.after)) return undefined;\n\n const { definition } = runtimeEvent.after;\n\n if (!definition.guard || definition.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: definition };\n }\n\n return undefined;\n }\n\n const candidates = state.on.get(runtimeEvent.event.type);\n\n if (!candidates) return undefined;\n\n for (const candidate of candidates) {\n const guard = candidate.guard as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event }) => boolean)\n | undefined;\n\n if (!guard || guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(machine, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot, type: 'ignored' },\n };\n }\n\n const reducer = selected.transition.reduce as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context)\n | undefined;\n const nextContext = reducer ? reducer({ context: snapshot.context, event: selected.event }) : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkError('INVALID_CONTEXT', 'a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(machine, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context, Event> = {},\n): Actor<State, Context, Event> => {\n if (\n options.maxTransitions !== undefined &&\n (!Number.isInteger(options.maxTransitions) || options.maxTransitions < 1)\n ) {\n throw new ClockworkError('INVALID_MAX_TRANSITIONS', 'maxTransitions must be a positive integer', {\n maxTransitions: options.maxTransitions,\n });\n }\n\n let current = options.snapshot ?? initialSnapshot;\n\n if (!isContextRecord(current.context)) {\n throw new ClockworkError('INVALID_CONTEXT', 'snapshot context must be a non-array object record', {});\n }\n\n if (!machine.states.has(current.state)) invalidSnapshot(current.state);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n const maxTransitions = options.maxTransitions ?? 1_000;\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n disposal.abort();\n };\n\n const report = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n let disposition: unknown = 'dispose';\n\n if (options.onError) {\n try {\n disposition = options.onError(error, context);\n } catch (handlerError) {\n dispose();\n throw handlerError;\n }\n }\n\n if (disposition !== 'continue') dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n report(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = stateNode(machine, state);\n\n for (const after of node.after) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.definition.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n report(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n report(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n report(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of listeners) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n report(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(machine, current, runtimeEvent);\n } catch (error) {\n report(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) return;\n\n const source = stateNode(machine, previous.state);\n\n current = outcome.result.snapshot;\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit, previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(stateNode(machine, current.state).entry, current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > maxTransitions) {\n report(\n new ClockworkError('INVALID_TRANSITION_LIMIT', 'maximum queued transitions exceeded', { maxTransitions }),\n { phase: 'transition', state: current.state },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(stateNode(machine, current.state).entry, current.state, undefined);\n }\n\n return {\n can: (event) => !disposed && canTransition(machine, current, event),\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n const compiled = compileDefinition(definition);\n const initialSnapshot = createSnapshot(compiled.initial, compiled.context);\n\n return {\n can: (snapshot, event) => canTransition(compiled, snapshot, event),\n createActor: (options) => createActor(compiled, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(compiled, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"mEAcA,IAAa,EAAb,cAAoC,KAAM,CACxC,KACA,QAEA,YAAY,EAA0B,EAAiB,EAAmC,CAAC,EAAG,EAAqB,CACjH,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,KAAK,KAAO,EACZ,KAAK,QAAU,OAAO,OAAO,CAAE,GAAG,CAAQ,CAAC,EAC3C,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,ECzBA,SAAgB,EAAgB,EAAkD,CAChF,GAAI,OAAO,GAAU,WAAY,GAAkB,MAAM,QAAQ,CAAK,EAAG,MAAO,GAEhF,IAAM,EAAY,OAAO,eAAe,CAAK,EAE7C,OAAO,IAAc,MAAQ,IAAc,OAAO,SACpD,CEoBA,IAAM,EAAY,GAAqD,OAAO,GAAU,YAAY,EAE9F,GAAQ,EAA8B,EAAiB,IAA4C,CACvG,MAAM,IAAI,EAAe,EAAM,EAAS,CAAO,CACjD,EAEM,GAAS,EAAgB,EAAiB,KACzC,MAAM,QAAQ,CAAK,GAAG,EAAK,qBAAsB,EAAS,CAAO,EAE/D,GAGH,GACJ,EACA,EACA,IAEe,EAAM,EAAO,GAAG,EAAM,mBAAoB,CAAE,GAAG,EAAS,OAAM,CAEtE,CAAA,CAAO,KAAK,EAAW,KACxB,OAAO,GAAc,YACvB,EAAK,iBAAkB,GAAG,EAAM,kBAAkB,EAAM,qBAAsB,CAAE,GAAG,EAAS,QAAO,OAAM,CAAC,EAGrG,EACR,EAGG,GACJ,EACA,EACA,IAEI,OAAO,GAAW,UAAY,CAAC,EAAO,IAAI,CAAe,EACpD,EAAK,iBAAkB,WAAW,OAAO,CAAM,EAAE,2BAA4B,CAAE,GAAG,EAAS,QAAO,CAAC,EAGrG,EAGH,GACJ,EACA,EACA,IACsC,CACtC,IAAM,EAAa,EAAS,CAAK,EAAI,EAAQ,EAAK,qBAAsB,iCAAkC,CAAO,EAC3G,EAAS,EAAe,EAAQ,EAAW,OAAQ,CAAO,EAUhE,OARI,EAAW,QAAU,IAAA,IAAa,OAAO,EAAW,OAAU,YAChE,EAAK,qBAAsB,sCAAuC,CAAE,GAAG,EAAS,MAAO,OAAQ,CAAC,EAG9F,EAAW,SAAW,IAAA,IAAa,OAAO,EAAW,QAAW,YAClE,EAAK,qBAAsB,wCAAyC,CAAE,GAAG,EAAS,MAAO,QAAS,CAAC,EAG9F,CACL,QACE,EAAW,UAAY,IAAA,GACnB,IAAA,GACA,EAAkC,EAAW,QAAS,UAAW,CAAO,EAC9E,MAAO,EAAW,MAClB,OAAQ,EAAW,OACnB,QACF,CACF,EAEM,GACJ,EACA,EACA,IACiD,CACjD,IAAM,EAAS,MAAM,QAAQ,CAAK,EAAI,EAAQ,CAAC,CAAK,EAIpD,OAFI,EAAO,SAAW,GAAG,EAAK,qBAAsB,uCAAwC,CAAO,EAE5F,EAAO,KAAK,EAAO,IACxB,EAAyC,EAAO,EAAQ,CAAE,GAAG,EAAS,iBAAgB,CAAC,CACzF,CACF,EAEM,GACJ,EACA,EACA,EACA,IACyC,CACzC,IAAM,EAAQ,EAAS,CAAK,EACxB,EACA,EAAK,qBAAsB,UAAU,EAAM,iCAAkC,CAAE,QAAO,OAAM,CAAC,EAC3F,EAAQ,EAAM,OAEhB,OAAO,GAAU,UAAY,CAAC,OAAO,SAAS,CAAK,GAAK,EAAQ,IAClE,EAAK,sBAAuB,UAAU,EAAM,kEAAmE,CAC7G,QACA,QACA,OACF,CAAC,EAGH,IAAM,EAAU,CAAE,QAAO,QAAO,OAAM,EAUtC,OARI,EAAM,QAAU,IAAA,IAAa,OAAO,EAAM,OAAU,YACtD,EAAK,qBAAsB,iCAAkC,CAAE,GAAG,EAAS,MAAO,OAAQ,CAAC,EAGzF,EAAM,SAAW,IAAA,IAAa,OAAO,EAAM,QAAW,YACxD,EAAK,qBAAsB,mCAAoC,CAAE,GAAG,EAAS,MAAO,QAAS,CAAC,EAGzF,CACL,WAAY,CACH,QACP,QACE,EAAM,UAAY,IAAA,GAAY,IAAA,GAAY,EAAkC,EAAM,QAAS,UAAW,CAAO,EAC/G,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,OAAQ,EAAe,EAAQ,EAAM,OAAQ,CAAO,CACtD,CACF,CACF,EAEM,GACJ,EACA,IAEA,EAAM,EAAO,UAAU,EAAM,2BAA4B,CAAE,OAAM,CAAC,CAAC,CAAC,KAAK,EAAO,IAAU,CACxF,IAAM,EAAY,EAAS,CAAK,EAC5B,EACA,EAAK,iBAAkB,iCAAkC,CAAE,QAAO,OAAM,CAAC,EAc7E,OAZI,OAAO,EAAU,KAAQ,YAC3B,EAAK,iBAAkB,gCAAiC,CAAE,QAAO,MAAO,MAAO,OAAM,CAAC,EAGpF,EAAU,SAAW,IAAA,IAAa,OAAO,EAAU,QAAW,YAChE,EAAK,iBAAkB,mCAAoC,CAAE,QAAO,MAAO,SAAU,OAAM,CAAC,EAG1F,EAAU,UAAY,IAAA,IAAa,OAAO,EAAU,SAAY,YAClE,EAAK,iBAAkB,oCAAqC,CAAE,QAAO,MAAO,UAAW,OAAM,CAAC,EAGzF,CACT,CAAC,EAGU,EAKX,GAC2C,CAC3C,IAAM,EAAM,EACN,EAAU,EAAS,CAAG,EAAI,EAAM,EAAK,qBAAsB,uCAAwC,CAAC,CAAC,EACrG,EAAY,EAAS,EAAQ,MAAM,EACrC,EAAQ,OACR,EAAK,qBAAsB,mCAAoC,CAAC,CAAC,EAC/D,EAAkB,OAAO,QAAQ,CAAS,EAC1C,EAAc,IAAI,IAAoB,CAAe,GAEvD,OAAO,EAAQ,SAAY,UAAY,CAAC,EAAY,IAAI,EAAQ,OAAgB,IAClF,EAAK,wBAAyB,kBAAkB,OAAO,EAAQ,OAAO,EAAE,mBAAoB,CAC1F,QAAS,EAAQ,OACnB,CAAC,EAGC,EAAQ,UAAY,IAAA,IAAa,CAAC,EAAgB,EAAQ,OAAO,GACnE,EAAK,kBAAmB,oDAAqD,CAAC,CAAC,EAGjF,IAAM,EAAS,IAAI,IAEnB,IAAK,GAAM,CAAC,EAAO,KAAiB,EAAiB,CACnD,IAAM,EAAU,EAAS,CAAY,EACjC,EACA,EAAK,qBAAsB,UAAU,EAAM,qBAAsB,CAAE,OAAM,CAAC,GAE1E,WAAY,GAAW,YAAa,IACtC,EAAK,qBAAsB,UAAU,EAAM,gDAAiD,CAAE,OAAM,CAAC,EAGvG,IAAM,EAAK,IAAI,IAEf,GAAI,EAAQ,KAAO,IAAA,GAAW,CAC5B,IAAM,EAAQ,EAAS,EAAQ,EAAE,EAC7B,EAAQ,GACR,EAAK,qBAAsB,UAAU,EAAM,wBAAyB,CAAE,OAAM,CAAC,EAEjF,IAAK,GAAM,CAAC,EAAM,KAAe,OAAO,QAAQ,CAAK,EACnD,EAAG,IAAI,EAAM,EAA0C,EAAY,EAAa,CAAE,QAAO,MAAK,CAAC,CAAC,CAEpG,CAEA,IAAM,EACJ,EAAQ,QAAU,IAAA,GACd,CAAC,EACD,EAAM,EAAQ,MAAO,UAAU,EAAM,0BAA2B,CAAE,OAAM,CAAC,CAAC,CAAC,KAAK,EAAO,IACrF,EAAoC,EAAO,EAAa,EAAO,CAAK,CACtE,EAEN,EAAO,IAAI,EAAO,CAChB,QACA,MAAO,EAAQ,QAAU,IAAA,GAAY,CAAC,EAAI,EAAkC,EAAQ,MAAO,QAAS,CAAE,OAAM,CAAC,EAC7G,KAAM,EAAQ,OAAS,IAAA,GAAY,CAAC,EAAI,EAAkC,EAAQ,KAAM,OAAQ,CAAE,OAAM,CAAC,EACzG,OAAQ,EAAQ,SAAW,IAAA,GAAY,CAAC,EAAI,EAA+B,EAAQ,OAAQ,CAAK,EAChG,IACF,CAAC,CACH,CAEA,MAAO,CACL,QAAU,EAAQ,SAAW,CAAC,EAC9B,QAAS,EAAQ,QACjB,QACF,CACF,EC7MM,GACJ,EACA,KACqC,CAAE,UAAS,OAAM,GAElD,EAAmB,GAA0B,CACjD,MAAM,IAAI,EAAe,yBAA0B,mBAAmB,OAAO,CAAK,EAAE,mBAAoB,CAAE,OAAM,CAAC,CACnH,EAEM,EAAkB,GACtB,OAAO,GAAU,YAAY,GAAkB,OAAQ,EAA6B,MAAS,SAEzF,GACJ,EACA,IACyC,EAAQ,OAAO,IAAI,CAAK,GAAK,EAAgB,CAAK,EAEvF,GACJ,EACA,EACA,IAC0D,CAC1D,IAAM,EAAQ,EAAU,EAAS,EAAS,KAAK,EAE/C,GAAI,EAAa,OAAS,QAAS,CACjC,GAAI,CAAC,EAAM,MAAM,SAAS,EAAa,KAAK,EAAG,OAE/C,GAAM,CAAE,cAAe,EAAa,MAMpC,MAJI,CAAC,EAAW,OAAS,EAAW,MAAM,CAAE,QAAS,EAAS,QAAS,MAAO,IAAA,EAAU,CAAC,EAChF,CAAE,MAAO,IAAA,GAAW,WAAY,CAAW,EAGpD,MACF,CAEA,IAAM,EAAa,EAAM,GAAG,IAAI,EAAa,MAAM,IAAI,EAElD,KAEL,IAAK,IAAM,KAAa,EAAY,CAClC,IAAM,EAAQ,EAAU,MAIxB,GAAI,CAAC,GAAS,EAAM,CAAE,QAAS,EAAS,QAAS,MAAO,EAAa,KAAM,CAAC,EAC1E,MAAO,CAAE,MAAO,EAAa,MAAO,WAAY,CAAU,CAE9D,CAGF,EAEM,GACJ,EACA,EACA,IAC6C,CAC7C,IAAM,EAAW,EAAiB,EAAS,EAAU,CAAY,EAEjE,GAAI,CAAC,EACH,MAAO,CACL,MAAO,EAAa,OAAS,QAAU,EAAa,MAAQ,IAAA,GAC5D,OAAQ,CAAE,WAAU,KAAM,SAAU,CACtC,EAGF,IAAM,EAAU,EAAS,WAAW,OAG9B,EAAc,EAAU,EAAQ,CAAE,QAAS,EAAS,QAAS,MAAO,EAAS,KAAM,CAAC,EAAI,EAAS,QAEvG,GAAI,CAAC,EAAgB,CAAW,EAC9B,MAAM,IAAI,EAAe,kBAAmB,kDAAmD,CAC7F,MAAO,EAAS,KAClB,CAAC,EAGH,MAAO,CACL,MAAO,EAAS,MAChB,OAAQ,CAAE,SAAU,EAAe,EAAS,WAAW,OAAQ,CAAsB,EAAG,KAAM,YAAa,EAC3G,WAAY,EAAS,UACvB,CACF,EAEM,GACJ,EACA,EACA,IACY,EAAiB,EAAS,EAAU,CAAE,QAAO,KAAM,OAAQ,CAAC,IAAM,IAAA,GAE1E,GACJ,EACA,EACA,EAA+C,CAAC,IACf,CACjC,GACE,EAAQ,iBAAmB,IAAA,KAC1B,CAAC,OAAO,UAAU,EAAQ,cAAc,GAAK,EAAQ,eAAiB,GAEvE,MAAM,IAAI,EAAe,0BAA2B,4CAA6C,CAC/F,eAAgB,EAAQ,cAC1B,CAAC,EAGH,IAAI,EAAU,EAAQ,UAAY,EAElC,GAAI,CAAC,EAAgB,EAAQ,OAAO,EAClC,MAAM,IAAI,EAAe,kBAAmB,qDAAsD,CAAC,CAAC,EAGjG,EAAQ,OAAO,IAAI,EAAQ,KAAK,GAAG,EAAgB,EAAQ,KAAK,EAErE,IAAM,EAAY,IAAI,IAChB,EAAW,IAAI,gBACf,EAAS,IAAI,IACb,EAAU,IAAI,IACd,EAA+C,CAAC,EAChD,EAAiB,EAAQ,gBAAkB,IAC7C,EAAW,GACX,EAAa,GAEX,MAAmC,CACvC,IAAK,IAAM,KAAS,EAAQ,aAAa,CAAK,EAC9C,EAAO,MAAM,EAEb,IAAK,IAAM,KAAc,EAAS,EAAW,MAAM,EACnD,EAAQ,MAAM,CAChB,EAEM,MAAsB,CACtB,IAEJ,EAAW,GACX,EAAM,OAAS,EACf,EAAqB,EACrB,EAAU,MAAM,EAChB,EAAS,MAAM,EACjB,EAEM,GAAU,EAAgB,IAAmD,CACjF,IAAI,EAAuB,UAE3B,GAAI,EAAQ,QACV,GAAI,CACF,EAAc,EAAQ,QAAQ,EAAO,CAAO,CAC9C,OAAS,EAAc,CAErB,MADA,EAAQ,EACF,CACR,CAGE,IAAgB,YAAY,EAAQ,CAC1C,EAEM,EAAO,GAA4D,CACnE,MAEJ,IAAI,EAAY,CACd,EAAM,KAAK,CAAY,EAEvB,MACF,CAEA,EAAa,GAEb,GAAI,CACF,EAAQ,CAAY,EACpB,EAAM,CACR,QAAU,CACR,EAAa,EACf,CATA,CAUF,EAEM,EAAQ,GAAuB,CAC/B,GAEC,EAAe,CAAK,GAMzB,EAAI,CAAE,QAAO,KAAM,OAAQ,CAAC,CAC9B,EAEM,GAAc,EAA4C,EAAc,IAAmC,CAC/G,IAAK,IAAM,KAAU,EAAS,CAC5B,GAAI,EAAU,OAEd,GAAI,CACF,EAAO,CAAE,QAAS,EAAQ,QAAS,QAAO,OAAM,OAAQ,EAAS,MAAO,CAAC,CAC3E,OAAS,EAAO,CACd,EAAO,EAAO,CAAE,QAAO,MAAO,SAAU,OAAM,CAAC,CACjD,CACF,CACF,EAEM,GAA2B,EAAc,IAAmC,CAChF,IAAM,EAAO,EAAU,EAAS,CAAK,EAErC,IAAK,IAAM,KAAS,EAAK,MAAO,CAC9B,IAAM,EAAQ,eAAiB,CAC7B,EAAO,OAAO,CAAK,EACnB,EAAI,CAAE,QAAO,KAAM,OAAQ,CAAC,CAC9B,EAAG,EAAM,WAAW,KAAK,EAEzB,EAAO,IAAI,CAAK,CAClB,CAEA,IAAK,IAAM,KAAU,EAAK,OAAQ,CAChC,IAAM,EAAa,IAAI,gBAEvB,EAAQ,IAAI,CAAU,EAEtB,IAAM,EAAkB,EAAQ,QAC1B,EAAgB,EAEtB,QAAa,QAAQ,CAAC,CACnB,SAAW,EAAO,IAAI,CAAE,QAAS,EAAiB,MAAO,EAAe,OAAQ,EAAW,MAAO,CAAC,CAAC,CAAC,CACrG,KACE,GAAW,CACV,KAAQ,OAAO,CAAU,EAErB,KAAY,EAAW,OAAO,SAAW,CAAC,EAAO,QAErD,GAAI,CACF,EAAK,EAAO,OAAO,CAAE,QAAS,EAAiB,QAAO,CAAC,CAAC,CAC1D,OAAS,EAAO,CACd,EAAO,EAAO,CAAE,MAAO,EAAe,MAAO,SAAU,OAAM,CAAC,CAChE,CACF,EACC,GAAmB,CAClB,KAAQ,OAAO,CAAU,EAErB,KAAY,EAAW,OAAO,SAElC,GAAI,CACE,EAAO,QACT,EAAK,EAAO,QAAQ,CAAE,QAAS,EAAiB,OAAM,CAAC,CAAC,EAExD,EAAO,EAAO,CAAE,MAAO,EAAe,MAAO,SAAU,OAAM,CAAC,CAElE,OAAS,EAAe,CACtB,EAAO,EAAe,CAAE,MAAO,EAAe,MAAO,SAAU,OAAM,CAAC,CACxE,CACF,CACF,CACJ,CACF,EAEM,EAAU,GAAmC,CACjD,IAAK,IAAM,KAAY,EAAW,CAChC,GAAI,EAAU,OAEd,GAAI,CACF,EAAS,CAAO,CAClB,OAAS,EAAO,CACd,EAAO,EAAO,CAAE,QAAO,MAAO,aAAc,MAAO,EAAQ,KAAM,CAAC,CACpE,CACF,CACF,EAEM,EAAW,GAA4D,CAC3E,IAAM,EAAW,EACb,EAEJ,GAAI,CACF,EAAU,EAAW,EAAS,EAAS,CAAY,CACrD,OAAS,EAAO,CACd,EAAO,EAAO,CACZ,MAAO,EAAa,OAAS,QAAU,EAAa,MAAQ,IAAA,GAC5D,MAAO,aACP,MAAO,EAAQ,KACjB,CAAC,EAED,MACF,CAEA,GAAI,EAAQ,OAAO,OAAS,WAAa,CAAC,EAAQ,WAAY,OAE9D,IAAM,EAAS,EAAU,EAAS,EAAS,KAAK,EAEhD,EAAU,EAAQ,OAAO,SACzB,EAAqB,EACrB,EAAwB,EAAQ,MAAO,EAAQ,KAAK,EACpD,EAAO,EAAQ,KAAK,EACpB,EAAW,EAAO,KAAM,EAAS,MAAO,EAAQ,KAAK,EACrD,EAAW,EAAQ,WAAW,SAAW,CAAC,EAAG,EAAS,MAAO,EAAQ,KAAK,EAC1E,EAAW,EAAU,EAAS,EAAQ,KAAK,CAAC,CAAC,MAAO,EAAQ,MAAO,EAAQ,KAAK,CAClF,EAEM,MAAoB,CACxB,IAAI,EAAc,EAElB,KAAO,EAAM,OAAS,GAAK,CAAC,GAAU,CAGpC,GAFA,GAAe,EAEX,EAAc,EAAgB,CAChC,EACE,IAAI,EAAe,2BAA4B,sCAAuC,CAAE,gBAAe,CAAC,EACxG,CAAE,MAAO,aAAc,MAAO,EAAQ,KAAM,CAC9C,EAEA,MACF,CAEA,IAAM,EAAO,EAAM,MAAM,EAErB,GAAM,EAAQ,CAAI,CACxB,CACF,EAQA,OANA,EAAwB,EAAQ,MAAO,IAAA,EAAS,EAE3C,EAAQ,UACX,EAAW,EAAU,EAAS,EAAQ,KAAK,CAAC,CAAC,MAAO,EAAQ,MAAO,IAAA,EAAS,EAGvE,CACL,IAAM,GAAU,CAAC,GAAY,EAAc,EAAS,EAAS,CAAK,EAClE,IAAI,gBAAiB,CACnB,OAAO,EAAS,MAClB,EACA,UACA,IAAI,UAAW,CACb,OAAO,CACT,EACA,OACA,IAAI,UAAW,CACb,OAAO,CACT,EACA,UAAU,EAAU,CAKlB,OAJI,MAAuB,IAAA,IAE3B,EAAU,IAAI,CAAQ,MAET,EAAU,OAAO,CAAQ,EACxC,GACC,OAAO,SAAU,CACpB,CACF,EAGa,MAEY,GAAqF,CAC1G,IAAM,EAAW,EAAkB,CAAU,EACvC,EAAkB,EAAe,EAAS,QAAS,EAAS,OAAO,EAEzE,MAAO,CACL,KAAM,EAAU,IAAU,EAAc,EAAU,EAAU,CAAK,EACjE,YAAc,GAAY,EAAY,EAAU,EAAiB,CAAO,EACxE,kBACA,YAAa,EAAU,IAAU,EAAW,EAAU,EAAU,CAAE,QAAO,KAAM,OAAQ,CAAC,CAAC,CAAC,MAC5F,CACF"}
1
+ {"version":3,"file":"clockwork.cjs","names":[],"sources":["../src/errors.ts","../src/_context.ts","../src/_dev.ts","../src/definition.ts","../src/interpret.ts"],"sourcesContent":["export type ClockworkErrorCode =\n | 'INVALID_AFTER_DELAY'\n | 'INVALID_CONTEXT'\n | 'INVALID_DEFINITION'\n | 'INVALID_EFFECT'\n | 'INVALID_INITIAL_STATE'\n | 'INVALID_INVOKE'\n | 'INVALID_MAX_TRANSITIONS'\n | 'INVALID_SNAPSHOT_STATE'\n | 'INVALID_TRANSITION'\n | 'INVALID_TRANSITION_LIMIT'\n | 'UNKNOWN_TARGET';\n\n/** A Clockwork failure with a stable machine-readable code and contextual details. */\nexport class ClockworkError extends Error {\n private static readonly errorName = 'ClockworkError';\n readonly code: ClockworkErrorCode;\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(code: ClockworkErrorCode, message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = ClockworkError.errorName;\n this.code = code;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function isContextRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { isContextRecord } from './_context.js';\nimport { ClockworkError } from './errors.js';\nimport type { After, Effect, Invoke, MachineConfig, MachineEvent, Transition } from './types.js';\n\nexport type CompiledAfter<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly definition: After<State, Context, Event>;\n};\n\nexport type CompiledState<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: readonly CompiledAfter<State, Context, Event>[];\n readonly entry: readonly Effect<Context, Event>[];\n readonly exit: readonly Effect<Context, Event>[];\n readonly invoke: readonly Invoke<Context, Event>[];\n readonly on: ReadonlyMap<string, readonly Transition<State, Context, Event>[]>;\n};\n\nexport type CompiledMachine<\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n> = {\n readonly context: Context;\n readonly initial: State;\n readonly states: ReadonlyMap<State, CompiledState<State, Context, Event>>;\n};\n\nconst MAX_TIMER_MS = 2_147_483_647;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst fail = (code: ClockworkError['code'], message: string, details: Record<string, unknown>): never => {\n throw new ClockworkError(code, message, details);\n};\n\nconst array = (value: unknown, message: string, details: Record<string, unknown>): readonly unknown[] => {\n if (!Array.isArray(value)) fail('INVALID_DEFINITION', message, details);\n\n return value as readonly unknown[];\n};\n\nconst functions = <Value>(\n value: unknown,\n phase: 'effects' | 'entry' | 'exit',\n details: Record<string, unknown>,\n): readonly Value[] => {\n const values = array(value, `${phase} must be an array`, { ...details, phase });\n\n return values.map((candidate, index) => {\n if (typeof candidate !== 'function') {\n fail('INVALID_EFFECT', `${phase} entry at index ${index} must be a function`, { ...details, index, phase });\n }\n\n return candidate as Value;\n });\n};\n\nconst validateTarget = <State extends string>(\n states: ReadonlyMap<State, unknown>,\n target: unknown,\n details: Record<string, unknown>,\n): State => {\n if (typeof target !== 'string' || !states.has(target as State)) {\n return fail('UNKNOWN_TARGET', `target \"${String(target)}\" is not a declared state`, { ...details, target });\n }\n\n return target as State;\n};\n\nconst compileTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): Transition<State, Context, Event> => {\n const transition = isRecord(input) ? input : fail('INVALID_TRANSITION', 'a transition must be an object', details);\n const target = validateTarget(states, transition.target, details);\n\n if (transition.guard !== undefined && typeof transition.guard !== 'function') {\n fail('INVALID_TRANSITION', 'transition guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (transition.reduce !== undefined && typeof transition.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'transition reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n effects:\n transition.effects === undefined\n ? undefined\n : functions<Effect<Context, Event>>(transition.effects, 'effects', details),\n guard: transition.guard as Transition<State, Context, Event>['guard'],\n reduce: transition.reduce as Transition<State, Context, Event>['reduce'],\n target,\n };\n};\n\nconst compileTransitions = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): readonly Transition<State, Context, Event>[] => {\n const values = Array.isArray(input) ? input : [input];\n\n if (values.length === 0) fail('INVALID_TRANSITION', 'a transition array must not be empty', details);\n\n return values.map((value, transitionIndex) =>\n compileTransition<State, Context, Event>(value, states, { ...details, transitionIndex }),\n );\n};\n\nconst compileAfter = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n index: number,\n state: State,\n): CompiledAfter<State, Context, Event> => {\n const after = isRecord(input)\n ? input\n : fail('INVALID_TRANSITION', `state \"${state}\" after entries must be objects`, { index, state });\n const delay = after.delay;\n\n if (typeof delay !== 'number' || !Number.isFinite(delay) || delay < 0 || delay > MAX_TIMER_MS) {\n fail('INVALID_AFTER_DELAY', `state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay,\n index,\n state,\n });\n }\n\n const details = { delay, index, state };\n\n if (after.guard !== undefined && typeof after.guard !== 'function') {\n fail('INVALID_TRANSITION', 'after guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (after.reduce !== undefined && typeof after.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'after reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n definition: {\n delay: delay as number,\n effects:\n after.effects === undefined ? undefined : functions<Effect<Context, Event>>(after.effects, 'effects', details),\n guard: after.guard as After<State, Context, Event>['guard'],\n reduce: after.reduce as After<State, Context, Event>['reduce'],\n target: validateTarget(states, after.target, details),\n },\n };\n};\n\nconst compileInvokes = <Context extends Record<string, unknown>, Event extends MachineEvent>(\n value: unknown,\n state: string,\n): readonly Invoke<Context, Event>[] =>\n array(value, `state \"${state}\" invoke must be an array`, { state }).map((value, index) => {\n const candidate = isRecord(value)\n ? value\n : fail('INVALID_INVOKE', 'invoke entry must be an object', { index, state });\n\n if (typeof candidate.src !== 'function') {\n fail('INVALID_INVOKE', 'invoke src must be a function', { index, phase: 'src', state });\n }\n\n if (candidate.onDone !== undefined && typeof candidate.onDone !== 'function') {\n fail('INVALID_INVOKE', 'invoke onDone must be a function', { index, phase: 'onDone', state });\n }\n\n if (candidate.onError !== undefined && typeof candidate.onError !== 'function') {\n fail('INVALID_INVOKE', 'invoke onError must be a function', { index, phase: 'onError', state });\n }\n\n return {\n onDone: candidate.onDone as Invoke<Context, Event>['onDone'],\n onError: candidate.onError as Invoke<Context, Event>['onError'],\n src: candidate.src as Invoke<Context, Event>['src'],\n };\n });\n\n/** Validates and structurally compiles a flat machine definition once. */\nexport const compileDefinition = <\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n>(\n definition: MachineConfig<State, Context, Event>,\n): CompiledMachine<State, Context, Event> => {\n const raw = definition as unknown;\n const machine = isRecord(raw) ? raw : fail('INVALID_DEFINITION', 'machine definition must be an object', {});\n const rawStates = isRecord(machine.states)\n ? machine.states\n : fail('INVALID_DEFINITION', 'machine states must be an object', {});\n const rawStateEntries = Object.entries(rawStates) as [State, unknown][];\n const rawStateMap = new Map<State, unknown>(rawStateEntries);\n\n if (typeof machine.initial !== 'string' || !rawStateMap.has(machine.initial as State)) {\n fail('INVALID_INITIAL_STATE', `initial state \"${String(machine.initial)}\" is not declared`, {\n initial: machine.initial,\n });\n }\n\n if (machine.context !== undefined && !isContextRecord(machine.context)) {\n fail('INVALID_CONTEXT', 'machine context must be a non-array object record', {});\n }\n\n const states = new Map<State, CompiledState<State, Context, Event>>();\n\n for (const [state, rawNodeValue] of rawStateEntries) {\n const rawNode = isRecord(rawNodeValue)\n ? rawNodeValue\n : fail('INVALID_DEFINITION', `state \"${state}\" must be an object`, { state });\n\n if ('states' in rawNode || 'initial' in rawNode) {\n fail('INVALID_DEFINITION', `state \"${state}\" must be flat and cannot declare child states`, { state });\n }\n\n const on = new Map<string, readonly Transition<State, Context, Event>[]>();\n\n if (rawNode.on !== undefined) {\n const rawOn = isRecord(rawNode.on)\n ? rawNode.on\n : fail('INVALID_TRANSITION', `state \"${state}\" on must be an object`, { state });\n\n for (const [type, transition] of Object.entries(rawOn)) {\n on.set(type, compileTransitions<State, Context, Event>(transition, rawStateMap, { state, type }));\n }\n }\n\n const after =\n rawNode.after === undefined\n ? []\n : array(rawNode.after, `state \"${state}\" after must be an array`, { state }).map((entry, index) =>\n compileAfter<State, Context, Event>(entry, rawStateMap, index, state),\n );\n\n states.set(state, {\n after,\n entry: rawNode.entry === undefined ? [] : functions<Effect<Context, Event>>(rawNode.entry, 'entry', { state }),\n exit: rawNode.exit === undefined ? [] : functions<Effect<Context, Event>>(rawNode.exit, 'exit', { state }),\n invoke: rawNode.invoke === undefined ? [] : compileInvokes<Context, Event>(rawNode.invoke, state),\n on,\n });\n }\n\n return {\n context: (machine.context ?? {}) as Context,\n initial: machine.initial as State,\n states,\n };\n};\n","import { isContextRecord } from './_context.js';\nimport { warn } from './_dev.js';\nimport { type CompiledAfter, type CompiledMachine, type CompiledState, compileDefinition } from './definition.js';\nimport { ClockworkError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n Effect,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n TransitionResult,\n} from './types.js';\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: CompiledAfter<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkError('INVALID_SNAPSHOT_STATE', `snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent => {\n try {\n return typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n } catch {\n return false;\n }\n};\n\nconst stateNode = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n state: State,\n): CompiledState<State, Context, Event> => machine.states.get(state) ?? invalidSnapshot(state);\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkError('INVALID_CONTEXT', 'snapshot context must be a non-array object record', {});\n }\n\n stateNode(machine, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(machine, snapshot);\n const state = stateNode(machine, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!state.after.includes(runtimeEvent.after)) return undefined;\n\n const { definition } = runtimeEvent.after;\n\n if (!definition.guard || definition.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: definition as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const candidates = state.on.get(runtimeEvent.event.type);\n\n if (!candidates) return undefined;\n\n for (const candidate of candidates) {\n const guard = candidate.guard as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event }) => boolean)\n | undefined;\n\n if (!guard || guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return {\n event: runtimeEvent.event,\n transition: candidate as unknown as ExecutableTransition<State, Context, Event>,\n };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(machine, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const reducer = selected.transition.reduce as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context)\n | undefined;\n const nextContext = reducer ? reducer({ context: snapshot.context, event: selected.event }) : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkError('INVALID_CONTEXT', 'a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(machine, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context, Event> = {},\n): Actor<State, Context, Event> => {\n if (\n options.maxTransitions !== undefined &&\n (!Number.isInteger(options.maxTransitions) || options.maxTransitions < 1)\n ) {\n throw new ClockworkError('INVALID_MAX_TRANSITIONS', 'maxTransitions must be a positive integer', {\n maxTransitions: options.maxTransitions,\n });\n }\n\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(machine, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n const maxTransitions = options.maxTransitions ?? 1_000;\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n try {\n options.onError?.(error, context);\n } catch {}\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = stateNode(machine, state);\n\n for (const after of node.after) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.definition.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(machine, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) return;\n\n const source = stateNode(machine, previous.state);\n\n current = outcome.result.snapshot;\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit, previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(stateNode(machine, current.state).entry, current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > maxTransitions) {\n fail(\n new ClockworkError('INVALID_TRANSITION_LIMIT', 'maximum queued transitions exceeded', { maxTransitions }),\n { phase: 'transition', state: current.state },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(stateNode(machine, current.state).entry, current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(machine, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n const compiled = compileDefinition(definition);\n const initialSnapshot = createSnapshot(compiled.initial, compiled.context);\n\n return {\n can: (snapshot, event) => canTransition(compiled, snapshot, event),\n createActor: (options) => createActor(compiled, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(compiled, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var Clockwork=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=class extends Error{code;details;constructor(e,t,n={},r){super(t,r),this.name=new.target.name,this.code=e,this.details=Object.freeze({...n}),Object.setPrototypeOf(this,new.target.prototype)}};function n(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}var r=e=>typeof e==`object`&&!!e,i=(e,n,r)=>{throw new t(e,n,r)},a=(e,t,n)=>(Array.isArray(e)||i(`INVALID_DEFINITION`,t,n),e),o=(e,t,n)=>a(e,`${t} must be an array`,{...n,phase:t}).map((e,r)=>(typeof e!=`function`&&i(`INVALID_EFFECT`,`${t} entry at index ${r} must be a function`,{...n,index:r,phase:t}),e)),s=(e,t,n)=>typeof t!=`string`||!e.has(t)?i(`UNKNOWN_TARGET`,`target "${String(t)}" is not a declared state`,{...n,target:t}):t,c=(e,t,n)=>{let a=r(e)?e:i(`INVALID_TRANSITION`,`a transition must be an object`,n),c=s(t,a.target,n);return a.guard!==void 0&&typeof a.guard!=`function`&&i(`INVALID_TRANSITION`,`transition guard must be a function`,{...n,phase:`guard`}),a.reduce!==void 0&&typeof a.reduce!=`function`&&i(`INVALID_TRANSITION`,`transition reducer must be a function`,{...n,phase:`reduce`}),{effects:a.effects===void 0?void 0:o(a.effects,`effects`,n),guard:a.guard,reduce:a.reduce,target:c}},l=(e,t,n)=>{let r=Array.isArray(e)?e:[e];return r.length===0&&i(`INVALID_TRANSITION`,`a transition array must not be empty`,n),r.map((e,r)=>c(e,t,{...n,transitionIndex:r}))},u=(e,t,n,a)=>{let c=r(e)?e:i(`INVALID_TRANSITION`,`state "${a}" after entries must be objects`,{index:n,state:a}),l=c.delay;(typeof l!=`number`||!Number.isFinite(l)||l<0)&&i(`INVALID_AFTER_DELAY`,`state "${a}" after delay must be a finite number greater than or equal to 0`,{delay:l,index:n,state:a});let u={delay:l,index:n,state:a};return c.guard!==void 0&&typeof c.guard!=`function`&&i(`INVALID_TRANSITION`,`after guard must be a function`,{...u,phase:`guard`}),c.reduce!==void 0&&typeof c.reduce!=`function`&&i(`INVALID_TRANSITION`,`after reducer must be a function`,{...u,phase:`reduce`}),{definition:{delay:l,effects:c.effects===void 0?void 0:o(c.effects,`effects`,u),guard:c.guard,reduce:c.reduce,target:s(t,c.target,u)}}},d=(e,t)=>a(e,`state "${t}" invoke must be an array`,{state:t}).map((e,n)=>{let a=r(e)?e:i(`INVALID_INVOKE`,`invoke entry must be an object`,{index:n,state:t});return typeof a.src!=`function`&&i(`INVALID_INVOKE`,`invoke src must be a function`,{index:n,phase:`src`,state:t}),a.onDone!==void 0&&typeof a.onDone!=`function`&&i(`INVALID_INVOKE`,`invoke onDone must be a function`,{index:n,phase:`onDone`,state:t}),a.onError!==void 0&&typeof a.onError!=`function`&&i(`INVALID_INVOKE`,`invoke onError must be a function`,{index:n,phase:`onError`,state:t}),a}),f=e=>{let t=e,s=r(t)?t:i(`INVALID_DEFINITION`,`machine definition must be an object`,{}),c=r(s.states)?s.states:i(`INVALID_DEFINITION`,`machine states must be an object`,{}),f=Object.entries(c),p=new Map(f);(typeof s.initial!=`string`||!p.has(s.initial))&&i(`INVALID_INITIAL_STATE`,`initial state "${String(s.initial)}" is not declared`,{initial:s.initial}),s.context!==void 0&&!n(s.context)&&i(`INVALID_CONTEXT`,`machine context must be a non-array object record`,{});let m=new Map;for(let[e,t]of f){let n=r(t)?t:i(`INVALID_DEFINITION`,`state "${e}" must be an object`,{state:e});(`states`in n||`initial`in n)&&i(`INVALID_DEFINITION`,`state "${e}" must be flat and cannot declare child states`,{state:e});let s=new Map;if(n.on!==void 0){let t=r(n.on)?n.on:i(`INVALID_TRANSITION`,`state "${e}" on must be an object`,{state:e});for(let[n,r]of Object.entries(t))s.set(n,l(r,p,{state:e,type:n}))}let c=n.after===void 0?[]:a(n.after,`state "${e}" after must be an array`,{state:e}).map((t,n)=>u(t,p,n,e));m.set(e,{after:c,entry:n.entry===void 0?[]:o(n.entry,`entry`,{state:e}),exit:n.exit===void 0?[]:o(n.exit,`exit`,{state:e}),invoke:n.invoke===void 0?[]:d(n.invoke,e),on:s})}return{context:s.context??{},initial:s.initial,states:m}},p=(e,t)=>({context:t,state:e}),m=e=>{throw new t(`INVALID_SNAPSHOT_STATE`,`snapshot state "${String(e)}" is not declared`,{state:e})},h=e=>typeof e==`object`&&!!e&&typeof e.type==`string`,g=(e,t)=>e.states.get(t)??m(t),_=(e,t,n)=>{let r=g(e,t.state);if(n.kind===`after`){if(!r.after.includes(n.after))return;let{definition:e}=n.after;return!e.guard||e.guard({context:t.context,event:void 0})?{event:void 0,transition:e}:void 0}let i=r.on.get(n.event.type);if(i)for(let e of i){let r=e.guard;if(!r||r({context:t.context,event:n.event}))return{event:n.event,transition:e}}},v=(e,r,i)=>{let a=_(e,r,i);if(!a)return{event:i.kind===`event`?i.event:void 0,result:{snapshot:r,type:`ignored`}};let o=a.transition.reduce,s=o?o({context:r.context,event:a.event}):r.context;if(!n(s))throw new t(`INVALID_CONTEXT`,`a reducer must return a non-array object record`,{state:r.state});return{event:a.event,result:{snapshot:p(a.transition.target,s),type:`transition`},transition:a.transition}},y=(e,t,n)=>_(e,t,{event:n,kind:`event`})!==void 0,b=(e,r,i={})=>{if(i.maxTransitions!==void 0&&(!Number.isInteger(i.maxTransitions)||i.maxTransitions<1))throw new t(`INVALID_MAX_TRANSITIONS`,`maxTransitions must be a positive integer`,{maxTransitions:i.maxTransitions});let a=i.snapshot??r;if(!n(a.context))throw new t(`INVALID_CONTEXT`,`snapshot context must be a non-array object record`,{});e.states.has(a.state)||m(a.state);let o=new Set,s=new AbortController,c=new Set,l=new Set,u=[],d=i.maxTransitions??1e3,f=!1,p=!1,_=()=>{for(let e of c)clearTimeout(e);c.clear();for(let e of l)e.abort();l.clear()},b=()=>{f||(f=!0,u.length=0,_(),o.clear(),s.abort())},x=(e,t)=>{let n=`dispose`;if(i.onError)try{n=i.onError(e,t)}catch(e){throw b(),e}n!==`continue`&&b()},S=e=>{if(!f){if(p){u.push(e);return}p=!0;try{D(e),O()}finally{p=!1}}},C=e=>{f||h(e)&&S({event:e,kind:`event`})},w=(e,t,n)=>{for(let r of e){if(f)return;try{r({context:a.context,event:n,send:C,signal:s.signal})}catch(e){x(e,{event:n,phase:`effect`,state:t})}}},T=(t,n)=>{let r=g(e,t);for(let e of r.after){let t=setTimeout(()=>{c.delete(t),S({after:e,kind:`after`})},e.definition.delay);c.add(t)}for(let e of r.invoke){let r=new AbortController;l.add(r);let i=a.context,o=n;Promise.resolve().then(()=>e.src({context:i,event:o,signal:r.signal})).then(n=>{if(l.delete(r),!(f||r.signal.aborted||!e.onDone))try{C(e.onDone({context:i,result:n}))}catch(e){x(e,{event:o,phase:`invoke`,state:t})}},n=>{if(l.delete(r),!(f||r.signal.aborted))try{e.onError?C(e.onError({context:i,error:n})):x(n,{event:o,phase:`invoke`,state:t})}catch(e){x(e,{event:o,phase:`invoke`,state:t})}})}},E=e=>{for(let t of o){if(f)return;try{t(a)}catch(t){x(t,{event:e,phase:`subscriber`,state:a.state})}}},D=t=>{let n=a,r;try{r=v(e,a,t)}catch(e){x(e,{event:t.kind===`event`?t.event:void 0,phase:`transition`,state:a.state});return}if(r.result.type===`ignored`||!r.transition)return;let i=g(e,n.state);a=r.result.snapshot,_(),T(a.state,r.event),E(r.event),w(i.exit,n.state,r.event),w(r.transition.effects??[],n.state,r.event),w(g(e,a.state).entry,a.state,r.event)},O=()=>{let e=0;for(;u.length>0&&!f;){if(e+=1,e>d){x(new t(`INVALID_TRANSITION_LIMIT`,`maximum queued transitions exceeded`,{maxTransitions:d}),{phase:`transition`,state:a.state});return}let n=u.shift();n&&D(n)}};return T(a.state,void 0),i.snapshot||w(g(e,a.state).entry,a.state,void 0),{can:t=>!f&&y(e,a,t),get disposalSignal(){return s.signal},dispose:b,get disposed(){return f},send:C,get snapshot(){return a},subscribe(e){return f?()=>void 0:(o.add(e),()=>o.delete(e))},[Symbol.dispose]:b}};return e.ClockworkError=t,e.defineMachine=()=>e=>{let t=f(e),n=p(t.initial,t.context);return{can:(e,n)=>y(t,e,n),createActor:e=>b(t,n,e),initialSnapshot:n,transition:(e,n)=>v(t,e,{event:n,kind:`event`}).result}},e})({});
1
+ var Clockwork=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=class e extends Error{static errorName=`ClockworkError`;code;details;constructor(t,n,r={},i){super(n,i),this.name=e.errorName,this.code=t,this.details=Object.freeze({...r}),Object.setPrototypeOf(this,new.target.prototype)}};function n(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}var r=2147483647,i=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null},a=(e,n,r)=>{throw new t(e,n,r)},o=(e,t,n)=>(Array.isArray(e)||a(`INVALID_DEFINITION`,t,n),e),s=(e,t,n)=>o(e,`${t} must be an array`,{...n,phase:t}).map((e,r)=>(typeof e!=`function`&&a(`INVALID_EFFECT`,`${t} entry at index ${r} must be a function`,{...n,index:r,phase:t}),e)),c=(e,t,n)=>typeof t!=`string`||!e.has(t)?a(`UNKNOWN_TARGET`,`target "${String(t)}" is not a declared state`,{...n,target:t}):t,l=(e,t,n)=>{let r=i(e)?e:a(`INVALID_TRANSITION`,`a transition must be an object`,n),o=c(t,r.target,n);return r.guard!==void 0&&typeof r.guard!=`function`&&a(`INVALID_TRANSITION`,`transition guard must be a function`,{...n,phase:`guard`}),r.reduce!==void 0&&typeof r.reduce!=`function`&&a(`INVALID_TRANSITION`,`transition reducer must be a function`,{...n,phase:`reduce`}),{effects:r.effects===void 0?void 0:s(r.effects,`effects`,n),guard:r.guard,reduce:r.reduce,target:o}},u=(e,t,n)=>{let r=Array.isArray(e)?e:[e];return r.length===0&&a(`INVALID_TRANSITION`,`a transition array must not be empty`,n),r.map((e,r)=>l(e,t,{...n,transitionIndex:r}))},d=(e,t,n,o)=>{let l=i(e)?e:a(`INVALID_TRANSITION`,`state "${o}" after entries must be objects`,{index:n,state:o}),u=l.delay;(typeof u!=`number`||!Number.isFinite(u)||u<0||u>r)&&a(`INVALID_AFTER_DELAY`,`state "${o}" after delay must be between 0 and ${r}`,{delay:u,index:n,state:o});let d={delay:u,index:n,state:o};return l.guard!==void 0&&typeof l.guard!=`function`&&a(`INVALID_TRANSITION`,`after guard must be a function`,{...d,phase:`guard`}),l.reduce!==void 0&&typeof l.reduce!=`function`&&a(`INVALID_TRANSITION`,`after reducer must be a function`,{...d,phase:`reduce`}),{definition:{delay:u,effects:l.effects===void 0?void 0:s(l.effects,`effects`,d),guard:l.guard,reduce:l.reduce,target:c(t,l.target,d)}}},f=(e,t)=>o(e,`state "${t}" invoke must be an array`,{state:t}).map((e,n)=>{let r=i(e)?e:a(`INVALID_INVOKE`,`invoke entry must be an object`,{index:n,state:t});return typeof r.src!=`function`&&a(`INVALID_INVOKE`,`invoke src must be a function`,{index:n,phase:`src`,state:t}),r.onDone!==void 0&&typeof r.onDone!=`function`&&a(`INVALID_INVOKE`,`invoke onDone must be a function`,{index:n,phase:`onDone`,state:t}),r.onError!==void 0&&typeof r.onError!=`function`&&a(`INVALID_INVOKE`,`invoke onError must be a function`,{index:n,phase:`onError`,state:t}),{onDone:r.onDone,onError:r.onError,src:r.src}}),p=e=>{let t=e,r=i(t)?t:a(`INVALID_DEFINITION`,`machine definition must be an object`,{}),c=i(r.states)?r.states:a(`INVALID_DEFINITION`,`machine states must be an object`,{}),l=Object.entries(c),p=new Map(l);(typeof r.initial!=`string`||!p.has(r.initial))&&a(`INVALID_INITIAL_STATE`,`initial state "${String(r.initial)}" is not declared`,{initial:r.initial}),r.context!==void 0&&!n(r.context)&&a(`INVALID_CONTEXT`,`machine context must be a non-array object record`,{});let m=new Map;for(let[e,t]of l){let n=i(t)?t:a(`INVALID_DEFINITION`,`state "${e}" must be an object`,{state:e});(`states`in n||`initial`in n)&&a(`INVALID_DEFINITION`,`state "${e}" must be flat and cannot declare child states`,{state:e});let r=new Map;if(n.on!==void 0){let t=i(n.on)?n.on:a(`INVALID_TRANSITION`,`state "${e}" on must be an object`,{state:e});for(let[n,i]of Object.entries(t))r.set(n,u(i,p,{state:e,type:n}))}let c=n.after===void 0?[]:o(n.after,`state "${e}" after must be an array`,{state:e}).map((t,n)=>d(t,p,n,e));m.set(e,{after:c,entry:n.entry===void 0?[]:s(n.entry,`entry`,{state:e}),exit:n.exit===void 0?[]:s(n.exit,`exit`,{state:e}),invoke:n.invoke===void 0?[]:f(n.invoke,e),on:r})}return{context:r.context??{},initial:r.initial,states:m}},m=(e,t)=>{let n=Object.assign(Object.create(Object.getPrototypeOf(t)),t);return Object.freeze({context:Object.freeze(n),state:e})},h=e=>Object.isFrozen(e)&&Object.isFrozen(e.context)?e:m(e.state,e.context),g=e=>{throw new t(`INVALID_SNAPSHOT_STATE`,`snapshot state "${String(e)}" is not declared`,{state:e})},_=e=>{try{return typeof e==`object`&&!!e&&typeof e.type==`string`}catch{return!1}},v=(e,t)=>e.states.get(t)??g(t),y=(e,r)=>{if(!n(r.context))throw new t(`INVALID_CONTEXT`,`snapshot context must be a non-array object record`,{});v(e,r.state)},b=(e,t,n)=>{y(e,t);let r=v(e,t.state);if(n.kind===`after`){if(!r.after.includes(n.after))return;let{definition:e}=n.after;return!e.guard||e.guard({context:t.context,event:void 0})?{event:void 0,transition:e}:void 0}let i=r.on.get(n.event.type);if(i)for(let e of i){let r=e.guard;if(!r||r({context:t.context,event:n.event}))return{event:n.event,transition:e}}},x=(e,r,i)=>{let a=b(e,r,i);if(!a)return{event:i.kind===`event`?i.event:void 0,result:{snapshot:h(r),type:`ignored`}};let o=a.transition.reduce,s=o?o({context:r.context,event:a.event}):r.context;if(!n(s))throw new t(`INVALID_CONTEXT`,`a reducer must return a non-array object record`,{state:r.state});return{event:a.event,result:{snapshot:m(a.transition.target,s),type:`transition`},transition:a.transition}},S=(e,t,n)=>b(e,t,{event:n,kind:`event`})!==void 0,C=(e,n,r={})=>{if(r.maxTransitions!==void 0&&(!Number.isInteger(r.maxTransitions)||r.maxTransitions<1))throw new t(`INVALID_MAX_TRANSITIONS`,`maxTransitions must be a positive integer`,{maxTransitions:r.maxTransitions});let i=r.snapshot??n;y(e,i);let a=m(i.state,i.context),o=new Set,s=new AbortController,c=new Set,l=new Set,u=[],d=r.maxTransitions??1e3,f=!1,p=!1,h=()=>{for(let e of c)clearTimeout(e);c.clear();for(let e of l)e.abort();l.clear()},g=()=>{f||(f=!0,u.length=0,h(),o.clear(),s.abort())},b=(e,t)=>{try{r.onError?.(e,t)}catch{}},C=(e,t)=>{b(e,t),g()},w=e=>{if(!f){if(p){u.push(e);return}p=!0;try{k(e),A()}finally{p=!1}}},T=e=>{f||_(e)&&w({event:e,kind:`event`})},E=(e,t,n)=>{for(let r of e){if(f)return;try{r({context:a.context,event:n,send:T,signal:s.signal})}catch(e){C(e,{event:n,phase:`effect`,state:t})}}},D=(t,n)=>{let r=v(e,t);for(let e of r.after){let t=setTimeout(()=>{c.delete(t),w({after:e,kind:`after`})},e.definition.delay);c.add(t)}for(let e of r.invoke){let r=new AbortController;l.add(r);let i=a.context,o=n;Promise.resolve().then(()=>e.src({context:i,event:o,signal:r.signal})).then(n=>{if(l.delete(r),!(f||r.signal.aborted||!e.onDone))try{T(e.onDone({context:i,result:n}))}catch(e){C(e,{event:o,phase:`invoke`,state:t})}},n=>{if(l.delete(r),!(f||r.signal.aborted))try{e.onError?T(e.onError({context:i,error:n})):C(n,{event:o,phase:`invoke`,state:t})}catch(e){C(e,{event:o,phase:`invoke`,state:t})}})}},O=e=>{for(let t of[...o]){if(f)return;try{t(a)}catch(t){b(t,{event:e,phase:`subscriber`,state:a.state})}}},k=t=>{let n=a,r;try{r=x(e,a,t)}catch(e){C(e,{event:t.kind===`event`?t.event:void 0,phase:`transition`,state:a.state});return}if(r.result.type===`ignored`||!r.transition)return;let i=v(e,n.state);a=r.result.snapshot,h(),D(a.state,r.event),O(r.event),E(i.exit,n.state,r.event),E(r.transition.effects??[],n.state,r.event),E(v(e,a.state).entry,a.state,r.event)},A=()=>{let e=0;for(;u.length>0&&!f;){if(e+=1,e>d){C(new t(`INVALID_TRANSITION_LIMIT`,`maximum queued transitions exceeded`,{maxTransitions:d}),{phase:`transition`,state:a.state});return}let n=u.shift();n&&k(n)}};return D(a.state,void 0),r.snapshot||E(v(e,a.state).entry,a.state,void 0),{can:t=>{if(f)return!1;try{return _(t)?S(e,a,t):!1}catch(e){return C(e,{event:t,phase:`transition`,state:a.state}),!1}},get disposalSignal(){return s.signal},dispose:g,get disposed(){return f},send:T,get snapshot(){return a},subscribe(e){return f?()=>void 0:(o.add(e),()=>o.delete(e))},[Symbol.dispose]:g}};return e.ClockworkError=t,e.defineMachine=()=>e=>{let t=p(e),n=m(t.initial,t.context);return{can:(e,n)=>S(t,e,n),createActor:e=>C(t,n,e),initialSnapshot:n,transition:(e,n)=>x(t,e,{event:n,kind:`event`}).result}},e})({});
2
2
  //# sourceMappingURL=clockwork.iife.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clockwork.iife.js","names":[],"sources":["../src/errors.ts","../src/_context.ts","../src/_dev.ts","../src/definition.ts","../src/interpret.ts"],"sourcesContent":["export type ClockworkErrorCode =\n | 'INVALID_AFTER_DELAY'\n | 'INVALID_CONTEXT'\n | 'INVALID_DEFINITION'\n | 'INVALID_EFFECT'\n | 'INVALID_INITIAL_STATE'\n | 'INVALID_INVOKE'\n | 'INVALID_MAX_TRANSITIONS'\n | 'INVALID_SNAPSHOT_STATE'\n | 'INVALID_TRANSITION'\n | 'INVALID_TRANSITION_LIMIT'\n | 'UNKNOWN_TARGET';\n\n/** A Clockwork failure with a stable machine-readable code and contextual details. */\nexport class ClockworkError extends Error {\n readonly code: ClockworkErrorCode;\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(code: ClockworkErrorCode, message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n this.code = code;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function isContextRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { isContextRecord } from './_context.js';\nimport { ClockworkError } from './errors.js';\nimport type { After, Effect, Invoke, MachineConfig, MachineEvent, Transition } from './types.js';\n\nexport type CompiledAfter<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly definition: After<State, Context, Event>;\n};\n\nexport type CompiledState<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: readonly CompiledAfter<State, Context, Event>[];\n readonly entry: readonly Effect<Context, Event>[];\n readonly exit: readonly Effect<Context, Event>[];\n readonly invoke: readonly Invoke<Context, Event>[];\n readonly on: ReadonlyMap<string, readonly Transition<State, Context, Event>[]>;\n};\n\nexport type CompiledMachine<\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n> = {\n readonly context: Context;\n readonly initial: State;\n readonly states: ReadonlyMap<State, CompiledState<State, Context, Event>>;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;\n\nconst fail = (code: ClockworkError['code'], message: string, details: Record<string, unknown>): never => {\n throw new ClockworkError(code, message, details);\n};\n\nconst array = (value: unknown, message: string, details: Record<string, unknown>): readonly unknown[] => {\n if (!Array.isArray(value)) fail('INVALID_DEFINITION', message, details);\n\n return value as readonly unknown[];\n};\n\nconst functions = <Value>(\n value: unknown,\n phase: 'effects' | 'entry' | 'exit',\n details: Record<string, unknown>,\n): readonly Value[] => {\n const values = array(value, `${phase} must be an array`, { ...details, phase });\n\n return values.map((candidate, index) => {\n if (typeof candidate !== 'function') {\n fail('INVALID_EFFECT', `${phase} entry at index ${index} must be a function`, { ...details, index, phase });\n }\n\n return candidate as Value;\n });\n};\n\nconst validateTarget = <State extends string>(\n states: ReadonlyMap<State, unknown>,\n target: unknown,\n details: Record<string, unknown>,\n): State => {\n if (typeof target !== 'string' || !states.has(target as State)) {\n return fail('UNKNOWN_TARGET', `target \"${String(target)}\" is not a declared state`, { ...details, target });\n }\n\n return target as State;\n};\n\nconst compileTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): Transition<State, Context, Event> => {\n const transition = isRecord(input) ? input : fail('INVALID_TRANSITION', 'a transition must be an object', details);\n const target = validateTarget(states, transition.target, details);\n\n if (transition.guard !== undefined && typeof transition.guard !== 'function') {\n fail('INVALID_TRANSITION', 'transition guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (transition.reduce !== undefined && typeof transition.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'transition reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n effects:\n transition.effects === undefined\n ? undefined\n : functions<Effect<Context, Event>>(transition.effects, 'effects', details),\n guard: transition.guard as Transition<State, Context, Event>['guard'],\n reduce: transition.reduce as Transition<State, Context, Event>['reduce'],\n target,\n };\n};\n\nconst compileTransitions = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): readonly Transition<State, Context, Event>[] => {\n const values = Array.isArray(input) ? input : [input];\n\n if (values.length === 0) fail('INVALID_TRANSITION', 'a transition array must not be empty', details);\n\n return values.map((value, transitionIndex) =>\n compileTransition<State, Context, Event>(value, states, { ...details, transitionIndex }),\n );\n};\n\nconst compileAfter = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n index: number,\n state: State,\n): CompiledAfter<State, Context, Event> => {\n const after = isRecord(input)\n ? input\n : fail('INVALID_TRANSITION', `state \"${state}\" after entries must be objects`, { index, state });\n const delay = after.delay;\n\n if (typeof delay !== 'number' || !Number.isFinite(delay) || delay < 0) {\n fail('INVALID_AFTER_DELAY', `state \"${state}\" after delay must be a finite number greater than or equal to 0`, {\n delay,\n index,\n state,\n });\n }\n\n const details = { delay, index, state };\n\n if (after.guard !== undefined && typeof after.guard !== 'function') {\n fail('INVALID_TRANSITION', 'after guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (after.reduce !== undefined && typeof after.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'after reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n definition: {\n delay: delay as number,\n effects:\n after.effects === undefined ? undefined : functions<Effect<Context, Event>>(after.effects, 'effects', details),\n guard: after.guard as After<State, Context, Event>['guard'],\n reduce: after.reduce as After<State, Context, Event>['reduce'],\n target: validateTarget(states, after.target, details),\n },\n };\n};\n\nconst compileInvokes = <Context extends Record<string, unknown>, Event extends MachineEvent>(\n value: unknown,\n state: string,\n): readonly Invoke<Context, Event>[] =>\n array(value, `state \"${state}\" invoke must be an array`, { state }).map((value, index) => {\n const candidate = isRecord(value)\n ? value\n : fail('INVALID_INVOKE', 'invoke entry must be an object', { index, state });\n\n if (typeof candidate.src !== 'function') {\n fail('INVALID_INVOKE', 'invoke src must be a function', { index, phase: 'src', state });\n }\n\n if (candidate.onDone !== undefined && typeof candidate.onDone !== 'function') {\n fail('INVALID_INVOKE', 'invoke onDone must be a function', { index, phase: 'onDone', state });\n }\n\n if (candidate.onError !== undefined && typeof candidate.onError !== 'function') {\n fail('INVALID_INVOKE', 'invoke onError must be a function', { index, phase: 'onError', state });\n }\n\n return candidate as unknown as Invoke<Context, Event>;\n });\n\n/** Validates and structurally compiles a flat machine definition once. */\nexport const compileDefinition = <\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n>(\n definition: MachineConfig<State, Context, Event>,\n): CompiledMachine<State, Context, Event> => {\n const raw = definition as unknown;\n const machine = isRecord(raw) ? raw : fail('INVALID_DEFINITION', 'machine definition must be an object', {});\n const rawStates = isRecord(machine.states)\n ? machine.states\n : fail('INVALID_DEFINITION', 'machine states must be an object', {});\n const rawStateEntries = Object.entries(rawStates) as [State, unknown][];\n const rawStateMap = new Map<State, unknown>(rawStateEntries);\n\n if (typeof machine.initial !== 'string' || !rawStateMap.has(machine.initial as State)) {\n fail('INVALID_INITIAL_STATE', `initial state \"${String(machine.initial)}\" is not declared`, {\n initial: machine.initial,\n });\n }\n\n if (machine.context !== undefined && !isContextRecord(machine.context)) {\n fail('INVALID_CONTEXT', 'machine context must be a non-array object record', {});\n }\n\n const states = new Map<State, CompiledState<State, Context, Event>>();\n\n for (const [state, rawNodeValue] of rawStateEntries) {\n const rawNode = isRecord(rawNodeValue)\n ? rawNodeValue\n : fail('INVALID_DEFINITION', `state \"${state}\" must be an object`, { state });\n\n if ('states' in rawNode || 'initial' in rawNode) {\n fail('INVALID_DEFINITION', `state \"${state}\" must be flat and cannot declare child states`, { state });\n }\n\n const on = new Map<string, readonly Transition<State, Context, Event>[]>();\n\n if (rawNode.on !== undefined) {\n const rawOn = isRecord(rawNode.on)\n ? rawNode.on\n : fail('INVALID_TRANSITION', `state \"${state}\" on must be an object`, { state });\n\n for (const [type, transition] of Object.entries(rawOn)) {\n on.set(type, compileTransitions<State, Context, Event>(transition, rawStateMap, { state, type }));\n }\n }\n\n const after =\n rawNode.after === undefined\n ? []\n : array(rawNode.after, `state \"${state}\" after must be an array`, { state }).map((entry, index) =>\n compileAfter<State, Context, Event>(entry, rawStateMap, index, state),\n );\n\n states.set(state, {\n after,\n entry: rawNode.entry === undefined ? [] : functions<Effect<Context, Event>>(rawNode.entry, 'entry', { state }),\n exit: rawNode.exit === undefined ? [] : functions<Effect<Context, Event>>(rawNode.exit, 'exit', { state }),\n invoke: rawNode.invoke === undefined ? [] : compileInvokes<Context, Event>(rawNode.invoke, state),\n on,\n });\n }\n\n return {\n context: (machine.context ?? {}) as Context,\n initial: machine.initial as State,\n states,\n };\n};\n","import { isContextRecord } from './_context.js';\nimport { warn } from './_dev.js';\nimport { type CompiledAfter, type CompiledMachine, type CompiledState, compileDefinition } from './definition.js';\nimport { ClockworkError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n Effect,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n Transition,\n TransitionResult,\n} from './types.js';\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: CompiledAfter<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: Transition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: Transition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => ({ context, state });\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkError('INVALID_SNAPSHOT_STATE', `snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent =>\n typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n\nconst stateNode = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n state: State,\n): CompiledState<State, Context, Event> => machine.states.get(state) ?? invalidSnapshot(state);\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n const state = stateNode(machine, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!state.after.includes(runtimeEvent.after)) return undefined;\n\n const { definition } = runtimeEvent.after;\n\n if (!definition.guard || definition.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: definition };\n }\n\n return undefined;\n }\n\n const candidates = state.on.get(runtimeEvent.event.type);\n\n if (!candidates) return undefined;\n\n for (const candidate of candidates) {\n const guard = candidate.guard as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event }) => boolean)\n | undefined;\n\n if (!guard || guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(machine, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot, type: 'ignored' },\n };\n }\n\n const reducer = selected.transition.reduce as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context)\n | undefined;\n const nextContext = reducer ? reducer({ context: snapshot.context, event: selected.event }) : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkError('INVALID_CONTEXT', 'a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(machine, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context, Event> = {},\n): Actor<State, Context, Event> => {\n if (\n options.maxTransitions !== undefined &&\n (!Number.isInteger(options.maxTransitions) || options.maxTransitions < 1)\n ) {\n throw new ClockworkError('INVALID_MAX_TRANSITIONS', 'maxTransitions must be a positive integer', {\n maxTransitions: options.maxTransitions,\n });\n }\n\n let current = options.snapshot ?? initialSnapshot;\n\n if (!isContextRecord(current.context)) {\n throw new ClockworkError('INVALID_CONTEXT', 'snapshot context must be a non-array object record', {});\n }\n\n if (!machine.states.has(current.state)) invalidSnapshot(current.state);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n const maxTransitions = options.maxTransitions ?? 1_000;\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n disposal.abort();\n };\n\n const report = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n let disposition: unknown = 'dispose';\n\n if (options.onError) {\n try {\n disposition = options.onError(error, context);\n } catch (handlerError) {\n dispose();\n throw handlerError;\n }\n }\n\n if (disposition !== 'continue') dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n report(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = stateNode(machine, state);\n\n for (const after of node.after) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.definition.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n report(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n report(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n report(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of listeners) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n report(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(machine, current, runtimeEvent);\n } catch (error) {\n report(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) return;\n\n const source = stateNode(machine, previous.state);\n\n current = outcome.result.snapshot;\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit, previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(stateNode(machine, current.state).entry, current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > maxTransitions) {\n report(\n new ClockworkError('INVALID_TRANSITION_LIMIT', 'maximum queued transitions exceeded', { maxTransitions }),\n { phase: 'transition', state: current.state },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(stateNode(machine, current.state).entry, current.state, undefined);\n }\n\n return {\n can: (event) => !disposed && canTransition(machine, current, event),\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n const compiled = compileDefinition(definition);\n const initialSnapshot = createSnapshot(compiled.initial, compiled.context);\n\n return {\n can: (snapshot, event) => canTransition(compiled, snapshot, event),\n createActor: (options) => createActor(compiled, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(compiled, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
1
+ {"version":3,"file":"clockwork.iife.js","names":[],"sources":["../src/errors.ts","../src/_context.ts","../src/_dev.ts","../src/definition.ts","../src/interpret.ts"],"sourcesContent":["export type ClockworkErrorCode =\n | 'INVALID_AFTER_DELAY'\n | 'INVALID_CONTEXT'\n | 'INVALID_DEFINITION'\n | 'INVALID_EFFECT'\n | 'INVALID_INITIAL_STATE'\n | 'INVALID_INVOKE'\n | 'INVALID_MAX_TRANSITIONS'\n | 'INVALID_SNAPSHOT_STATE'\n | 'INVALID_TRANSITION'\n | 'INVALID_TRANSITION_LIMIT'\n | 'UNKNOWN_TARGET';\n\n/** A Clockwork failure with a stable machine-readable code and contextual details. */\nexport class ClockworkError extends Error {\n private static readonly errorName = 'ClockworkError';\n readonly code: ClockworkErrorCode;\n readonly details: Readonly<Record<string, unknown>>;\n\n constructor(code: ClockworkErrorCode, message: string, details: Record<string, unknown> = {}, opts?: ErrorOptions) {\n super(message, opts);\n this.name = ClockworkError.errorName;\n this.code = code;\n this.details = Object.freeze({ ...details });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","export function isContextRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === null || prototype === Object.prototype;\n}\n","const isDev = !(globalThis as { __CLOCKWORK_PROD__?: boolean }).__CLOCKWORK_PROD__;\n\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/clockwork] ${msg}`);\n}\n","import { isContextRecord } from './_context.js';\nimport { ClockworkError } from './errors.js';\nimport type { After, Effect, Invoke, MachineConfig, MachineEvent, Transition } from './types.js';\n\nexport type CompiledAfter<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly definition: After<State, Context, Event>;\n};\n\nexport type CompiledState<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: readonly CompiledAfter<State, Context, Event>[];\n readonly entry: readonly Effect<Context, Event>[];\n readonly exit: readonly Effect<Context, Event>[];\n readonly invoke: readonly Invoke<Context, Event>[];\n readonly on: ReadonlyMap<string, readonly Transition<State, Context, Event>[]>;\n};\n\nexport type CompiledMachine<\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n> = {\n readonly context: Context;\n readonly initial: State;\n readonly states: ReadonlyMap<State, CompiledState<State, Context, Event>>;\n};\n\nconst MAX_TIMER_MS = 2_147_483_647;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst fail = (code: ClockworkError['code'], message: string, details: Record<string, unknown>): never => {\n throw new ClockworkError(code, message, details);\n};\n\nconst array = (value: unknown, message: string, details: Record<string, unknown>): readonly unknown[] => {\n if (!Array.isArray(value)) fail('INVALID_DEFINITION', message, details);\n\n return value as readonly unknown[];\n};\n\nconst functions = <Value>(\n value: unknown,\n phase: 'effects' | 'entry' | 'exit',\n details: Record<string, unknown>,\n): readonly Value[] => {\n const values = array(value, `${phase} must be an array`, { ...details, phase });\n\n return values.map((candidate, index) => {\n if (typeof candidate !== 'function') {\n fail('INVALID_EFFECT', `${phase} entry at index ${index} must be a function`, { ...details, index, phase });\n }\n\n return candidate as Value;\n });\n};\n\nconst validateTarget = <State extends string>(\n states: ReadonlyMap<State, unknown>,\n target: unknown,\n details: Record<string, unknown>,\n): State => {\n if (typeof target !== 'string' || !states.has(target as State)) {\n return fail('UNKNOWN_TARGET', `target \"${String(target)}\" is not a declared state`, { ...details, target });\n }\n\n return target as State;\n};\n\nconst compileTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): Transition<State, Context, Event> => {\n const transition = isRecord(input) ? input : fail('INVALID_TRANSITION', 'a transition must be an object', details);\n const target = validateTarget(states, transition.target, details);\n\n if (transition.guard !== undefined && typeof transition.guard !== 'function') {\n fail('INVALID_TRANSITION', 'transition guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (transition.reduce !== undefined && typeof transition.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'transition reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n effects:\n transition.effects === undefined\n ? undefined\n : functions<Effect<Context, Event>>(transition.effects, 'effects', details),\n guard: transition.guard as Transition<State, Context, Event>['guard'],\n reduce: transition.reduce as Transition<State, Context, Event>['reduce'],\n target,\n };\n};\n\nconst compileTransitions = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): readonly Transition<State, Context, Event>[] => {\n const values = Array.isArray(input) ? input : [input];\n\n if (values.length === 0) fail('INVALID_TRANSITION', 'a transition array must not be empty', details);\n\n return values.map((value, transitionIndex) =>\n compileTransition<State, Context, Event>(value, states, { ...details, transitionIndex }),\n );\n};\n\nconst compileAfter = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n index: number,\n state: State,\n): CompiledAfter<State, Context, Event> => {\n const after = isRecord(input)\n ? input\n : fail('INVALID_TRANSITION', `state \"${state}\" after entries must be objects`, { index, state });\n const delay = after.delay;\n\n if (typeof delay !== 'number' || !Number.isFinite(delay) || delay < 0 || delay > MAX_TIMER_MS) {\n fail('INVALID_AFTER_DELAY', `state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay,\n index,\n state,\n });\n }\n\n const details = { delay, index, state };\n\n if (after.guard !== undefined && typeof after.guard !== 'function') {\n fail('INVALID_TRANSITION', 'after guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (after.reduce !== undefined && typeof after.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'after reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n definition: {\n delay: delay as number,\n effects:\n after.effects === undefined ? undefined : functions<Effect<Context, Event>>(after.effects, 'effects', details),\n guard: after.guard as After<State, Context, Event>['guard'],\n reduce: after.reduce as After<State, Context, Event>['reduce'],\n target: validateTarget(states, after.target, details),\n },\n };\n};\n\nconst compileInvokes = <Context extends Record<string, unknown>, Event extends MachineEvent>(\n value: unknown,\n state: string,\n): readonly Invoke<Context, Event>[] =>\n array(value, `state \"${state}\" invoke must be an array`, { state }).map((value, index) => {\n const candidate = isRecord(value)\n ? value\n : fail('INVALID_INVOKE', 'invoke entry must be an object', { index, state });\n\n if (typeof candidate.src !== 'function') {\n fail('INVALID_INVOKE', 'invoke src must be a function', { index, phase: 'src', state });\n }\n\n if (candidate.onDone !== undefined && typeof candidate.onDone !== 'function') {\n fail('INVALID_INVOKE', 'invoke onDone must be a function', { index, phase: 'onDone', state });\n }\n\n if (candidate.onError !== undefined && typeof candidate.onError !== 'function') {\n fail('INVALID_INVOKE', 'invoke onError must be a function', { index, phase: 'onError', state });\n }\n\n return {\n onDone: candidate.onDone as Invoke<Context, Event>['onDone'],\n onError: candidate.onError as Invoke<Context, Event>['onError'],\n src: candidate.src as Invoke<Context, Event>['src'],\n };\n });\n\n/** Validates and structurally compiles a flat machine definition once. */\nexport const compileDefinition = <\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n>(\n definition: MachineConfig<State, Context, Event>,\n): CompiledMachine<State, Context, Event> => {\n const raw = definition as unknown;\n const machine = isRecord(raw) ? raw : fail('INVALID_DEFINITION', 'machine definition must be an object', {});\n const rawStates = isRecord(machine.states)\n ? machine.states\n : fail('INVALID_DEFINITION', 'machine states must be an object', {});\n const rawStateEntries = Object.entries(rawStates) as [State, unknown][];\n const rawStateMap = new Map<State, unknown>(rawStateEntries);\n\n if (typeof machine.initial !== 'string' || !rawStateMap.has(machine.initial as State)) {\n fail('INVALID_INITIAL_STATE', `initial state \"${String(machine.initial)}\" is not declared`, {\n initial: machine.initial,\n });\n }\n\n if (machine.context !== undefined && !isContextRecord(machine.context)) {\n fail('INVALID_CONTEXT', 'machine context must be a non-array object record', {});\n }\n\n const states = new Map<State, CompiledState<State, Context, Event>>();\n\n for (const [state, rawNodeValue] of rawStateEntries) {\n const rawNode = isRecord(rawNodeValue)\n ? rawNodeValue\n : fail('INVALID_DEFINITION', `state \"${state}\" must be an object`, { state });\n\n if ('states' in rawNode || 'initial' in rawNode) {\n fail('INVALID_DEFINITION', `state \"${state}\" must be flat and cannot declare child states`, { state });\n }\n\n const on = new Map<string, readonly Transition<State, Context, Event>[]>();\n\n if (rawNode.on !== undefined) {\n const rawOn = isRecord(rawNode.on)\n ? rawNode.on\n : fail('INVALID_TRANSITION', `state \"${state}\" on must be an object`, { state });\n\n for (const [type, transition] of Object.entries(rawOn)) {\n on.set(type, compileTransitions<State, Context, Event>(transition, rawStateMap, { state, type }));\n }\n }\n\n const after =\n rawNode.after === undefined\n ? []\n : array(rawNode.after, `state \"${state}\" after must be an array`, { state }).map((entry, index) =>\n compileAfter<State, Context, Event>(entry, rawStateMap, index, state),\n );\n\n states.set(state, {\n after,\n entry: rawNode.entry === undefined ? [] : functions<Effect<Context, Event>>(rawNode.entry, 'entry', { state }),\n exit: rawNode.exit === undefined ? [] : functions<Effect<Context, Event>>(rawNode.exit, 'exit', { state }),\n invoke: rawNode.invoke === undefined ? [] : compileInvokes<Context, Event>(rawNode.invoke, state),\n on,\n });\n }\n\n return {\n context: (machine.context ?? {}) as Context,\n initial: machine.initial as State,\n states,\n };\n};\n","import { isContextRecord } from './_context.js';\nimport { warn } from './_dev.js';\nimport { type CompiledAfter, type CompiledMachine, type CompiledState, compileDefinition } from './definition.js';\nimport { ClockworkError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n Effect,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n TransitionResult,\n} from './types.js';\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: CompiledAfter<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkError('INVALID_SNAPSHOT_STATE', `snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent => {\n try {\n return typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n } catch {\n return false;\n }\n};\n\nconst stateNode = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n state: State,\n): CompiledState<State, Context, Event> => machine.states.get(state) ?? invalidSnapshot(state);\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkError('INVALID_CONTEXT', 'snapshot context must be a non-array object record', {});\n }\n\n stateNode(machine, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(machine, snapshot);\n const state = stateNode(machine, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!state.after.includes(runtimeEvent.after)) return undefined;\n\n const { definition } = runtimeEvent.after;\n\n if (!definition.guard || definition.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: definition as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const candidates = state.on.get(runtimeEvent.event.type);\n\n if (!candidates) return undefined;\n\n for (const candidate of candidates) {\n const guard = candidate.guard as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event }) => boolean)\n | undefined;\n\n if (!guard || guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return {\n event: runtimeEvent.event,\n transition: candidate as unknown as ExecutableTransition<State, Context, Event>,\n };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(machine, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const reducer = selected.transition.reduce as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context)\n | undefined;\n const nextContext = reducer ? reducer({ context: snapshot.context, event: selected.event }) : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkError('INVALID_CONTEXT', 'a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(machine, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context, Event> = {},\n): Actor<State, Context, Event> => {\n if (\n options.maxTransitions !== undefined &&\n (!Number.isInteger(options.maxTransitions) || options.maxTransitions < 1)\n ) {\n throw new ClockworkError('INVALID_MAX_TRANSITIONS', 'maxTransitions must be a positive integer', {\n maxTransitions: options.maxTransitions,\n });\n }\n\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(machine, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n const maxTransitions = options.maxTransitions ?? 1_000;\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n try {\n options.onError?.(error, context);\n } catch {}\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = stateNode(machine, state);\n\n for (const after of node.after) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.definition.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(machine, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) return;\n\n const source = stateNode(machine, previous.state);\n\n current = outcome.result.snapshot;\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit, previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(stateNode(machine, current.state).entry, current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > maxTransitions) {\n fail(\n new ClockworkError('INVALID_TRANSITION_LIMIT', 'maximum queued transitions exceeded', { maxTransitions }),\n { phase: 'transition', state: current.state },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(stateNode(machine, current.state).entry, current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(machine, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n const compiled = compileDefinition(definition);\n const initialSnapshot = createSnapshot(compiled.initial, compiled.context);\n\n return {\n can: (snapshot, event) => canTransition(compiled, snapshot, event),\n createActor: (options) => createActor(compiled, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(compiled, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}