@vielzeug/clockwork 3.0.0 → 26.10.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 +1 -1
- package/dist/_dev.cjs +1 -1
- package/dist/_dev.cjs.map +1 -1
- package/dist/_dev.js +1 -5
- package/dist/_dev.js.map +1 -1
- 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/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +11 -5
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -12
- package/dist/errors.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/interpret.cjs +1 -1
- package/dist/interpret.cjs.map +1 -1
- package/dist/interpret.d.ts.map +1 -1
- package/dist/interpret.js +1 -262
- package/dist/interpret.js.map +1 -1
- package/dist/types.d.ts +20 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -5
- package/dist/_context.cjs +0 -2
- package/dist/_context.cjs.map +0 -1
- package/dist/_context.d.ts +0 -2
- package/dist/_context.d.ts.map +0 -1
- package/dist/_context.js +0 -10
- package/dist/_context.js.map +0 -1
- package/dist/definition.cjs +0 -2
- package/dist/definition.cjs.map +0 -1
- package/dist/definition.d.ts +0 -19
- package/dist/definition.d.ts.map +0 -1
- package/dist/definition.js +0 -123
- package/dist/definition.js.map +0 -1
package/dist/interpret.js
CHANGED
|
@@ -1,263 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { isContextRecord as t } from "./_context.js";
|
|
3
|
-
import "./_dev.js";
|
|
4
|
-
import { compileDefinition as n } from "./definition.js";
|
|
5
|
-
//#region src/interpret.ts
|
|
6
|
-
var r = (e, t) => {
|
|
7
|
-
let n = Object.assign(Object.create(Object.getPrototypeOf(t)), t);
|
|
8
|
-
return Object.freeze({
|
|
9
|
-
context: Object.freeze(n),
|
|
10
|
-
state: e
|
|
11
|
-
});
|
|
12
|
-
}, i = (e) => Object.isFrozen(e) && Object.isFrozen(e.context) ? e : r(e.state, e.context), a = (t) => {
|
|
13
|
-
throw new e("INVALID_SNAPSHOT_STATE", `snapshot state "${String(t)}" is not declared`, { state: t });
|
|
14
|
-
}, o = (e) => {
|
|
15
|
-
try {
|
|
16
|
-
return typeof e == "object" && !!e && typeof e.type == "string";
|
|
17
|
-
} catch {
|
|
18
|
-
return !1;
|
|
19
|
-
}
|
|
20
|
-
}, s = (e, t) => e.states.get(t) ?? a(t), c = (n, r) => {
|
|
21
|
-
if (!t(r.context)) throw new e("INVALID_CONTEXT", "snapshot context must be a non-array object record", {});
|
|
22
|
-
s(n, r.state);
|
|
23
|
-
}, l = (e, t, n) => {
|
|
24
|
-
c(e, t);
|
|
25
|
-
let r = s(e, t.state);
|
|
26
|
-
if (n.kind === "after") {
|
|
27
|
-
if (!r.after.includes(n.after)) return;
|
|
28
|
-
let { definition: e } = n.after;
|
|
29
|
-
return !e.guard || e.guard({
|
|
30
|
-
context: t.context,
|
|
31
|
-
event: void 0
|
|
32
|
-
}) ? {
|
|
33
|
-
event: void 0,
|
|
34
|
-
transition: e
|
|
35
|
-
} : void 0;
|
|
36
|
-
}
|
|
37
|
-
let i = r.on.get(n.event.type);
|
|
38
|
-
if (i) for (let e of i) {
|
|
39
|
-
let r = e.guard;
|
|
40
|
-
if (!r || r({
|
|
41
|
-
context: t.context,
|
|
42
|
-
event: n.event
|
|
43
|
-
})) return {
|
|
44
|
-
event: n.event,
|
|
45
|
-
transition: e
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
}, u = (n, a, o) => {
|
|
49
|
-
let s = l(n, a, o);
|
|
50
|
-
if (!s) return {
|
|
51
|
-
event: o.kind === "event" ? o.event : void 0,
|
|
52
|
-
result: {
|
|
53
|
-
snapshot: i(a),
|
|
54
|
-
type: "ignored"
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
let c = s.transition.reduce, u = c ? c({
|
|
58
|
-
context: a.context,
|
|
59
|
-
event: s.event
|
|
60
|
-
}) : a.context;
|
|
61
|
-
if (!t(u)) throw new e("INVALID_CONTEXT", "a reducer must return a non-array object record", { state: a.state });
|
|
62
|
-
return {
|
|
63
|
-
event: s.event,
|
|
64
|
-
result: {
|
|
65
|
-
snapshot: r(s.transition.target, u),
|
|
66
|
-
type: "transition"
|
|
67
|
-
},
|
|
68
|
-
transition: s.transition
|
|
69
|
-
};
|
|
70
|
-
}, d = (e, t, n) => l(e, t, {
|
|
71
|
-
event: n,
|
|
72
|
-
kind: "event"
|
|
73
|
-
}) !== void 0, f = (t, n, i = {}) => {
|
|
74
|
-
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 });
|
|
75
|
-
let a = i.snapshot ?? n;
|
|
76
|
-
c(t, a);
|
|
77
|
-
let l = r(a.state, a.context), f = /* @__PURE__ */ new Set(), p = new AbortController(), m = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set(), g = [], _ = i.maxTransitions ?? 1e3, v = !1, y = !1, b = () => {
|
|
78
|
-
for (let e of m) clearTimeout(e);
|
|
79
|
-
m.clear();
|
|
80
|
-
for (let e of h) e.abort();
|
|
81
|
-
h.clear();
|
|
82
|
-
}, x = () => {
|
|
83
|
-
v || (v = !0, g.length = 0, b(), f.clear(), p.abort());
|
|
84
|
-
}, S = (e, t) => {
|
|
85
|
-
try {
|
|
86
|
-
i.onError?.(e, t);
|
|
87
|
-
} catch {}
|
|
88
|
-
}, C = (e, t) => {
|
|
89
|
-
S(e, t), x();
|
|
90
|
-
}, w = (e) => {
|
|
91
|
-
if (!v) {
|
|
92
|
-
if (y) {
|
|
93
|
-
g.push(e);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
y = !0;
|
|
97
|
-
try {
|
|
98
|
-
k(e), A();
|
|
99
|
-
} finally {
|
|
100
|
-
y = !1;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}, T = (e) => {
|
|
104
|
-
v || o(e) && w({
|
|
105
|
-
event: e,
|
|
106
|
-
kind: "event"
|
|
107
|
-
});
|
|
108
|
-
}, E = (e, t, n) => {
|
|
109
|
-
for (let r of e) {
|
|
110
|
-
if (v) return;
|
|
111
|
-
try {
|
|
112
|
-
r({
|
|
113
|
-
context: l.context,
|
|
114
|
-
event: n,
|
|
115
|
-
send: T,
|
|
116
|
-
signal: p.signal
|
|
117
|
-
});
|
|
118
|
-
} catch (e) {
|
|
119
|
-
C(e, {
|
|
120
|
-
event: n,
|
|
121
|
-
phase: "effect",
|
|
122
|
-
state: t
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}, D = (e, n) => {
|
|
127
|
-
let r = s(t, e);
|
|
128
|
-
for (let e of r.after) {
|
|
129
|
-
let t = setTimeout(() => {
|
|
130
|
-
m.delete(t), w({
|
|
131
|
-
after: e,
|
|
132
|
-
kind: "after"
|
|
133
|
-
});
|
|
134
|
-
}, e.definition.delay);
|
|
135
|
-
m.add(t);
|
|
136
|
-
}
|
|
137
|
-
for (let t of r.invoke) {
|
|
138
|
-
let r = new AbortController();
|
|
139
|
-
h.add(r);
|
|
140
|
-
let i = l.context, a = n;
|
|
141
|
-
Promise.resolve().then(() => t.src({
|
|
142
|
-
context: i,
|
|
143
|
-
event: a,
|
|
144
|
-
signal: r.signal
|
|
145
|
-
})).then((n) => {
|
|
146
|
-
if (h.delete(r), !(v || r.signal.aborted || !t.onDone)) try {
|
|
147
|
-
T(t.onDone({
|
|
148
|
-
context: i,
|
|
149
|
-
result: n
|
|
150
|
-
}));
|
|
151
|
-
} catch (t) {
|
|
152
|
-
C(t, {
|
|
153
|
-
event: a,
|
|
154
|
-
phase: "invoke",
|
|
155
|
-
state: e
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
}, (n) => {
|
|
159
|
-
if (h.delete(r), !(v || r.signal.aborted)) try {
|
|
160
|
-
t.onError ? T(t.onError({
|
|
161
|
-
context: i,
|
|
162
|
-
error: n
|
|
163
|
-
})) : C(n, {
|
|
164
|
-
event: a,
|
|
165
|
-
phase: "invoke",
|
|
166
|
-
state: e
|
|
167
|
-
});
|
|
168
|
-
} catch (t) {
|
|
169
|
-
C(t, {
|
|
170
|
-
event: a,
|
|
171
|
-
phase: "invoke",
|
|
172
|
-
state: e
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}, O = (e) => {
|
|
178
|
-
for (let t of [...f]) {
|
|
179
|
-
if (v) return;
|
|
180
|
-
try {
|
|
181
|
-
t(l);
|
|
182
|
-
} catch (t) {
|
|
183
|
-
S(t, {
|
|
184
|
-
event: e,
|
|
185
|
-
phase: "subscriber",
|
|
186
|
-
state: l.state
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}, k = (e) => {
|
|
191
|
-
let n = l, r;
|
|
192
|
-
try {
|
|
193
|
-
r = u(t, l, e);
|
|
194
|
-
} catch (t) {
|
|
195
|
-
C(t, {
|
|
196
|
-
event: e.kind === "event" ? e.event : void 0,
|
|
197
|
-
phase: "transition",
|
|
198
|
-
state: l.state
|
|
199
|
-
});
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
if (r.result.type === "ignored" || !r.transition) return;
|
|
203
|
-
let i = s(t, n.state);
|
|
204
|
-
l = r.result.snapshot, b(), D(l.state, r.event), O(r.event), E(i.exit, n.state, r.event), E(r.transition.effects ?? [], n.state, r.event), E(s(t, l.state).entry, l.state, r.event);
|
|
205
|
-
}, A = () => {
|
|
206
|
-
let t = 0;
|
|
207
|
-
for (; g.length > 0 && !v;) {
|
|
208
|
-
if (t += 1, t > _) {
|
|
209
|
-
C(new e("INVALID_TRANSITION_LIMIT", "maximum queued transitions exceeded", { maxTransitions: _ }), {
|
|
210
|
-
phase: "transition",
|
|
211
|
-
state: l.state
|
|
212
|
-
});
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
let n = g.shift();
|
|
216
|
-
n && k(n);
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
return D(l.state, void 0), i.snapshot || E(s(t, l.state).entry, l.state, void 0), {
|
|
220
|
-
can: (e) => {
|
|
221
|
-
if (v) return !1;
|
|
222
|
-
try {
|
|
223
|
-
return o(e) ? d(t, l, e) : !1;
|
|
224
|
-
} catch (t) {
|
|
225
|
-
return C(t, {
|
|
226
|
-
event: e,
|
|
227
|
-
phase: "transition",
|
|
228
|
-
state: l.state
|
|
229
|
-
}), !1;
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
get disposalSignal() {
|
|
233
|
-
return p.signal;
|
|
234
|
-
},
|
|
235
|
-
dispose: x,
|
|
236
|
-
get disposed() {
|
|
237
|
-
return v;
|
|
238
|
-
},
|
|
239
|
-
send: T,
|
|
240
|
-
get snapshot() {
|
|
241
|
-
return l;
|
|
242
|
-
},
|
|
243
|
-
subscribe(e) {
|
|
244
|
-
return v ? () => void 0 : (f.add(e), () => f.delete(e));
|
|
245
|
-
},
|
|
246
|
-
[Symbol.dispose]: x
|
|
247
|
-
};
|
|
248
|
-
}, p = () => (e) => {
|
|
249
|
-
let t = n(e), i = r(t.initial, t.context);
|
|
250
|
-
return {
|
|
251
|
-
can: (e, n) => d(t, e, n),
|
|
252
|
-
createActor: (e) => f(t, i, e),
|
|
253
|
-
initialSnapshot: i,
|
|
254
|
-
transition: (e, n) => u(t, e, {
|
|
255
|
-
event: n,
|
|
256
|
-
kind: "event"
|
|
257
|
-
}).result
|
|
258
|
-
};
|
|
259
|
-
};
|
|
260
|
-
//#endregion
|
|
261
|
-
export { p as defineMachine };
|
|
262
|
-
|
|
1
|
+
import{ClockworkDefinitionError as e,ClockworkSnapshotError as t,ClockworkTransitionLimitError as n}from"./errors.js";import"./_dev.js";import{tapper as r}from"@vielzeug/arsenal";var i=2147483647,a=1e3,isContextRecord=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype},assertDefinition=t=>{let n=t.context;if(n!==void 0&&!isContextRecord(n))throw new e(`machine context must be a non-array object record`,{});for(let[n,r]of Object.entries(t.states)){for(let[t,i]of Object.entries(r.on??{}))if(Array.isArray(i)&&i.length===0)throw new e(`a transition array must not be empty`,{state:n,type:t});for(let[t,a]of(r.after??[]).entries())if(!Number.isFinite(a.delay)||a.delay<0||a.delay>i)throw new e(`state "${n}" after delay must be between 0 and ${i}`,{delay:a.delay,index:t,state:n})}},createSnapshot=(e,t)=>{let n=Object.assign(Object.create(Object.getPrototypeOf(t)),t);return Object.freeze({context:Object.freeze(n),state:e})},normalizeSnapshot=e=>Object.isFrozen(e)&&Object.isFrozen(e.context)?e:createSnapshot(e.state,e.context),invalidSnapshot=e=>{throw new t(`snapshot state "${String(e)}" is not declared`,{state:e})},isMachineEvent=e=>typeof e==`object`&&!!e&&typeof e.type==`string`,nodeFor=(e,t)=>Object.hasOwn(e.states,t)?e.states[t]:invalidSnapshot(t),assertSnapshot=(e,n)=>{if(!isContextRecord(n.context))throw new t(`snapshot context must be a non-array object record`,{});nodeFor(e,n.state)},selectTransition=(e,t,n)=>{assertSnapshot(e,t);let r=nodeFor(e,t.state);if(n.kind===`after`)return!r.after||!r.after.includes(n.after)?void 0:!n.after.guard||n.after.guard({context:t.context,event:void 0})?{event:void 0,transition:n.after}:void 0;let i=r.on;if(!i||!Object.hasOwn(i,n.event.type))return;let a=i[n.event.type],o=Array.isArray(a)?a:[a];for(let e of o)if(!e.guard||e.guard({context:t.context,event:n.event}))return{event:n.event,transition:e}},transition=(e,n,r)=>{let i=selectTransition(e,n,r);if(!i)return{event:r.kind===`event`?r.event:void 0,result:{snapshot:normalizeSnapshot(n),type:`ignored`}};let a=i.transition.reduce?i.transition.reduce({context:n.context,event:i.event}):n.context;if(!isContextRecord(a))throw new t(`a reducer must return a non-array object record`,{state:n.state});return{event:i.event,result:{snapshot:createSnapshot(i.transition.target,a),type:`transition`},transition:i.transition}},canTransition=(e,t,n)=>selectTransition(e,t,{event:n,kind:`event`})!==void 0,createActor=(e,t,i={})=>{let o=i.snapshot??t;assertSnapshot(e,o);let s=createSnapshot(o.state,o.context),c=new Set,l=r(),u=new AbortController,d=new Set,f=new Set,p=[],m=!1,h=!1,cancelStateResources=()=>{for(let e of d)clearTimeout(e);d.clear();for(let e of f)e.abort();f.clear()},dispose=()=>{m||(m=!0,p.length=0,cancelStateResources(),c.clear(),l.emit({type:`dispose`}),l.clear(),u.abort())},observeError=(e,t)=>{l.emit({error:e,event:t.event,phase:t.phase,state:t.state,type:`error`})},fail=(e,t)=>{observeError(e,t),dispose()},run=e=>{if(!m){if(h){p.push(e);return}h=!0;try{process(e),flush()}finally{h=!1}}},send=e=>{m||isMachineEvent(e)&&run({event:e,kind:`event`})},runEffects=(e,t,n)=>{for(let r of e){if(m)return;try{r({context:s.context,event:n,send,signal:u.signal})}catch(e){fail(e,{event:n,phase:`effect`,state:t})}}},establishStateResources=(t,n)=>{let r=nodeFor(e,t);for(let e of r.after??[]){let t=setTimeout(()=>{d.delete(t),run({after:e,kind:`after`})},e.delay);d.add(t)}for(let e of r.invoke??[]){let r=new AbortController;f.add(r);let i=s.context,a=n;Promise.resolve().then(()=>e.src({context:i,event:a,signal:r.signal})).then(n=>{if(f.delete(r),!(m||r.signal.aborted||!e.onDone))try{send(e.onDone({context:i,result:n}))}catch(e){fail(e,{event:a,phase:`invoke`,state:t})}},n=>{if(f.delete(r),!(m||r.signal.aborted))try{e.onError?send(e.onError({context:i,error:n})):fail(n,{event:a,phase:`invoke`,state:t})}catch(e){fail(e,{event:a,phase:`invoke`,state:t})}})}},notify=e=>{for(let t of[...c]){if(m)return;try{t(s)}catch(t){observeError(t,{event:e,phase:`subscriber`,state:s.state})}}},process=t=>{let n=s,r;try{r=transition(e,s,t)}catch(e){fail(e,{event:t.kind===`event`?t.event:void 0,phase:`transition`,state:s.state});return}if(r.result.type===`ignored`||!r.transition){l.emit({event:r.event,snapshot:r.result.snapshot,type:`ignored`});return}let i=nodeFor(e,n.state);s=r.result.snapshot,l.emit({event:r.event,snapshot:s,type:`transition`}),cancelStateResources(),establishStateResources(s.state,r.event),notify(r.event),runEffects(i.exit??[],n.state,r.event),runEffects(r.transition.effects??[],n.state,r.event),runEffects(nodeFor(e,s.state).entry??[],s.state,r.event)},flush=()=>{let e=0;for(;p.length>0&&!m;){if(e+=1,e>a){fail(new n(`maximum queued transitions exceeded`,{maxTransitions:a}),{phase:`transition`,state:s.state});return}let t=p.shift();t&&process(t)}};return establishStateResources(s.state,void 0),i.snapshot||runEffects(nodeFor(e,s.state).entry??[],s.state,void 0),{can:t=>{if(m)return!1;try{return isMachineEvent(t)?canTransition(e,s,t):!1}catch(e){return fail(e,{event:t,phase:`transition`,state:s.state}),!1}},get disposalSignal(){return u.signal},dispose,get disposed(){return m},send,get snapshot(){return s},subscribe(e){return m?()=>void 0:(c.add(e),()=>c.delete(e))},tap(e,t){return m?()=>void 0:l.tap(e,t)},[Symbol.dispose]:dispose}},defineMachine=()=>e=>{assertDefinition(e);let t=e.context??{},n=createSnapshot(e.initial,t);return{can:(t,n)=>canTransition(e,t,n),createActor:t=>createActor(e,n,t),initialSnapshot:n,transition:(t,n)=>transition(e,t,{event:n,kind:`event`}).result}};export{defineMachine};
|
|
263
2
|
//# sourceMappingURL=interpret.js.map
|
package/dist/interpret.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interpret.js","names":[],"sources":["../src/interpret.ts"],"sourcesContent":["import { isContextRecord } from './_context.js';\nimport { warn } from './_dev.js';\nimport { type CompiledAfter, type CompiledMachine, type CompiledState, compileDefinition } from './definition.js';\nimport { ClockworkError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n Effect,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n TransitionResult,\n} from './types.js';\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: CompiledAfter<State, Context, Event>;\n readonly kind: 'after';\n};\n\ntype RuntimeEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> =\n | { readonly event: Event; readonly kind: 'event' }\n | InternalEvent<State, Context, Event>;\n\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkError('INVALID_SNAPSHOT_STATE', `snapshot state \"${String(state)}\" is not declared`, { state });\n};\n\nconst isMachineEvent = (event: unknown): event is MachineEvent => {\n try {\n return typeof event === 'object' && event !== null && typeof (event as { type?: unknown }).type === 'string';\n } catch {\n return false;\n }\n};\n\nconst stateNode = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n state: State,\n): CompiledState<State, Context, Event> => machine.states.get(state) ?? invalidSnapshot(state);\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkError('INVALID_CONTEXT', 'snapshot context must be a non-array object record', {});\n }\n\n stateNode(machine, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(machine, snapshot);\n const state = stateNode(machine, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!state.after.includes(runtimeEvent.after)) return undefined;\n\n const { definition } = runtimeEvent.after;\n\n if (!definition.guard || definition.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: definition as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const candidates = state.on.get(runtimeEvent.event.type);\n\n if (!candidates) return undefined;\n\n for (const candidate of candidates) {\n const guard = candidate.guard as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event }) => boolean)\n | undefined;\n\n if (!guard || guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return {\n event: runtimeEvent.event,\n transition: candidate as unknown as ExecutableTransition<State, Context, Event>,\n };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(machine, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const reducer = selected.transition.reduce as\n | ((args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context)\n | undefined;\n const nextContext = reducer ? reducer({ context: snapshot.context, event: selected.event }) : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkError('INVALID_CONTEXT', 'a reducer must return a non-array object record', {\n state: snapshot.state,\n });\n }\n\n return {\n event: selected.event,\n result: { snapshot: createSnapshot(selected.transition.target, nextContext as Context), type: 'transition' },\n transition: selected.transition,\n };\n};\n\nconst canTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(machine, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n machine: CompiledMachine<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context, Event> = {},\n): Actor<State, Context, Event> => {\n if (\n options.maxTransitions !== undefined &&\n (!Number.isInteger(options.maxTransitions) || options.maxTransitions < 1)\n ) {\n throw new ClockworkError('INVALID_MAX_TRANSITIONS', 'maxTransitions must be a positive integer', {\n maxTransitions: options.maxTransitions,\n });\n }\n\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(machine, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const disposal = new AbortController();\n const timers = new Set<ReturnType<typeof setTimeout>>();\n const invokes = new Set<AbortController>();\n const queue: RuntimeEvent<State, Context, Event>[] = [];\n const maxTransitions = options.maxTransitions ?? 1_000;\n let disposed = false;\n let processing = false;\n\n const cancelStateResources = (): void => {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n\n for (const controller of invokes) controller.abort();\n invokes.clear();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n queue.length = 0;\n cancelStateResources();\n listeners.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n try {\n options.onError?.(error, context);\n } catch {}\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = stateNode(machine, state);\n\n for (const after of node.after) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.definition.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(machine, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) return;\n\n const source = stateNode(machine, previous.state);\n\n current = outcome.result.snapshot;\n cancelStateResources();\n establishStateResources(current.state, outcome.event);\n notify(outcome.event);\n runEffects(source.exit, previous.state, outcome.event);\n runEffects(outcome.transition.effects ?? [], previous.state, outcome.event);\n runEffects(stateNode(machine, current.state).entry, current.state, outcome.event);\n };\n\n const flush = (): void => {\n let transitions = 0;\n\n while (queue.length > 0 && !disposed) {\n transitions += 1;\n\n if (transitions > maxTransitions) {\n fail(\n new ClockworkError('INVALID_TRANSITION_LIMIT', 'maximum queued transitions exceeded', { maxTransitions }),\n { phase: 'transition', state: current.state },\n );\n\n return;\n }\n\n const next = queue.shift();\n\n if (next) process(next);\n }\n };\n\n establishStateResources(current.state, undefined);\n\n if (!options.snapshot) {\n runEffects(stateNode(machine, current.state).entry, current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(machine, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n [Symbol.dispose]: dispose,\n };\n};\n\n/** Defines a typed flat finite-state machine. */\nexport const defineMachine =\n <Context extends Record<string, unknown> = Record<string, never>, Event extends MachineEvent = MachineEvent>() =>\n <State extends string>(definition: MachineConfig<State, Context, Event>): Machine<State, Context, Event> => {\n const compiled = compileDefinition(definition);\n const initialSnapshot = createSnapshot(compiled.initial, compiled.context);\n\n return {\n can: (snapshot, event) => canTransition(compiled, snapshot, event),\n createActor: (options) => createActor(compiled, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(compiled, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interpret.js","names":[],"sources":["../src/interpret.ts"],"sourcesContent":["import { tapper } from '@vielzeug/arsenal';\nimport { warn } from './_dev.js';\nimport { ClockworkDefinitionError, ClockworkSnapshotError, ClockworkTransitionLimitError } from './errors.js';\nimport type {\n Actor,\n ActorErrorContext,\n ActorOptions,\n ActorTapEvent,\n After,\n Effect,\n EventType,\n Machine,\n MachineConfig,\n MachineEvent,\n MachineSnapshot,\n StateNode,\n TransitionResult,\n} from './types.js';\n\nconst MAX_TIMER_MS = 2_147_483_647;\nconst MAX_TRANSITIONS = 1_000;\n\nconst 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\n/** Fails fast on the definition footguns the type system cannot express: out-of-range\n * timer delays (platform timers fire immediately above 2^31 ms), empty transition\n * arrays, and a context that is not a plain record. Everything else: declared\n * targets, callback shapes, state keys: is compiler-checked in the typed definition. */\nconst assertDefinition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n): void => {\n const context = (definition as { readonly context?: Context }).context;\n\n if (context !== undefined && !isContextRecord(context)) {\n throw new ClockworkDefinitionError('machine context must be a non-array object record', {});\n }\n\n for (const [state, node] of Object.entries(definition.states) as [string, StateNode<State, Context, Event>][]) {\n for (const [type, input] of Object.entries(node.on ?? {})) {\n if (Array.isArray(input) && input.length === 0) {\n throw new ClockworkDefinitionError('a transition array must not be empty', { state, type });\n }\n }\n\n for (const [index, after] of (node.after ?? []).entries()) {\n if (!Number.isFinite(after.delay) || after.delay < 0 || after.delay > MAX_TIMER_MS) {\n throw new ClockworkDefinitionError(`state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay: after.delay,\n index,\n state,\n });\n }\n }\n }\n};\n\ntype InternalEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly after: After<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\n/** A transition or delayed transition selected for execution. The reducer's event\n * parameter is whatever the selector matched: the event for a user transition,\n * `undefined` for a timer, which the declared per-type signatures cannot express. */\ntype ExecutableTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly effects?: readonly Effect<Context, Event>[];\n readonly reduce?: (args: { readonly context: Readonly<Context>; readonly event: Event | undefined }) => Context;\n readonly target: State;\n};\n\ntype SelectedTransition<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly transition: ExecutableTransition<State, Context, Event>;\n};\n\ntype TransitionOutcome<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {\n readonly event: Event | undefined;\n readonly result: TransitionResult<State, Context>;\n readonly transition?: ExecutableTransition<State, Context, Event>;\n};\n\nconst createSnapshot = <State extends string, Context extends Record<string, unknown>>(\n state: State,\n context: Context,\n): MachineSnapshot<State, Context> => {\n const cloned = Object.assign(Object.create(Object.getPrototypeOf(context)) as Context, context);\n\n return Object.freeze({ context: Object.freeze(cloned), state });\n};\n\nconst normalizeSnapshot = <State extends string, Context extends Record<string, unknown>>(\n snapshot: MachineSnapshot<State, Context>,\n): MachineSnapshot<State, Context> =>\n Object.isFrozen(snapshot) && Object.isFrozen(snapshot.context)\n ? snapshot\n : createSnapshot(snapshot.state, snapshot.context as Context);\n\nconst invalidSnapshot = (state: unknown): never => {\n throw new ClockworkSnapshotError(`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\n/** Reads a declared state node. The own-property guard keeps prototype keys such as\n * `constructor` or `__proto__` from reading as declared states. */\nconst nodeFor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n state: State,\n) => (Object.hasOwn(definition.states, state) ? definition.states[state] : invalidSnapshot(state));\n\nconst assertSnapshot = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n): void => {\n if (!isContextRecord(snapshot.context)) {\n throw new ClockworkSnapshotError('snapshot context must be a non-array object record', {});\n }\n\n nodeFor(definition, snapshot.state);\n};\n\nconst selectTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): SelectedTransition<State, Context, Event> | undefined => {\n assertSnapshot(definition, snapshot);\n const node = nodeFor(definition, snapshot.state);\n\n if (runtimeEvent.kind === 'after') {\n if (!node.after || !node.after.includes(runtimeEvent.after)) return undefined;\n\n if (!runtimeEvent.after.guard || runtimeEvent.after.guard({ context: snapshot.context, event: undefined })) {\n return { event: undefined, transition: runtimeEvent.after as ExecutableTransition<State, Context, Event> };\n }\n\n return undefined;\n }\n\n const on = node.on;\n\n if (!on || !Object.hasOwn(on, runtimeEvent.event.type)) return undefined;\n\n const input = on[runtimeEvent.event.type as EventType<Event>];\n const candidates = Array.isArray(input) ? input : [input];\n\n for (const candidate of candidates) {\n if (!candidate.guard || candidate.guard({ context: snapshot.context, event: runtimeEvent.event })) {\n return { event: runtimeEvent.event, transition: candidate as ExecutableTransition<State, Context, Event> };\n }\n }\n\n return undefined;\n};\n\nconst transition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n runtimeEvent: RuntimeEvent<State, Context, Event>,\n): TransitionOutcome<State, Context, Event> => {\n const selected = selectTransition(definition, snapshot, runtimeEvent);\n\n if (!selected) {\n return {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n result: { snapshot: normalizeSnapshot(snapshot), type: 'ignored' },\n };\n }\n\n const nextContext = selected.transition.reduce\n ? selected.transition.reduce({ context: snapshot.context, event: selected.event })\n : snapshot.context;\n\n if (!isContextRecord(nextContext)) {\n throw new ClockworkSnapshotError('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 definition: MachineConfig<State, Context, Event>,\n snapshot: MachineSnapshot<State, Context>,\n event: Event,\n): boolean => selectTransition(definition, snapshot, { event, kind: 'event' }) !== undefined;\n\nconst createActor = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n definition: MachineConfig<State, Context, Event>,\n initialSnapshot: MachineSnapshot<State, Context>,\n options: ActorOptions<State, Context> = {},\n): Actor<State, Context, Event> => {\n const restored = options.snapshot ?? initialSnapshot;\n\n assertSnapshot(definition, restored);\n let current = createSnapshot(restored.state, restored.context as Context);\n\n const listeners = new Set<(snapshot: MachineSnapshot<State, Context>) => void>();\n const tappers = tapper<ActorTapEvent<State, Context, Event>>();\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 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 tappers.emit({ type: 'dispose' });\n tappers.clear();\n disposal.abort();\n };\n\n const observeError = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n tappers.emit({ error, event: context.event, phase: context.phase, state: context.state, type: 'error' });\n };\n\n const fail = (error: unknown, context: ActorErrorContext<State, Event>): void => {\n observeError(error, context);\n dispose();\n };\n\n const run = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n if (disposed) return;\n\n if (processing) {\n queue.push(runtimeEvent);\n\n return;\n }\n\n processing = true;\n\n try {\n process(runtimeEvent);\n flush();\n } finally {\n processing = false;\n }\n };\n\n const send = (event: Event): void => {\n if (disposed) return;\n\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n\n return;\n }\n\n run({ event, kind: 'event' });\n };\n\n const runEffects = (effects: readonly Effect<Context, Event>[], state: State, event: Event | undefined): void => {\n for (const effect of effects) {\n if (disposed) return;\n\n try {\n effect({ context: current.context, event, send, signal: disposal.signal });\n } catch (error) {\n fail(error, { event, phase: 'effect', state });\n }\n }\n };\n\n const establishStateResources = (state: State, event: Event | undefined): void => {\n const node = nodeFor(definition, state);\n\n for (const after of node.after ?? []) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n run({ after, kind: 'after' });\n }, after.delay);\n\n timers.add(timer);\n }\n\n for (const invoke of node.invoke ?? []) {\n const controller = new AbortController();\n\n invokes.add(controller);\n\n const capturedContext = current.context;\n const capturedEvent = event;\n\n void Promise.resolve()\n .then(() => invoke.src({ context: capturedContext, event: capturedEvent, signal: controller.signal }))\n .then(\n (result) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted || !invoke.onDone) return;\n\n try {\n send(invoke.onDone({ context: capturedContext, result }));\n } catch (error) {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n (error: unknown) => {\n invokes.delete(controller);\n\n if (disposed || controller.signal.aborted) return;\n\n try {\n if (invoke.onError) {\n send(invoke.onError({ context: capturedContext, error }));\n } else {\n fail(error, { event: capturedEvent, phase: 'invoke', state });\n }\n } catch (callbackError) {\n fail(callbackError, { event: capturedEvent, phase: 'invoke', state });\n }\n },\n );\n }\n };\n\n const notify = (event: Event | undefined): void => {\n for (const listener of [...listeners]) {\n if (disposed) return;\n\n try {\n listener(current);\n } catch (error) {\n observeError(error, { event, phase: 'subscriber', state: current.state });\n }\n }\n };\n\n const process = (runtimeEvent: RuntimeEvent<State, Context, Event>): void => {\n const previous = current;\n let outcome: TransitionOutcome<State, Context, Event>;\n\n try {\n outcome = transition(definition, current, runtimeEvent);\n } catch (error) {\n fail(error, {\n event: runtimeEvent.kind === 'event' ? runtimeEvent.event : undefined,\n phase: 'transition',\n state: current.state,\n });\n\n return;\n }\n\n if (outcome.result.type === 'ignored' || !outcome.transition) {\n tappers.emit({ event: outcome.event, snapshot: outcome.result.snapshot, type: 'ignored' });\n return;\n }\n\n const source = nodeFor(definition, previous.state);\n\n current = outcome.result.snapshot;\n tappers.emit({ event: outcome.event, snapshot: current, type: 'transition' });\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(nodeFor(definition, 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 > MAX_TRANSITIONS) {\n fail(\n new ClockworkTransitionLimitError('maximum queued transitions exceeded', { maxTransitions: MAX_TRANSITIONS }),\n {\n phase: 'transition',\n state: current.state,\n },\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(nodeFor(definition, current.state).entry ?? [], current.state, undefined);\n }\n\n return {\n can: (event) => {\n if (disposed) return false;\n\n try {\n if (!isMachineEvent(event)) {\n warn('ignored malformed event; expected an object with a string `type`');\n return false;\n }\n\n return canTransition(definition, current, event);\n } catch (error) {\n fail(error, { event, phase: 'transition', state: current.state });\n return false;\n }\n },\n get disposalSignal() {\n return disposal.signal;\n },\n dispose,\n get disposed() {\n return disposed;\n },\n send,\n get snapshot() {\n return current;\n },\n subscribe(listener) {\n if (disposed) return () => undefined;\n\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n tap(handler, tapOptions) {\n if (disposed) return () => undefined;\n\n return tappers.tap(handler, tapOptions);\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 assertDefinition(definition);\n const context = (definition as { readonly context?: Context }).context ?? ({} as Context);\n const initialSnapshot = createSnapshot(definition.initial, context);\n\n return {\n can: (snapshot, event) => canTransition(definition, snapshot, event),\n createActor: (options) => createActor(definition, initialSnapshot, options),\n initialSnapshot,\n transition: (snapshot, event) => transition(definition, snapshot, { event, kind: 'event' }).result,\n };\n };\n"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -84,9 +84,18 @@ export type ActorErrorContext<State extends string, Event extends MachineEvent>
|
|
|
84
84
|
readonly phase: 'effect' | 'invoke' | 'subscriber' | 'transition';
|
|
85
85
|
readonly state: State;
|
|
86
86
|
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
readonly
|
|
87
|
+
/** Observation event delivered to {@link Actor.tap} handlers. */
|
|
88
|
+
export type ActorTapEvent<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = (ActorErrorContext<State, Event> & {
|
|
89
|
+
readonly error: unknown;
|
|
90
|
+
readonly type: 'error';
|
|
91
|
+
}) | {
|
|
92
|
+
readonly event: Event | undefined;
|
|
93
|
+
readonly snapshot: MachineSnapshot<State, Context>;
|
|
94
|
+
readonly type: 'transition' | 'ignored';
|
|
95
|
+
} | {
|
|
96
|
+
readonly type: 'dispose';
|
|
97
|
+
};
|
|
98
|
+
export type ActorOptions<State extends string, Context extends Record<string, unknown>> = {
|
|
90
99
|
readonly snapshot?: MachineSnapshot<State, Context>;
|
|
91
100
|
};
|
|
92
101
|
export type Actor<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
|
|
@@ -98,10 +107,17 @@ export type Actor<State extends string, Context extends Record<string, unknown>,
|
|
|
98
107
|
send(event: Event): void;
|
|
99
108
|
readonly snapshot: MachineSnapshot<State, Context>;
|
|
100
109
|
subscribe(listener: (snapshot: MachineSnapshot<State, Context>) => void): () => void;
|
|
110
|
+
/**
|
|
111
|
+
* Observe actor lifecycle without affecting machine behavior.
|
|
112
|
+
* Handler errors are swallowed. Returns an unsubscribe function.
|
|
113
|
+
*/
|
|
114
|
+
tap(handler: (event: ActorTapEvent<State, Context, Event>) => void, options?: {
|
|
115
|
+
readonly signal?: AbortSignal;
|
|
116
|
+
}): () => void;
|
|
101
117
|
};
|
|
102
118
|
export type Machine<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
|
|
103
119
|
can(snapshot: MachineSnapshot<State, Context>, event: Event): boolean;
|
|
104
|
-
createActor(options?: ActorOptions<State, Context
|
|
120
|
+
createActor(options?: ActorOptions<State, Context>): Actor<State, Context, Event>;
|
|
105
121
|
readonly initialSnapshot: MachineSnapshot<State, Context>;
|
|
106
122
|
transition(snapshot: MachineSnapshot<State, Context>, event: Event): TransitionResult<State, Context>;
|
|
107
123
|
};
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vielzeug/clockwork",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Framework-neutral
|
|
3
|
+
"version": "26.10.1",
|
|
4
|
+
"description": "Framework-neutral finite state machines with pure transitions and actors",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/helmuthdu/vielzeug",
|
|
@@ -39,10 +39,13 @@
|
|
|
39
39
|
"test": "vitest",
|
|
40
40
|
"verify:exports": "node verify-exports.mjs"
|
|
41
41
|
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@vielzeug/arsenal": "26.10.1"
|
|
44
|
+
},
|
|
42
45
|
"devDependencies": {
|
|
43
|
-
"@types/node": "^26.
|
|
46
|
+
"@types/node": "^26.6.2",
|
|
44
47
|
"typescript": "^6.0.3",
|
|
45
|
-
"vite": "^8.
|
|
46
|
-
"vitest": "^5.0.
|
|
48
|
+
"vite": "^8.3.0",
|
|
49
|
+
"vitest": "^5.0.1"
|
|
47
50
|
}
|
|
48
51
|
}
|
package/dist/_context.cjs
DELETED
package/dist/_context.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_context.cjs","names":[],"sources":["../src/_context.ts"],"sourcesContent":["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"],"mappings":"AAAA,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"}
|
package/dist/_context.d.ts
DELETED
package/dist/_context.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_context.d.ts","sourceRoot":"","sources":["../src/_context.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMhF"}
|
package/dist/_context.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
//#region src/_context.ts
|
|
2
|
-
function e(e) {
|
|
3
|
-
if (typeof e != "object" || !e || Array.isArray(e)) return !1;
|
|
4
|
-
let t = Object.getPrototypeOf(e);
|
|
5
|
-
return t === null || t === Object.prototype;
|
|
6
|
-
}
|
|
7
|
-
//#endregion
|
|
8
|
-
export { e as isContextRecord };
|
|
9
|
-
|
|
10
|
-
//# sourceMappingURL=_context.js.map
|
package/dist/_context.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_context.js","names":[],"sources":["../src/_context.ts"],"sourcesContent":["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"],"mappings":";AAAA,SAAgB,EAAgB,GAAkD;CAChF,IAAI,OAAO,KAAU,aAAY,KAAkB,MAAM,QAAQ,CAAK,GAAG,OAAO;CAEhF,IAAM,IAAY,OAAO,eAAe,CAAK;CAE7C,OAAO,MAAc,QAAQ,MAAc,OAAO;AACpD"}
|
package/dist/definition.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("./errors.cjs"),t=require("./_context.cjs");var n=2147483647,r=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null},i=(t,n,r)=>{throw new e.ClockworkError(t,n,r)},a=(e,t,n)=>(Array.isArray(e)||i(`INVALID_DEFINITION`,t,n),e),o=(e,t,n)=>a(e,`${t} must be an array`,{...n,phase:t}).map((e,r)=>(typeof e!=`function`&&i(`INVALID_EFFECT`,`${t} entry at index ${r} must be a function`,{...n,index:r,phase:t}),e)),s=(e,t,n)=>typeof t!=`string`||!e.has(t)?i(`UNKNOWN_TARGET`,`target "${String(t)}" is not a declared state`,{...n,target:t}):t,c=(e,t,n)=>{let a=r(e)?e:i(`INVALID_TRANSITION`,`a transition must be an object`,n),c=s(t,a.target,n);return a.guard!==void 0&&typeof a.guard!=`function`&&i(`INVALID_TRANSITION`,`transition guard must be a function`,{...n,phase:`guard`}),a.reduce!==void 0&&typeof a.reduce!=`function`&&i(`INVALID_TRANSITION`,`transition reducer must be a function`,{...n,phase:`reduce`}),{effects:a.effects===void 0?void 0:o(a.effects,`effects`,n),guard:a.guard,reduce:a.reduce,target:c}},l=(e,t,n)=>{let r=Array.isArray(e)?e:[e];return r.length===0&&i(`INVALID_TRANSITION`,`a transition array must not be empty`,n),r.map((e,r)=>c(e,t,{...n,transitionIndex:r}))},u=(e,t,a,c)=>{let l=r(e)?e:i(`INVALID_TRANSITION`,`state "${c}" after entries must be objects`,{index:a,state:c}),u=l.delay;(typeof u!=`number`||!Number.isFinite(u)||u<0||u>n)&&i(`INVALID_AFTER_DELAY`,`state "${c}" after delay must be between 0 and ${n}`,{delay:u,index:a,state:c});let d={delay:u,index:a,state:c};return l.guard!==void 0&&typeof l.guard!=`function`&&i(`INVALID_TRANSITION`,`after guard must be a function`,{...d,phase:`guard`}),l.reduce!==void 0&&typeof l.reduce!=`function`&&i(`INVALID_TRANSITION`,`after reducer must be a function`,{...d,phase:`reduce`}),{definition:{delay:u,effects:l.effects===void 0?void 0:o(l.effects,`effects`,d),guard:l.guard,reduce:l.reduce,target:s(t,l.target,d)}}},d=(e,t)=>a(e,`state "${t}" invoke must be an array`,{state:t}).map((e,n)=>{let a=r(e)?e:i(`INVALID_INVOKE`,`invoke entry must be an object`,{index:n,state:t});return typeof a.src!=`function`&&i(`INVALID_INVOKE`,`invoke src must be a function`,{index:n,phase:`src`,state:t}),a.onDone!==void 0&&typeof a.onDone!=`function`&&i(`INVALID_INVOKE`,`invoke onDone must be a function`,{index:n,phase:`onDone`,state:t}),a.onError!==void 0&&typeof a.onError!=`function`&&i(`INVALID_INVOKE`,`invoke onError must be a function`,{index:n,phase:`onError`,state:t}),{onDone:a.onDone,onError:a.onError,src:a.src}}),f=e=>{let n=e,s=r(n)?n:i(`INVALID_DEFINITION`,`machine definition must be an object`,{}),c=r(s.states)?s.states:i(`INVALID_DEFINITION`,`machine states must be an object`,{}),f=Object.entries(c),p=new Map(f);(typeof s.initial!=`string`||!p.has(s.initial))&&i(`INVALID_INITIAL_STATE`,`initial state "${String(s.initial)}" is not declared`,{initial:s.initial}),s.context!==void 0&&!t.isContextRecord(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}};exports.compileDefinition=f;
|
|
2
|
-
//# sourceMappingURL=definition.cjs.map
|
package/dist/definition.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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 MAX_TIMER_MS = 2_147_483_647;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst fail = (code: ClockworkError['code'], message: string, details: Record<string, unknown>): never => {\n throw new ClockworkError(code, message, details);\n};\n\nconst array = (value: unknown, message: string, details: Record<string, unknown>): readonly unknown[] => {\n if (!Array.isArray(value)) fail('INVALID_DEFINITION', message, details);\n\n return value as readonly unknown[];\n};\n\nconst functions = <Value>(\n value: unknown,\n phase: 'effects' | 'entry' | 'exit',\n details: Record<string, unknown>,\n): readonly Value[] => {\n const values = array(value, `${phase} must be an array`, { ...details, phase });\n\n return values.map((candidate, index) => {\n if (typeof candidate !== 'function') {\n fail('INVALID_EFFECT', `${phase} entry at index ${index} must be a function`, { ...details, index, phase });\n }\n\n return candidate as Value;\n });\n};\n\nconst validateTarget = <State extends string>(\n states: ReadonlyMap<State, unknown>,\n target: unknown,\n details: Record<string, unknown>,\n): State => {\n if (typeof target !== 'string' || !states.has(target as State)) {\n return fail('UNKNOWN_TARGET', `target \"${String(target)}\" is not a declared state`, { ...details, target });\n }\n\n return target as State;\n};\n\nconst compileTransition = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): Transition<State, Context, Event> => {\n const transition = isRecord(input) ? input : fail('INVALID_TRANSITION', 'a transition must be an object', details);\n const target = validateTarget(states, transition.target, details);\n\n if (transition.guard !== undefined && typeof transition.guard !== 'function') {\n fail('INVALID_TRANSITION', 'transition guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (transition.reduce !== undefined && typeof transition.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'transition reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n effects:\n transition.effects === undefined\n ? undefined\n : functions<Effect<Context, Event>>(transition.effects, 'effects', details),\n guard: transition.guard as Transition<State, Context, Event>['guard'],\n reduce: transition.reduce as Transition<State, Context, Event>['reduce'],\n target,\n };\n};\n\nconst compileTransitions = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n details: Record<string, unknown>,\n): readonly Transition<State, Context, Event>[] => {\n const values = Array.isArray(input) ? input : [input];\n\n if (values.length === 0) fail('INVALID_TRANSITION', 'a transition array must not be empty', details);\n\n return values.map((value, transitionIndex) =>\n compileTransition<State, Context, Event>(value, states, { ...details, transitionIndex }),\n );\n};\n\nconst compileAfter = <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(\n input: unknown,\n states: ReadonlyMap<State, unknown>,\n index: number,\n state: State,\n): CompiledAfter<State, Context, Event> => {\n const after = isRecord(input)\n ? input\n : fail('INVALID_TRANSITION', `state \"${state}\" after entries must be objects`, { index, state });\n const delay = after.delay;\n\n if (typeof delay !== 'number' || !Number.isFinite(delay) || delay < 0 || delay > MAX_TIMER_MS) {\n fail('INVALID_AFTER_DELAY', `state \"${state}\" after delay must be between 0 and ${MAX_TIMER_MS}`, {\n delay,\n index,\n state,\n });\n }\n\n const details = { delay, index, state };\n\n if (after.guard !== undefined && typeof after.guard !== 'function') {\n fail('INVALID_TRANSITION', 'after guard must be a function', { ...details, phase: 'guard' });\n }\n\n if (after.reduce !== undefined && typeof after.reduce !== 'function') {\n fail('INVALID_TRANSITION', 'after reducer must be a function', { ...details, phase: 'reduce' });\n }\n\n return {\n definition: {\n delay: delay as number,\n effects:\n after.effects === undefined ? undefined : functions<Effect<Context, Event>>(after.effects, 'effects', details),\n guard: after.guard as After<State, Context, Event>['guard'],\n reduce: after.reduce as After<State, Context, Event>['reduce'],\n target: validateTarget(states, after.target, details),\n },\n };\n};\n\nconst compileInvokes = <Context extends Record<string, unknown>, Event extends MachineEvent>(\n value: unknown,\n state: string,\n): readonly Invoke<Context, Event>[] =>\n array(value, `state \"${state}\" invoke must be an array`, { state }).map((value, index) => {\n const candidate = isRecord(value)\n ? value\n : fail('INVALID_INVOKE', 'invoke entry must be an object', { index, state });\n\n if (typeof candidate.src !== 'function') {\n fail('INVALID_INVOKE', 'invoke src must be a function', { index, phase: 'src', state });\n }\n\n if (candidate.onDone !== undefined && typeof candidate.onDone !== 'function') {\n fail('INVALID_INVOKE', 'invoke onDone must be a function', { index, phase: 'onDone', state });\n }\n\n if (candidate.onError !== undefined && typeof candidate.onError !== 'function') {\n fail('INVALID_INVOKE', 'invoke onError must be a function', { index, phase: 'onError', state });\n }\n\n return {\n onDone: candidate.onDone as Invoke<Context, Event>['onDone'],\n onError: candidate.onError as Invoke<Context, Event>['onError'],\n src: candidate.src as Invoke<Context, Event>['src'],\n };\n });\n\n/** Validates and structurally compiles a flat machine definition once. */\nexport const compileDefinition = <\n State extends string,\n Context extends Record<string, unknown>,\n Event extends MachineEvent,\n>(\n definition: MachineConfig<State, Context, Event>,\n): CompiledMachine<State, Context, Event> => {\n const raw = definition as unknown;\n const machine = isRecord(raw) ? raw : fail('INVALID_DEFINITION', 'machine definition must be an object', {});\n const rawStates = isRecord(machine.states)\n ? machine.states\n : fail('INVALID_DEFINITION', 'machine states must be an object', {});\n const rawStateEntries = Object.entries(rawStates) as [State, unknown][];\n const rawStateMap = new Map<State, unknown>(rawStateEntries);\n\n if (typeof machine.initial !== 'string' || !rawStateMap.has(machine.initial as State)) {\n fail('INVALID_INITIAL_STATE', `initial state \"${String(machine.initial)}\" is not declared`, {\n initial: machine.initial,\n });\n }\n\n if (machine.context !== undefined && !isContextRecord(machine.context)) {\n fail('INVALID_CONTEXT', 'machine context must be a non-array object record', {});\n }\n\n const states = new Map<State, CompiledState<State, Context, Event>>();\n\n for (const [state, rawNodeValue] of rawStateEntries) {\n const rawNode = isRecord(rawNodeValue)\n ? rawNodeValue\n : fail('INVALID_DEFINITION', `state \"${state}\" must be an object`, { state });\n\n if ('states' in rawNode || 'initial' in rawNode) {\n fail('INVALID_DEFINITION', `state \"${state}\" must be flat and cannot declare child states`, { state });\n }\n\n const on = new Map<string, readonly Transition<State, Context, Event>[]>();\n\n if (rawNode.on !== undefined) {\n const rawOn = isRecord(rawNode.on)\n ? rawNode.on\n : fail('INVALID_TRANSITION', `state \"${state}\" on must be an object`, { state });\n\n for (const [type, transition] of Object.entries(rawOn)) {\n on.set(type, compileTransitions<State, Context, Event>(transition, rawStateMap, { state, type }));\n }\n }\n\n const after =\n rawNode.after === undefined\n ? []\n : array(rawNode.after, `state \"${state}\" after must be an array`, { state }).map((entry, index) =>\n compileAfter<State, Context, Event>(entry, rawStateMap, index, state),\n );\n\n states.set(state, {\n after,\n entry: rawNode.entry === undefined ? [] : functions<Effect<Context, Event>>(rawNode.entry, 'entry', { state }),\n exit: rawNode.exit === undefined ? [] : functions<Effect<Context, Event>>(rawNode.exit, 'exit', { state }),\n invoke: rawNode.invoke === undefined ? [] : compileInvokes<Context, Event>(rawNode.invoke, state),\n on,\n });\n }\n\n return {\n context: (machine.context ?? {}) as Context,\n initial: machine.initial as State,\n states,\n };\n};\n"],"mappings":"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"}
|
package/dist/definition.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { After, Effect, Invoke, MachineConfig, MachineEvent, Transition } from './types.js';
|
|
2
|
-
export type CompiledAfter<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
|
|
3
|
-
readonly definition: After<State, Context, Event>;
|
|
4
|
-
};
|
|
5
|
-
export type CompiledState<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
|
|
6
|
-
readonly after: readonly CompiledAfter<State, Context, Event>[];
|
|
7
|
-
readonly entry: readonly Effect<Context, Event>[];
|
|
8
|
-
readonly exit: readonly Effect<Context, Event>[];
|
|
9
|
-
readonly invoke: readonly Invoke<Context, Event>[];
|
|
10
|
-
readonly on: ReadonlyMap<string, readonly Transition<State, Context, Event>[]>;
|
|
11
|
-
};
|
|
12
|
-
export type CompiledMachine<State extends string, Context extends Record<string, unknown>, Event extends MachineEvent> = {
|
|
13
|
-
readonly context: Context;
|
|
14
|
-
readonly initial: State;
|
|
15
|
-
readonly states: ReadonlyMap<State, CompiledState<State, Context, Event>>;
|
|
16
|
-
};
|
|
17
|
-
/** Validates and structurally compiles a flat machine definition once. */
|
|
18
|
-
export declare const compileDefinition: <State extends string, Context extends Record<string, unknown>, Event extends MachineEvent>(definition: MachineConfig<State, Context, Event>) => CompiledMachine<State, Context, Event>;
|
|
19
|
-
//# sourceMappingURL=definition.d.ts.map
|
package/dist/definition.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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;AA+JF,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"}
|