@lite-fsm/react 2.0.5 → 2.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -78,8 +78,18 @@ function Counter() {
78
78
  - `useTransition` - returns `manager.transition`.
79
79
  - `useManager` - returns the current manager from context.
80
80
  - `FSMHydrationBoundary` and `useHydrateSnapshot` - React hydration helpers for snapshots.
81
+ - `useStorageHydrationPreview` - generic raw `snapshot.storage[kind]` preview для plugin packages.
81
82
  - `defineMachine` - creates a standalone shared machine hook.
82
83
 
84
+ ## Storage Preview Bridge
85
+
86
+ `useStorageHydrationPreview(storageKind)` возвращает `{ hasPreview, preview,
87
+ hasServerPreview, serverPreview }`. Payload имеет тип `unknown`; plugin package
88
+ сам валидирует свой `snapshot.storage[kind]`. `FSMHydrationBoundary` наследует
89
+ storage preview от parent boundary, если child snapshot не содержит этот
90
+ `storageKind`, и заменяет его, если содержит. API не импортирует plugin packages
91
+ и не дает доступа к мутации storage runtime.
92
+
83
93
  ## Documentation
84
94
 
85
95
  - [Full documentation](https://alexandergureev.github.io/lite-fsm/)
@@ -6,5 +6,5 @@ export type FSMHydrationBoundaryProps<S extends MachineStore, P extends AnyEvent
6
6
  strategy?: HydrateStrategy;
7
7
  transitionAfterHydrate?: TransitionAfterHydrate<P>;
8
8
  }>;
9
- export declare const FSMHydrationBoundary: <S extends MachineStore, P extends AnyEvent = MachineEvents<S>>({ snapshot, strategy, transitionAfterHydrate, children, }: FSMHydrationBoundaryProps<S, P>) => import("react/jsx-runtime").JSX.Element;
9
+ export declare const FSMHydrationBoundary: <S extends MachineStore, P extends AnyEvent = MachineEvents<S>>({ snapshot, strategy, transitionAfterHydrate, children, }: FSMHydrationBoundaryProps<S, P>) => React.JSX.Element;
10
10
  export {};
@@ -6,5 +6,5 @@ export type FSMHydrationBoundaryProps<S extends MachineStore, P extends AnyEvent
6
6
  strategy?: HydrateStrategy;
7
7
  transitionAfterHydrate?: TransitionAfterHydrate<P>;
8
8
  }>;
9
- export declare const FSMHydrationBoundary: <S extends MachineStore, P extends AnyEvent = MachineEvents<S>>({ snapshot, strategy, transitionAfterHydrate, children, }: FSMHydrationBoundaryProps<S, P>) => import("react/jsx-runtime").JSX.Element;
9
+ export declare const FSMHydrationBoundary: <S extends MachineStore, P extends AnyEvent = MachineEvents<S>>({ snapshot, strategy, transitionAfterHydrate, children, }: FSMHydrationBoundaryProps<S, P>) => React.JSX.Element;
10
10
  export {};
@@ -7,4 +7,4 @@ export type FSMContextProviderProps<S extends MachineStore, P extends AnyEvent =
7
7
  getServerSnapshot?: () => MachinesState<S>;
8
8
  persist?: readonly FSMPersistLifecycle[];
9
9
  }>;
10
- export declare const FSMContextProvider: <S extends MachineStore, P extends AnyEvent = AnyEvent>({ children, getServerSnapshot, machineManager, persist, }: FSMContextProviderProps<S, P>) => import("react/jsx-runtime").JSX.Element;
10
+ export declare const FSMContextProvider: <S extends MachineStore, P extends AnyEvent = AnyEvent>({ children, getServerSnapshot, machineManager, persist, }: FSMContextProviderProps<S, P>) => React.JSX.Element;
@@ -7,4 +7,4 @@ export type FSMContextProviderProps<S extends MachineStore, P extends AnyEvent =
7
7
  getServerSnapshot?: () => MachinesState<S>;
8
8
  persist?: readonly FSMPersistLifecycle[];
9
9
  }>;
10
- export declare const FSMContextProvider: <S extends MachineStore, P extends AnyEvent = AnyEvent>({ children, getServerSnapshot, machineManager, persist, }: FSMContextProviderProps<S, P>) => import("react/jsx-runtime").JSX.Element;
10
+ export declare const FSMContextProvider: <S extends MachineStore, P extends AnyEvent = AnyEvent>({ children, getServerSnapshot, machineManager, persist, }: FSMContextProviderProps<S, P>) => React.JSX.Element;
@@ -2,12 +2,29 @@ import React from "react";
2
2
  import type { MachinesState, MachineStore } from "@lite-fsm/core";
