@lite-fsm/core 2.0.3 → 2.0.5

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/dist/actor.d.cts CHANGED
@@ -23,7 +23,7 @@ export type Counters = {
23
23
  };
24
24
  export type NormalizeOptions = {
25
25
  sender?: Self;
26
- forceUnscoped?: boolean;
26
+ routingMode?: "default" | "unscoped";
27
27
  };
28
28
  export type RoutingScope = "actor" | "group" | "tag" | "unscoped";
29
29
  export declare const EMPTY_ACTOR_RECORD: Record<string, RuntimeActorSlice>;
package/dist/actor.d.ts CHANGED
@@ -23,7 +23,7 @@ export type Counters = {
23
23
  };
24
24
  export type NormalizeOptions = {
25
25
  sender?: Self;
26
- forceUnscoped?: boolean;
26
+ routingMode?: "default" | "unscoped";
27
27
  };
28
28
  export type RoutingScope = "actor" | "group" | "tag" | "unscoped";
29
29
  export declare const EMPTY_ACTOR_RECORD: Record<string, RuntimeActorSlice>;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var ee=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var Bt=Object.getOwnPropertyNames;var Ft=Object.prototype.hasOwnProperty;var Vt=(e,t,n)=>t in e?ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Gt=(e,t)=>{for(var n in t)ee(e,n,{get:t[n],enumerable:!0})},Kt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Bt(t))!Ft.call(e,o)&&o!==n&&ee(e,o,{get:()=>t[o],enumerable:!(r=Lt(t,o))||r.enumerable});return e};var Ht=e=>Kt(ee({},"__esModule",{value:!0}),e);var be=(e,t,n)=>Vt(e,typeof t!="symbol"?t+"":t,n);var yn={};Gt(yn,{LiteFsmError:()=>h,Machine:()=>Z,MachineManager:()=>ft,createActorMeta:()=>W,createConfig:()=>pn,createEffect:()=>fn,createMachine:()=>yt,createReducer:()=>dn,defineMachine:()=>$e});module.exports=Ht(yn);var X=Symbol.for("lite-fsm.late-dispatch"),te=Symbol.for("lite-fsm.registerBagDispose");function ne(...e){return e.length===0?t=>t:e.reduce((t,n)=>(...r)=>t(n(...r)))}var fe="*",jt="@@lite-fsm/",ve="@@lite-fsm/HYDRATE",$t="__liteFsmAllowVoidReducer",q="Reducer returned undefined. Return the next state, or use immerMiddleware to mutate draft state without return.",oe=e=>typeof e=="function"&&$t in e,h=class extends Error{constructor(n,r){super(r);be(this,"code",n);this.name="LiteFsmError"}},ye=(e,t)=>{if(typeof e!="string"||e.length===0)throw new h("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] generate${t==="actor"?"Actor":"Group"}Id must return a non-empty string.`);return e},re=e=>typeof e.type=="string"&&e.type.startsWith(jt),O=globalThis.process?.env?.NODE_ENV!=="production",H=e=>{if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))H(Reflect.get(e,t));return e};var $=Object.freeze({}),zt=new Set(["__RESOLVED","__REJECTED","__CANCELLED"]),Wt=["senderActorId","senderGroupId","senderGroupTag"],Ut=["actorId","groupId","groupTag"],V=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),N=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>typeof e=="string"&&zt.has(e),Oe=e=>N(e)&&typeof e.state=="string"&&N(e.context),W=e=>Object.freeze({actorId:e.actorId,groupId:e.groupId,groupTag:e.groupTag}),J=e=>V(e.config,"__INIT"),ae=(e,t,n,r)=>{let o=e[t]?.[n];if(o!==void 0)return o;if(!(r&&t==="__INIT"))return e["*"]?.[n]},Le=(e,t,n,r)=>{if(n==="__INIT")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' remained in __INIT after spawn.`);if(!j(n)&&!r(t,n))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' has invalid state.`)},Be=(e,t)=>{if(t.initialState!=="__INIT")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' must use __INIT as initialState.`);if(t.persistence!==void 0&&t.persistence!=="runtime"&&t.persistence!=="snapshot")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid persistence mode.`);if(t.persistence!=="snapshot"&&(t.hydrate||t.dehydrate))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot define hydrate/dehydrate hooks without snapshot persistence.`);let n=t.config;for(let r of Object.keys(n)){if(j(r)||r.startsWith("__")&&r!=="__INIT")throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has reserved state '${r}'.`);for(let o of Object.values(n[r])){if(r==="__INIT"&&o===null)throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot spawn with a null __INIT target.`);if(o==="__INIT"||typeof o=="string"&&o.startsWith("__")&&!j(o))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid target '${String(o)}'.`)}}},Fe=e=>{let t={};return e&&(e.actorId!==void 0&&(t.actorId=e.actorId),e.groupId!==void 0&&(t.groupId=e.groupId),e.groupTag!==void 0&&(t.groupTag=e.groupTag),e.senderActorId!==void 0&&(t.senderActorId=e.senderActorId),e.senderGroupId!==void 0&&(t.senderGroupId=e.senderGroupId),e.senderGroupTag!==void 0&&(t.senderGroupTag=e.senderGroupTag)),t},Ve=e=>{let t=Fe(e);for(let n of Wt)delete t[n];return t},Ge=e=>{let t=Fe(e);for(let n of Ut)delete t[n];return t},Ae=(e,t)=>{if(Object.keys(t).length===0){let{meta:n,...r}=e;return r}return{...e,meta:t}},le=e=>Array.isArray(e)?e:[e],Se=e=>[...new Set(e)],Ke=e=>e?e.actorId!==void 0?{scope:"actor",targetSet:Se(le(e.actorId))}:e.groupId!==void 0?{scope:"group",targetSet:Se(le(e.groupId))}:e.groupTag!==void 0?{scope:"tag",targetSet:Se(le(e.groupTag))}:{scope:"unscoped",targetSet:[]}:{scope:"unscoped",targetSet:[]},U="#",me=e=>{let t=e.indexOf(U);return t===-1?{owner:null,tail:e}:{owner:e.slice(0,t),tail:e.slice(t+1)}},ke=(e,t)=>{let{owner:n}=me(e);return t===void 0?n===null:n===t},Q=e=>({actor:e.actor,groupByTag:new Map(e.groupByTag)}),He=(e,t)=>{let n=Q(e);n.actor=Math.max(n.actor,t.actor);for(let[r,o]of t.groupByTag)n.groupByTag.set(r,Math.max(n.groupByTag.get(r)??0,o));return n},Ne=e=>{let t=e.lastIndexOf("/");if(t<0)return null;let n=Number(e.slice(t+1));return Number.isInteger(n)&&n>=0?n:null},je=(e,t,n,r)=>{if(ke(t,r)){let o=Ne(me(t).tail);o!==null&&(e.actor=Math.max(e.actor,o+1))}if(ke(n,r)){let o=me(n).tail,c=o.lastIndexOf("/"),a=Ne(o);if(a===null)return;let i=o.slice(0,c);e.groupByTag.set(i,Math.max(e.groupByTag.get(i)??0,a+1))}};var Z=(e,t={})=>{let n=J(e);return{config:e.config,transition:(r,o)=>{if(n&&!t.allowActorTemplate)throw new h("LITE_FSM_STANDALONE_ACTOR_TEMPLATE","[lite-fsm] actor templates can only be used inside MachineManager.");let c=e.config,a=ae(c,r.state,o.type,n);if(a===void 0)return r;if(e.reducer){let u=a||r.state,l=e.reducer(r,o,{nextState:u,config:e.config});if(l===void 0){if(t.allowVoidReducer?.())return r;throw new Error(q)}return l}let i="payload"in o?o.payload:{};return{state:a||r.state,context:{...r.context,...i}}},invokeEffect:async(r,o,c)=>{if(!e.effects)return;let a=e.effects;if(r!==o&&a[o]){let i=a[o];await i?.(c)}else if(a[fe]){let i=a[fe];await i?.(c)}}}},Yt=(e,t={})=>{let n,r=[],o=!1,c=y=>{o=!!y?.some(oe)},a=Z(e,{allowVoidReducer:()=>o}),i=[],u={context:e.initialContext,state:e.initialState};O&&H(u);let l=(y,M)=>a.transition(y,M),A=y=>{l=y(l)},R=y=>new Promise((M,D)=>{let _=m((G,K,P)=>{try{y(P)&&(_(),M(!0))}catch(v){_(),D(v)}})}),p=(y,M,D)=>{a.invokeEffect(y.state,M.state,{...t.dependencies,transition:n,action:D,condition:R}).catch(_=>{t?.onError?.(_)})},m=y=>(i.push(y),()=>{i=i.filter(M=>M!==y)}),b=(y,M,D)=>{i.forEach(_=>_(y,M,D))},f=y=>{let M=u,D=l(M,y);if(D===void 0)throw new Error(q);return u=D,O&&H(u),b(M,u,y),y},S=y=>{if(c(y),!y?.length)return f;let M=y.map(D=>D({getState:E,transition:_=>n(_),replaceReducer:A,onTransition:m,condition:R}));return ne(...M)(f)},I=S(r);n=y=>{let M=u,D=I(y);return p(M,u,D),D};let E=()=>u;return{transition:n,getState:E,onTransition:m,addMiddleware:(...y)=>{r=[...r,...y],I=S(r)}}},$e=(e={})=>({create:t=>Yt(t,e)});var ze=e=>{let{sidecar:t,machines:n,domainKeys:r,refs:o,onTransition:c,onError:a}=e,i=(f,S,I)=>{t.actorById.get(f)?.bag.set(S,I)},u=(f,S)=>{t.actorById.get(f)?.bag.delete(S)},l=(f,S)=>new Promise((I,E)=>{let x=()=>S!==void 0&&!t.actorById.has(S.actorId),y=()=>new h("LITE_FSM_ACTOR_DISPOSED","Actor was disposed before condition resolved.");if(x())return E(y());let M,D=()=>{_(),S&&M&&u(S.actorId,M)},_=c((G,K,P)=>{if(!re(P)){if(x())return _();try{if(!f(P))return;if(x())return _();D(),I(!0)}catch(v){D(),E(v)}}});S&&(M=Symbol("condition"),i(S.actorId,M,()=>{_(),E(y())}))}),A=f=>l(f),R=f=>{let S=(I=>o.transition(I,{sender:f}));return S.unscoped=I=>o.transition(I,{sender:f,forceUnscoped:!0}),S.actor=(I,E)=>o.transition({...E,meta:{actorId:I}},{sender:f}),S.group=(I,E)=>o.transition({...E,meta:{groupId:I}},{sender:f}),S.tag=(I,E)=>o.transition({...E,meta:{groupTag:I}},{sender:f}),S},p=(f,S,I)=>{let E=x=>o.transition(x);for(let x of r){let y=n[x],M=f[x],D=S[x];y.invokeEffect(M.state,D.state,{...o.userDeps,transition:E,action:I,condition:A}).catch(_=>a?.(_))}},m=(f,S,I,E)=>{for(let x of E){let{actorId:y,groupId:M,groupTag:D}=x.meta,_=n[x.templateKey],G=f[x.templateKey],K=S[x.templateKey],P=G?.[y],v=K?.[y];if(!v)continue;let F={actorId:y,groupId:M,groupTag:D};_.invokeEffect(P?.state??"__INIT",v.state,{...o.userDeps,transition:R(F),action:I,condition:Y=>l(Y,F),self:F,[te]:i}).catch(Y=>a?.(Y))}};return{condition:A,invokeEffects:(f,S,I,E)=>{p(f,S,I),m(f,S,I,E)}}};var We=(e,t)=>({normalizeOpts:e,countersBase:t,pendingSpawned:[],pendingDelivered:[],pendingDeleted:[],touchedActorRecords:new Map,effectsTargets:[]}),Ue=e=>(e.countersDraft||(e.countersDraft=Q(e.countersBase)),e.countersDraft),Ye=(e,t,n)=>e?`${e}${U}${t}/${n}`:`${t}/${n}`,Xe=(e,t,n,r,o)=>{let c=Ue(e),a=c.groupByTag.get(t)??0;c.groupByTag.set(t,a+1);let i=r.generateGroupId?ye(r.generateGroupId({templateKey:t,groupTag:t,counter:a,originId:r.originId,action:n}),"group"):Ye(r.originId,t,a);if(o(i))throw new h("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] groupId '${i}' is already in use.`);return i},qe=(e,t,n,r,o,c)=>{let a=Ue(e),i=a.actor;a.actor=i+1;let u=o.generateActorId?ye(o.generateActorId({templateKey:t,groupTag:n,counter:i,originId:o.originId,action:r}),"actor"):Ye(o.originId,t,i);if(c(u))throw new h("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] actorId '${u}' is already in use.`);return u},se=(e,t,n)=>{let r=e.touchedActorRecords.get(n);if(r)return{root:t,record:r};let o=t[n],c=o===$?{}:{...o},a={...t,[n]:c};return e.touchedActorRecords.set(n,c),{root:a,record:c}};var Xt=e=>{if(!N(e))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot must be an object envelope.");if(!N(e.machines))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot.machines must be an object.");return{schemaVersion:typeof e.schemaVersion=="number"?e.schemaVersion:void 0,machines:e.machines}},he=e=>({state:e.state,context:e.context}),qt=e=>N(e)&&V(e,"snapshot")?{snapshot:e.snapshot,meta:e.meta}:{snapshot:e},Je=(e,t)=>N(e)?{...e,meta:t}:e,Jt=(e,t,n)=>e&&N(t)&&t.state===e.state&&t.context===e.context?e:Je(t,n),Qt=(e,t,n,r,o)=>{if(!N(n))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${t}'.`);let c=e[t],i=o.config[t].hydrate,u=r==="replace"?{}:{...c},l=!1;for(let[A,R]of Object.entries(n)){let p=c[A],m=qt(R),b=i?i(p?he(p):void 0,m.snapshot,{strategy:r}):m.snapshot,f=Jt(p,b,p?.meta??m.meta);c[A]!==f&&(l=!0),u[A]=f}if(r==="replace"&&!l){for(let A of Object.keys(c))if(!(A in u)){l=!0;break}}return{record:l?u:c,changed:l}},ie=(e,t,n,r,o,c="commit")=>{let a=Xt(t);c==="commit"&&a.schemaVersion!==o.schemaVersion&&o.onSchemaVersionMismatch?.(a.schemaVersion,o.schemaVersion);let i,u=[];for(let l of Object.keys(a.machines)){if(!V(o.config,l)){c==="commit"&&(O&&console.warn(`[lite-fsm] hydrate: unknown machine key '${l}', skipped.`),o.onUnknownMachineKey?.(l,r));continue}let A=l;if(o.runtimeActorTemplateKeys.includes(A)){O&&console.warn(`[lite-fsm] hydrate: runtime actor template '${A}' was skipped \u2014 runtime actor templates do not participate in hydrate/dehydrate.`);continue}if(o.snapshotActorTemplateKeys.includes(A)){let f=Qt(e,A,a.machines[l],n,o);if(!f.changed)continue;i=i??{...e},i[A]=f.record,u.push(A);continue}let R=e[A],p=a.machines[l],m=o.config[A].hydrate,b=m?m(R,p,{strategy:n}):p;b!==R&&(i=i??{...e},i[A]=b)}return{nextState:i??e,changedActorTemplateKeys:u}},Qe=(e,t,n,r,o,c,a,i)=>{let u=i?.machines;if(u)for(let p of u){if(!V(t,p))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: unknown machine key '${p}'.`);if(o.includes(p))throw new h("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: runtime actor template '${p}' cannot be dehydrated.`)}let l=p=>{let m=e[p];if(!N(m))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let f=t[p].dehydrate,S={};for(let[I,E]of Object.entries(m)){let x=n.actorById.get(I);if(!x)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${I}' has no runtime identity.`);S[I]={snapshot:f?f(he(E)):he(E),meta:x.meta}}return S},A=u??[...c,...r],R={};for(let p of A){if(r.includes(p)){R[p]=l(p);continue}let b=t[p].dehydrate;R[p]=b?b(e[p]):e[p]}return{schemaVersion:a,machines:R}};var Ze=(e,t,n)=>{let r=new Map,o=[];for(let a of e){let i=!1;for(let[u,l]of Object.entries(t(a)))if(!(!l||!n(u)))for(let A of Object.keys(l)){i=!0;let R=r.get(A);R||r.set(A,R=new Set),R.add(a)}i||o.push(a)}let c=new Map;for(let[a,i]of r)c.set(a,[...i]);return{index:c,keysWithoutEdges:o}},Zt=(e,t,n)=>{let r=new Map;for(let o of e){let c=n(o);for(let a of Object.keys(t(o).__INIT??{})){let i=r.get(a);i||r.set(a,i=new Map);let u=i.get(c);u||i.set(c,u=[]),u.push(o)}}return r},et=(e,t,n,r)=>{let o=u=>e[u].config,c=Ze(n,o,()=>!0),a=Ze(t,o,u=>u!=="__INIT"),i=Zt(t,o,r);return{domainReduceIndex:c.index,domainAlwaysReduce:c.keysWithoutEdges,actorReduceIndex:a.index,actorSpawnIndex:i}},tt=e=>{let t=a=>e[a],n=a=>t(a).config;return{groupTagForTemplate:a=>t(a).groupTag??a,hasActorTransition:(a,i,u)=>ae(n(a),i,u.type,!0)!==void 0,isPublicActorState:(a,i)=>i==="__INIT"||j(i)?!1:V(t(a).config,i)}};var nt=e=>{if(re(e))throw new Error(`[lite-fsm] reserved system action '${e.type}' cannot be dispatched.`)},ot=e=>{let{sidecar:t}=e,n=(o,{sender:c,forceUnscoped:a=!1}={})=>{if(!c&&!a&&!("meta"in o))return o;if(c&&!t.actorById.has(c.actorId))return X;let i=Ve(o.meta);return c&&(i.senderActorId=c.actorId,i.senderGroupId=c.groupId,i.senderGroupTag=c.groupTag),a?Ae(o,Ge(i)):(c&&i.actorId===void 0&&i.groupId===void 0&&i.groupTag===void 0&&(i.groupId=c.groupId,i.groupTag=c.groupTag),Ae(o,i))};return{normalizeAction:n,applyPostNormalize:(o,c)=>{let a=n(c,o.normalizeOpts);a!==X&&(o.committed=a)}}};var en=(e,t)=>{let n=[];for(let r of t){let o=e.groupIdsByTag.get(r);if(o)for(let c of o)n.push(c)}return n},tn=e=>{let t=new Map;for(let n of e){let r=t.get(n.templateKey);r?r.push(n):t.set(n.templateKey,[n])}return t},rt=(e,t,n,r)=>{if(n===null){for(let o of e.actorIdsByTemplate.get(t)??[])r(o);return}for(let o of n){let c=e.groupById.get(o)?.actorIdsByTemplate.get(t);if(c)for(let a of c)r(a)}},at=e=>{let{sidecar:t,actorTemplateKeys:n,actorSpawnIndex:r,actorReduceIndex:o,spawnIdConfig:c}=e;return{resolveSpawnGroups:(u,l,A,R)=>{if(u==="group"){let f=[];for(let S of l){let I=t.groupById.get(S);I&&f.push({groupId:S,groupTag:I.groupTag})}return f}if(u==="tag"){let f=[];for(let S of l)for(let I of t.groupIdsByTag.get(S)??[])f.push({groupId:I,groupTag:S});return f}let p=[],m=new Set,b=f=>t.groupById.has(f)||m.has(f);for(let f of r.get(R.type)?.keys()??[]){let S=Xe(A,f,R,c,b);m.add(S),p.push({groupId:S,groupTag:f})}return p},forEachRoutedIdentity:(u,l,A,R,p)=>{if(u==="actor"){for(let x of l){let y=t.actorById.get(x);y&&p(y)}return}let m=u==="group"?l:u==="tag"?en(t,l):null;if(A.length===0){for(let x of o.get(R.type)??[])rt(t,x,m,y=>{let M=t.actorById.get(y);M&&p(M)});return}let b=new Set(o.get(R.type)??[]),f=tn(A),S=new Set(l),I=x=>u==="unscoped"?!0:u==="group"?S.has(x.meta.groupId):S.has(x.meta.groupTag),E=new Set;for(let x of n){b.has(x)&&rt(t,x,m,y=>{if(E.has(y))return;let M=t.actorById.get(y);M&&(E.add(y),p(M))});for(let y of f.get(x)??[]){let M=y.meta.actorId;E.has(M)||I(y)&&(E.add(M),p(y))}}}}};var ct=()=>({actorById:new Map,groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map,counters:{actor:0,groupByTag:new Map}}),nn=()=>({groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map}),st=(e,t,n)=>{let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)},it=(e,t,n)=>{let r=e.get(t);r?.delete(n),r?.size===0&&e.delete(t)},dt=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta,c=e.groupById.get(r);c||(c={groupTag:o,actorIds:new Set,actorIdsByTemplate:new Map},e.groupById.set(r,c)),c.actorIds.add(n),st(c.actorIdsByTemplate,t.templateKey,n),st(e.actorIdsByTemplate,t.templateKey,n);let a=e.groupIdsByTag.get(o);a||(a=new Set,e.groupIdsByTag.set(o,a)),a.add(r)},on=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta;it(e.actorIdsByTemplate,t.templateKey,n);let c=e.groupById.get(r);if(!c||(c.actorIds.delete(n),it(c.actorIdsByTemplate,t.templateKey,n),c.actorIds.size>0))return;e.groupById.delete(r);let a=e.groupIdsByTag.get(o);a?.delete(r),a?.size===0&&e.groupIdsByTag.delete(o)},pt=e=>{for(let t of e.bag.values())t();e.bag.clear()},rn=(e,t,n,r,o)=>{if(r.length===0)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor id for template '${n}' must be non-empty.`);if(!Oe(o)||!t.isPublicActorState(n,o.state))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor slice '${n}.${r}'.`);let c=e.actorById.get(r);if(c){if(c.templateKey!==n)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot move between actor template records.`);return{identity:c,isNew:!1}}let a=o.meta;if(!N(a))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot be created by state replacement without actor meta.`);let{groupId:i,groupTag:u}=a;if(a.actorId!==r||typeof u!="string"||u!==t.groupTagForTemplate(n)||typeof i!="string"||i.length===0)throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' has invalid actor meta.`);return{identity:{templateKey:n,meta:W({actorId:r,groupId:i,groupTag:u})},isNew:!0}},an=e=>{let t=nn();for(let n of e.values())dt(t,n);return t},Ie=(e,t,n,r)=>{let o=new Set,c=new Map,a=new Map(e.actorById),i=new Map,u=[];for(let p of n){let m=r[p];if(!N(m))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let b={};for(let[f,S]of Object.entries(m)){if(o.has(f))throw new h("LITE_FSM_INVALID_ACTOR_SLICE",`Duplicate actorId '${f}'.`);o.add(f);let{identity:I,isNew:E}=rn(e,t,p,f,S);b[f]={...S,meta:I.meta},E&&c.set(f,I)}i.set(p,b)}for(let[p,m]of c)a.set(p,{...m,bag:new Map});let l=new Set(n);for(let[p,m]of a)l.has(m.templateKey)&&(o.has(p)||(u.push(m),a.delete(p)));let A=an(a),R=Q(e.counters);for(let[p,m]of c)je(R,p,m.meta.groupId,t.originId);return{nextActorById:a,nextGroupById:A.groupById,nextGroupIdsByTag:A.groupIdsByTag,nextActorIdsByTemplate:A.actorIdsByTemplate,nextCounters:R,canonicalActorRecords:i,actorsToCleanup:u,touchedTemplateKeys:n}},sn=(e,t)=>{e.actorById=t.nextActorById,e.groupById=t.nextGroupById,e.groupIdsByTag=t.nextGroupIdsByTag,e.actorIdsByTemplate=t.nextActorIdsByTemplate,e.counters=t.nextCounters;for(let n of t.actorsToCleanup)pt(n)},cn=(e,t)=>{let n=new Set(t.pendingDeleted.map(r=>r.meta.actorId));for(let r of t.pendingSpawned){if(n.has(r.meta.actorId))continue;let o={...r,bag:new Map};e.actorById.set(r.meta.actorId,o),dt(e,o)}for(let r of t.pendingDeleted){let o=e.actorById.get(r.meta.actorId);o&&(e.actorById.delete(r.meta.actorId),on(e,o),pt(o))}},ut=(e,t)=>{let n=e;for(let r of t){let o=n[r];o&&o!==$&&Object.keys(o).length===0&&(n={...n,[r]:$})}return n},gt=(e,t,n)=>(t.countersDraft&&(e.counters=He(e.counters,t.countersDraft)),cn(e,t),ut(n,t.touchedActorRecords.keys())),Te=(e,t,n)=>{for(let[r,o]of t.canonicalActorRecords)n={...n,[r]:o};return sn(e,t),ut(n,t.touchedTemplateKeys)},Re=(e,t)=>{let n=[];for(let r of t){let o=e.actorById.get(r.meta.actorId);o&&n.push(o)}return n};var ft=(e,t)=>{let n=t?.originId;if(n!==void 0&&(n.length===0||n.includes(U)))throw new h("LITE_FSM_INVALID_OPTIONS",`[lite-fsm] originId must be a non-empty string without '${U}'.`);let r={originId:n,generateActorId:t?.generateActorId,generateGroupId:t?.generateGroupId},o=Object.keys(e),c=(s,g)=>s[g],a=o.filter(s=>J(e[s])),i=o.filter(s=>!J(e[s]));for(let s of a)Be(s,e[s]);for(let s of i)if(V(e[s],"persistence"))throw new h("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] domain machine '${s}' cannot define actor persistence.`);let u=a.filter(s=>e[s].persistence==="snapshot"),l=a.filter(s=>e[s].persistence!=="snapshot"),A=!!t?.middleware?.some(oe),R=t?.schemaVersion,{groupTagForTemplate:p,hasActorTransition:m,isPublicActorState:b}=tt(e),{domainReduceIndex:f,domainAlwaysReduce:S,actorReduceIndex:I,actorSpawnIndex:E}=et(e,a,i,p),x=s=>!!e[s].effects,y=i.filter(x),M=a.some(x),D=y.length>0||M;if(O)for(let s of i)e[s].groupTag&&console.warn(`[lite-fsm] groupTag on domain machine '${s}' is ignored.`);let _=Object.fromEntries(o.map(s=>[s,Z(e[s],{allowActorTemplate:!0,allowVoidReducer:()=>A})])),G={transition:void 0,userDeps:{}},K=[],P=Object.fromEntries(o.map(s=>[s,a.includes(s)?$:{state:e[s].initialState,context:e[s].initialContext}])),v=ct(),F=null,{normalizeAction:Y,applyPostNormalize:lt}=ot({sidecar:v}),{resolveSpawnGroups:St,forEachRoutedIdentity:mt}=at({sidecar:v,actorTemplateKeys:a,actorSpawnIndex:E,actorReduceIndex:I,spawnIdConfig:r}),At=(s,g)=>{let d=s,T=C=>{let w=_[C],k=s[C],L=w.transition(k,g);L!==k&&(d=d===s?{...s}:d,d[C]=L)};for(let C of S)T(C);for(let C of f.get(g.type)??[])T(C);return d},ht=(s,g,d,T,C)=>{let w=g,k=E.get(d.type);if(!k)return w;let L=B=>v.actorById.has(B)||s.pendingSpawned.some(z=>z.meta.actorId===B);for(let B of St(T,C,s,d))for(let z of k.get(B.groupTag)??[]){let kt=e[z],Nt=W({actorId:qe(s,z,B.groupTag,d,r,L),groupId:B.groupId,groupTag:B.groupTag}),ge={templateKey:z,meta:Nt},Ot={state:"__INIT",context:{...kt.initialContext},meta:ge.meta},_e=se(s,w,z);_e.record[ge.meta.actorId]=Ot,w=_e.root,s.pendingSpawned.push(ge)}return w},It=(s,g,d,T)=>{let w=c(g,d.templateKey)?.[d.meta.actorId];if(!w||!m(d.templateKey,w.state,T))return{root:g,delivered:!1};let k=se(s,g,d.templateKey),B=_[d.templateKey].transition(w,T);return O&&Le(d.meta.actorId,d.templateKey,B.state,b),k.record[d.meta.actorId]={...B,meta:d.meta},{root:k.root,delivered:!0}},Tt=(s,g)=>{let d=g,T=new Set;for(let C of[...s.pendingSpawned,...s.pendingDelivered]){if(T.has(C.meta.actorId))continue;T.add(C.meta.actorId);let k=c(d,C.templateKey)?.[C.meta.actorId];if(!k||!j(k.state))continue;let L=se(s,d,C.templateKey);delete L.record[C.meta.actorId],d=L.root,s.pendingDeleted.push(C)}return d},ce=(s,g)=>{let d=F,{scope:T,targetSet:C}=Ke(g.meta),w=At(s,g);return T!=="actor"&&(w=ht(d,w,g,T,C)),mt(T,C,d.pendingSpawned,g,k=>{let L=It(d,w,k,g);w=L.root,L.delivered&&d.pendingDelivered.push(k)}),Tt(d,w)},Me=s=>{ce=s(ce)},Ce={actorTemplateKeys:a,groupTagForTemplate:p,isPublicActorState:b,originId:n},Rt=s=>{let g=[],d=new Set,T=C=>{for(let w of C){let k=w.meta.actorId;d.has(k)||(d.add(k),g.push(w))}};T(Re(v,s.pendingSpawned)),T(Re(v,s.pendingDelivered)),s.effectsTargets=g},Mt=(s,g,d)=>a.filter(T=>s[T]===g[T]?!1:d.touchedActorRecords.get(T)!==g[T]),Ct=(s,g,d)=>{let T=Mt(g,d,s),C=T.length?Ie(v,Ce,T,d):void 0,w=C?Te(v,C,d):d;return gt(v,s,w)},de=s=>(K.push(s),()=>{K=K.filter(g=>g!==s)}),xe=(s,g,d)=>{for(let T of K)T(s,g,d)},{condition:xt,invokeEffects:Et}=ze({sidecar:v,machines:_,domainKeys:y,refs:G,onTransition:de,onError:t?.onError}),Ee=()=>P,wt=()=>({schemaVersion:R,machines:{...P}}),pe={config:e,snapshotActorTemplateKeys:u,runtimeActorTemplateKeys:l,schemaVersion:R,groupTagForTemplate:p,onSchemaVersionMismatch:t?.onSchemaVersionMismatch,onUnknownMachineKey:t?.onUnknownMachineKey},we=(s,g)=>{if(s.changedActorTemplateKeys.length===0)return g;let d=Ie(v,Ce,s.changedActorTemplateKeys,g);return Te(v,d,g)},Dt=(s,{strategy:g="merge",baseState:d=P}={})=>ie(d,s,g,"hydrate",pe,"preview").nextState,De=t?.snapshot;if(De){let s=ie(P,De,"replace","opts.snapshot",pe);P=we(s,s.nextState)}O&&H(P);let Pt=(s,{strategy:g="merge"}={})=>{let d=P,T=ie(d,s,g,"hydrate",pe),C=T.nextState;C!==d&&(P=we(T,C),O&&H(P),xe(d,P,{type:ve,payload:{strategy:g,snapshot:s}}))},_t=(s=>Qe(P,e,v,u,l,i,R,s)),Pe=s=>{let g=F;if(g.committed)throw new Error("[lite-fsm] middleware called next() more than once for a single transition.");let d=P;if(lt(g,s),!g.committed)return s;g.committedPrevState=d;let T=ce(d,g.committed);if(T===void 0)throw new Error(q);return P=Ct(g,d,T),M&&Rt(g),O&&H(P),xe(d,P,g.committed),g.committed},bt=(()=>{let s=t?.middleware;if(!s?.length)return Pe;let g={getState:Ee,transition:T=>ue(T),replaceReducer:Me,onTransition:de,condition:xt},d=s.map(T=>T(g));return ne(...d)(Pe)})();function ue(s,g={}){nt(s);let d=Y(s,g);if(d===X)return s;let T=F,C=We(g,v.counters);F=C;let w;try{w=bt(d)}finally{F=T}return C.committed?(D&&Et(C.committedPrevState,P,C.committed,C.effectsTargets),C.committed):w}let vt=s=>{let g=G.userDeps,d=typeof s=="function"?s(g):s;G.userDeps=d};return G.transition=ue,{getState:Ee,getSnapshot:wt,getHydratedState:Dt,hydrate:Pt,dehydrate:_t,transition:ue,setDependencies:vt,onTransition:de,replaceReducer:Me}};function yt(e){return e}var dn=e=>e,pn=e=>e,un=Symbol.for("lite-fsm.owner.domain"),gn=({type:e,effect:t,cancelFn:n})=>{let r=new Map;return o=>{let c=o,a=c.self?.actorId??un,i=r.get(a)??{lastId:0};i.lastId+=1,i.cancel=n?.(o),r.set(a,i);let u=i.lastId;c.self&&!i.dispose&&(i.dispose=()=>r.delete(a),c[te]?.(c.self.actorId,Symbol("createEffect"),i.dispose));let l=()=>e==="latest"&&u!==r.get(a)?.lastId?!1:!i.cancel?.(),A=Object.assign(R=>l()?o.transition(R):R,o.transition);if(c.self){let R=o.transition;A.unscoped=p=>l()?R.unscoped(p):p,A.actor=(p,m)=>l()?R.actor(p,m):m,A.group=(p,m)=>l()?R.group(p,m):m,A.tag=(p,m)=>l()?R.tag(p,m):m}return t({...o,transition:A})}},fn=e=>gn(e);0&&(module.exports={LiteFsmError,Machine,MachineManager,createActorMeta,createConfig,createEffect,createMachine,createReducer,defineMachine});
1
+ "use strict";var J=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var Bt=Object.getOwnPropertyNames;var Ft=Object.prototype.hasOwnProperty;var Vt=(e,t,n)=>t in e?J(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Gt=(e,t)=>{for(var n in t)J(e,n,{get:t[n],enumerable:!0})},Kt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Bt(t))!Ft.call(e,o)&&o!==n&&J(e,o,{get:()=>t[o],enumerable:!(r=Lt(t,o))||r.enumerable});return e};var Ht=e=>Kt(J({},"__esModule",{value:!0}),e);var _e=(e,t,n)=>Vt(e,typeof t!="symbol"?t+"":t,n);var fn={};Gt(fn,{HYDRATE_ACTION_TYPE:()=>te,LiteFsmError:()=>I,Machine:()=>q,MachineManager:()=>ft,VOID_REDUCER_MIDDLEWARE_MARKER:()=>le,createActorMeta:()=>z,createConfig:()=>dn,createEffect:()=>gn,createMachine:()=>yt,createReducer:()=>cn,defineMachine:()=>He});module.exports=Ht(fn);var Q=Symbol.for("lite-fsm.registerBagDispose");function ee(...e){return e.length===0?t=>t:e.reduce((t,n)=>(...r)=>t(n(...r)))}var Pe="*",jt="@@lite-fsm/",te="@@lite-fsm/HYDRATE",le="__liteFsmAllowVoidReducer",Z="Reducer returned undefined. Return the next state, or use immerMiddleware to mutate draft state without return.",ne=e=>typeof e=="function"&&le in e,I=class extends Error{constructor(n,r){super(r);_e(this,"code",n);this.name="LiteFsmError"}},Se=(e,t)=>{if(typeof e!="string"||e.length===0)throw new I("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] generate${t==="actor"?"Actor":"Group"}Id must return a non-empty string.`);return e},oe=e=>typeof e.type=="string"&&e.type.startsWith(jt),L=globalThis.process?.env?.NODE_ENV!=="production",K=e=>{if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))K(Reflect.get(e,t));return e};var j=Object.freeze({}),$t=new Set(["__RESOLVED","__REJECTED","__CANCELLED"]),zt=["senderActorId","senderGroupId","senderGroupTag"],Wt=["actorId","groupId","groupTag"],V=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),N=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),H=e=>typeof e=="string"&&$t.has(e),ke=e=>N(e)&&typeof e.state=="string"&&N(e.context),z=e=>Object.freeze({actorId:e.actorId,groupId:e.groupId,groupTag:e.groupTag}),re=e=>V(e.config,"__INIT"),ae=(e,t,n,r)=>{let o=e[t]?.[n];if(o!==void 0)return o;if(!(r&&t==="__INIT"))return e["*"]?.[n]},Ne=(e,t,n,r)=>{if(n==="__INIT")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' remained in __INIT after spawn.`);if(!H(n)&&!r(t,n))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' has invalid state.`)},Oe=(e,t)=>{if(t.initialState!=="__INIT")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' must use __INIT as initialState.`);if(t.persistence!==void 0&&t.persistence!=="runtime"&&t.persistence!=="snapshot")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid persistence mode.`);if(t.persistence!=="snapshot"&&(t.hydrate||t.dehydrate))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot define hydrate/dehydrate hooks without snapshot persistence.`);let n=t.config;for(let r of Object.keys(n)){if(H(r)||r.startsWith("__")&&r!=="__INIT")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has reserved state '${r}'.`);for(let o of Object.values(n[r])){if(r==="__INIT"&&o===null)throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot spawn with a null __INIT target.`);if(o==="__INIT"||typeof o=="string"&&o.startsWith("__")&&!H(o))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid target '${String(o)}'.`)}}},Le=e=>{let t={};return e&&(e.actorId!==void 0&&(t.actorId=e.actorId),e.groupId!==void 0&&(t.groupId=e.groupId),e.groupTag!==void 0&&(t.groupTag=e.groupTag),e.senderActorId!==void 0&&(t.senderActorId=e.senderActorId),e.senderGroupId!==void 0&&(t.senderGroupId=e.senderGroupId),e.senderGroupTag!==void 0&&(t.senderGroupTag=e.senderGroupTag)),t},Be=e=>{let t=Le(e);for(let n of zt)delete t[n];return t},Fe=e=>{let t=Le(e);for(let n of Wt)delete t[n];return t},Ie=(e,t)=>{if(Object.keys(t).length===0){let{meta:n,...r}=e;return r}return{...e,meta:t}},me=e=>Array.isArray(e)?e:[e],Ae=e=>[...new Set(e)],Ve=e=>e?e.actorId!==void 0?{scope:"actor",targetSet:Ae(me(e.actorId))}:e.groupId!==void 0?{scope:"group",targetSet:Ae(me(e.groupId))}:e.groupTag!==void 0?{scope:"tag",targetSet:Ae(me(e.groupTag))}:{scope:"unscoped",targetSet:[]}:{scope:"unscoped",targetSet:[]},W="#",he=e=>{let t=e.indexOf(W);return t===-1?{owner:null,tail:e}:{owner:e.slice(0,t),tail:e.slice(t+1)}},be=(e,t)=>{let{owner:n}=he(e);return t===void 0?n===null:n===t},X=e=>({actor:e.actor,groupByTag:new Map(e.groupByTag)}),Ge=(e,t)=>{let n=X(e);n.actor=Math.max(n.actor,t.actor);for(let[r,o]of t.groupByTag)n.groupByTag.set(r,Math.max(n.groupByTag.get(r)??0,o));return n},ve=e=>{let t=e.lastIndexOf("/");if(t<0)return null;let n=Number(e.slice(t+1));return Number.isInteger(n)&&n>=0?n:null},Ke=(e,t,n,r)=>{if(be(t,r)){let o=ve(he(t).tail);o!==null&&(e.actor=Math.max(e.actor,o+1))}if(be(n,r)){let o=he(n).tail,a=ve(o);if(a===null)return;let s=o.slice(0,o.lastIndexOf("/"));e.groupByTag.set(s,Math.max(e.groupByTag.get(s)??0,a+1))}};var q=(e,t={})=>{let n=re(e);return{config:e.config,transition:(r,o)=>{if(n&&!t.allowActorTemplate)throw new I("LITE_FSM_STANDALONE_ACTOR_TEMPLATE","[lite-fsm] actor templates can only be used inside MachineManager.");let a=e.config,s=ae(a,r.state,o.type,n);if(s===void 0)return r;if(e.reducer){let d=s||r.state,S=e.reducer(r,o,{nextState:d,config:e.config});if(S===void 0){if(t.allowVoidReducer?.())return r;throw new Error(Z)}return S}let c="payload"in o?o.payload:{};return{state:s||r.state,context:{...r.context,...c}}},invokeEffect:async(r,o,a)=>{if(!e.effects)return;let s=e.effects,c=r!==o&&s[o]||s[Pe];c&&await c(a)}}},Yt=(e,t={})=>{let n,r=[],o=!1,a=y=>{o=!!y?.some(ne)},s=q(e,{allowVoidReducer:()=>o}),c=[],d={context:e.initialContext,state:e.initialState};L&&K(d);let S=(y,M)=>s.transition(y,M),m=y=>{S=y(S)},R=y=>new Promise((M,w)=>{let D=A((G,b,v)=>{try{y(v)&&(D(),M(!0))}catch(O){D(),w(O)}})}),u=(y,M,w)=>{s.invokeEffect(y.state,M.state,{...t.dependencies,transition:n,action:w,condition:R}).catch(D=>{t?.onError?.(D)})},A=y=>(c.push(y),()=>{c=c.filter(M=>M!==y)}),P=(y,M,w)=>{c.forEach(D=>D(y,M,w))},g=y=>{let M=d,w=S(M,y);if(w===void 0)throw new Error(Z);return d=w,L&&K(d),P(M,d,y),y},l=y=>{if(a(y),!y?.length)return g;let M=y.map(w=>w({getState:E,transition:D=>n(D),replaceReducer:m,onTransition:A,condition:R}));return ee(...M)(g)},h=l(r);n=y=>{let M=d,w=h(y);return u(M,d,w),w};let E=()=>d;return{transition:n,getState:E,onTransition:A,addMiddleware:(...y)=>{r=[...r,...y],h=l(r)}}},He=(e={})=>({create:t=>Yt(t,e)});var je=e=>{let{sidecar:t,machines:n,domainKeys:r,refs:o,onTransition:a,onError:s}=e,c=(g,l,h)=>{t.actorById.get(g)?.bag.set(l,h)},d=(g,l)=>{t.actorById.get(g)?.bag.delete(l)},S=(g,l)=>new Promise((h,E)=>{let x=()=>l!==void 0&&!t.actorById.has(l.actorId),y=()=>new I("LITE_FSM_ACTOR_DISPOSED","Actor was disposed before condition resolved.");if(x())return E(y());let M,w=()=>{D(),l&&M&&d(l.actorId,M)},D=a((G,b,v)=>{if(!oe(v)){if(x())return D();try{if(!g(v))return;if(x())return D();w(),h(!0)}catch(O){w(),E(O)}}});l&&(M=Symbol("condition"),c(l.actorId,M,()=>{D(),E(y())}))}),m=g=>S(g),R=g=>{let l=(h=>o.transition(h,{sender:g}));return l.unscoped=h=>o.transition(h,{sender:g,routingMode:"unscoped"}),l.actor=(h,E)=>o.transition({...E,meta:{actorId:h}},{sender:g}),l.group=(h,E)=>o.transition({...E,meta:{groupId:h}},{sender:g}),l.tag=(h,E)=>o.transition({...E,meta:{groupTag:h}},{sender:g}),l},u=(g,l,h)=>{let E=x=>o.transition(x);for(let x of r){let y=n[x],M=g[x],w=l[x];y.invokeEffect(M.state,w.state,{...o.userDeps,transition:E,action:h,condition:m}).catch(D=>s?.(D))}},A=(g,l,h,E)=>{for(let x of E){let{actorId:y,groupId:M,groupTag:w}=x.meta,D=n[x.templateKey],G=g[x.templateKey],b=l[x.templateKey],v=G?.[y],O=b?.[y];if(!O)continue;let Y={actorId:y,groupId:M,groupTag:w};D.invokeEffect(v?.state??"__INIT",O.state,{...o.userDeps,transition:R(Y),action:h,condition:U=>S(U,Y),self:Y,[Q]:c}).catch(U=>s?.(U))}};return{condition:m,invokeEffects:(g,l,h,E)=>{u(g,l,h),A(g,l,h,E)}}};var $e=(e,t)=>({normalizeOpts:e,countersBase:t,pendingSpawned:[],pendingDelivered:[],pendingDeleted:[],touchedActorRecords:new Map,effectsTargets:[]}),ze=e=>(e.countersDraft||(e.countersDraft=X(e.countersBase)),e.countersDraft),We=(e,t,n)=>e?`${e}${W}${t}/${n}`:`${t}/${n}`,Ye=(e,t,n,r,o)=>{let a=ze(e),s=a.groupByTag.get(t)??0;a.groupByTag.set(t,s+1);let c=r.generateGroupId?Se(r.generateGroupId({templateKey:t,groupTag:t,counter:s,originId:r.originId,action:n}),"group"):We(r.originId,t,s);if(o(c))throw new I("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] groupId '${c}' is already in use.`);return c},Ue=(e,t,n,r,o,a)=>{let s=ze(e),c=s.actor;s.actor=c+1;let d=o.generateActorId?Se(o.generateActorId({templateKey:t,groupTag:n,counter:c,originId:o.originId,action:r}),"actor"):We(o.originId,t,c);if(a(d))throw new I("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] actorId '${d}' is already in use.`);return d},se=(e,t,n)=>{let r=e.touchedActorRecords.get(n);if(r)return{root:t,record:r};let o=t[n],a=o===j?{}:{...o},s={...t,[n]:a};return e.touchedActorRecords.set(n,a),{root:s,record:a}};var Ut=e=>{if(!N(e))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot must be an object envelope.");if(!N(e.machines))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot.machines must be an object.");return{schemaVersion:typeof e.schemaVersion=="number"?e.schemaVersion:void 0,machines:e.machines}},Re=e=>({state:e.state,context:e.context}),Zt=e=>N(e)&&V(e,"snapshot")?{snapshot:e.snapshot,meta:e.meta}:{snapshot:e},Ze=(e,t)=>N(e)?{...e,meta:t}:e,Xt=(e,t,n)=>e&&N(t)&&t.state===e.state&&t.context===e.context?e:Ze(t,n),qt=(e,t,n,r,o)=>{if(!N(n))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${t}'.`);let a=e[t],c=o.config[t].hydrate,d=r==="replace"?{}:{...a},S=!1;for(let[m,R]of Object.entries(n)){let u=a[m],A=Zt(R),P=c?c(u?Re(u):void 0,A.snapshot,{strategy:r}):A.snapshot,g=Xt(u,P,u?.meta??A.meta);a[m]!==g&&(S=!0),d[m]=g}if(r==="replace"&&!S){for(let m of Object.keys(a))if(!(m in d)){S=!0;break}}return{record:S?d:a,changed:S}},ie=(e,t,n,r,o,a="commit")=>{let s=Ut(t);a==="commit"&&s.schemaVersion!==o.schemaVersion&&o.onSchemaVersionMismatch?.(s.schemaVersion,o.schemaVersion);let c,d=[];for(let S of Object.keys(s.machines)){if(!V(o.config,S)){a==="commit"&&(L&&console.warn(`[lite-fsm] hydrate: unknown machine key '${S}', skipped.`),o.onUnknownMachineKey?.(S,r));continue}let m=S;if(o.runtimeActorTemplateKeys.includes(m)){L&&console.warn(`[lite-fsm] hydrate: runtime actor template '${m}' was skipped \u2014 runtime actor templates do not participate in hydrate/dehydrate.`);continue}if(o.snapshotActorTemplateKeys.includes(m)){let g=qt(e,m,s.machines[S],n,o);if(!g.changed)continue;c=c??{...e},c[m]=g.record,d.push(m);continue}let R=e[m],u=s.machines[S],A=o.config[m].hydrate,P=A?A(R,u,{strategy:n}):u;P!==R&&(c=c??{...e},c[m]=P)}return{nextState:c??e,changedActorTemplateKeys:d}},Xe=(e,t,n,r,o,a,s,c)=>{let d=c?.machines;if(d)for(let u of d){if(!V(t,u))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: unknown machine key '${u}'.`);if(o.includes(u))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: runtime actor template '${u}' cannot be dehydrated.`)}let S=u=>{let A=e[u];if(!N(A))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${u}'.`);let g=t[u].dehydrate,l={};for(let[h,E]of Object.entries(A)){let x=n.actorById.get(h);if(!x)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${h}' has no runtime identity.`);l[h]={snapshot:g?g(Re(E)):Re(E),meta:x.meta}}return l},m=d??[...a,...r],R={};for(let u of m){if(r.includes(u)){R[u]=S(u);continue}let P=t[u].dehydrate;R[u]=P?P(e[u]):e[u]}return{schemaVersion:s,machines:R}};var qe=(e,t,n)=>{let r=new Map,o=[];for(let s of e){let c=!1;for(let[d,S]of Object.entries(t(s)))if(!(!S||!n(d)))for(let m of Object.keys(S)){c=!0;let R=r.get(m);R||r.set(m,R=new Set),R.add(s)}c||o.push(s)}let a=new Map;for(let[s,c]of r)a.set(s,[...c]);return{index:a,keysWithoutEdges:o}},Jt=(e,t,n)=>{let r=new Map;for(let o of e){let a=n(o);for(let s of Object.keys(t(o).__INIT??{})){let c=r.get(s);c||r.set(s,c=new Map);let d=c.get(a);d||c.set(a,d=[]),d.push(o)}}return r},Je=(e,t,n,r)=>{let o=d=>e[d].config,a=qe(n,o,()=>!0),s=qe(t,o,d=>d!=="__INIT"),c=Jt(t,o,r);return{domainReduceIndex:a.index,domainAlwaysReduce:a.keysWithoutEdges,actorReduceIndex:s.index,actorSpawnIndex:c}},Qe=e=>{let t=s=>e[s],n=s=>t(s).config;return{groupTagForTemplate:s=>t(s).groupTag??s,hasActorTransition:(s,c,d)=>ae(n(s),c,d.type,!0)!==void 0,isPublicActorState:(s,c)=>c==="__INIT"||H(c)?!1:V(t(s).config,c)}};var ce=Symbol.for("lite-fsm.normalize-drop"),et=e=>{if(oe(e))throw new Error(`[lite-fsm] reserved system action '${e.type}' cannot be dispatched.`)},tt=e=>{let{sidecar:t}=e,n=(o,{sender:a,routingMode:s="default"}={})=>{if(!a&&s==="default"&&!("meta"in o))return o;if(a&&!t.actorById.has(a.actorId))return ce;let c=Be(o.meta);return a&&(c.senderActorId=a.actorId,c.senderGroupId=a.groupId,c.senderGroupTag=a.groupTag),s==="unscoped"?Ie(o,Fe(c)):(a&&c.actorId===void 0&&c.groupId===void 0&&c.groupTag===void 0&&(c.groupId=a.groupId,c.groupTag=a.groupTag),Ie(o,c))};return{normalizeAction:n,applyPostNormalize:(o,a)=>{let s=n(a,o.normalizeOpts);s!==ce&&(o.committed=s)}}};var Qt=(e,t)=>{let n=[];for(let r of t){let o=e.groupIdsByTag.get(r);if(o)for(let a of o)n.push(a)}return n},en=e=>{let t=new Map;for(let n of e){let r=t.get(n.templateKey);r?r.push(n):t.set(n.templateKey,[n])}return t},nt=(e,t,n,r)=>{if(n===null){for(let o of e.actorIdsByTemplate.get(t)??[])r(o);return}for(let o of n){let a=e.groupById.get(o)?.actorIdsByTemplate.get(t);if(a)for(let s of a)r(s)}},ot=e=>{let{sidecar:t,actorTemplateKeys:n,actorSpawnIndex:r,actorReduceIndex:o,spawnIdConfig:a}=e;return{resolveSpawnGroups:(d,S,m,R)=>{if(d==="group"){let g=[];for(let l of S){let h=t.groupById.get(l);h&&g.push({groupId:l,groupTag:h.groupTag})}return g}if(d==="tag"){let g=[];for(let l of S)for(let h of t.groupIdsByTag.get(l)??[])g.push({groupId:h,groupTag:l});return g}let u=[],A=new Set,P=g=>t.groupById.has(g)||A.has(g);for(let g of r.get(R.type)?.keys()??[]){let l=Ye(m,g,R,a,P);A.add(l),u.push({groupId:l,groupTag:g})}return u},forEachRoutedIdentity:(d,S,m,R,u)=>{if(d==="actor"){for(let x of S){let y=t.actorById.get(x);y&&u(y)}return}let A=d==="group"?S:d==="tag"?Qt(t,S):null;if(m.length===0){for(let x of o.get(R.type)??[])nt(t,x,A,y=>{let M=t.actorById.get(y);M&&u(M)});return}let P=new Set(o.get(R.type)??[]),g=en(m),l=new Set(S),h=x=>d==="unscoped"?!0:d==="group"?l.has(x.meta.groupId):l.has(x.meta.groupTag),E=new Set;for(let x of n){P.has(x)&&nt(t,x,A,y=>{if(E.has(y))return;let M=t.actorById.get(y);M&&(E.add(y),u(M))});for(let y of g.get(x)??[]){let M=y.meta.actorId;E.has(M)||h(y)&&(E.add(M),u(y))}}}}};var st=()=>({actorById:new Map,groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map,counters:{actor:0,groupByTag:new Map}}),tn=()=>({groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map}),rt=(e,t,n)=>{let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)},at=(e,t,n)=>{let r=e.get(t);r?.delete(n),r?.size===0&&e.delete(t)},it=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta,a=e.groupById.get(r);a||(a={groupTag:o,actorIds:new Set,actorIdsByTemplate:new Map},e.groupById.set(r,a)),a.actorIds.add(n),rt(a.actorIdsByTemplate,t.templateKey,n),rt(e.actorIdsByTemplate,t.templateKey,n);let s=e.groupIdsByTag.get(o);s||(s=new Set,e.groupIdsByTag.set(o,s)),s.add(r)},nn=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta;at(e.actorIdsByTemplate,t.templateKey,n);let a=e.groupById.get(r);if(!a||(a.actorIds.delete(n),at(a.actorIdsByTemplate,t.templateKey,n),a.actorIds.size>0))return;e.groupById.delete(r);let s=e.groupIdsByTag.get(o);s?.delete(r),s?.size===0&&e.groupIdsByTag.delete(o)},ct=e=>{for(let t of e.bag.values())t();e.bag.clear()},on=(e,t,n,r,o)=>{if(r.length===0)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor id for template '${n}' must be non-empty.`);if(!ke(o)||!t.isPublicActorState(n,o.state))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor slice '${n}.${r}'.`);let a=e.actorById.get(r);if(a){if(a.templateKey!==n)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot move between actor template records.`);return{identity:a,isNew:!1}}let s=o.meta;if(!N(s))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot be created by state replacement without actor meta.`);let{groupId:c,groupTag:d}=s;if(s.actorId!==r||typeof d!="string"||d!==t.groupTagForTemplate(n)||typeof c!="string"||c.length===0)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' has invalid actor meta.`);return{identity:{templateKey:n,meta:z({actorId:r,groupId:c,groupTag:d})},isNew:!0}},rn=e=>{let t=tn();for(let n of e.values())it(t,n);return t},dt=(e,t,n,r)=>{let o=new Set,a=new Map,s=new Map(e.actorById),c=new Map,d=[];for(let u of n){let A=r[u];if(!N(A))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${u}'.`);let P={};for(let[g,l]of Object.entries(A)){if(o.has(g))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Duplicate actorId '${g}'.`);o.add(g);let{identity:h,isNew:E}=on(e,t,u,g,l);P[g]={...l,meta:h.meta},E&&a.set(g,h)}c.set(u,P)}for(let[u,A]of a)s.set(u,{...A,bag:new Map});let S=new Set(n);for(let[u,A]of s)S.has(A.templateKey)&&(o.has(u)||(d.push(A),s.delete(u)));let m=rn(s),R=X(e.counters);for(let[u,A]of a)Ke(R,u,A.meta.groupId,t.originId);return{nextActorById:s,nextGroupById:m.groupById,nextGroupIdsByTag:m.groupIdsByTag,nextActorIdsByTemplate:m.actorIdsByTemplate,nextCounters:R,canonicalActorRecords:c,actorsToCleanup:d,touchedTemplateKeys:n}},an=(e,t)=>{e.actorById=t.nextActorById,e.groupById=t.nextGroupById,e.groupIdsByTag=t.nextGroupIdsByTag,e.actorIdsByTemplate=t.nextActorIdsByTemplate,e.counters=t.nextCounters;for(let n of t.actorsToCleanup)ct(n)},sn=(e,t)=>{let n=new Set(t.pendingDeleted.map(r=>r.meta.actorId));for(let r of t.pendingSpawned){if(n.has(r.meta.actorId))continue;let o={...r,bag:new Map};e.actorById.set(r.meta.actorId,o),it(e,o)}for(let r of t.pendingDeleted){let o=e.actorById.get(r.meta.actorId);o&&(e.actorById.delete(r.meta.actorId),nn(e,o),ct(o))}},pt=(e,t)=>{let n=e;for(let r of t){let o=n[r];o&&o!==j&&Object.keys(o).length===0&&(n={...n,[r]:j})}return n},ut=(e,t,n)=>(t.countersDraft&&(e.counters=Ge(e.counters,t.countersDraft)),sn(e,t),pt(n,t.touchedActorRecords.keys())),gt=(e,t,n)=>{for(let[r,o]of t.canonicalActorRecords)n={...n,[r]:o};return an(e,t),pt(n,t.touchedTemplateKeys)},Te=(e,t)=>{let n=[];for(let r of t){let o=e.actorById.get(r.meta.actorId);o&&n.push(o)}return n};var ft=(e,t)=>{let n=t?.originId;if(n!==void 0&&(n.length===0||n.includes(W)))throw new I("LITE_FSM_INVALID_OPTIONS",`[lite-fsm] originId must be a non-empty string without '${W}'.`);let r={originId:n,generateActorId:t?.generateActorId,generateGroupId:t?.generateGroupId},o=Object.keys(e),a=[],s=[];for(let i of o)re(e[i])?a.push(i):s.push(i);for(let i of a)Oe(i,e[i]);for(let i of s)if(V(e[i],"persistence"))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] domain machine '${i}' cannot define actor persistence.`);let c=[],d=[];for(let i of a)e[i].persistence==="snapshot"?c.push(i):d.push(i);let S=!!t?.middleware?.some(ne),m=t?.schemaVersion,{groupTagForTemplate:R,hasActorTransition:u,isPublicActorState:A}=Qe(e),{domainReduceIndex:P,domainAlwaysReduce:g,actorReduceIndex:l,actorSpawnIndex:h}=Je(e,a,s,R),E=i=>!!e[i].effects,x=s.filter(E),y=a.some(E),M=x.length>0||y;if(L)for(let i of s)e[i].groupTag&&console.warn(`[lite-fsm] groupTag on domain machine '${i}' is ignored.`);let w=Object.fromEntries(o.map(i=>[i,q(e[i],{allowActorTemplate:!0,allowVoidReducer:()=>S})])),D={transition:void 0,userDeps:{}},G=[],b=Object.fromEntries(o.map(i=>[i,a.includes(i)?j:{state:e[i].initialState,context:e[i].initialContext}])),v=st(),O=null,{normalizeAction:Y,applyPostNormalize:U}=tt({sidecar:v}),{resolveSpawnGroups:lt,forEachRoutedIdentity:St}=ot({sidecar:v,actorTemplateKeys:a,actorSpawnIndex:h,actorReduceIndex:l,spawnIdConfig:r}),mt=(i,f)=>{let p=i,T=C=>{let _=w[C],k=i[C],B=_.transition(k,f);B!==k&&(p=p===i?{...i}:p,p[C]=B)};for(let C of g)T(C);for(let C of P.get(f.type)??[])T(C);return p},At=(i,f,p,T,C)=>{let _=f,k=h.get(p.type);if(!k)return _;let B=F=>v.actorById.has(F)||i.pendingSpawned.some($=>$.meta.actorId===F);for(let F of lt(T,C,i,p))for(let $ of k.get(F.groupTag)??[]){let kt=e[$],Nt=z({actorId:Ue(i,$,F.groupTag,p,r,B),groupId:F.groupId,groupTag:F.groupTag}),ye={templateKey:$,meta:Nt},Ot={state:"__INIT",context:{...kt.initialContext},meta:ye.meta},De=se(i,_,$);De.record[ye.meta.actorId]=Ot,_=De.root,i.pendingSpawned.push(ye)}return _},ht=(i,f,p,T)=>{let _=f[p.templateKey]?.[p.meta.actorId];if(!_||!u(p.templateKey,_.state,T))return{root:f,delivered:!1};let k=se(i,f,p.templateKey),F=w[p.templateKey].transition(_,T);return L&&Ne(p.meta.actorId,p.templateKey,F.state,A),k.record[p.meta.actorId]={...F,meta:p.meta},{root:k.root,delivered:!0}},It=(i,f)=>{let p=f,T=new Set;for(let C of[...i.pendingSpawned,...i.pendingDelivered]){if(T.has(C.meta.actorId))continue;T.add(C.meta.actorId);let k=p[C.templateKey]?.[C.meta.actorId];if(!k||!H(k.state))continue;let B=se(i,p,C.templateKey);delete B.record[C.meta.actorId],p=B.root,i.pendingDeleted.push(C)}return p},de=(i,f)=>{let p=O,{scope:T,targetSet:C}=Ve(f.meta),_=mt(i,f);return T!=="actor"&&(_=At(p,_,f,T,C)),St(T,C,p.pendingSpawned,f,k=>{let B=ht(p,_,k,f);_=B.root,B.delivered&&p.pendingDelivered.push(k)}),It(p,_)},Me=i=>{de=i(de)},Rt={actorTemplateKeys:a,groupTagForTemplate:R,isPublicActorState:A,originId:n},Tt=i=>{let f=[],p=new Set,T=C=>{for(let _ of C){let k=_.meta.actorId;p.has(k)||(p.add(k),f.push(_))}};T(Te(v,i.pendingSpawned)),T(Te(v,i.pendingDelivered)),i.effectsTargets=f},Mt=(i,f,p)=>a.filter(T=>i[T]===f[T]?!1:p.touchedActorRecords.get(T)!==f[T]),pe=(i,f)=>{if(f.length===0)return i;let p=dt(v,Rt,f,i);return gt(v,p,i)},Ct=(i,f,p)=>{let T=Mt(f,p,i),C=pe(p,T);return ut(v,i,C)},ue=i=>(G.push(i),()=>{G=G.filter(f=>f!==i)}),Ce=(i,f,p)=>{for(let T of G)T(i,f,p)},{condition:xt,invokeEffects:Et}=je({sidecar:v,machines:w,domainKeys:x,refs:D,onTransition:ue,onError:t?.onError}),xe=()=>b,wt=()=>({schemaVersion:m,machines:{...b}}),ge={config:e,snapshotActorTemplateKeys:c,runtimeActorTemplateKeys:d,schemaVersion:m,groupTagForTemplate:R,onSchemaVersionMismatch:t?.onSchemaVersionMismatch,onUnknownMachineKey:t?.onUnknownMachineKey},Dt=(i,{strategy:f="merge",baseState:p=b}={})=>ie(p,i,f,"hydrate",ge,"preview").nextState,Ee=t?.snapshot;if(Ee){let i=ie(b,Ee,"replace","opts.snapshot",ge);b=pe(i.nextState,i.changedActorTemplateKeys)}L&&K(b);let _t=(i,{strategy:f="merge"}={})=>{let p=b,T=ie(p,i,f,"hydrate",ge),C=T.nextState;C!==p&&(b=pe(C,T.changedActorTemplateKeys),L&&K(b),Ce(p,b,{type:te,payload:{strategy:f,snapshot:i}}))},Pt=(i=>Xe(b,e,v,c,d,s,m,i)),we=i=>{let f=O;if(f.committed)throw new Error("[lite-fsm] middleware called next() more than once for a single transition.");let p=b;if(U(f,i),!f.committed)return i;f.committedPrevState=p;let T=de(p,f.committed);if(T===void 0)throw new Error(Z);return b=Ct(f,p,T),y&&Tt(f),L&&K(b),Ce(p,b,f.committed),f.committed},bt=(()=>{let i=t?.middleware;if(!i?.length)return we;let f={getState:xe,transition:T=>fe(T),replaceReducer:Me,onTransition:ue,condition:xt},p=i.map(T=>T(f));return ee(...p)(we)})();function fe(i,f={}){et(i);let p=Y(i,f);if(p===ce)return i;let T=O,C=$e(f,v.counters);O=C;let _;try{_=bt(p)}finally{O=T}return C.committed?(M&&Et(C.committedPrevState,b,C.committed,C.effectsTargets),C.committed):_}let vt=i=>{let f=D.userDeps,p=typeof i=="function"?i(f):i;D.userDeps=p};return D.transition=fe,{getState:xe,getSnapshot:wt,getHydratedState:Dt,hydrate:_t,dehydrate:Pt,transition:fe,setDependencies:vt,onTransition:ue,replaceReducer:Me}};function yt(e){return e}var cn=e=>e,dn=e=>e,pn=Symbol.for("lite-fsm.owner.domain"),un=({type:e,effect:t,cancelFn:n})=>{let r=new Map;return o=>{let a=o,s=a.self?.actorId??pn,c=r.get(s)??{lastId:0};c.lastId+=1,c.cancel=n?.(o),r.set(s,c);let d=c.lastId;a.self&&!c.dispose&&(c.dispose=()=>r.delete(s),a[Q]?.(a.self.actorId,Symbol("createEffect"),c.dispose));let S=()=>e==="latest"&&d!==r.get(s)?.lastId?!1:!c.cancel?.(),m=Object.assign(R=>S()?o.transition(R):R,o.transition);if(a.self){let R=o.transition;m.unscoped=u=>S()?R.unscoped(u):u,m.actor=(u,A)=>S()?R.actor(u,A):A,m.group=(u,A)=>S()?R.group(u,A):A,m.tag=(u,A)=>S()?R.tag(u,A):A}return t({...o,transition:m})}},gn=e=>un(e);0&&(module.exports={HYDRATE_ACTION_TYPE,LiteFsmError,Machine,MachineManager,VOID_REDUCER_MIDDLEWARE_MARKER,createActorMeta,createConfig,createEffect,createMachine,createReducer,defineMachine});
package/dist/index.d.cts CHANGED
@@ -5,7 +5,7 @@ export { CreateMachine as Machine, defineMachine } from "./Machine";
5
5
  export { MachineManager } from "./MachineManager";
6
6
  export * from "./types";
7
7
  export { createMachine, type TypedCreateMachineFn } from "./createMachine";
8
- export { LiteFsmError } from "./utils";
8
+ export { HYDRATE_ACTION_TYPE, LiteFsmError, VOID_REDUCER_MIDDLEWARE_MARKER } from "./utils";
9
9
  export declare const createReducer: <C extends object, T extends AnyRecord, P extends AnyEvent = AnyEvent>(reducer: MachineReducer<C, P, T>) => MachineReducer<C, P, T>;
10
10
  export declare const createConfig: <C extends object, P extends AnyEvent = AnyEvent>(cfg: C & CFG<C, P, StateName<C> | WILDCARD>) => C;
11
11
  export declare const createEffect: <P extends AnyEvent = AnyEvent, D extends AnyRecord = {}, C extends { [key in keyof C]: object; } = Record<string, never>, N extends StateName<C> | WILDCARD = StateName<C> | WILDCARD>(opts: {
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { CreateMachine as Machine, defineMachine } from "./Machine";
5
5
  export { MachineManager } from "./MachineManager";
6
6
  export * from "./types";
7
7
  export { createMachine, type TypedCreateMachineFn } from "./createMachine";
8
- export { LiteFsmError } from "./utils";
8
+ export { HYDRATE_ACTION_TYPE, LiteFsmError, VOID_REDUCER_MIDDLEWARE_MARKER } from "./utils";
9
9
  export declare const createReducer: <C extends object, T extends AnyRecord, P extends AnyEvent = AnyEvent>(reducer: MachineReducer<C, P, T>) => MachineReducer<C, P, T>;
10
10
  export declare const createConfig: <C extends object, P extends AnyEvent = AnyEvent>(cfg: C & CFG<C, P, StateName<C> | WILDCARD>) => C;
11
11
  export declare const createEffect: <P extends AnyEvent = AnyEvent, D extends AnyRecord = {}, C extends { [key in keyof C]: object; } = Record<string, never>, N extends StateName<C> | WILDCARD = StateName<C> | WILDCARD>(opts: {
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var vt=Object.defineProperty;var kt=(e,t,n)=>t in e?vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var _e=(e,t,n)=>kt(e,typeof t!="symbol"?t+"":t,n);var Y=Symbol.for("lite-fsm.late-dispatch"),Z=Symbol.for("lite-fsm.registerBagDispose");function ee(...e){return e.length===0?t=>t:e.reduce((t,n)=>(...r)=>t(n(...r)))}var ge="*",Nt="@@lite-fsm/",be="@@lite-fsm/HYDRATE",Ot="__liteFsmAllowVoidReducer",X="Reducer returned undefined. Return the next state, or use immerMiddleware to mutate draft state without return.",te=e=>typeof e=="function"&&Ot in e,T=class extends Error{constructor(n,r){super(r);_e(this,"code",n);this.name="LiteFsmError"}},fe=(e,t)=>{if(typeof e!="string"||e.length===0)throw new T("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] generate${t==="actor"?"Actor":"Group"}Id must return a non-empty string.`);return e},ne=e=>typeof e.type=="string"&&e.type.startsWith(Nt),O=globalThis.process?.env?.NODE_ENV!=="production",H=e=>{if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))H(Reflect.get(e,t));return e};var $=Object.freeze({}),Lt=new Set(["__RESOLVED","__REJECTED","__CANCELLED"]),Bt=["senderActorId","senderGroupId","senderGroupTag"],Ft=["actorId","groupId","groupTag"],V=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),N=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>typeof e=="string"&&Lt.has(e),Ne=e=>N(e)&&typeof e.state=="string"&&N(e.context),q=e=>Object.freeze({actorId:e.actorId,groupId:e.groupId,groupTag:e.groupTag}),J=e=>V(e.config,"__INIT"),oe=(e,t,n,r)=>{let o=e[t]?.[n];if(o!==void 0)return o;if(!(r&&t==="__INIT"))return e["*"]?.[n]},Oe=(e,t,n,r)=>{if(n==="__INIT")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' remained in __INIT after spawn.`);if(!j(n)&&!r(t,n))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' has invalid state.`)},Le=(e,t)=>{if(t.initialState!=="__INIT")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' must use __INIT as initialState.`);if(t.persistence!==void 0&&t.persistence!=="runtime"&&t.persistence!=="snapshot")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid persistence mode.`);if(t.persistence!=="snapshot"&&(t.hydrate||t.dehydrate))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot define hydrate/dehydrate hooks without snapshot persistence.`);let n=t.config;for(let r of Object.keys(n)){if(j(r)||r.startsWith("__")&&r!=="__INIT")throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has reserved state '${r}'.`);for(let o of Object.values(n[r])){if(r==="__INIT"&&o===null)throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot spawn with a null __INIT target.`);if(o==="__INIT"||typeof o=="string"&&o.startsWith("__")&&!j(o))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid target '${String(o)}'.`)}}},Be=e=>{let t={};return e&&(e.actorId!==void 0&&(t.actorId=e.actorId),e.groupId!==void 0&&(t.groupId=e.groupId),e.groupTag!==void 0&&(t.groupTag=e.groupTag),e.senderActorId!==void 0&&(t.senderActorId=e.senderActorId),e.senderGroupId!==void 0&&(t.senderGroupId=e.senderGroupId),e.senderGroupTag!==void 0&&(t.senderGroupTag=e.senderGroupTag)),t},Fe=e=>{let t=Be(e);for(let n of Bt)delete t[n];return t},Ve=e=>{let t=Be(e);for(let n of Ft)delete t[n];return t},me=(e,t)=>{if(Object.keys(t).length===0){let{meta:n,...r}=e;return r}return{...e,meta:t}},ye=e=>Array.isArray(e)?e:[e],le=e=>[...new Set(e)],Ge=e=>e?e.actorId!==void 0?{scope:"actor",targetSet:le(ye(e.actorId))}:e.groupId!==void 0?{scope:"group",targetSet:le(ye(e.groupId))}:e.groupTag!==void 0?{scope:"tag",targetSet:le(ye(e.groupTag))}:{scope:"unscoped",targetSet:[]}:{scope:"unscoped",targetSet:[]},W="#",Se=e=>{let t=e.indexOf(W);return t===-1?{owner:null,tail:e}:{owner:e.slice(0,t),tail:e.slice(t+1)}},ve=(e,t)=>{let{owner:n}=Se(e);return t===void 0?n===null:n===t},Q=e=>({actor:e.actor,groupByTag:new Map(e.groupByTag)}),Ke=(e,t)=>{let n=Q(e);n.actor=Math.max(n.actor,t.actor);for(let[r,o]of t.groupByTag)n.groupByTag.set(r,Math.max(n.groupByTag.get(r)??0,o));return n},ke=e=>{let t=e.lastIndexOf("/");if(t<0)return null;let n=Number(e.slice(t+1));return Number.isInteger(n)&&n>=0?n:null},He=(e,t,n,r)=>{if(ve(t,r)){let o=ke(Se(t).tail);o!==null&&(e.actor=Math.max(e.actor,o+1))}if(ve(n,r)){let o=Se(n).tail,c=o.lastIndexOf("/"),a=ke(o);if(a===null)return;let i=o.slice(0,c);e.groupByTag.set(i,Math.max(e.groupByTag.get(i)??0,a+1))}};var re=(e,t={})=>{let n=J(e);return{config:e.config,transition:(r,o)=>{if(n&&!t.allowActorTemplate)throw new T("LITE_FSM_STANDALONE_ACTOR_TEMPLATE","[lite-fsm] actor templates can only be used inside MachineManager.");let c=e.config,a=oe(c,r.state,o.type,n);if(a===void 0)return r;if(e.reducer){let u=a||r.state,l=e.reducer(r,o,{nextState:u,config:e.config});if(l===void 0){if(t.allowVoidReducer?.())return r;throw new Error(X)}return l}let i="payload"in o?o.payload:{};return{state:a||r.state,context:{...r.context,...i}}},invokeEffect:async(r,o,c)=>{if(!e.effects)return;let a=e.effects;if(r!==o&&a[o]){let i=a[o];await i?.(c)}else if(a[ge]){let i=a[ge];await i?.(c)}}}},Vt=(e,t={})=>{let n,r=[],o=!1,c=y=>{o=!!y?.some(te)},a=re(e,{allowVoidReducer:()=>o}),i=[],u={context:e.initialContext,state:e.initialState};O&&H(u);let l=(y,M)=>a.transition(y,M),A=y=>{l=y(l)},R=y=>new Promise((M,D)=>{let _=m((G,K,P)=>{try{y(P)&&(_(),M(!0))}catch(v){_(),D(v)}})}),p=(y,M,D)=>{a.invokeEffect(y.state,M.state,{...t.dependencies,transition:n,action:D,condition:R}).catch(_=>{t?.onError?.(_)})},m=y=>(i.push(y),()=>{i=i.filter(M=>M!==y)}),b=(y,M,D)=>{i.forEach(_=>_(y,M,D))},f=y=>{let M=u,D=l(M,y);if(D===void 0)throw new Error(X);return u=D,O&&H(u),b(M,u,y),y},S=y=>{if(c(y),!y?.length)return f;let M=y.map(D=>D({getState:E,transition:_=>n(_),replaceReducer:A,onTransition:m,condition:R}));return ee(...M)(f)},h=S(r);n=y=>{let M=u,D=h(y);return p(M,u,D),D};let E=()=>u;return{transition:n,getState:E,onTransition:m,addMiddleware:(...y)=>{r=[...r,...y],h=S(r)}}},Gt=(e={})=>({create:t=>Vt(t,e)});var je=e=>{let{sidecar:t,machines:n,domainKeys:r,refs:o,onTransition:c,onError:a}=e,i=(f,S,h)=>{t.actorById.get(f)?.bag.set(S,h)},u=(f,S)=>{t.actorById.get(f)?.bag.delete(S)},l=(f,S)=>new Promise((h,E)=>{let x=()=>S!==void 0&&!t.actorById.has(S.actorId),y=()=>new T("LITE_FSM_ACTOR_DISPOSED","Actor was disposed before condition resolved.");if(x())return E(y());let M,D=()=>{_(),S&&M&&u(S.actorId,M)},_=c((G,K,P)=>{if(!ne(P)){if(x())return _();try{if(!f(P))return;if(x())return _();D(),h(!0)}catch(v){D(),E(v)}}});S&&(M=Symbol("condition"),i(S.actorId,M,()=>{_(),E(y())}))}),A=f=>l(f),R=f=>{let S=(h=>o.transition(h,{sender:f}));return S.unscoped=h=>o.transition(h,{sender:f,forceUnscoped:!0}),S.actor=(h,E)=>o.transition({...E,meta:{actorId:h}},{sender:f}),S.group=(h,E)=>o.transition({...E,meta:{groupId:h}},{sender:f}),S.tag=(h,E)=>o.transition({...E,meta:{groupTag:h}},{sender:f}),S},p=(f,S,h)=>{let E=x=>o.transition(x);for(let x of r){let y=n[x],M=f[x],D=S[x];y.invokeEffect(M.state,D.state,{...o.userDeps,transition:E,action:h,condition:A}).catch(_=>a?.(_))}},m=(f,S,h,E)=>{for(let x of E){let{actorId:y,groupId:M,groupTag:D}=x.meta,_=n[x.templateKey],G=f[x.templateKey],K=S[x.templateKey],P=G?.[y],v=K?.[y];if(!v)continue;let F={actorId:y,groupId:M,groupTag:D};_.invokeEffect(P?.state??"__INIT",v.state,{...o.userDeps,transition:R(F),action:h,condition:U=>l(U,F),self:F,[Z]:i}).catch(U=>a?.(U))}};return{condition:A,invokeEffects:(f,S,h,E)=>{p(f,S,h),m(f,S,h,E)}}};var $e=(e,t)=>({normalizeOpts:e,countersBase:t,pendingSpawned:[],pendingDelivered:[],pendingDeleted:[],touchedActorRecords:new Map,effectsTargets:[]}),ze=e=>(e.countersDraft||(e.countersDraft=Q(e.countersBase)),e.countersDraft),We=(e,t,n)=>e?`${e}${W}${t}/${n}`:`${t}/${n}`,Ue=(e,t,n,r,o)=>{let c=ze(e),a=c.groupByTag.get(t)??0;c.groupByTag.set(t,a+1);let i=r.generateGroupId?fe(r.generateGroupId({templateKey:t,groupTag:t,counter:a,originId:r.originId,action:n}),"group"):We(r.originId,t,a);if(o(i))throw new T("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] groupId '${i}' is already in use.`);return i},Ye=(e,t,n,r,o,c)=>{let a=ze(e),i=a.actor;a.actor=i+1;let u=o.generateActorId?fe(o.generateActorId({templateKey:t,groupTag:n,counter:i,originId:o.originId,action:r}),"actor"):We(o.originId,t,i);if(c(u))throw new T("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] actorId '${u}' is already in use.`);return u},ae=(e,t,n)=>{let r=e.touchedActorRecords.get(n);if(r)return{root:t,record:r};let o=t[n],c=o===$?{}:{...o},a={...t,[n]:c};return e.touchedActorRecords.set(n,c),{root:a,record:c}};var Kt=e=>{if(!N(e))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot must be an object envelope.");if(!N(e.machines))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot.machines must be an object.");return{schemaVersion:typeof e.schemaVersion=="number"?e.schemaVersion:void 0,machines:e.machines}},Ae=e=>({state:e.state,context:e.context}),Ht=e=>N(e)&&V(e,"snapshot")?{snapshot:e.snapshot,meta:e.meta}:{snapshot:e},Xe=(e,t)=>N(e)?{...e,meta:t}:e,jt=(e,t,n)=>e&&N(t)&&t.state===e.state&&t.context===e.context?e:Xe(t,n),$t=(e,t,n,r,o)=>{if(!N(n))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${t}'.`);let c=e[t],i=o.config[t].hydrate,u=r==="replace"?{}:{...c},l=!1;for(let[A,R]of Object.entries(n)){let p=c[A],m=Ht(R),b=i?i(p?Ae(p):void 0,m.snapshot,{strategy:r}):m.snapshot,f=jt(p,b,p?.meta??m.meta);c[A]!==f&&(l=!0),u[A]=f}if(r==="replace"&&!l){for(let A of Object.keys(c))if(!(A in u)){l=!0;break}}return{record:l?u:c,changed:l}},se=(e,t,n,r,o,c="commit")=>{let a=Kt(t);c==="commit"&&a.schemaVersion!==o.schemaVersion&&o.onSchemaVersionMismatch?.(a.schemaVersion,o.schemaVersion);let i,u=[];for(let l of Object.keys(a.machines)){if(!V(o.config,l)){c==="commit"&&(O&&console.warn(`[lite-fsm] hydrate: unknown machine key '${l}', skipped.`),o.onUnknownMachineKey?.(l,r));continue}let A=l;if(o.runtimeActorTemplateKeys.includes(A)){O&&console.warn(`[lite-fsm] hydrate: runtime actor template '${A}' was skipped \u2014 runtime actor templates do not participate in hydrate/dehydrate.`);continue}if(o.snapshotActorTemplateKeys.includes(A)){let f=$t(e,A,a.machines[l],n,o);if(!f.changed)continue;i=i??{...e},i[A]=f.record,u.push(A);continue}let R=e[A],p=a.machines[l],m=o.config[A].hydrate,b=m?m(R,p,{strategy:n}):p;b!==R&&(i=i??{...e},i[A]=b)}return{nextState:i??e,changedActorTemplateKeys:u}},qe=(e,t,n,r,o,c,a,i)=>{let u=i?.machines;if(u)for(let p of u){if(!V(t,p))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: unknown machine key '${p}'.`);if(o.includes(p))throw new T("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: runtime actor template '${p}' cannot be dehydrated.`)}let l=p=>{let m=e[p];if(!N(m))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let f=t[p].dehydrate,S={};for(let[h,E]of Object.entries(m)){let x=n.actorById.get(h);if(!x)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${h}' has no runtime identity.`);S[h]={snapshot:f?f(Ae(E)):Ae(E),meta:x.meta}}return S},A=u??[...c,...r],R={};for(let p of A){if(r.includes(p)){R[p]=l(p);continue}let b=t[p].dehydrate;R[p]=b?b(e[p]):e[p]}return{schemaVersion:a,machines:R}};var Je=(e,t,n)=>{let r=new Map,o=[];for(let a of e){let i=!1;for(let[u,l]of Object.entries(t(a)))if(!(!l||!n(u)))for(let A of Object.keys(l)){i=!0;let R=r.get(A);R||r.set(A,R=new Set),R.add(a)}i||o.push(a)}let c=new Map;for(let[a,i]of r)c.set(a,[...i]);return{index:c,keysWithoutEdges:o}},zt=(e,t,n)=>{let r=new Map;for(let o of e){let c=n(o);for(let a of Object.keys(t(o).__INIT??{})){let i=r.get(a);i||r.set(a,i=new Map);let u=i.get(c);u||i.set(c,u=[]),u.push(o)}}return r},Qe=(e,t,n,r)=>{let o=u=>e[u].config,c=Je(n,o,()=>!0),a=Je(t,o,u=>u!=="__INIT"),i=zt(t,o,r);return{domainReduceIndex:c.index,domainAlwaysReduce:c.keysWithoutEdges,actorReduceIndex:a.index,actorSpawnIndex:i}},Ze=e=>{let t=a=>e[a],n=a=>t(a).config;return{groupTagForTemplate:a=>t(a).groupTag??a,hasActorTransition:(a,i,u)=>oe(n(a),i,u.type,!0)!==void 0,isPublicActorState:(a,i)=>i==="__INIT"||j(i)?!1:V(t(a).config,i)}};var et=e=>{if(ne(e))throw new Error(`[lite-fsm] reserved system action '${e.type}' cannot be dispatched.`)},tt=e=>{let{sidecar:t}=e,n=(o,{sender:c,forceUnscoped:a=!1}={})=>{if(!c&&!a&&!("meta"in o))return o;if(c&&!t.actorById.has(c.actorId))return Y;let i=Fe(o.meta);return c&&(i.senderActorId=c.actorId,i.senderGroupId=c.groupId,i.senderGroupTag=c.groupTag),a?me(o,Ve(i)):(c&&i.actorId===void 0&&i.groupId===void 0&&i.groupTag===void 0&&(i.groupId=c.groupId,i.groupTag=c.groupTag),me(o,i))};return{normalizeAction:n,applyPostNormalize:(o,c)=>{let a=n(c,o.normalizeOpts);a!==Y&&(o.committed=a)}}};var Wt=(e,t)=>{let n=[];for(let r of t){let o=e.groupIdsByTag.get(r);if(o)for(let c of o)n.push(c)}return n},Ut=e=>{let t=new Map;for(let n of e){let r=t.get(n.templateKey);r?r.push(n):t.set(n.templateKey,[n])}return t},nt=(e,t,n,r)=>{if(n===null){for(let o of e.actorIdsByTemplate.get(t)??[])r(o);return}for(let o of n){let c=e.groupById.get(o)?.actorIdsByTemplate.get(t);if(c)for(let a of c)r(a)}},ot=e=>{let{sidecar:t,actorTemplateKeys:n,actorSpawnIndex:r,actorReduceIndex:o,spawnIdConfig:c}=e;return{resolveSpawnGroups:(u,l,A,R)=>{if(u==="group"){let f=[];for(let S of l){let h=t.groupById.get(S);h&&f.push({groupId:S,groupTag:h.groupTag})}return f}if(u==="tag"){let f=[];for(let S of l)for(let h of t.groupIdsByTag.get(S)??[])f.push({groupId:h,groupTag:S});return f}let p=[],m=new Set,b=f=>t.groupById.has(f)||m.has(f);for(let f of r.get(R.type)?.keys()??[]){let S=Ue(A,f,R,c,b);m.add(S),p.push({groupId:S,groupTag:f})}return p},forEachRoutedIdentity:(u,l,A,R,p)=>{if(u==="actor"){for(let x of l){let y=t.actorById.get(x);y&&p(y)}return}let m=u==="group"?l:u==="tag"?Wt(t,l):null;if(A.length===0){for(let x of o.get(R.type)??[])nt(t,x,m,y=>{let M=t.actorById.get(y);M&&p(M)});return}let b=new Set(o.get(R.type)??[]),f=Ut(A),S=new Set(l),h=x=>u==="unscoped"?!0:u==="group"?S.has(x.meta.groupId):S.has(x.meta.groupTag),E=new Set;for(let x of n){b.has(x)&&nt(t,x,m,y=>{if(E.has(y))return;let M=t.actorById.get(y);M&&(E.add(y),p(M))});for(let y of f.get(x)??[]){let M=y.meta.actorId;E.has(M)||h(y)&&(E.add(M),p(y))}}}}};var st=()=>({actorById:new Map,groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map,counters:{actor:0,groupByTag:new Map}}),Yt=()=>({groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map}),rt=(e,t,n)=>{let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)},at=(e,t,n)=>{let r=e.get(t);r?.delete(n),r?.size===0&&e.delete(t)},it=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta,c=e.groupById.get(r);c||(c={groupTag:o,actorIds:new Set,actorIdsByTemplate:new Map},e.groupById.set(r,c)),c.actorIds.add(n),rt(c.actorIdsByTemplate,t.templateKey,n),rt(e.actorIdsByTemplate,t.templateKey,n);let a=e.groupIdsByTag.get(o);a||(a=new Set,e.groupIdsByTag.set(o,a)),a.add(r)},Xt=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta;at(e.actorIdsByTemplate,t.templateKey,n);let c=e.groupById.get(r);if(!c||(c.actorIds.delete(n),at(c.actorIdsByTemplate,t.templateKey,n),c.actorIds.size>0))return;e.groupById.delete(r);let a=e.groupIdsByTag.get(o);a?.delete(r),a?.size===0&&e.groupIdsByTag.delete(o)},ct=e=>{for(let t of e.bag.values())t();e.bag.clear()},qt=(e,t,n,r,o)=>{if(r.length===0)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor id for template '${n}' must be non-empty.`);if(!Ne(o)||!t.isPublicActorState(n,o.state))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor slice '${n}.${r}'.`);let c=e.actorById.get(r);if(c){if(c.templateKey!==n)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot move between actor template records.`);return{identity:c,isNew:!1}}let a=o.meta;if(!N(a))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot be created by state replacement without actor meta.`);let{groupId:i,groupTag:u}=a;if(a.actorId!==r||typeof u!="string"||u!==t.groupTagForTemplate(n)||typeof i!="string"||i.length===0)throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' has invalid actor meta.`);return{identity:{templateKey:n,meta:q({actorId:r,groupId:i,groupTag:u})},isNew:!0}},Jt=e=>{let t=Yt();for(let n of e.values())it(t,n);return t},he=(e,t,n,r)=>{let o=new Set,c=new Map,a=new Map(e.actorById),i=new Map,u=[];for(let p of n){let m=r[p];if(!N(m))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${p}'.`);let b={};for(let[f,S]of Object.entries(m)){if(o.has(f))throw new T("LITE_FSM_INVALID_ACTOR_SLICE",`Duplicate actorId '${f}'.`);o.add(f);let{identity:h,isNew:E}=qt(e,t,p,f,S);b[f]={...S,meta:h.meta},E&&c.set(f,h)}i.set(p,b)}for(let[p,m]of c)a.set(p,{...m,bag:new Map});let l=new Set(n);for(let[p,m]of a)l.has(m.templateKey)&&(o.has(p)||(u.push(m),a.delete(p)));let A=Jt(a),R=Q(e.counters);for(let[p,m]of c)He(R,p,m.meta.groupId,t.originId);return{nextActorById:a,nextGroupById:A.groupById,nextGroupIdsByTag:A.groupIdsByTag,nextActorIdsByTemplate:A.actorIdsByTemplate,nextCounters:R,canonicalActorRecords:i,actorsToCleanup:u,touchedTemplateKeys:n}},Qt=(e,t)=>{e.actorById=t.nextActorById,e.groupById=t.nextGroupById,e.groupIdsByTag=t.nextGroupIdsByTag,e.actorIdsByTemplate=t.nextActorIdsByTemplate,e.counters=t.nextCounters;for(let n of t.actorsToCleanup)ct(n)},Zt=(e,t)=>{let n=new Set(t.pendingDeleted.map(r=>r.meta.actorId));for(let r of t.pendingSpawned){if(n.has(r.meta.actorId))continue;let o={...r,bag:new Map};e.actorById.set(r.meta.actorId,o),it(e,o)}for(let r of t.pendingDeleted){let o=e.actorById.get(r.meta.actorId);o&&(e.actorById.delete(r.meta.actorId),Xt(e,o),ct(o))}},dt=(e,t)=>{let n=e;for(let r of t){let o=n[r];o&&o!==$&&Object.keys(o).length===0&&(n={...n,[r]:$})}return n},pt=(e,t,n)=>(t.countersDraft&&(e.counters=Ke(e.counters,t.countersDraft)),Zt(e,t),dt(n,t.touchedActorRecords.keys())),Ie=(e,t,n)=>{for(let[r,o]of t.canonicalActorRecords)n={...n,[r]:o};return Qt(e,t),dt(n,t.touchedTemplateKeys)},Te=(e,t)=>{let n=[];for(let r of t){let o=e.actorById.get(r.meta.actorId);o&&n.push(o)}return n};var en=(e,t)=>{let n=t?.originId;if(n!==void 0&&(n.length===0||n.includes(W)))throw new T("LITE_FSM_INVALID_OPTIONS",`[lite-fsm] originId must be a non-empty string without '${W}'.`);let r={originId:n,generateActorId:t?.generateActorId,generateGroupId:t?.generateGroupId},o=Object.keys(e),c=(s,g)=>s[g],a=o.filter(s=>J(e[s])),i=o.filter(s=>!J(e[s]));for(let s of a)Le(s,e[s]);for(let s of i)if(V(e[s],"persistence"))throw new T("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] domain machine '${s}' cannot define actor persistence.`);let u=a.filter(s=>e[s].persistence==="snapshot"),l=a.filter(s=>e[s].persistence!=="snapshot"),A=!!t?.middleware?.some(te),R=t?.schemaVersion,{groupTagForTemplate:p,hasActorTransition:m,isPublicActorState:b}=Ze(e),{domainReduceIndex:f,domainAlwaysReduce:S,actorReduceIndex:h,actorSpawnIndex:E}=Qe(e,a,i,p),x=s=>!!e[s].effects,y=i.filter(x),M=a.some(x),D=y.length>0||M;if(O)for(let s of i)e[s].groupTag&&console.warn(`[lite-fsm] groupTag on domain machine '${s}' is ignored.`);let _=Object.fromEntries(o.map(s=>[s,re(e[s],{allowActorTemplate:!0,allowVoidReducer:()=>A})])),G={transition:void 0,userDeps:{}},K=[],P=Object.fromEntries(o.map(s=>[s,a.includes(s)?$:{state:e[s].initialState,context:e[s].initialContext}])),v=st(),F=null,{normalizeAction:U,applyPostNormalize:ut}=tt({sidecar:v}),{resolveSpawnGroups:gt,forEachRoutedIdentity:ft}=ot({sidecar:v,actorTemplateKeys:a,actorSpawnIndex:E,actorReduceIndex:h,spawnIdConfig:r}),yt=(s,g)=>{let d=s,I=C=>{let w=_[C],k=s[C],L=w.transition(k,g);L!==k&&(d=d===s?{...s}:d,d[C]=L)};for(let C of S)I(C);for(let C of f.get(g.type)??[])I(C);return d},lt=(s,g,d,I,C)=>{let w=g,k=E.get(d.type);if(!k)return w;let L=B=>v.actorById.has(B)||s.pendingSpawned.some(z=>z.meta.actorId===B);for(let B of gt(I,C,s,d))for(let z of k.get(B.groupTag)??[]){let Pt=e[z],_t=q({actorId:Ye(s,z,B.groupTag,d,r,L),groupId:B.groupId,groupTag:B.groupTag}),ue={templateKey:z,meta:_t},bt={state:"__INIT",context:{...Pt.initialContext},meta:ue.meta},Pe=ae(s,w,z);Pe.record[ue.meta.actorId]=bt,w=Pe.root,s.pendingSpawned.push(ue)}return w},St=(s,g,d,I)=>{let w=c(g,d.templateKey)?.[d.meta.actorId];if(!w||!m(d.templateKey,w.state,I))return{root:g,delivered:!1};let k=ae(s,g,d.templateKey),B=_[d.templateKey].transition(w,I);return O&&Oe(d.meta.actorId,d.templateKey,B.state,b),k.record[d.meta.actorId]={...B,meta:d.meta},{root:k.root,delivered:!0}},mt=(s,g)=>{let d=g,I=new Set;for(let C of[...s.pendingSpawned,...s.pendingDelivered]){if(I.has(C.meta.actorId))continue;I.add(C.meta.actorId);let k=c(d,C.templateKey)?.[C.meta.actorId];if(!k||!j(k.state))continue;let L=ae(s,d,C.templateKey);delete L.record[C.meta.actorId],d=L.root,s.pendingDeleted.push(C)}return d},ie=(s,g)=>{let d=F,{scope:I,targetSet:C}=Ge(g.meta),w=yt(s,g);return I!=="actor"&&(w=lt(d,w,g,I,C)),ft(I,C,d.pendingSpawned,g,k=>{let L=St(d,w,k,g);w=L.root,L.delivered&&d.pendingDelivered.push(k)}),mt(d,w)},Re=s=>{ie=s(ie)},Me={actorTemplateKeys:a,groupTagForTemplate:p,isPublicActorState:b,originId:n},At=s=>{let g=[],d=new Set,I=C=>{for(let w of C){let k=w.meta.actorId;d.has(k)||(d.add(k),g.push(w))}};I(Te(v,s.pendingSpawned)),I(Te(v,s.pendingDelivered)),s.effectsTargets=g},ht=(s,g,d)=>a.filter(I=>s[I]===g[I]?!1:d.touchedActorRecords.get(I)!==g[I]),It=(s,g,d)=>{let I=ht(g,d,s),C=I.length?he(v,Me,I,d):void 0,w=C?Ie(v,C,d):d;return pt(v,s,w)},ce=s=>(K.push(s),()=>{K=K.filter(g=>g!==s)}),Ce=(s,g,d)=>{for(let I of K)I(s,g,d)},{condition:Tt,invokeEffects:Rt}=je({sidecar:v,machines:_,domainKeys:y,refs:G,onTransition:ce,onError:t?.onError}),xe=()=>P,Mt=()=>({schemaVersion:R,machines:{...P}}),de={config:e,snapshotActorTemplateKeys:u,runtimeActorTemplateKeys:l,schemaVersion:R,groupTagForTemplate:p,onSchemaVersionMismatch:t?.onSchemaVersionMismatch,onUnknownMachineKey:t?.onUnknownMachineKey},Ee=(s,g)=>{if(s.changedActorTemplateKeys.length===0)return g;let d=he(v,Me,s.changedActorTemplateKeys,g);return Ie(v,d,g)},Ct=(s,{strategy:g="merge",baseState:d=P}={})=>se(d,s,g,"hydrate",de,"preview").nextState,we=t?.snapshot;if(we){let s=se(P,we,"replace","opts.snapshot",de);P=Ee(s,s.nextState)}O&&H(P);let xt=(s,{strategy:g="merge"}={})=>{let d=P,I=se(d,s,g,"hydrate",de),C=I.nextState;C!==d&&(P=Ee(I,C),O&&H(P),Ce(d,P,{type:be,payload:{strategy:g,snapshot:s}}))},Et=(s=>qe(P,e,v,u,l,i,R,s)),De=s=>{let g=F;if(g.committed)throw new Error("[lite-fsm] middleware called next() more than once for a single transition.");let d=P;if(ut(g,s),!g.committed)return s;g.committedPrevState=d;let I=ie(d,g.committed);if(I===void 0)throw new Error(X);return P=It(g,d,I),M&&At(g),O&&H(P),Ce(d,P,g.committed),g.committed},wt=(()=>{let s=t?.middleware;if(!s?.length)return De;let g={getState:xe,transition:I=>pe(I),replaceReducer:Re,onTransition:ce,condition:Tt},d=s.map(I=>I(g));return ee(...d)(De)})();function pe(s,g={}){et(s);let d=U(s,g);if(d===Y)return s;let I=F,C=$e(g,v.counters);F=C;let w;try{w=wt(d)}finally{F=I}return C.committed?(D&&Rt(C.committedPrevState,P,C.committed,C.effectsTargets),C.committed):w}let Dt=s=>{let g=G.userDeps,d=typeof s=="function"?s(g):s;G.userDeps=d};return G.transition=pe,{getState:xe,getSnapshot:Mt,getHydratedState:Ct,hydrate:xt,dehydrate:Et,transition:pe,setDependencies:Dt,onTransition:ce,replaceReducer:Re}};function tn(e){return e}var ro=e=>e,ao=e=>e,nn=Symbol.for("lite-fsm.owner.domain"),on=({type:e,effect:t,cancelFn:n})=>{let r=new Map;return o=>{let c=o,a=c.self?.actorId??nn,i=r.get(a)??{lastId:0};i.lastId+=1,i.cancel=n?.(o),r.set(a,i);let u=i.lastId;c.self&&!i.dispose&&(i.dispose=()=>r.delete(a),c[Z]?.(c.self.actorId,Symbol("createEffect"),i.dispose));let l=()=>e==="latest"&&u!==r.get(a)?.lastId?!1:!i.cancel?.(),A=Object.assign(R=>l()?o.transition(R):R,o.transition);if(c.self){let R=o.transition;A.unscoped=p=>l()?R.unscoped(p):p,A.actor=(p,m)=>l()?R.actor(p,m):m,A.group=(p,m)=>l()?R.group(p,m):m,A.tag=(p,m)=>l()?R.tag(p,m):m}return t({...o,transition:A})}},so=e=>on(e);export{T as LiteFsmError,re as Machine,en as MachineManager,q as createActorMeta,ao as createConfig,so as createEffect,tn as createMachine,ro as createReducer,Gt as defineMachine};
1
+ var vt=Object.defineProperty;var kt=(e,t,n)=>t in e?vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var we=(e,t,n)=>kt(e,typeof t!="symbol"?t+"":t,n);var q=Symbol.for("lite-fsm.registerBagDispose");function J(...e){return e.length===0?t=>t:e.reduce((t,n)=>(...r)=>t(n(...r)))}var De="*",Nt="@@lite-fsm/",fe="@@lite-fsm/HYDRATE",_e="__liteFsmAllowVoidReducer",U="Reducer returned undefined. Return the next state, or use immerMiddleware to mutate draft state without return.",Q=e=>typeof e=="function"&&_e in e,I=class extends Error{constructor(n,r){super(r);we(this,"code",n);this.name="LiteFsmError"}},ye=(e,t)=>{if(typeof e!="string"||e.length===0)throw new I("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] generate${t==="actor"?"Actor":"Group"}Id must return a non-empty string.`);return e},ee=e=>typeof e.type=="string"&&e.type.startsWith(Nt),L=globalThis.process?.env?.NODE_ENV!=="production",K=e=>{if(e===null||typeof e!="object"||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.keys(e))K(Reflect.get(e,t));return e};var j=Object.freeze({}),Ot=new Set(["__RESOLVED","__REJECTED","__CANCELLED"]),Lt=["senderActorId","senderGroupId","senderGroupTag"],Bt=["actorId","groupId","groupTag"],V=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),N=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),H=e=>typeof e=="string"&&Ot.has(e),ve=e=>N(e)&&typeof e.state=="string"&&N(e.context),Z=e=>Object.freeze({actorId:e.actorId,groupId:e.groupId,groupTag:e.groupTag}),te=e=>V(e.config,"__INIT"),ne=(e,t,n,r)=>{let o=e[t]?.[n];if(o!==void 0)return o;if(!(r&&t==="__INIT"))return e["*"]?.[n]},ke=(e,t,n,r)=>{if(n==="__INIT")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' remained in __INIT after spawn.`);if(!H(n)&&!r(t,n))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor '${e}' has invalid state.`)},Ne=(e,t)=>{if(t.initialState!=="__INIT")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' must use __INIT as initialState.`);if(t.persistence!==void 0&&t.persistence!=="runtime"&&t.persistence!=="snapshot")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid persistence mode.`);if(t.persistence!=="snapshot"&&(t.hydrate||t.dehydrate))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot define hydrate/dehydrate hooks without snapshot persistence.`);let n=t.config;for(let r of Object.keys(n)){if(H(r)||r.startsWith("__")&&r!=="__INIT")throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has reserved state '${r}'.`);for(let o of Object.values(n[r])){if(r==="__INIT"&&o===null)throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' cannot spawn with a null __INIT target.`);if(o==="__INIT"||typeof o=="string"&&o.startsWith("__")&&!H(o))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] actor template '${e}' has invalid target '${String(o)}'.`)}}},Oe=e=>{let t={};return e&&(e.actorId!==void 0&&(t.actorId=e.actorId),e.groupId!==void 0&&(t.groupId=e.groupId),e.groupTag!==void 0&&(t.groupTag=e.groupTag),e.senderActorId!==void 0&&(t.senderActorId=e.senderActorId),e.senderGroupId!==void 0&&(t.senderGroupId=e.senderGroupId),e.senderGroupTag!==void 0&&(t.senderGroupTag=e.senderGroupTag)),t},Le=e=>{let t=Oe(e);for(let n of Lt)delete t[n];return t},Be=e=>{let t=Oe(e);for(let n of Bt)delete t[n];return t},Ae=(e,t)=>{if(Object.keys(t).length===0){let{meta:n,...r}=e;return r}return{...e,meta:t}},le=e=>Array.isArray(e)?e:[e],Se=e=>[...new Set(e)],Fe=e=>e?e.actorId!==void 0?{scope:"actor",targetSet:Se(le(e.actorId))}:e.groupId!==void 0?{scope:"group",targetSet:Se(le(e.groupId))}:e.groupTag!==void 0?{scope:"tag",targetSet:Se(le(e.groupTag))}:{scope:"unscoped",targetSet:[]}:{scope:"unscoped",targetSet:[]},z="#",me=e=>{let t=e.indexOf(z);return t===-1?{owner:null,tail:e}:{owner:e.slice(0,t),tail:e.slice(t+1)}},Pe=(e,t)=>{let{owner:n}=me(e);return t===void 0?n===null:n===t},X=e=>({actor:e.actor,groupByTag:new Map(e.groupByTag)}),Ve=(e,t)=>{let n=X(e);n.actor=Math.max(n.actor,t.actor);for(let[r,o]of t.groupByTag)n.groupByTag.set(r,Math.max(n.groupByTag.get(r)??0,o));return n},be=e=>{let t=e.lastIndexOf("/");if(t<0)return null;let n=Number(e.slice(t+1));return Number.isInteger(n)&&n>=0?n:null},Ge=(e,t,n,r)=>{if(Pe(t,r)){let o=be(me(t).tail);o!==null&&(e.actor=Math.max(e.actor,o+1))}if(Pe(n,r)){let o=me(n).tail,a=be(o);if(a===null)return;let s=o.slice(0,o.lastIndexOf("/"));e.groupByTag.set(s,Math.max(e.groupByTag.get(s)??0,a+1))}};var oe=(e,t={})=>{let n=te(e);return{config:e.config,transition:(r,o)=>{if(n&&!t.allowActorTemplate)throw new I("LITE_FSM_STANDALONE_ACTOR_TEMPLATE","[lite-fsm] actor templates can only be used inside MachineManager.");let a=e.config,s=ne(a,r.state,o.type,n);if(s===void 0)return r;if(e.reducer){let d=s||r.state,S=e.reducer(r,o,{nextState:d,config:e.config});if(S===void 0){if(t.allowVoidReducer?.())return r;throw new Error(U)}return S}let c="payload"in o?o.payload:{};return{state:s||r.state,context:{...r.context,...c}}},invokeEffect:async(r,o,a)=>{if(!e.effects)return;let s=e.effects,c=r!==o&&s[o]||s[De];c&&await c(a)}}},Ft=(e,t={})=>{let n,r=[],o=!1,a=y=>{o=!!y?.some(Q)},s=oe(e,{allowVoidReducer:()=>o}),c=[],d={context:e.initialContext,state:e.initialState};L&&K(d);let S=(y,M)=>s.transition(y,M),m=y=>{S=y(S)},R=y=>new Promise((M,w)=>{let D=A((G,b,v)=>{try{y(v)&&(D(),M(!0))}catch(O){D(),w(O)}})}),u=(y,M,w)=>{s.invokeEffect(y.state,M.state,{...t.dependencies,transition:n,action:w,condition:R}).catch(D=>{t?.onError?.(D)})},A=y=>(c.push(y),()=>{c=c.filter(M=>M!==y)}),P=(y,M,w)=>{c.forEach(D=>D(y,M,w))},g=y=>{let M=d,w=S(M,y);if(w===void 0)throw new Error(U);return d=w,L&&K(d),P(M,d,y),y},l=y=>{if(a(y),!y?.length)return g;let M=y.map(w=>w({getState:E,transition:D=>n(D),replaceReducer:m,onTransition:A,condition:R}));return J(...M)(g)},h=l(r);n=y=>{let M=d,w=h(y);return u(M,d,w),w};let E=()=>d;return{transition:n,getState:E,onTransition:A,addMiddleware:(...y)=>{r=[...r,...y],h=l(r)}}},Vt=(e={})=>({create:t=>Ft(t,e)});var Ke=e=>{let{sidecar:t,machines:n,domainKeys:r,refs:o,onTransition:a,onError:s}=e,c=(g,l,h)=>{t.actorById.get(g)?.bag.set(l,h)},d=(g,l)=>{t.actorById.get(g)?.bag.delete(l)},S=(g,l)=>new Promise((h,E)=>{let x=()=>l!==void 0&&!t.actorById.has(l.actorId),y=()=>new I("LITE_FSM_ACTOR_DISPOSED","Actor was disposed before condition resolved.");if(x())return E(y());let M,w=()=>{D(),l&&M&&d(l.actorId,M)},D=a((G,b,v)=>{if(!ee(v)){if(x())return D();try{if(!g(v))return;if(x())return D();w(),h(!0)}catch(O){w(),E(O)}}});l&&(M=Symbol("condition"),c(l.actorId,M,()=>{D(),E(y())}))}),m=g=>S(g),R=g=>{let l=(h=>o.transition(h,{sender:g}));return l.unscoped=h=>o.transition(h,{sender:g,routingMode:"unscoped"}),l.actor=(h,E)=>o.transition({...E,meta:{actorId:h}},{sender:g}),l.group=(h,E)=>o.transition({...E,meta:{groupId:h}},{sender:g}),l.tag=(h,E)=>o.transition({...E,meta:{groupTag:h}},{sender:g}),l},u=(g,l,h)=>{let E=x=>o.transition(x);for(let x of r){let y=n[x],M=g[x],w=l[x];y.invokeEffect(M.state,w.state,{...o.userDeps,transition:E,action:h,condition:m}).catch(D=>s?.(D))}},A=(g,l,h,E)=>{for(let x of E){let{actorId:y,groupId:M,groupTag:w}=x.meta,D=n[x.templateKey],G=g[x.templateKey],b=l[x.templateKey],v=G?.[y],O=b?.[y];if(!O)continue;let W={actorId:y,groupId:M,groupTag:w};D.invokeEffect(v?.state??"__INIT",O.state,{...o.userDeps,transition:R(W),action:h,condition:Y=>S(Y,W),self:W,[q]:c}).catch(Y=>s?.(Y))}};return{condition:m,invokeEffects:(g,l,h,E)=>{u(g,l,h),A(g,l,h,E)}}};var He=(e,t)=>({normalizeOpts:e,countersBase:t,pendingSpawned:[],pendingDelivered:[],pendingDeleted:[],touchedActorRecords:new Map,effectsTargets:[]}),je=e=>(e.countersDraft||(e.countersDraft=X(e.countersBase)),e.countersDraft),$e=(e,t,n)=>e?`${e}${z}${t}/${n}`:`${t}/${n}`,ze=(e,t,n,r,o)=>{let a=je(e),s=a.groupByTag.get(t)??0;a.groupByTag.set(t,s+1);let c=r.generateGroupId?ye(r.generateGroupId({templateKey:t,groupTag:t,counter:s,originId:r.originId,action:n}),"group"):$e(r.originId,t,s);if(o(c))throw new I("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] groupId '${c}' is already in use.`);return c},We=(e,t,n,r,o,a)=>{let s=je(e),c=s.actor;s.actor=c+1;let d=o.generateActorId?ye(o.generateActorId({templateKey:t,groupTag:n,counter:c,originId:o.originId,action:r}),"actor"):$e(o.originId,t,c);if(a(d))throw new I("LITE_FSM_INVALID_GENERATED_ID",`[lite-fsm] actorId '${d}' is already in use.`);return d},re=(e,t,n)=>{let r=e.touchedActorRecords.get(n);if(r)return{root:t,record:r};let o=t[n],a=o===j?{}:{...o},s={...t,[n]:a};return e.touchedActorRecords.set(n,a),{root:s,record:a}};var Gt=e=>{if(!N(e))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot must be an object envelope.");if(!N(e.machines))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE","[lite-fsm] hydrate: snapshot.machines must be an object.");return{schemaVersion:typeof e.schemaVersion=="number"?e.schemaVersion:void 0,machines:e.machines}},he=e=>({state:e.state,context:e.context}),Kt=e=>N(e)&&V(e,"snapshot")?{snapshot:e.snapshot,meta:e.meta}:{snapshot:e},Ye=(e,t)=>N(e)?{...e,meta:t}:e,Ht=(e,t,n)=>e&&N(t)&&t.state===e.state&&t.context===e.context?e:Ye(t,n),jt=(e,t,n,r,o)=>{if(!N(n))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${t}'.`);let a=e[t],c=o.config[t].hydrate,d=r==="replace"?{}:{...a},S=!1;for(let[m,R]of Object.entries(n)){let u=a[m],A=Kt(R),P=c?c(u?he(u):void 0,A.snapshot,{strategy:r}):A.snapshot,g=Ht(u,P,u?.meta??A.meta);a[m]!==g&&(S=!0),d[m]=g}if(r==="replace"&&!S){for(let m of Object.keys(a))if(!(m in d)){S=!0;break}}return{record:S?d:a,changed:S}},ae=(e,t,n,r,o,a="commit")=>{let s=Gt(t);a==="commit"&&s.schemaVersion!==o.schemaVersion&&o.onSchemaVersionMismatch?.(s.schemaVersion,o.schemaVersion);let c,d=[];for(let S of Object.keys(s.machines)){if(!V(o.config,S)){a==="commit"&&(L&&console.warn(`[lite-fsm] hydrate: unknown machine key '${S}', skipped.`),o.onUnknownMachineKey?.(S,r));continue}let m=S;if(o.runtimeActorTemplateKeys.includes(m)){L&&console.warn(`[lite-fsm] hydrate: runtime actor template '${m}' was skipped \u2014 runtime actor templates do not participate in hydrate/dehydrate.`);continue}if(o.snapshotActorTemplateKeys.includes(m)){let g=jt(e,m,s.machines[S],n,o);if(!g.changed)continue;c=c??{...e},c[m]=g.record,d.push(m);continue}let R=e[m],u=s.machines[S],A=o.config[m].hydrate,P=A?A(R,u,{strategy:n}):u;P!==R&&(c=c??{...e},c[m]=P)}return{nextState:c??e,changedActorTemplateKeys:d}},Ue=(e,t,n,r,o,a,s,c)=>{let d=c?.machines;if(d)for(let u of d){if(!V(t,u))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: unknown machine key '${u}'.`);if(o.includes(u))throw new I("LITE_FSM_INVALID_HYDRATION_ENVELOPE",`[lite-fsm] dehydrate: runtime actor template '${u}' cannot be dehydrated.`)}let S=u=>{let A=e[u];if(!N(A))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${u}'.`);let g=t[u].dehydrate,l={};for(let[h,E]of Object.entries(A)){let x=n.actorById.get(h);if(!x)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${h}' has no runtime identity.`);l[h]={snapshot:g?g(he(E)):he(E),meta:x.meta}}return l},m=d??[...a,...r],R={};for(let u of m){if(r.includes(u)){R[u]=S(u);continue}let P=t[u].dehydrate;R[u]=P?P(e[u]):e[u]}return{schemaVersion:s,machines:R}};var Ze=(e,t,n)=>{let r=new Map,o=[];for(let s of e){let c=!1;for(let[d,S]of Object.entries(t(s)))if(!(!S||!n(d)))for(let m of Object.keys(S)){c=!0;let R=r.get(m);R||r.set(m,R=new Set),R.add(s)}c||o.push(s)}let a=new Map;for(let[s,c]of r)a.set(s,[...c]);return{index:a,keysWithoutEdges:o}},$t=(e,t,n)=>{let r=new Map;for(let o of e){let a=n(o);for(let s of Object.keys(t(o).__INIT??{})){let c=r.get(s);c||r.set(s,c=new Map);let d=c.get(a);d||c.set(a,d=[]),d.push(o)}}return r},Xe=(e,t,n,r)=>{let o=d=>e[d].config,a=Ze(n,o,()=>!0),s=Ze(t,o,d=>d!=="__INIT"),c=$t(t,o,r);return{domainReduceIndex:a.index,domainAlwaysReduce:a.keysWithoutEdges,actorReduceIndex:s.index,actorSpawnIndex:c}},qe=e=>{let t=s=>e[s],n=s=>t(s).config;return{groupTagForTemplate:s=>t(s).groupTag??s,hasActorTransition:(s,c,d)=>ne(n(s),c,d.type,!0)!==void 0,isPublicActorState:(s,c)=>c==="__INIT"||H(c)?!1:V(t(s).config,c)}};var se=Symbol.for("lite-fsm.normalize-drop"),Je=e=>{if(ee(e))throw new Error(`[lite-fsm] reserved system action '${e.type}' cannot be dispatched.`)},Qe=e=>{let{sidecar:t}=e,n=(o,{sender:a,routingMode:s="default"}={})=>{if(!a&&s==="default"&&!("meta"in o))return o;if(a&&!t.actorById.has(a.actorId))return se;let c=Le(o.meta);return a&&(c.senderActorId=a.actorId,c.senderGroupId=a.groupId,c.senderGroupTag=a.groupTag),s==="unscoped"?Ae(o,Be(c)):(a&&c.actorId===void 0&&c.groupId===void 0&&c.groupTag===void 0&&(c.groupId=a.groupId,c.groupTag=a.groupTag),Ae(o,c))};return{normalizeAction:n,applyPostNormalize:(o,a)=>{let s=n(a,o.normalizeOpts);s!==se&&(o.committed=s)}}};var zt=(e,t)=>{let n=[];for(let r of t){let o=e.groupIdsByTag.get(r);if(o)for(let a of o)n.push(a)}return n},Wt=e=>{let t=new Map;for(let n of e){let r=t.get(n.templateKey);r?r.push(n):t.set(n.templateKey,[n])}return t},et=(e,t,n,r)=>{if(n===null){for(let o of e.actorIdsByTemplate.get(t)??[])r(o);return}for(let o of n){let a=e.groupById.get(o)?.actorIdsByTemplate.get(t);if(a)for(let s of a)r(s)}},tt=e=>{let{sidecar:t,actorTemplateKeys:n,actorSpawnIndex:r,actorReduceIndex:o,spawnIdConfig:a}=e;return{resolveSpawnGroups:(d,S,m,R)=>{if(d==="group"){let g=[];for(let l of S){let h=t.groupById.get(l);h&&g.push({groupId:l,groupTag:h.groupTag})}return g}if(d==="tag"){let g=[];for(let l of S)for(let h of t.groupIdsByTag.get(l)??[])g.push({groupId:h,groupTag:l});return g}let u=[],A=new Set,P=g=>t.groupById.has(g)||A.has(g);for(let g of r.get(R.type)?.keys()??[]){let l=ze(m,g,R,a,P);A.add(l),u.push({groupId:l,groupTag:g})}return u},forEachRoutedIdentity:(d,S,m,R,u)=>{if(d==="actor"){for(let x of S){let y=t.actorById.get(x);y&&u(y)}return}let A=d==="group"?S:d==="tag"?zt(t,S):null;if(m.length===0){for(let x of o.get(R.type)??[])et(t,x,A,y=>{let M=t.actorById.get(y);M&&u(M)});return}let P=new Set(o.get(R.type)??[]),g=Wt(m),l=new Set(S),h=x=>d==="unscoped"?!0:d==="group"?l.has(x.meta.groupId):l.has(x.meta.groupTag),E=new Set;for(let x of n){P.has(x)&&et(t,x,A,y=>{if(E.has(y))return;let M=t.actorById.get(y);M&&(E.add(y),u(M))});for(let y of g.get(x)??[]){let M=y.meta.actorId;E.has(M)||h(y)&&(E.add(M),u(y))}}}}};var rt=()=>({actorById:new Map,groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map,counters:{actor:0,groupByTag:new Map}}),Yt=()=>({groupById:new Map,groupIdsByTag:new Map,actorIdsByTemplate:new Map}),nt=(e,t,n)=>{let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)},ot=(e,t,n)=>{let r=e.get(t);r?.delete(n),r?.size===0&&e.delete(t)},at=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta,a=e.groupById.get(r);a||(a={groupTag:o,actorIds:new Set,actorIdsByTemplate:new Map},e.groupById.set(r,a)),a.actorIds.add(n),nt(a.actorIdsByTemplate,t.templateKey,n),nt(e.actorIdsByTemplate,t.templateKey,n);let s=e.groupIdsByTag.get(o);s||(s=new Set,e.groupIdsByTag.set(o,s)),s.add(r)},Ut=(e,t)=>{let{actorId:n,groupId:r,groupTag:o}=t.meta;ot(e.actorIdsByTemplate,t.templateKey,n);let a=e.groupById.get(r);if(!a||(a.actorIds.delete(n),ot(a.actorIdsByTemplate,t.templateKey,n),a.actorIds.size>0))return;e.groupById.delete(r);let s=e.groupIdsByTag.get(o);s?.delete(r),s?.size===0&&e.groupIdsByTag.delete(o)},st=e=>{for(let t of e.bag.values())t();e.bag.clear()},Zt=(e,t,n,r,o)=>{if(r.length===0)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor id for template '${n}' must be non-empty.`);if(!ve(o)||!t.isPublicActorState(n,o.state))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor slice '${n}.${r}'.`);let a=e.actorById.get(r);if(a){if(a.templateKey!==n)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot move between actor template records.`);return{identity:a,isNew:!1}}let s=o.meta;if(!N(s))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' cannot be created by state replacement without actor meta.`);let{groupId:c,groupTag:d}=s;if(s.actorId!==r||typeof d!="string"||d!==t.groupTagForTemplate(n)||typeof c!="string"||c.length===0)throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Actor '${r}' has invalid actor meta.`);return{identity:{templateKey:n,meta:Z({actorId:r,groupId:c,groupTag:d})},isNew:!0}},Xt=e=>{let t=Yt();for(let n of e.values())at(t,n);return t},it=(e,t,n,r)=>{let o=new Set,a=new Map,s=new Map(e.actorById),c=new Map,d=[];for(let u of n){let A=r[u];if(!N(A))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Invalid actor record '${u}'.`);let P={};for(let[g,l]of Object.entries(A)){if(o.has(g))throw new I("LITE_FSM_INVALID_ACTOR_SLICE",`Duplicate actorId '${g}'.`);o.add(g);let{identity:h,isNew:E}=Zt(e,t,u,g,l);P[g]={...l,meta:h.meta},E&&a.set(g,h)}c.set(u,P)}for(let[u,A]of a)s.set(u,{...A,bag:new Map});let S=new Set(n);for(let[u,A]of s)S.has(A.templateKey)&&(o.has(u)||(d.push(A),s.delete(u)));let m=Xt(s),R=X(e.counters);for(let[u,A]of a)Ge(R,u,A.meta.groupId,t.originId);return{nextActorById:s,nextGroupById:m.groupById,nextGroupIdsByTag:m.groupIdsByTag,nextActorIdsByTemplate:m.actorIdsByTemplate,nextCounters:R,canonicalActorRecords:c,actorsToCleanup:d,touchedTemplateKeys:n}},qt=(e,t)=>{e.actorById=t.nextActorById,e.groupById=t.nextGroupById,e.groupIdsByTag=t.nextGroupIdsByTag,e.actorIdsByTemplate=t.nextActorIdsByTemplate,e.counters=t.nextCounters;for(let n of t.actorsToCleanup)st(n)},Jt=(e,t)=>{let n=new Set(t.pendingDeleted.map(r=>r.meta.actorId));for(let r of t.pendingSpawned){if(n.has(r.meta.actorId))continue;let o={...r,bag:new Map};e.actorById.set(r.meta.actorId,o),at(e,o)}for(let r of t.pendingDeleted){let o=e.actorById.get(r.meta.actorId);o&&(e.actorById.delete(r.meta.actorId),Ut(e,o),st(o))}},ct=(e,t)=>{let n=e;for(let r of t){let o=n[r];o&&o!==j&&Object.keys(o).length===0&&(n={...n,[r]:j})}return n},dt=(e,t,n)=>(t.countersDraft&&(e.counters=Ve(e.counters,t.countersDraft)),Jt(e,t),ct(n,t.touchedActorRecords.keys())),pt=(e,t,n)=>{for(let[r,o]of t.canonicalActorRecords)n={...n,[r]:o};return qt(e,t),ct(n,t.touchedTemplateKeys)},Ie=(e,t)=>{let n=[];for(let r of t){let o=e.actorById.get(r.meta.actorId);o&&n.push(o)}return n};var Qt=(e,t)=>{let n=t?.originId;if(n!==void 0&&(n.length===0||n.includes(z)))throw new I("LITE_FSM_INVALID_OPTIONS",`[lite-fsm] originId must be a non-empty string without '${z}'.`);let r={originId:n,generateActorId:t?.generateActorId,generateGroupId:t?.generateGroupId},o=Object.keys(e),a=[],s=[];for(let i of o)te(e[i])?a.push(i):s.push(i);for(let i of a)Ne(i,e[i]);for(let i of s)if(V(e[i],"persistence"))throw new I("LITE_FSM_INVALID_ACTOR_CONFIG",`[lite-fsm] domain machine '${i}' cannot define actor persistence.`);let c=[],d=[];for(let i of a)e[i].persistence==="snapshot"?c.push(i):d.push(i);let S=!!t?.middleware?.some(Q),m=t?.schemaVersion,{groupTagForTemplate:R,hasActorTransition:u,isPublicActorState:A}=qe(e),{domainReduceIndex:P,domainAlwaysReduce:g,actorReduceIndex:l,actorSpawnIndex:h}=Xe(e,a,s,R),E=i=>!!e[i].effects,x=s.filter(E),y=a.some(E),M=x.length>0||y;if(L)for(let i of s)e[i].groupTag&&console.warn(`[lite-fsm] groupTag on domain machine '${i}' is ignored.`);let w=Object.fromEntries(o.map(i=>[i,oe(e[i],{allowActorTemplate:!0,allowVoidReducer:()=>S})])),D={transition:void 0,userDeps:{}},G=[],b=Object.fromEntries(o.map(i=>[i,a.includes(i)?j:{state:e[i].initialState,context:e[i].initialContext}])),v=rt(),O=null,{normalizeAction:W,applyPostNormalize:Y}=Qe({sidecar:v}),{resolveSpawnGroups:ut,forEachRoutedIdentity:gt}=tt({sidecar:v,actorTemplateKeys:a,actorSpawnIndex:h,actorReduceIndex:l,spawnIdConfig:r}),ft=(i,f)=>{let p=i,T=C=>{let _=w[C],k=i[C],B=_.transition(k,f);B!==k&&(p=p===i?{...i}:p,p[C]=B)};for(let C of g)T(C);for(let C of P.get(f.type)??[])T(C);return p},yt=(i,f,p,T,C)=>{let _=f,k=h.get(p.type);if(!k)return _;let B=F=>v.actorById.has(F)||i.pendingSpawned.some($=>$.meta.actorId===F);for(let F of ut(T,C,i,p))for(let $ of k.get(F.groupTag)??[]){let _t=e[$],Pt=Z({actorId:We(i,$,F.groupTag,p,r,B),groupId:F.groupId,groupTag:F.groupTag}),ge={templateKey:$,meta:Pt},bt={state:"__INIT",context:{..._t.initialContext},meta:ge.meta},Ee=re(i,_,$);Ee.record[ge.meta.actorId]=bt,_=Ee.root,i.pendingSpawned.push(ge)}return _},lt=(i,f,p,T)=>{let _=f[p.templateKey]?.[p.meta.actorId];if(!_||!u(p.templateKey,_.state,T))return{root:f,delivered:!1};let k=re(i,f,p.templateKey),F=w[p.templateKey].transition(_,T);return L&&ke(p.meta.actorId,p.templateKey,F.state,A),k.record[p.meta.actorId]={...F,meta:p.meta},{root:k.root,delivered:!0}},St=(i,f)=>{let p=f,T=new Set;for(let C of[...i.pendingSpawned,...i.pendingDelivered]){if(T.has(C.meta.actorId))continue;T.add(C.meta.actorId);let k=p[C.templateKey]?.[C.meta.actorId];if(!k||!H(k.state))continue;let B=re(i,p,C.templateKey);delete B.record[C.meta.actorId],p=B.root,i.pendingDeleted.push(C)}return p},ie=(i,f)=>{let p=O,{scope:T,targetSet:C}=Fe(f.meta),_=ft(i,f);return T!=="actor"&&(_=yt(p,_,f,T,C)),gt(T,C,p.pendingSpawned,f,k=>{let B=lt(p,_,k,f);_=B.root,B.delivered&&p.pendingDelivered.push(k)}),St(p,_)},Re=i=>{ie=i(ie)},mt={actorTemplateKeys:a,groupTagForTemplate:R,isPublicActorState:A,originId:n},At=i=>{let f=[],p=new Set,T=C=>{for(let _ of C){let k=_.meta.actorId;p.has(k)||(p.add(k),f.push(_))}};T(Ie(v,i.pendingSpawned)),T(Ie(v,i.pendingDelivered)),i.effectsTargets=f},ht=(i,f,p)=>a.filter(T=>i[T]===f[T]?!1:p.touchedActorRecords.get(T)!==f[T]),ce=(i,f)=>{if(f.length===0)return i;let p=it(v,mt,f,i);return pt(v,p,i)},It=(i,f,p)=>{let T=ht(f,p,i),C=ce(p,T);return dt(v,i,C)},de=i=>(G.push(i),()=>{G=G.filter(f=>f!==i)}),Te=(i,f,p)=>{for(let T of G)T(i,f,p)},{condition:Rt,invokeEffects:Tt}=Ke({sidecar:v,machines:w,domainKeys:x,refs:D,onTransition:de,onError:t?.onError}),Me=()=>b,Mt=()=>({schemaVersion:m,machines:{...b}}),pe={config:e,snapshotActorTemplateKeys:c,runtimeActorTemplateKeys:d,schemaVersion:m,groupTagForTemplate:R,onSchemaVersionMismatch:t?.onSchemaVersionMismatch,onUnknownMachineKey:t?.onUnknownMachineKey},Ct=(i,{strategy:f="merge",baseState:p=b}={})=>ae(p,i,f,"hydrate",pe,"preview").nextState,Ce=t?.snapshot;if(Ce){let i=ae(b,Ce,"replace","opts.snapshot",pe);b=ce(i.nextState,i.changedActorTemplateKeys)}L&&K(b);let xt=(i,{strategy:f="merge"}={})=>{let p=b,T=ae(p,i,f,"hydrate",pe),C=T.nextState;C!==p&&(b=ce(C,T.changedActorTemplateKeys),L&&K(b),Te(p,b,{type:fe,payload:{strategy:f,snapshot:i}}))},Et=(i=>Ue(b,e,v,c,d,s,m,i)),xe=i=>{let f=O;if(f.committed)throw new Error("[lite-fsm] middleware called next() more than once for a single transition.");let p=b;if(Y(f,i),!f.committed)return i;f.committedPrevState=p;let T=ie(p,f.committed);if(T===void 0)throw new Error(U);return b=It(f,p,T),y&&At(f),L&&K(b),Te(p,b,f.committed),f.committed},wt=(()=>{let i=t?.middleware;if(!i?.length)return xe;let f={getState:Me,transition:T=>ue(T),replaceReducer:Re,onTransition:de,condition:Rt},p=i.map(T=>T(f));return J(...p)(xe)})();function ue(i,f={}){Je(i);let p=W(i,f);if(p===se)return i;let T=O,C=He(f,v.counters);O=C;let _;try{_=wt(p)}finally{O=T}return C.committed?(M&&Tt(C.committedPrevState,b,C.committed,C.effectsTargets),C.committed):_}let Dt=i=>{let f=D.userDeps,p=typeof i=="function"?i(f):i;D.userDeps=p};return D.transition=ue,{getState:Me,getSnapshot:Mt,getHydratedState:Ct,hydrate:xt,dehydrate:Et,transition:ue,setDependencies:Dt,onTransition:de,replaceReducer:Re}};function en(e){return e}var to=e=>e,no=e=>e,tn=Symbol.for("lite-fsm.owner.domain"),nn=({type:e,effect:t,cancelFn:n})=>{let r=new Map;return o=>{let a=o,s=a.self?.actorId??tn,c=r.get(s)??{lastId:0};c.lastId+=1,c.cancel=n?.(o),r.set(s,c);let d=c.lastId;a.self&&!c.dispose&&(c.dispose=()=>r.delete(s),a[q]?.(a.self.actorId,Symbol("createEffect"),c.dispose));let S=()=>e==="latest"&&d!==r.get(s)?.lastId?!1:!c.cancel?.(),m=Object.assign(R=>S()?o.transition(R):R,o.transition);if(a.self){let R=o.transition;m.unscoped=u=>S()?R.unscoped(u):u,m.actor=(u,A)=>S()?R.actor(u,A):A,m.group=(u,A)=>S()?R.group(u,A):A,m.tag=(u,A)=>S()?R.tag(u,A):A}return t({...o,transition:m})}},oo=e=>nn(e);export{fe as HYDRATE_ACTION_TYPE,I as LiteFsmError,oe as Machine,Qt as MachineManager,_e as VOID_REDUCER_MIDDLEWARE_MARKER,Z as createActorMeta,no as createConfig,oo as createEffect,en as createMachine,to as createReducer,Vt as defineMachine};
@@ -1,2 +1 @@
1
- export declare const LATE_DISPATCH: unique symbol;
2
1
  export declare const REGISTER_BAG_DISPOSE: unique symbol;
@@ -1,2 +1 @@
1
- export declare const LATE_DISPATCH: unique symbol;
2
1
  export declare const REGISTER_BAG_DISPOSE: unique symbol;
@@ -1,10 +1,10 @@
1
1
  import { type NormalizeOptions } from "./actor";
2
2
  import type { DispatchContext } from "./dispatchContext";
3
- import { LATE_DISPATCH } from "./internal";
4
3
  import type { SidecarState } from "./sidecar";
5
4
  import type { AnyEvent, ManagerAction, MachineStore } from "./types";
5
+ export declare const NORMALIZE_DROP: unique symbol;
6
6
  export type Normalizer<S extends MachineStore, P extends AnyEvent> = {
7
- normalizeAction: (raw: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P> | typeof LATE_DISPATCH;
7
+ normalizeAction: (raw: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P> | typeof NORMALIZE_DROP;
8
8
  applyPostNormalize: (ctx: DispatchContext<S, P>, action: ManagerAction<P>) => void;
9
9
  };
10
10
  export declare const assertUserAction: (action: {
@@ -1,10 +1,10 @@
1
1
  import { type NormalizeOptions } from "./actor";
2
2
  import type { DispatchContext } from "./dispatchContext";
3
- import { LATE_DISPATCH } from "./internal";
4
3
  import type { SidecarState } from "./sidecar";
5
4
  import type { AnyEvent, ManagerAction, MachineStore } from "./types";
5
+ export declare const NORMALIZE_DROP: unique symbol;
6
6
  export type Normalizer<S extends MachineStore, P extends AnyEvent> = {
7
- normalizeAction: (raw: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P> | typeof LATE_DISPATCH;
7
+ normalizeAction: (raw: ManagerAction<P>, opts?: NormalizeOptions) => ManagerAction<P> | typeof NORMALIZE_DROP;
8
8
  applyPostNormalize: (ctx: DispatchContext<S, P>, action: ManagerAction<P>) => void;
9
9
  };
10
10
  export declare const assertUserAction: (action: {
@@ -15,7 +15,7 @@ export type ReplacementReconcilePlan = {
15
15
  nextCounters: Counters;
16
16
  canonicalActorRecords: Map<string, ActorRecord>;
17
17
  actorsToCleanup: ActorRuntime[];
18
- touchedTemplateKeys: string[];
18
+ touchedTemplateKeys: readonly string[];
19
19
  };
20
20
  export type SidecarValidationDeps = {
21
21
  actorTemplateKeys: readonly string[];
@@ -34,7 +34,7 @@ type IndexBundle = {
34
34
  export declare const addActorToGroupIndexes: (indexes: IndexBundle, actor: ActorRuntime) => void;
35
35
  export declare const removeActorFromGroupIndexes: (sidecar: SidecarState, actor: ActorRuntime) => void;
36
36
  export declare const cleanupDisposedActor: (actor: ActorRuntime) => void;
37
- export declare const buildReplacementReconcilePlan: (sidecar: SidecarState, deps: SidecarValidationDeps, changedTemplateKeys: string[], nextRoot: RootStateView) => ReplacementReconcilePlan;
37
+ export declare const buildReplacementReconcilePlan: (sidecar: SidecarState, deps: SidecarValidationDeps, changedTemplateKeys: readonly string[], nextRoot: RootStateView) => ReplacementReconcilePlan;
38
38
  export declare const canonicalizeEmptyActorRecords: <S extends RootStateView>(state: S, templateKeys: Iterable<string>) => S;
39
39
  export declare const commitDispatchSidecar: <S extends RootStateView>(sidecar: SidecarState, ctx: DispatchContext, nextState: S) => S;
40
40
  export declare const commitReplacementSidecar: <S extends RootStateView>(sidecar: SidecarState, plan: ReplacementReconcilePlan, nextState: S) => S;
package/dist/sidecar.d.ts CHANGED
@@ -15,7 +15,7 @@ export type ReplacementReconcilePlan = {
15
15
  nextCounters: Counters;
16
16
  canonicalActorRecords: Map<string, ActorRecord>;
17
17
  actorsToCleanup: ActorRuntime[];
18
- touchedTemplateKeys: string[];
18
+ touchedTemplateKeys: readonly string[];
19
19
  };
20
20
  export type SidecarValidationDeps = {
21
21
  actorTemplateKeys: readonly string[];
@@ -34,7 +34,7 @@ type IndexBundle = {
34
34
  export declare const addActorToGroupIndexes: (indexes: IndexBundle, actor: ActorRuntime) => void;
35
35
  export declare const removeActorFromGroupIndexes: (sidecar: SidecarState, actor: ActorRuntime) => void;
36
36
  export declare const cleanupDisposedActor: (actor: ActorRuntime) => void;
37
- export declare const buildReplacementReconcilePlan: (sidecar: SidecarState, deps: SidecarValidationDeps, changedTemplateKeys: string[], nextRoot: RootStateView) => ReplacementReconcilePlan;
37
+ export declare const buildReplacementReconcilePlan: (sidecar: SidecarState, deps: SidecarValidationDeps, changedTemplateKeys: readonly string[], nextRoot: RootStateView) => ReplacementReconcilePlan;
38
38
  export declare const canonicalizeEmptyActorRecords: <S extends RootStateView>(state: S, templateKeys: Iterable<string>) => S;
39
39
  export declare const commitDispatchSidecar: <S extends RootStateView>(sidecar: SidecarState, ctx: DispatchContext, nextState: S) => S;
40
40
  export declare const commitReplacementSidecar: <S extends RootStateView>(sidecar: SidecarState, plan: ReplacementReconcilePlan, nextState: S) => S;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lite-fsm/core",
3
- "version": "2.0.3",
3
+ "version": "2.0.5",
4
4
  "type": "module",
5
5
  "description": "Framework-agnostic runtime for lite-fsm",
6
6
  "license": "MIT",