@vielzeug/clockwork 2.1.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -6
- package/dist/clockwork.cjs +1 -1
- package/dist/clockwork.cjs.map +1 -1
- package/dist/clockwork.iife.js +1 -1
- package/dist/clockwork.iife.js.map +1 -1
- package/dist/clockwork.js +1 -1
- package/dist/clockwork.js.map +1 -1
- package/dist/definition.cjs +1 -1
- package/dist/definition.cjs.map +1 -1
- package/dist/definition.d.ts +0 -1
- package/dist/definition.d.ts.map +1 -1
- package/dist/definition.js +26 -29
- package/dist/definition.js.map +1 -1
- package/package.json +2 -13
- package/dist/devtools.cjs +0 -2
- package/dist/devtools.cjs.map +0 -1
- package/dist/devtools.d.ts +0 -10
- package/dist/devtools.d.ts.map +0 -1
- package/dist/devtools.js +0 -13
- package/dist/devtools.js.map +0 -1
package/README.md
CHANGED
|
@@ -51,7 +51,6 @@ actor.dispose();
|
|
|
51
51
|
| `machine.createActor(options?)` | Create an owned runtime actor |
|
|
52
52
|
| `Actor` | Runtime resource with a readonly snapshot, subscriptions, and disposal |
|
|
53
53
|
| `ClockworkError` | Validation error with stable `code` |
|
|
54
|
-
| `debugActor(actor, options?)` | Observe committed actor snapshots from `/devtools` |
|
|
55
54
|
|
|
56
55
|
## Async invokes and timers
|
|
57
56
|
|
|
@@ -84,23 +83,22 @@ const loader = defineMachine<{ data: string }, Event>()({
|
|
|
84
83
|
});
|
|
85
84
|
```
|
|
86
85
|
|
|
87
|
-
##
|
|
86
|
+
## Observability
|
|
88
87
|
|
|
89
|
-
`
|
|
88
|
+
`actor.subscribe(listener)` observes committed snapshots. It does not modify actor behavior or trace dispatches and runtime errors.
|
|
90
89
|
|
|
91
90
|
```ts
|
|
92
91
|
import { defineMachine } from '@vielzeug/clockwork';
|
|
93
|
-
import { debugActor } from '@vielzeug/clockwork/devtools';
|
|
94
92
|
|
|
95
93
|
const machine = defineMachine<Record<string, never>, { type: 'NEXT' }>()({
|
|
96
94
|
initial: 'idle',
|
|
97
95
|
states: { idle: { on: { NEXT: { target: 'idle' } } } },
|
|
98
96
|
});
|
|
99
97
|
const actor = machine.createActor();
|
|
100
|
-
const
|
|
98
|
+
const stop = actor.subscribe((snapshot) => console.debug(snapshot.state));
|
|
101
99
|
|
|
102
100
|
actor.send({ type: 'NEXT' });
|
|
103
|
-
|
|
101
|
+
stop();
|
|
104
102
|
actor.dispose();
|
|
105
103
|
```
|
|
106
104
|
|
package/dist/clockwork.cjs
CHANGED
|
@@ -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
|
|
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;
|
|
2
2
|
//# sourceMappingURL=clockwork.cjs.map
|
package/dist/clockwork.cjs.map
CHANGED
|
@@ -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 readonly id: number;\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 id: number,\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 id,\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 let afterId = 0;\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, afterId++, 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.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"}
|
package/dist/clockwork.iife.js
CHANGED
|
@@ -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
|
|
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})({});
|
|
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 readonly id: number;\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 id: number,\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 id,\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 let afterId = 0;\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, afterId++, 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 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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"}
|
package/dist/clockwork.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
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
|
|
1
|
+
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}};export{e as ClockworkError,b as defineMachine};
|
|
2
2
|
//# sourceMappingURL=clockwork.js.map
|
package/dist/clockwork.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clockwork.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 readonly id: number;\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 id: number,\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 id,\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 let afterId = 0;\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, afterId++, 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.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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"}
|
package/dist/definition.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./errors.cjs"),t=require("./_context.cjs");var n=e=>typeof e==`object`&&!!e,r=(t,n,r)=>{throw new e.ClockworkError(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
|
|
1
|
+
const e=require("./errors.cjs"),t=require("./_context.cjs");var n=e=>typeof e==`object`&&!!e,r=(t,n,r)=>{throw new e.ClockworkError(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.isContextRecord(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}};exports.compileDefinition=d;
|
|
2
2
|
//# sourceMappingURL=definition.cjs.map
|
package/dist/definition.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.cjs","names":[],"sources":["../src/definition.ts"],"sourcesContent":["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 readonly id: number;\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 id: number,\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 id,\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 let afterId = 0;\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, afterId++, 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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definition.cjs","names":[],"sources":["../src/definition.ts"],"sourcesContent":["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"],"mappings":"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"}
|
package/dist/definition.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { After, Effect, Invoke, MachineConfig, MachineEvent, Transition } from './types.js';
|
|
2
2
|
export type CompiledAfter<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
|
|
3
3
|
readonly definition: After<State, Context, Event>;
|
|
4
|
-
readonly id: number;
|
|
5
4
|
};
|
|
6
5
|
export type CompiledState<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
|
|
7
6
|
readonly after: readonly CompiledAfter<State, Context, Event>[];
|
package/dist/definition.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,YAAY,IAAI;IACrH,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,YAAY,IAAI;IACrH,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,YAAY,IAAI;IACrH,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IAChE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IACnD,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,eAAe,CACzB,KAAK,SAAS,MAAM,EACpB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,KAAK,SAAS,YAAY,IACxB;IACF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;CAC3E,CAAC;AAoJF,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,GAC5B,KAAK,SAAS,MAAM,EACpB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,KAAK,SAAS,YAAY,EAE1B,YAAY,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,KAC/C,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CA+DvC,CAAC"}
|
package/dist/definition.js
CHANGED
|
@@ -33,37 +33,34 @@ var n = (e) => typeof e == "object" && !!e, r = (t, n, r) => {
|
|
|
33
33
|
...n,
|
|
34
34
|
transitionIndex: r
|
|
35
35
|
}));
|
|
36
|
-
}, l = (e, t, i, s
|
|
37
|
-
let
|
|
38
|
-
index:
|
|
39
|
-
state:
|
|
40
|
-
}),
|
|
41
|
-
(typeof
|
|
42
|
-
delay:
|
|
43
|
-
index:
|
|
44
|
-
state:
|
|
36
|
+
}, l = (e, t, i, s) => {
|
|
37
|
+
let c = n(e) ? e : r("INVALID_TRANSITION", `state "${s}" after entries must be objects`, {
|
|
38
|
+
index: i,
|
|
39
|
+
state: s
|
|
40
|
+
}), l = c.delay;
|
|
41
|
+
(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`, {
|
|
42
|
+
delay: l,
|
|
43
|
+
index: i,
|
|
44
|
+
state: s
|
|
45
45
|
});
|
|
46
|
-
let
|
|
47
|
-
delay:
|
|
48
|
-
index:
|
|
49
|
-
state:
|
|
46
|
+
let u = {
|
|
47
|
+
delay: l,
|
|
48
|
+
index: i,
|
|
49
|
+
state: s
|
|
50
50
|
};
|
|
51
|
-
return
|
|
52
|
-
...
|
|
51
|
+
return c.guard !== void 0 && typeof c.guard != "function" && r("INVALID_TRANSITION", "after guard must be a function", {
|
|
52
|
+
...u,
|
|
53
53
|
phase: "guard"
|
|
54
|
-
}),
|
|
55
|
-
...
|
|
54
|
+
}), c.reduce !== void 0 && typeof c.reduce != "function" && r("INVALID_TRANSITION", "after reducer must be a function", {
|
|
55
|
+
...u,
|
|
56
56
|
phase: "reduce"
|
|
57
|
-
}), {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
},
|
|
65
|
-
id: i
|
|
66
|
-
};
|
|
57
|
+
}), { definition: {
|
|
58
|
+
delay: l,
|
|
59
|
+
effects: c.effects === void 0 ? void 0 : a(c.effects, "effects", u),
|
|
60
|
+
guard: c.guard,
|
|
61
|
+
reduce: c.reduce,
|
|
62
|
+
target: o(t, c.target, u)
|
|
63
|
+
} };
|
|
67
64
|
}, u = (e, t) => i(e, `state "${t}" invoke must be an array`, { state: t }).map((e, i) => {
|
|
68
65
|
let a = n(e) ? e : r("INVALID_INVOKE", "invoke entry must be an object", {
|
|
69
66
|
index: i,
|
|
@@ -85,7 +82,7 @@ var n = (e) => typeof e == "object" && !!e, r = (t, n, r) => {
|
|
|
85
82
|
}), d = (e) => {
|
|
86
83
|
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);
|
|
87
84
|
(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", {});
|
|
88
|
-
let m = /* @__PURE__ */ new Map()
|
|
85
|
+
let m = /* @__PURE__ */ new Map();
|
|
89
86
|
for (let [e, t] of f) {
|
|
90
87
|
let o = n(t) ? t : r("INVALID_DEFINITION", `state "${e}" must be an object`, { state: e });
|
|
91
88
|
("states" in o || "initial" in o) && r("INVALID_DEFINITION", `state "${e}" must be flat and cannot declare child states`, { state: e });
|
|
@@ -97,7 +94,7 @@ var n = (e) => typeof e == "object" && !!e, r = (t, n, r) => {
|
|
|
97
94
|
type: n
|
|
98
95
|
}));
|
|
99
96
|
}
|
|
100
|
-
let d = o.after === void 0 ? [] : i(o.after, `state "${e}" after must be an array`, { state: e }).map((t, n) => l(t, p,
|
|
97
|
+
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));
|
|
101
98
|
m.set(e, {
|
|
102
99
|
after: d,
|
|
103
100
|
entry: o.entry === void 0 ? [] : a(o.entry, "entry", { state: e }),
|
package/dist/definition.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","names":[],"sources":["../src/definition.ts"],"sourcesContent":["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 readonly id: number;\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 id: number,\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 id,\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 let afterId = 0;\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, afterId++, 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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definition.js","names":[],"sources":["../src/definition.ts"],"sourcesContent":["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"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vielzeug/clockwork",
|
|
3
|
-
"version": "2.1
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Framework-neutral typed finite state machines with pure transitions and actors",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,20 +22,9 @@
|
|
|
22
22
|
"import": "./dist/index.js",
|
|
23
23
|
"require": "./dist/index.cjs",
|
|
24
24
|
"types": "./dist/index.d.ts"
|
|
25
|
-
},
|
|
26
|
-
"./devtools": {
|
|
27
|
-
"import": "./dist/devtools.js",
|
|
28
|
-
"require": "./dist/devtools.cjs",
|
|
29
|
-
"types": "./dist/devtools.d.ts"
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"typesVersions": {
|
|
33
|
-
"*": {
|
|
34
|
-
"devtools": [
|
|
35
|
-
"dist/devtools.d.ts"
|
|
36
|
-
]
|
|
37
25
|
}
|
|
38
26
|
},
|
|
27
|
+
"sideEffects": false,
|
|
39
28
|
"publishConfig": {
|
|
40
29
|
"access": "public",
|
|
41
30
|
"registry": "https://registry.npmjs.org/"
|
package/dist/devtools.cjs
DELETED
package/dist/devtools.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.cjs","names":[],"sources":["../src/devtools.ts"],"sourcesContent":["import type { Actor, MachineEvent, MachineSnapshot } from './types.js';\n\nexport type DebugActorOptions<State extends string, Context extends Record<string, unknown>> = {\n readonly logger?: (snapshot: MachineSnapshot<State, Context>) => void;\n};\n\n/**\n * Observes committed actor snapshots with `console.debug` without changing actor behavior.\n * Import from `@vielzeug/clockwork/devtools` so this development-only observability stays opt-in.\n */\nexport const debugActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n actor: Actor<State, Context, Event>,\n options: DebugActorOptions<State, Context> = {},\n): (() => void) => {\n const logger =\n options.logger ?? ((snapshot: MachineSnapshot<State, Context>) => console.debug('[clockwork] snapshot', snapshot));\n\n return actor.subscribe((snapshot) => {\n try {\n logger(snapshot);\n } catch {\n // Observability must not affect the actor's error policy.\n }\n });\n};\n"],"mappings":"mEAUA,IAAa,GACX,EACA,EAA6C,CAAC,IAC7B,CACjB,IAAM,EACJ,EAAQ,SAAY,GAA8C,QAAQ,MAAM,uBAAwB,CAAQ,GAElH,OAAO,EAAM,UAAW,GAAa,CACnC,GAAI,CACF,EAAO,CAAQ,CACjB,MAAQ,CAER,CACF,CAAC,CACH"}
|
package/dist/devtools.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Actor, MachineEvent, MachineSnapshot } from './types.js';
|
|
2
|
-
export type DebugActorOptions<State extends string, Context extends Record<string, unknown>> = {
|
|
3
|
-
readonly logger?: (snapshot: MachineSnapshot<State, Context>) => void;
|
|
4
|
-
};
|
|
5
|
-
/**
|
|
6
|
-
* Observes committed actor snapshots with `console.debug` without changing actor behavior.
|
|
7
|
-
* Import from `@vielzeug/clockwork/devtools` so this development-only observability stays opt-in.
|
|
8
|
-
*/
|
|
9
|
-
export declare const debugActor: <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(actor: Actor<State, Context, Event>, options?: DebugActorOptions<State, Context>) => (() => void);
|
|
10
|
-
//# sourceMappingURL=devtools.d.ts.map
|
package/dist/devtools.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../src/devtools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC7F,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACvE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,SAAS,YAAY,EAClH,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EACnC,UAAS,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAM,KAC9C,CAAC,MAAM,IAAI,CAWb,CAAC"}
|
package/dist/devtools.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region src/devtools.ts
|
|
2
|
-
var e = (e, t = {}) => {
|
|
3
|
-
let n = t.logger ?? ((e) => console.debug("[clockwork] snapshot", e));
|
|
4
|
-
return e.subscribe((e) => {
|
|
5
|
-
try {
|
|
6
|
-
n(e);
|
|
7
|
-
} catch {}
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
//#endregion
|
|
11
|
-
export { e as debugActor };
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=devtools.js.map
|
package/dist/devtools.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.js","names":[],"sources":["../src/devtools.ts"],"sourcesContent":["import type { Actor, MachineEvent, MachineSnapshot } from './types.js';\n\nexport type DebugActorOptions<State extends string, Context extends Record<string, unknown>> = {\n readonly logger?: (snapshot: MachineSnapshot<State, Context>) => void;\n};\n\n/**\n * Observes committed actor snapshots with `console.debug` without changing actor behavior.\n * Import from `@vielzeug/clockwork/devtools` so this development-only observability stays opt-in.\n */\nexport const debugActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n actor: Actor<State, Context, Event>,\n options: DebugActorOptions<State, Context> = {},\n): (() => void) => {\n const logger =\n options.logger ?? ((snapshot: MachineSnapshot<State, Context>) => console.debug('[clockwork] snapshot', snapshot));\n\n return actor.subscribe((snapshot) => {\n try {\n logger(snapshot);\n } catch {\n // Observability must not affect the actor's error policy.\n }\n });\n};\n"],"mappings":";AAUA,IAAa,KACX,GACA,IAA6C,CAAC,MAC7B;CACjB,IAAM,IACJ,EAAQ,YAAY,MAA8C,QAAQ,MAAM,wBAAwB,CAAQ;CAElH,OAAO,EAAM,WAAW,MAAa;EACnC,IAAI;GACF,EAAO,CAAQ;EACjB,QAAQ,CAER;CACF,CAAC;AACH"}
|