3
3
  export type HydrationOverlay<S extends MachineStore> = {
4
4
  getState: () => MachinesState<S>;
5
+ getStoragePreview: (storageKind: string) => StorageHydrationPreviewSlot;
6
+ };
7
+ type StorageHydrationPreviewSlot = {
8
+ readonly hasPreview: boolean;
9
+ readonly preview: unknown | undefined;
10
+ };
11
+ export type FSMStorageHydrationPreview = {
12
+ readonly hasPreview: boolean;
13
+ readonly preview: unknown | undefined;
14
+ readonly hasServerPreview: boolean;
15
+ readonly serverPreview: unknown | undefined;
5
16
  };
6
17
  type ErasedHydrationOverlay = {
7
18
  getState: () => unknown;
19
+ getStoragePreview: (storageKind: string) => StorageHydrationPreviewSlot;
8
20
  };
21
+ export declare const NO_STORAGE_HYDRATION_PREVIEW: StorageHydrationPreviewSlot;
9
22
  export declare const FSMHydrationOverlayProvider: React.Provider<ErasedHydrationOverlay | null>;
10
23
  export declare const useHydrationOverlay: <S extends MachineStore>() => HydrationOverlay<S> | null;
11
24
  export declare const FSMServerSnapshotProvider: React.Provider<ErasedHydrationOverlay | null>;
12
25
  export declare const useServerSnapshot: <S extends MachineStore>() => HydrationOverlay<S> | null;
26
+ export declare const readSnapshotStoragePreview: (snapshot: {
27
+ readonly storage?: Readonly<Record<string, unknown>>;
28
+ }, parent: ((storageKind: string) => StorageHydrationPreviewSlot) | undefined, storageKind: string) => StorageHydrationPreviewSlot;
29
+ export declare function useStorageHydrationPreview(storageKind: string): FSMStorageHydrationPreview;
13
30
  export {};
@@ -2,12 +2,29 @@ import React from "react";
2
2
  import type { MachinesState, MachineStore } from "@lite-fsm/core";
3
3
  export type HydrationOverlay<S extends MachineStore> = {
4
4
  getState: () => MachinesState<S>;
5
+ getStoragePreview: (storageKind: string) => StorageHydrationPreviewSlot;
6
+ };
7
+ type StorageHydrationPreviewSlot = {
8
+ readonly hasPreview: boolean;
9
+ readonly preview: unknown | undefined;
10
+ };
11
+ export type FSMStorageHydrationPreview = {
12
+ readonly hasPreview: boolean;
13
+ readonly preview: unknown | undefined;
14
+ readonly hasServerPreview: boolean;
15
+ readonly serverPreview: unknown | undefined;
5
16
  };
6
17
  type ErasedHydrationOverlay = {
7
18
  getState: () => unknown;
19
+ getStoragePreview: (storageKind: string) => StorageHydrationPreviewSlot;
8
20
  };
21
+ export declare const NO_STORAGE_HYDRATION_PREVIEW: StorageHydrationPreviewSlot;
9
22
  export declare const FSMHydrationOverlayProvider: React.Provider<ErasedHydrationOverlay | null>;
10
23
  export declare const useHydrationOverlay: <S extends MachineStore>() => HydrationOverlay<S> | null;
11
24
  export declare const FSMServerSnapshotProvider: React.Provider<ErasedHydrationOverlay | null>;
12
25
  export declare const useServerSnapshot: <S extends MachineStore>() => HydrationOverlay<S> | null;
26
+ export declare const readSnapshotStoragePreview: (snapshot: {
27
+ readonly storage?: Readonly<Record<string, unknown>>;
28
+ }, parent: ((storageKind: string) => StorageHydrationPreviewSlot) | undefined, storageKind: string) => StorageHydrationPreviewSlot;
29
+ export declare function useStorageHydrationPreview(storageKind: string): FSMStorageHydrationPreview;
13
30
  export {};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";"use client";var me=Object.create;var P=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,xe=Object.prototype.hasOwnProperty;var Pe=(e,r)=>{for(var t in r)P(e,t,{get:r[t],enumerable:!0})},k=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of fe(r))!xe.call(e,n)&&n!==t&&P(e,n,{get:()=>r[n],enumerable:!(o=Me(r,n))||o.enumerable});return e};var c=(e,r,t)=>(t=e!=null?me(he(e)):{},k(r||!e||!e.__esModule?P(t,"default",{value:e,enumerable:!0}):t,e)),ve=e=>k(P({},"__esModule",{value:!0}),e);var Ae={};Pe(Ae,{FSMContext:()=>u,FSMContextProvider:()=>Z,FSMHydrationBoundary:()=>j,defineMachine:()=>ae,useHydrateSnapshot:()=>ee,useManager:()=>i,useSelector:()=>re,useTransition:()=>ne});module.exports=ve(Ae);var V=c(require("react"),1),B="Hooks from @lite-fsm/react must be used within FSMContextProvider.",u=V.default.createContext(null);var S=c(require("react"),1);var f=c(require("react"),1),U=f.default.createContext(null),q=U.Provider,v=()=>f.default.useContext(U),N=f.default.createContext(null),g=N.Provider,E=()=>f.default.useContext(N);var W=c(require("react"),1);var i=()=>{let e=W.default.useContext(u);if(!e)throw new Error(B);return e};var O=c(require("react"),1),F=typeof window>"u"?O.default.useEffect:O.default.useLayoutEffect;var b=require("react/jsx-runtime"),Y=(e,r,t,o)=>o!==null&&e!==null&&e.snapshot===r&&e.strategy===t&&e.actions===o,j=({snapshot:e,strategy:r,transitionAfterHydrate:t,children:o})=>{let n=i(),a=v(),d=E(),s=r??"merge",p=S.default.useRef(null),[x,ie]=S.default.useState(null),L=S.default.useRef(null),[Se,ce]=S.default.useState(null),l=S.default.useMemo(()=>{if(!t)return null;let m=Array.isArray(t)?t:[t];return m.length>0?m:null},[t]),y=a?.getState()??n.getState(),H=S.default.useMemo(()=>n.getHydratedState(e,{baseState:y,strategy:s}),[y,s,n,e]),ye=Y(Se,e,s,l),le=x!==null&&x.committedState===y&&x.snapshot===e&&x.strategy===s,A=H!==y&&!ye&&!le,w=d?.getState()??y,D=S.default.useMemo(()=>n.getHydratedState(e,{baseState:w,strategy:s}),[s,n,w,e]);F(()=>{let m=Y(L.current,e,s,l),I=l!==null&&!m,_=A&&!m;if(!_&&!I)return;let T=p.current;if(_&&!(T?.baseState===y&&T.snapshot===e&&T.strategy===s)){n.hydrate(e,{strategy:s});let M={baseState:y,committedState:n.getState(),snapshot:e,strategy:s};p.current=M,ie(M)}if(I&&l!==null){for(let de of l)n.transition(de);let M={snapshot:e,strategy:s,actions:l};L.current=M,ce(M)}},[y,A,s,n,e,l]);let pe=S.default.useMemo(()=>({getState:()=>H}),[H]),ue=S.default.useMemo(()=>({getState:()=>D}),[D]);return(0,b.jsx)(g,{value:ue,children:A?(0,b.jsx)(q,{value:pe,children:o}):o})};var h=c(require("react"),1);var X=c(require("react"),1),z=globalThis,K=Symbol.for("@lite-fsm/react.persistStatusesContext"),C=[],ge=[],G=z[K]??(z[K]=X.default.createContext(null)),Ee=e=>{let r=e;return e!==null&&typeof e=="object"&&typeof r.getStatus=="function"&&typeof r.subscribeStatus=="function"},J=(e,r)=>{if(e.length!==r.length)return!1;for(let t=0;t<e.length;t+=1)if(e[t]!==r[t])return!1;return!0},Q=e=>e===void 0||e.length===0?ge:e.map(r=>Ee(r)?r:null);var R=require("react/jsx-runtime"),Fe=e=>e===void 0||e.length===0?C:e,Ce=e=>{let[r,t]=h.default.useState(C),o=Fe(e);return J(r,o)||t(o.length===0?C:[...o]),r},Z=({children:e,getServerSnapshot:r,machineManager:t,persist:o})=>{let n=h.default.useMemo(()=>{if(r)return{getState:r};let s=t.getState();return{getState:()=>s}},[r,t]),a=Ce(o),d=h.default.useMemo(()=>Q(a),[a]);return h.default.useEffect(()=>{if(a.length===0)return;let s=a.map(p=>p.start());return()=>{for(let p of s)p()}},[a]),(0,R.jsx)(u.Provider,{value:t,children:(0,R.jsx)(G.Provider,{value:d,children:(0,R.jsx)(g,{value:n,children:e})})})};var $=require("react");var ee=(e,r)=>{let t=i(),o=r?.strategy??"merge",n=(0,$.useRef)(null);F(()=>{n.current?.snapshot===e&&n.current.strategy===o||(t.hydrate(e,{strategy:o}),n.current={snapshot:e,strategy:o})},[t,e,o])};var te=c(require("use-sync-external-store/shim/with-selector"),1);var{useSyncExternalStoreWithSelector:Re}=te.default;function re(e,r){let t=i(),o=v(),n=E(),a=o?.getState??t.getState,d=n?.getState??a;return Re(t.onTransition,a,d,e,r)}var ne=()=>i().transition;var oe=c(require("use-sync-external-store/shim/with-selector"),1),se=require("@lite-fsm/core"),{useSyncExternalStoreWithSelector:He}=oe.default,ae=(e={})=>({create:r=>{let t=(0,se.defineMachine)(e).create(r),o=(n,a)=>He(t.onTransition,t.getState,t.getState,n,a);return Object.assign(o,t),o}});0&&(module.exports={FSMContext,FSMContextProvider,FSMHydrationBoundary,defineMachine,useHydrateSnapshot,useManager,useSelector,useTransition});
1
+ "use strict";"use client";var ge=Object.create;var h=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var xe=Object.getOwnPropertyNames;var Ee=Object.getPrototypeOf,we=Object.prototype.hasOwnProperty;var Fe=(e,r)=>{for(var t in r)h(e,t,{get:r[t],enumerable:!0})},q=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of xe(r))!we.call(e,n)&&n!==t&&h(e,n,{get:()=>r[n],enumerable:!(o=he(r,n))||o.enumerable});return e};var y=(e,r,t)=>(t=e!=null?ge(Ee(e)):{},q(r||!e||!e.__esModule?h(t,"default",{value:e,enumerable:!0}):t,e)),Re=e=>q(h({},"__esModule",{value:!0}),e);var _e={};Fe(_e,{FSMContext:()=>f,FSMContextProvider:()=>ne,FSMHydrationBoundary:()=>Q,defineMachine:()=>de,useHydrateSnapshot:()=>se,useManager:()=>S,useSelector:()=>Se,useStorageHydrationPreview:()=>X,useTransition:()=>ce});module.exports=Re(_e);var j=y(require("react"),1),G="Hooks from @lite-fsm/react must be used within FSMContextProvider.",f=j.default.createContext(null);var c=y(require("react"),1);var M=y(require("react"),1),m=Object.freeze({hasPreview:!1,preview:void 0}),b=M.default.createContext(null),z=b.Provider,x=()=>M.default.useContext(b),_=M.default.createContext(null),E=_.Provider,w=()=>M.default.useContext(_),I=(e,r,t)=>{let o=e.storage;return o&&Object.prototype.hasOwnProperty.call(o,t)?{hasPreview:!0,preview:o[t]}:r?r(t):m};function X(e){let r=M.default.useContext(b),t=M.default.useContext(_),o=r?.getStoragePreview(e)??m,n=t?.getStoragePreview(e)??m;return{hasPreview:o.hasPreview,preview:o.preview,hasServerPreview:n.hasPreview,serverPreview:n.preview}}var J=y(require("react"),1);var S=()=>{let e=J.default.useContext(f);if(!e)throw new Error(G);return e};var D=y(require("react"),1),F=typeof window>"u"?D.default.useEffect:D.default.useLayoutEffect;var L=require("react/jsx-runtime"),K=(e,r,t,o)=>o!==null&&e!==null&&e.snapshot===r&&e.strategy===t&&e.actions===o,Q=({snapshot:e,strategy:r,transitionAfterHydrate:t,children:o})=>{let n=S(),s=x(),u=w(),a=r??"merge",l=c.default.useRef(null),[g,ue]=c.default.useState(null),k=c.default.useRef(null),[pe,Me]=c.default.useState(null),p=c.default.useMemo(()=>{if(!t)return null;let i=Array.isArray(t)?t:[t];return i.length>0?i:null},[t]),d=s?.getState()??n.getState(),H=c.default.useMemo(()=>n.getHydratedState(e,{baseState:d,strategy:a}),[d,a,n,e]),V=K(pe,e,a,p),N=g!==null&&g.committedState===d&&g.snapshot===e&&g.strategy===a,A=H!==d&&!V&&!N,B=u?.getState()??d,W=c.default.useMemo(()=>n.getHydratedState(e,{baseState:B,strategy:a}),[a,n,B,e]),me=e.storage!==void 0&&Object.keys(e.storage).length>0,T=!V&&!N&&me;F(()=>{let i=K(k.current,e,a,p),Y=p!==null&&!i,U=A&&!i;if(!U&&!Y)return;let O=l.current;if(U&&!(O?.baseState===d&&O.snapshot===e&&O.strategy===a)){n.hydrate(e,{strategy:a});let v={baseState:d,committedState:n.getState(),snapshot:e,strategy:a};l.current=v,ue(v)}if(Y&&p!==null){for(let Pe of p)n.transition(Pe);let v={snapshot:e,strategy:a,actions:p};k.current=v,Me(v)}},[d,A,a,n,e,p]);let fe=c.default.useMemo(()=>({getState:()=>H,getStoragePreview:i=>T?I(e,s?.getStoragePreview,i):s?.getStoragePreview(i)??m}),[T,s,H,e]),ve=c.default.useMemo(()=>({getState:()=>W,getStoragePreview:i=>I(e,u?.getStoragePreview,i)}),[u,W,e]);return(0,L.jsx)(E,{value:ve,children:A||T?(0,L.jsx)(z,{value:fe,children:o}):o})};var P=y(require("react"),1);var ee=y(require("react"),1),Z=globalThis,$=Symbol.for("@lite-fsm/react.persistStatusesContext"),R=[],Ce=[],te=Z[$]??(Z[$]=ee.default.createContext(null)),He=e=>{let r=e;return e!==null&&typeof e=="object"&&typeof r.getStatus=="function"&&typeof r.subscribeStatus=="function"},re=(e,r)=>{if(e.length!==r.length)return!1;for(let t=0;t<e.length;t+=1)if(e[t]!==r[t])return!1;return!0},oe=e=>e===void 0||e.length===0?Ce:e.map(r=>He(r)?r:null);var C=require("react/jsx-runtime"),Ae=e=>e===void 0||e.length===0?R:e,Te=e=>{let[r,t]=P.default.useState(R),o=Ae(e);return re(r,o)||t(o.length===0?R:[...o]),r},ne=({children:e,getServerSnapshot:r,machineManager:t,persist:o})=>{let n=P.default.useMemo(()=>{let a=()=>m;if(r)return{getState:r,getStoragePreview:a};let l=t.getState();return{getState:()=>l,getStoragePreview:a}},[r,t]),s=Te(o),u=P.default.useMemo(()=>oe(s),[s]);return P.default.useEffect(()=>{if(s.length===0)return;let a=s.map(l=>l.start());return()=>{for(let l of a)l()}},[s]),(0,C.jsx)(f.Provider,{value:t,children:(0,C.jsx)(te.Provider,{value:u,children:(0,C.jsx)(E,{value:n,children:e})})})};var ae=require("react");var se=(e,r)=>{let t=S(),o=r?.strategy??"merge",n=(0,ae.useRef)(null);F(()=>{n.current?.snapshot===e&&n.current.strategy===o||(t.hydrate(e,{strategy:o}),n.current={snapshot:e,strategy:o})},[t,e,o])};var ie=y(require("use-sync-external-store/shim/with-selector"),1);var{useSyncExternalStoreWithSelector:Oe}=ie.default;function Se(e,r){let t=S(),o=x(),n=w(),s=o?.getState??t.getState,u=n?.getState??s;return Oe(t.onTransition,s,u,e,r)}var ce=()=>S().transition;var ye=y(require("use-sync-external-store/shim/with-selector"),1),le=require("@lite-fsm/core"),{useSyncExternalStoreWithSelector:be}=ye.default,de=(e={})=>({create:r=>{let t=(0,le.defineMachine)(e).create(r),o=(n,s)=>be(t.onTransition,t.getState,t.getState,n,s);return Object.assign(o,t),o}});0&&(module.exports={FSMContext,FSMContextProvider,FSMHydrationBoundary,defineMachine,useHydrateSnapshot,useManager,useSelector,useStorageHydrationPreview,useTransition});
package/dist/index.d.cts CHANGED
@@ -4,9 +4,11 @@ export type { FSMHydrationBoundaryProps } from "./FSMHydrationBoundary";
4
4
  export { FSMHydrationBoundary } from "./FSMHydrationBoundary";
5
5
  export type { FSMContextProviderProps, FSMPersistLifecycle } from "./FSMProvider";
6
6
  export { FSMContextProvider } from "./FSMProvider";
7
+ export type { FSMStorageHydrationPreview } from "./hydrationOverlay";
7
8
  export type { TypedUseMachineHook, TypedUseManagerHook, TypedUseSelectorHook, TypedUseTransitionHook } from "./types";
8
9
  export { useHydrateSnapshot } from "./useHydrateSnapshot";
9
10
  export { useManager } from "./useManager";
10
11
  export { useSelector } from "./useSelector";
12
+ export { useStorageHydrationPreview } from "./hydrationOverlay";
11
13
  export { useTransition } from "./useTransition";
12
14
  export { defineMachine } from "./defineMachine";
package/dist/index.d.ts CHANGED
@@ -4,9 +4,11 @@ export type { FSMHydrationBoundaryProps } from "./FSMHydrationBoundary";
4
4
  export { FSMHydrationBoundary } from "./FSMHydrationBoundary";
5
5
  export type { FSMContextProviderProps, FSMPersistLifecycle } from "./FSMProvider";
6
6
  export { FSMContextProvider } from "./FSMProvider";
7
+ export type { FSMStorageHydrationPreview } from "./hydrationOverlay";
7
8
  export type { TypedUseMachineHook, TypedUseManagerHook, TypedUseSelectorHook, TypedUseTransitionHook } from "./types";
8
9
  export { useHydrateSnapshot } from "./useHydrateSnapshot";
9
10
  export { useManager } from "./useManager";
10
11
  export { useSelector } from "./useSelector";
12
+ export { useStorageHydrationPreview } from "./hydrationOverlay";
11
13
  export { useTransition } from "./useTransition";
12
14
  export { defineMachine } from "./defineMachine";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use client";import $ from"react";var w="Hooks from @lite-fsm/react must be used within FSMContextProvider.",m=$.createContext(null);import S from"react";import f from"react";var D=f.createContext(null),I=D.Provider,h=()=>f.useContext(D),_=f.createContext(null),x=_.Provider,P=()=>f.useContext(_);import ee from"react";var i=()=>{let e=ee.useContext(m);if(!e)throw new Error(w);return e};import k from"react";var v=typeof window>"u"?k.useEffect:k.useLayoutEffect;import{jsx as B}from"react/jsx-runtime";var V=(e,r,t,n)=>n!==null&&e!==null&&e.snapshot===r&&e.strategy===t&&e.actions===n,te=({snapshot:e,strategy:r,transitionAfterHydrate:t,children:n})=>{let o=i(),a=h(),p=P(),s=r??"merge",l=S.useRef(null),[M,j]=S.useState(null),A=S.useRef(null),[z,K]=S.useState(null),y=S.useMemo(()=>{if(!t)return null;let u=Array.isArray(t)?t:[t];return u.length>0?u:null},[t]),c=a?.getState()??o.getState(),F=S.useMemo(()=>o.getHydratedState(e,{baseState:c,strategy:s}),[c,s,o,e]),X=V(z,e,s,y),G=M!==null&&M.committedState===c&&M.snapshot===e&&M.strategy===s,C=F!==c&&!X&&!G,T=p?.getState()??c,O=S.useMemo(()=>o.getHydratedState(e,{baseState:T,strategy:s}),[s,o,T,e]);v(()=>{let u=V(A.current,e,s,y),b=y!==null&&!u,L=C&&!u;if(!L&&!b)return;let R=l.current;if(L&&!(R?.baseState===c&&R.snapshot===e&&R.strategy===s)){o.hydrate(e,{strategy:s});let d={baseState:c,committedState:o.getState(),snapshot:e,strategy:s};l.current=d,j(d)}if(b&&y!==null){for(let Z of y)o.transition(Z);let d={snapshot:e,strategy:s,actions:y};A.current=d,K(d)}},[c,C,s,o,e,y]);let J=S.useMemo(()=>({getState:()=>F}),[F]),Q=S.useMemo(()=>({getState:()=>O}),[O]);return B(x,{value:Q,children:C?B(I,{value:J,children:n}):n})};import E from"react";import re from"react";var U=globalThis,q=Symbol.for("@lite-fsm/react.persistStatusesContext"),g=[],ne=[],N=U[q]??(U[q]=re.createContext(null)),oe=e=>{let r=e;return e!==null&&typeof e=="object"&&typeof r.getStatus=="function"&&typeof r.subscribeStatus=="function"},W=(e,r)=>{if(e.length!==r.length)return!1;for(let t=0;t<e.length;t+=1)if(e[t]!==r[t])return!1;return!0},Y=e=>e===void 0||e.length===0?ne:e.map(r=>oe(r)?r:null);import{jsx as H}from"react/jsx-runtime";var se=e=>e===void 0||e.length===0?g:e,ae=e=>{let[r,t]=E.useState(g),n=se(e);return W(r,n)||t(n.length===0?g:[...n]),r},ie=({children:e,getServerSnapshot:r,machineManager:t,persist:n})=>{let o=E.useMemo(()=>{if(r)return{getState:r};let s=t.getState();return{getState:()=>s}},[r,t]),a=ae(n),p=E.useMemo(()=>Y(a),[a]);return E.useEffect(()=>{if(a.length===0)return;let s=a.map(l=>l.start());return()=>{for(let l of s)l()}},[a]),H(m.Provider,{value:t,children:H(N.Provider,{value:p,children:H(x,{value:o,children:e})})})};import{useRef as Se}from"react";var ce=(e,r)=>{let t=i(),n=r?.strategy??"merge",o=Se(null);v(()=>{o.current?.snapshot===e&&o.current.strategy===n||(t.hydrate(e,{strategy:n}),o.current={snapshot:e,strategy:n})},[t,e,n])};import ye from"use-sync-external-store/shim/with-selector";var{useSyncExternalStoreWithSelector:le}=ye;function pe(e,r){let t=i(),n=h(),o=P(),a=n?.getState??t.getState,p=o?.getState??a;return le(t.onTransition,a,p,e,r)}var ue=()=>i().transition;import de from"use-sync-external-store/shim/with-selector";import{defineMachine as me}from"@lite-fsm/core";var{useSyncExternalStoreWithSelector:Me}=de,fe=(e={})=>({create:r=>{let t=me(e).create(r),n=(o,a)=>Me(t.onTransition,t.getState,t.getState,o,a);return Object.assign(n,t),n}});export{m as FSMContext,ie as FSMContextProvider,te as FSMHydrationBoundary,fe as defineMachine,ce as useHydrateSnapshot,i as useManager,pe as useSelector,ue as useTransition};
1
+ "use client";import oe from"react";var B="Hooks from @lite-fsm/react must be used within FSMContextProvider.",f=oe.createContext(null);import c from"react";import M from"react";var p=Object.freeze({hasPreview:!1,preview:void 0}),A=M.createContext(null),W=A.Provider,P=()=>M.useContext(A),T=M.createContext(null),g=T.Provider,h=()=>M.useContext(T),O=(e,r,t)=>{let o=e.storage;return o&&Object.prototype.hasOwnProperty.call(o,t)?{hasPreview:!0,preview:o[t]}:r?r(t):p};function ne(e){let r=M.useContext(A),t=M.useContext(T),o=r?.getStoragePreview(e)??p,n=t?.getStoragePreview(e)??p;return{hasPreview:o.hasPreview,preview:o.preview,hasServerPreview:n.hasPreview,serverPreview:n.preview}}import ae from"react";var S=()=>{let e=ae.useContext(f);if(!e)throw new Error(B);return e};import Y from"react";var x=typeof window>"u"?Y.useEffect:Y.useLayoutEffect;import{jsx as q}from"react/jsx-runtime";var U=(e,r,t,o)=>o!==null&&e!==null&&e.snapshot===r&&e.strategy===t&&e.actions===o,se=({snapshot:e,strategy:r,transitionAfterHydrate:t,children:o})=>{let n=S(),s=P(),d=h(),a=r??"merge",y=c.useRef(null),[v,K]=c.useState(null),_=c.useRef(null),[Q,Z]=c.useState(null),u=c.useMemo(()=>{if(!t)return null;let i=Array.isArray(t)?t:[t];return i.length>0?i:null},[t]),l=s?.getState()??n.getState(),F=c.useMemo(()=>n.getHydratedState(e,{baseState:l,strategy:a}),[l,a,n,e]),I=U(Q,e,a,u),D=v!==null&&v.committedState===l&&v.snapshot===e&&v.strategy===a,R=F!==l&&!I&&!D,L=d?.getState()??l,k=c.useMemo(()=>n.getHydratedState(e,{baseState:L,strategy:a}),[a,n,L,e]),$=e.storage!==void 0&&Object.keys(e.storage).length>0,C=!I&&!D&&$;x(()=>{let i=U(_.current,e,a,u),V=u!==null&&!i,N=R&&!i;if(!N&&!V)return;let H=y.current;if(N&&!(H?.baseState===l&&H.snapshot===e&&H.strategy===a)){n.hydrate(e,{strategy:a});let m={baseState:l,committedState:n.getState(),snapshot:e,strategy:a};y.current=m,K(m)}if(V&&u!==null){for(let re of u)n.transition(re);let m={snapshot:e,strategy:a,actions:u};_.current=m,Z(m)}},[l,R,a,n,e,u]);let ee=c.useMemo(()=>({getState:()=>F,getStoragePreview:i=>C?O(e,s?.getStoragePreview,i):s?.getStoragePreview(i)??p}),[C,s,F,e]),te=c.useMemo(()=>({getState:()=>k,getStoragePreview:i=>O(e,d?.getStoragePreview,i)}),[d,k,e]);return q(g,{value:te,children:R||C?q(W,{value:ee,children:o}):o})};import w from"react";import ie from"react";var j=globalThis,G=Symbol.for("@lite-fsm/react.persistStatusesContext"),E=[],Se=[],z=j[G]??(j[G]=ie.createContext(null)),ce=e=>{let r=e;return e!==null&&typeof e=="object"&&typeof r.getStatus=="function"&&typeof r.subscribeStatus=="function"},X=(e,r)=>{if(e.length!==r.length)return!1;for(let t=0;t<e.length;t+=1)if(e[t]!==r[t])return!1;return!0},J=e=>e===void 0||e.length===0?Se:e.map(r=>ce(r)?r:null);import{jsx as b}from"react/jsx-runtime";var ye=e=>e===void 0||e.length===0?E:e,le=e=>{let[r,t]=w.useState(E),o=ye(e);return X(r,o)||t(o.length===0?E:[...o]),r},de=({children:e,getServerSnapshot:r,machineManager:t,persist:o})=>{let n=w.useMemo(()=>{let a=()=>p;if(r)return{getState:r,getStoragePreview:a};let y=t.getState();return{getState:()=>y,getStoragePreview:a}},[r,t]),s=le(o),d=w.useMemo(()=>J(s),[s]);return w.useEffect(()=>{if(s.length===0)return;let a=s.map(y=>y.start());return()=>{for(let y of a)y()}},[s]),b(f.Provider,{value:t,children:b(z.Provider,{value:d,children:b(g,{value:n,children:e})})})};import{useRef as ue}from"react";var pe=(e,r)=>{let t=S(),o=r?.strategy??"merge",n=ue(null);x(()=>{n.current?.snapshot===e&&n.current.strategy===o||(t.hydrate(e,{strategy:o}),n.current={snapshot:e,strategy:o})},[t,e,o])};import Me from"use-sync-external-store/shim/with-selector";var{useSyncExternalStoreWithSelector:me}=Me;function fe(e,r){let t=S(),o=P(),n=h(),s=o?.getState??t.getState,d=n?.getState??s;return me(t.onTransition,s,d,e,r)}var ve=()=>S().transition;import Pe from"use-sync-external-store/shim/with-selector";import{defineMachine as ge}from"@lite-fsm/core";var{useSyncExternalStoreWithSelector:he}=Pe,xe=(e={})=>({create:r=>{let t=ge(e).create(r),o=(n,s)=>he(t.onTransition,t.getState,t.getState,n,s);return Object.assign(o,t),o}});export{f as FSMContext,de as FSMContextProvider,se as FSMHydrationBoundary,xe as defineMachine,pe as useHydrateSnapshot,S as useManager,fe as useSelector,ne as useStorageHydrationPreview,ve as useTransition};
@@ -1,2 +1,2 @@
1
1
  import type { AnyEvent } from "@lite-fsm/core";
2
- export declare const useTransition: <P extends AnyEvent = AnyEvent>() => (payload: import("@lite-fsm/core").ManagerAction<P>) => import("@lite-fsm/core").ManagerAction<P>;
2
+ export declare const useTransition: <P extends AnyEvent = AnyEvent>() => (payload: import("@lite-fsm/core").ManagerAction<P, import("@lite-fsm/core").FSMEventMeta>) => import("@lite-fsm/core").ManagerAction<P, import("@lite-fsm/core").FSMEventMeta>;
@@ -1,2 +1,2 @@
1
1
  import type { AnyEvent } from "@lite-fsm/core";
2
- export declare const useTransition: <P extends AnyEvent = AnyEvent>() => (payload: import("@lite-fsm/core").ManagerAction<P>) => import("@lite-fsm/core").ManagerAction<P>;
2
+ export declare const useTransition: <P extends AnyEvent = AnyEvent>() => (payload: import("@lite-fsm/core").ManagerAction<P, import("@lite-fsm/core").FSMEventMeta>) => import("@lite-fsm/core").ManagerAction<P, import("@lite-fsm/core").FSMEventMeta>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lite-fsm/react",
3
- "version": "2.0.5",
3
+ "version": "2.1.0-alpha.0",
4
4
  "type": "module",
5
5
  "description": "React bindings for lite-fsm",
6
6
  "license": "MIT",
@@ -56,7 +56,7 @@
56
56
  },
57
57
  "dependencies": {
58
58
  "use-sync-external-store": ">=1.2.0",
59
- "@lite-fsm/core": "2.0.5"
59
+ "@lite-fsm/core": "2.1.0-alpha.0"
60
60
  },
61
61
  "peerDependencies": {
62
62
  "react": ">=18.0.0"