chizu 0.2.52 → 0.2.53

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
@@ -248,14 +248,31 @@ actions.dispatch(Actions.Multicast.Update, 42, { scope: "TeamA" });
248
248
 
249
249
  Unlike broadcast which reaches all components, multicast is scoped to the named boundary – perfect for isolated widget groups, form sections, or distinct UI regions. See the [multicast recipe](./recipes/multicast-actions.md) for more details.
250
250
 
251
- To preserve a component's state across unmount/remount cycles, wrap the initial model with `Rehydrate`:
251
+ To preserve a component's state across unmount/remount cycles, define a store with `Id` and wrap the initial model with `Rehydrate`:
252
252
 
253
253
  ```ts
254
- import { useActions, Rehydrate } from "chizu";
254
+ import { useActions, Rehydrate, Id } from "chizu";
255
255
 
256
+ class Store {
257
+ static Counter = Id<Model, { UserId: number }>();
258
+ static Settings = Id<Model>();
259
+ }
260
+
261
+ // Channeled — independent snapshot per UserId
262
+ const actions = useActions<Model, typeof Actions>(
263
+ Rehydrate(model, Store.Counter({ UserId: props.userId })),
264
+ );
265
+
266
+ // Unchanneled — single shared snapshot
256
267
  const actions = useActions<Model, typeof Actions>(
257
- Rehydrate(model, { UserId: props.userId }),
268
+ Rehydrate(model, Store.Settings()),
258
269
  );
259
270
  ```
260
271
 
261
- When the component unmounts, its model is snapshotted into the rehydrator. On remount with the same channel key, the model is restored automatically. This is useful for tab switching, route changes, and conditionally rendered components. See the [rehydration recipe](./recipes/rehydration.md) for details.
272
+ When the component unmounts, its model is snapshotted into the rehydrator. On remount with the same channel key, the model is restored automatically. Use `context.actions.invalidate` to clear a specific snapshot so the next mount starts fresh:
273
+
274
+ ```ts
275
+ context.actions.invalidate(Store.Counter({ UserId: 5 }));
276
+ ```
277
+
278
+ This is useful for tab switching, route changes, and conditionally rendered components. See the [rehydration recipe](./recipes/rehydration.md) for details.
package/dist/chizu.js CHANGED
@@ -1,8 +1,8 @@
1
- import{G as e,A as t}from"@mobily/ts-belt";import*as n from"react";import{createContext as r,useContext as o}from"react";import{jsx as c}from"react/jsx-runtime";import{immerable as s,enablePatches as i,Immer as a}from"immer";class u{static Payload=/* @__PURE__ */Symbol("chizu.brand/Payload");static Broadcast=/* @__PURE__ */Symbol("chizu.brand/Broadcast");static Multicast=/* @__PURE__ */Symbol("chizu.brand/Multicast");static Action=/* @__PURE__ */Symbol("chizu.brand/Action");static Channel=/* @__PURE__ */Symbol("chizu.brand/Channel");static Node=/* @__PURE__ */Symbol("chizu.action.lifecycle/Node");static Rehydrate=/* @__PURE__ */Symbol("chizu.brand/Rehydrate")}class l{static Mount=/* @__PURE__ */Symbol("chizu.action.lifecycle/Mount");static Unmount=/* @__PURE__ */Symbol("chizu.action.lifecycle/Unmount");static Error=/* @__PURE__ */Symbol("chizu.action.lifecycle/Error");static Update=/* @__PURE__ */Symbol("chizu.action.lifecycle/Update");static Node=(()=>{const e=u.Node,t=function(t){return{[u.Action]:e,[u.Payload]:void 0,[u.Channel]:t,channel:t}};return Object.defineProperty(t,u.Action,{value:e,enumerable:!1}),Object.defineProperty(t,u.Payload,{value:void 0,enumerable:!1}),t})()}var f=/* @__PURE__ */(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(f||{}),d=/* @__PURE__ */(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(d||{}),p=/* @__PURE__ */(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Disallowed=2]="Disallowed",e[e.Errored=3]="Errored",e[e.Unmounted=4]="Unmounted",e))(p||{});class h extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}const m={actionPrefix:"chizu.action/",broadcastActionPrefix:"chizu.action/broadcast/",multicastActionPrefix:"chizu.action/multicast/",channelPrefix:"chizu.channel/",cachePrefix:"chizu.cache/"};function y(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(new h);const o=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(o),r(new h)},{once:!0})})}function b(e){return e?Boolean(e&&"symbol"!=typeof e):/* @__PURE__ */Symbol(`pk.${Date.now()}.${crypto.randomUUID()}`)}const v=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,config:m,pk:b,sleep:y,"ζ":y,"κ":b},Symbol.toStringTag,{value:"Module"})),g=e=>"symbol"==typeof e;function w(t){return e.isString(t)||g(t)?t:(e.isObject(t)||e.isFunction(t))&&u.Action in t?t[u.Action]:t}function S(t){if(e.isString(t))return t.startsWith(m.broadcastActionPrefix);if(g(t))return t.description?.startsWith(m.broadcastActionPrefix)??!1;if(e.isObject(t)||e.isFunction(t)){if(u.Broadcast in t&&t[u.Broadcast])return!0;if(u.Action in t){const e=t[u.Action];return e.description?.startsWith(m.broadcastActionPrefix)??!1}}return!1}function x(t){const n=w(t),r=e.isString(n)?n:n.description??"";return r.startsWith(m.actionPrefix)&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function P(t){return e.isObject(t)&&u.Channel in t&&"channel"in t}function E(t){if(e.isString(t))return t.startsWith(m.multicastActionPrefix);if(g(t))return t.description?.startsWith(m.multicastActionPrefix)??!1;if(e.isObject(t)||e.isFunction(t)){if(u.Multicast in t&&t[u.Multicast])return!0;if(u.Action in t){const e=t[u.Action];return e.description?.startsWith(m.multicastActionPrefix)??!1}}return!1}const M=(e,t=f.Unicast)=>{const n=t===f.Broadcast?/* @__PURE__ */Symbol(`${m.broadcastActionPrefix}${e}`):t===f.Multicast?/* @__PURE__ */Symbol(`${m.multicastActionPrefix}${e}`):/* @__PURE__ */Symbol(`${m.actionPrefix}${e}`),r=function(e){return{[u.Action]:n,[u.Payload]:void 0,[u.Channel]:e,channel:e}};return Object.defineProperty(r,u.Action,{value:n,enumerable:!1}),Object.defineProperty(r,u.Payload,{value:void 0,enumerable:!1}),t===f.Broadcast&&Object.defineProperty(r,u.Broadcast,{value:!0,enumerable:!1}),t===f.Multicast&&Object.defineProperty(r,u.Multicast,{value:!0,enumerable:!1}),r},A=n.createContext({data:/* @__PURE__ */new Map});function O(e){return e?[...Object.keys(e)].toSorted().map(t=>`${t}=${String(e[t])}`).join("&"):""}function j(e,t){return{[u.Rehydrate]:!0,model:e,channel:t}}function _(e){if(e instanceof Error){if("TimeoutError"===e.name)return p.Timedout;if("AbortError"===e.name)return p.Supplanted}return p.Errored}function k(e){return e instanceof Error?e:new Error(String(e))}const R=r(void 0);function C({handler:e,children:t}){/* @__PURE__ */
2
- return c(R.Provider,{value:e,children:t})}let N=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var U=/* @__PURE__ */(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(U||{}),z=/* @__PURE__ */(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(z||{}),L=/* @__PURE__ */(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(L||{});class T{[s]=!0;static keys=new Set(Object.values(L));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new T(this.value,this.operation);return n.property=e,n.process=t,n}}class B{static immer=(()=>{i();const e=new a;return e.setAutoFreeze(!1),e})();static tag="κ";static id=N}function $(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function F(t){if(e.isNullable(t)||H(t))return t;if(e.isArray(t))return t.map(e=>F(e));if(e.isObject(t)){const e=Object.entries(t).map(([e,t])=>[e,F(t)]);return{...Object.fromEntries(e),[B.tag]:t[B.tag]??B.id()}}return t}function W(e){if(Array.isArray(e))return e.filter(e=>B.tag in e).map(e=>e[B.tag]??"").join(",");const t=e[B.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function H(t){return e.isNullable(t)||e.isString(t)||e.isNumber(t)||e.isBoolean(t)||"symbol"==typeof t||"bigint"==typeof t}function D(t,n,r,o,c,s){return function i(a,u=n.path){if(a instanceof T){const n=$(r,u.join("."));if(Object.entries(a).filter(([e,t])=>!T.keys.has(e)&&t instanceof T).forEach(([e,t])=>i(t,u.concat(e))),H(a.value)){if(t===z.Hydrate)return a.value;const i=u.slice(0,-1),l=i.length>0?$(r,i.join(".")):r;return e.isNullable(l)||I(l,a,u.at(-1),o,c,s),n??a.value}if(t===z.Hydrate){const e=F(i(a.value,u));return I(e,a,null,o,c,s),e}const l=n??F(a.value);return I(l,a,null,o,c,s),e.isNullable(n)?l:(i(a.value,u),n)}if(e.isArray(a))return a.map((e,t)=>i(e,u.concat(t)));if(e.isObject(a)){const e=Object.entries(a).map(([e,t])=>[e,i(t,u.concat(e))]),n=Object.fromEntries(e);if(t===z.Hydrate){const e=F(n);return Object.entries(a).forEach(([t,n])=>{n instanceof T&&H(n.value)&&I(e,n,t,o,c,s)}),e}return n}return a}(n.value)}function I(e,t,n,r,o,c){const s=c(e),i=o.get(s)??[];o.set(s,[t.assign(n,r),...i])}class G{#e={};#t;#n=/* @__PURE__ */new Map;#r=/* @__PURE__ */new Set;#o=!1;constructor(e=W){this.#t=e}static pk(){return N()}static"κ"=G.pk;annotate(e,t){return new T(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(n,r,o,c,s){function i(c){const s=c.at(-1),i=$(n(),c),a=c.slice(0,-1),u=t.isNotEmpty(a)?$(n(),a):n();return[...e.isObject(i)||e.isArray(i)?r.get(o(i))?.filter(t=>e.isNullable(t.property))??[]:[],...e.isObject(u)?r.get(o(u))?.filter(e=>e.property===s)??[]:[]]}return function e(r){return new Proxy(()=>{},{get:(o,a)=>"pending"===a?()=>!t.isEmpty(i(r)):"remaining"===a?()=>t.length(i(r)):"box"===a?()=>({value:$(n(),r),inspect:e(r)}):"is"===a?e=>i(r).some(t=>0!==(t.operation&e)):"draft"===a?()=>t.head(i(r))?.value??$(n(),r):"settled"===a?()=>new Promise(e=>{if(t.isEmpty(i(r)))return e($(n(),r));const o=()=>{t.isEmpty(i(r))&&(s(o),e($(n(),r)))};c(o)}):e([...r,String(a)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#c(z.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#c(z.Produce,e)}#c(e,t){const n=/* @__PURE__ */Symbol("process"),[,r]=B.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>B.immer.applyPatches(t,[{...r,value:D(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=F(this.#e),this.#s(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#s()}#s(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const V=new G;function q(e,t){return V.annotate(e,t)}function J(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var K,Q={exports:{}};const X=/* @__PURE__ */J((K||(K=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function c(e,t,r,c,s){if("function"!=typeof r)throw new TypeError("The listener must be a function");var i=new o(r,c||e,s),a=n?n+t:t;return e._events[a]?e._events[a].fn?e._events[a]=[e._events[a],i]:e._events[a].push(i):(e._events[a]=i,e._eventsCount++),e}function s(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function i(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=/* @__PURE__ */Object.create(null),(new r).__proto__||(n=!1)),i.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},i.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,c=new Array(o);r<o;r++)c[r]=t[r].fn;return c},i.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},i.prototype.emit=function(e,t,r,o,c,s){var i=n?n+e:e;if(!this._events[i])return!1;var a,u,l=this._events[i],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,c),!0;case 6:return l.fn.call(l.context,t,r,o,c,s),!0}for(u=1,a=new Array(f-1);u<f;u++)a[u-1]=arguments[u];l.fn.apply(l.context,a)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!a)for(d=1,a=new Array(f-1);d<f;d++)a[d-1]=arguments[d];l[u].fn.apply(l[u].context,a)}}return!0},i.prototype.on=function(e,t,n){return c(this,e,t,n,!1)},i.prototype.once=function(e,t,n){return c(this,e,t,n,!0)},i.prototype.removeListener=function(e,t,r,o){var c=n?n+e:e;if(!this._events[c])return this;if(!t)return s(this,c),this;var i=this._events[c];if(i.fn)i.fn!==t||o&&!i.once||r&&i.context!==r||s(this,c);else{for(var a=0,u=[],l=i.length;a<l;a++)(i[a].fn!==t||o&&!i[a].once||r&&i[a].context!==r)&&u.push(i[a]);u.length?this._events[c]=1===u.length?u[0]:u:s(this,c)}return this},i.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&s(this,t):(this._events=new r,this._eventsCount=0),this},i.prototype.off=i.prototype.removeListener,i.prototype.addListener=i.prototype.on,i.prefixed=n,i.EventEmitter=i,e.exports=i}(Q)),Q.exports)),Y=n.createContext(new X);function Z(){return n.useContext(Y)}function ee({children:e}){const t=n.useMemo(()=>new X,[]);/* @__PURE__ */
3
- return c(Y.Provider,{value:t,children:e})}const te=n.createContext(/* @__PURE__ */new Map);function ne(){return n.useContext(te)}function re(){const[,e]=n.useReducer(e=>e+1,0);return e}function oe({action:t,renderer:r}){const o=Z(),c=ne(),s=re(),i=n.useMemo(()=>{const e=c.get(t);if(e)return e;const n={state:new G,listeners:/* @__PURE__ */new Set};return c.set(t,n),n},[t,c]);n.useLayoutEffect(()=>{function e(e){i.state.hydrate({value:e}),i.listeners.forEach(e=>e())}return i.listeners.add(s),o.on(t,e),()=>{i.listeners.delete(s),o.off(t,e)}},[t,o,i]);const a=i.state.model?.value;return e.isNullable(a)?null:r({value:a,inspect:i.state.inspect.value})}function ce({children:e}){const t=n.useMemo(()=>/* @__PURE__ */new Map,[]);/* @__PURE__ */
4
- return c(te.Provider,{value:t,children:e})}function se({children:e}){const t=n.useMemo(()=>({data:/* @__PURE__ */new Map}),[]);/* @__PURE__ */
5
- return c(A.Provider,{value:t,children:e})}const ie=n.createContext(/* @__PURE__ */new Set);function ae({children:e}){const t=n.useMemo(()=>/* @__PURE__ */new Set,[]);/* @__PURE__ */
6
- return c(ie.Provider,{value:t,children:e})}function ue({children:e}){/* @__PURE__ */
7
- return c(ee,{children:/* @__PURE__ */c(ce,{children:/* @__PURE__ */c(se,{children:/* @__PURE__ */c(ae,{children:e})})})})}const le=n.createContext(null);function fe(){return n.useContext(le)}function de(e,t){return e?.get(t)??null}function pe({action:t,scopeName:r,renderer:o}){const c=fe(),s=re(),i=n.useMemo(()=>de(c,r),[c,r]),a=n.useMemo(()=>i?function(e,t){const n=e.store.get(t);if(n)return n;const r={state:new G,listeners:/* @__PURE__ */new Set};return e.store.set(t,r),r}(i,t):null,[t,i]);if(n.useLayoutEffect(()=>{if(i&&a)return a.listeners.add(s),i.emitter.on(t,e),()=>{a.listeners.delete(s),i.emitter.off(t,e)};function e(e){a&&(a.state.hydrate({value:e}),a.listeners.forEach(e=>e()))}},[t,i,a,s]),!a)return null;const u=a.state.model?.value;return e.isNullable(u)?null:o({value:u,inspect:a.state.inspect.value})}function he({name:e,children:t}){const r=fe(),o=n.useMemo(()=>({name:e,emitter:new X,store:/* @__PURE__ */new Map,listeners:/* @__PURE__ */new Map}),[]),s=n.useMemo(()=>{const t=new Map(r??[]);return t.set(e,o),t},[r,e,o]);/* @__PURE__ */
8
- return c(le.Provider,{value:s,children:t})}function me(e){return(t,n)=>{t.actions.produce(t=>{t.model[e]=n})}}function ye(r,c=()=>({})){const s=Z(),i=fe(),a=o(R),f=n.useContext(ie),p=re(),h=n.useRef(!1),m=n.useRef(null),y=n.useRef(new G),{model:b,save:v}=function(e){const t=n.useContext(A),r=n.useRef(null);if(!r.current)if("object"==typeof(o=e)&&null!==o&&u.Rehydrate in o&&!0===o[u.Rehydrate]){const{channel:n,model:o}=e,c=function(e,t){const n=O(t);return e.data.get(n)||null}(t,n);r.current={model:c??o,save:e=>function(e,t,n){const r=O(t);e.data.set(r,n)}(t,n,e)}}else r.current={model:e,save:()=>{}};var o;return r.current}(r);h.current||(h.current=!0,m.current=y.current.hydrate(b));const[g,M]=n.useState(()=>y.current.model),j=function(e){const t=n.useRef(e);return n.useLayoutEffect(()=>{t.current=e},[e]),n.useMemo(()=>{return n=t,Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>n.current[t],enumerable:!0}),e),{});var n},[e])}(c()),C=n.useMemo(()=>new X,[]),N=n.useRef({handlers:/* @__PURE__ */new Map});N.current.handlers=/* @__PURE__ */new Map;const U=function(){const e=n.useRef(/* @__PURE__ */new Set),t=n.useRef(/* @__PURE__ */new Set);return n.useMemo(()=>({broadcast:e.current,multicast:t.current}),[])}(),z=n.useRef(d.Mounting),L=function(){const e=n.useRef({}),t=n.useRef(/* @__PURE__ */new Map),r=n.useRef(/* @__PURE__ */new Map);return n.useMemo(()=>({refs:e,pending:t,emitted:r}),[])}(),T=n.useRef(/* @__PURE__ */new Set),B=n.useRef(0),$=n.useCallback((e,t,n)=>{const r=new AbortController,o={controller:r,action:e,payload:t};return f.add(o),T.current.add(o),{model:g,get phase(){return z.current},task:o,data:j,tasks:f,nodes:L.refs.current,actions:{produce(e){if(r.signal.aborted)return;const t=y.current.produce(t=>e({model:t,inspect:y.current.inspect}));M(y.current.model),n.processes.add(t),m.current&&(n.processes.add(m.current),m.current=null)},dispatch(e,t,n){if(r.signal.aborted)return;const o=w(e),c=P(e)?e.channel:void 0;if(E(e)&&n?.scope){const e=de(i,n.scope);return void(e&&e.emitter.emit(o,t,c))}(S(e)?s:C).emit(o,t,c)},annotate:(e,t)=>y.current.annotate(e,t)}}},[g]);n.useLayoutEffect(()=>{function t(t,n,r){return async function(o,c){const s=r();if(e.isNotNullable(c)&&e.isNotNullable(s)&&!function(e,t){for(const n of Object.keys(e))if(t[n]!==e[n])return!1;return!0}(c,s))return;const i={processes:/* @__PURE__ */new Set},u=Promise.withResolvers(),d=$(t,o,i);try{await n(d,o)}catch(h){const e=N.current.handlers.has(l.Error),n={reason:_(h),error:k(h),action:x(t),handled:e,tasks:f};a?.(n),e&&C.emit(l.Error,n)}finally{for(const e of f)if(e===d.task){f.delete(e),T.current.delete(e);break}i.processes.forEach(e=>y.current.prune(e)),i.processes.size>0&&p(),u.resolve()}}}B.current++;const n=/* @__PURE__ */new Set;return N.current.handlers.forEach((e,r)=>{for(const{getChannel:o,handler:c}of e){const e=t(r,c,o);if(E(r)){if(i)for(const t of i.values()){const o=t.emitter;o.on(r,e),n.add(()=>o.off(r,e))}C.on(r,e),U.multicast.add(r),n.add(()=>C.off(r,e))}else S(r)?(s.on(r,e),C.on(r,e),U.broadcast.add(r),n.add(()=>{s.off(r,e),C.off(r,e)})):(C.on(r,e),n.add(()=>C.off(r,e)))}}),()=>{const e=++B.current,t=new Set(n);queueMicrotask(()=>{if(B.current===e){v(y.current.model);for(const e of T.current)e.controller.abort(),f.delete(e);T.current.clear(),z.current=d.Unmounting,C.emit(l.Unmount),z.current=d.Unmounted;for(const e of t)e()}else for(const e of t)e()})}},[C]),n.useLayoutEffect(()=>{for(const[e,t]of L.pending.current)L.emitted.current.get(e)!==t&&(L.emitted.current.set(e,t),C.emit(u.Node,t,{Name:e}));L.pending.current.clear()}),function({unicast:r,broadcastActions:o,phase:c,data:s}){const i=ne(),a=n.useRef(null);n.useLayoutEffect(()=>{c.current===d.Mounting&&(r.emit(l.Mount),o.forEach(t=>{const n=i.get(t),o=n?.state.model?.value;e.isNullable(o)||r.emit(t,o)}),c.current=d.Mounted)},[]),n.useLayoutEffect(()=>{if(e.isNotNullable(a.current)){const e=function(e,t){return Object.keys(t).reduce((n,r)=>e[r]!==t[r]?{...n,[r]:t[r]}:n,{})}(a.current,s);t.isNotEmpty(Object.keys(e))&&r.emit(l.Update,e)}a.current=s},[s,r])}({unicast:C,broadcastActions:U.broadcast,phase:z,data:c()});const F=n.useMemo(()=>[g,{dispatch(e,t,n){const r=w(e),o=P(e)?e.channel:void 0;if(E(e)&&n?.scope){const e=de(i,n.scope);return void(e&&e.emitter.emit(r,t,o))}(S(e)?s:C).emit(r,t,o)},consume:(e,t,r)=>E(e)&&r?.scope?n.createElement(pe,{action:w(e),scopeName:r.scope,renderer:t}):n.createElement(oe,{action:w(e),renderer:t}),get inspect(){return y.current.inspect},get nodes(){return L.refs.current},node(e,t){L.refs.current[e]=t,L.pending.current.set(e,t)}}],[g,C]);return F.useAction=(e,t)=>{!function(e,t,r){const o=n.useRef(r);n.useLayoutEffect(()=>{o.current=r});const c=n.useRef(t);n.useLayoutEffect(()=>{c.current=t});const s=n.useCallback(async(e,t)=>{const n=o.current;if("GeneratorFunction"===n.constructor.name||"AsyncGeneratorFunction"===n.constructor.name){const r=n(e,t);for await(const e of r);}else await n(e,t)},[]),i=n.useCallback(()=>P(c.current)?c.current.channel:void 0,[]),a=w(t),u=e.current.handlers.get(a)??/* @__PURE__ */new Set;0===u.size&&e.current.handlers.set(a,u),u.add({getChannel:i,handler:s})}(N,e,t)},F}export{M as Action,ue as Boundary,f as Distribution,C as Error,l as Lifecycle,U as Op,U as Operation,p as Reason,j as Rehydrate,he as Scope,G as State,me as With,q as annotate,ye as useActions,v as utils};
1
+ import{G as e,A as t}from"@mobily/ts-belt";import*as n from"react";import{createContext as r,useContext as o}from"react";import{jsx as c}from"react/jsx-runtime";import{immerable as i,enablePatches as s,Immer as a}from"immer";class u{static Payload=/* @__PURE__ */Symbol("chizu.brand/Payload");static Broadcast=/* @__PURE__ */Symbol("chizu.brand/Broadcast");static Multicast=/* @__PURE__ */Symbol("chizu.brand/Multicast");static Action=/* @__PURE__ */Symbol("chizu.brand/Action");static Channel=/* @__PURE__ */Symbol("chizu.brand/Channel");static Node=/* @__PURE__ */Symbol("chizu.action.lifecycle/Node");static Rehydrate=/* @__PURE__ */Symbol("chizu.brand/Rehydrate")}class l{static Mount=/* @__PURE__ */Symbol("chizu.action.lifecycle/Mount");static Unmount=/* @__PURE__ */Symbol("chizu.action.lifecycle/Unmount");static Error=/* @__PURE__ */Symbol("chizu.action.lifecycle/Error");static Update=/* @__PURE__ */Symbol("chizu.action.lifecycle/Update");static Node=(()=>{const e=u.Node,t=function(t){return{[u.Action]:e,[u.Payload]:void 0,[u.Channel]:t,channel:t}};return Object.defineProperty(t,u.Action,{value:e,enumerable:!1}),Object.defineProperty(t,u.Payload,{value:void 0,enumerable:!1}),t})()}var f=/* @__PURE__ */(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(f||{}),d=/* @__PURE__ */(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(d||{}),p=/* @__PURE__ */(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Disallowed=2]="Disallowed",e[e.Errored=3]="Errored",e[e.Unmounted=4]="Unmounted",e))(p||{});class h extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}const m={actionPrefix:"chizu.action/",broadcastActionPrefix:"chizu.action/broadcast/",multicastActionPrefix:"chizu.action/multicast/",channelPrefix:"chizu.channel/",cachePrefix:"chizu.cache/"};function y(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(new h);const o=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(o),r(new h)},{once:!0})})}function b(e){return e?Boolean(e&&"symbol"!=typeof e):/* @__PURE__ */Symbol(`pk.${Date.now()}.${crypto.randomUUID()}`)}const v=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,config:m,pk:b,sleep:y,"ζ":y,"κ":b},Symbol.toStringTag,{value:"Module"})),g=e=>"symbol"==typeof e;function w(t){return e.isString(t)||g(t)?t:(e.isObject(t)||e.isFunction(t))&&u.Action in t?t[u.Action]:t}function S(t){if(e.isString(t))return t.startsWith(m.broadcastActionPrefix);if(g(t))return t.description?.startsWith(m.broadcastActionPrefix)??!1;if(e.isObject(t)||e.isFunction(t)){if(u.Broadcast in t&&t[u.Broadcast])return!0;if(u.Action in t){const e=t[u.Action];return e.description?.startsWith(m.broadcastActionPrefix)??!1}}return!1}function x(t){const n=w(t),r=e.isString(n)?n:n.description??"";return r.startsWith(m.actionPrefix)&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function P(t){return e.isObject(t)&&u.Channel in t&&"channel"in t}function E(t){if(e.isString(t))return t.startsWith(m.multicastActionPrefix);if(g(t))return t.description?.startsWith(m.multicastActionPrefix)??!1;if(e.isObject(t)||e.isFunction(t)){if(u.Multicast in t&&t[u.Multicast])return!0;if(u.Action in t){const e=t[u.Action];return e.description?.startsWith(m.multicastActionPrefix)??!1}}return!1}const M=(e,t=f.Unicast)=>{const n=t===f.Broadcast?/* @__PURE__ */Symbol(`${m.broadcastActionPrefix}${e}`):t===f.Multicast?/* @__PURE__ */Symbol(`${m.multicastActionPrefix}${e}`):/* @__PURE__ */Symbol(`${m.actionPrefix}${e}`),r=function(e){return{[u.Action]:n,[u.Payload]:void 0,[u.Channel]:e,channel:e}};return Object.defineProperty(r,u.Action,{value:n,enumerable:!1}),Object.defineProperty(r,u.Payload,{value:void 0,enumerable:!1}),t===f.Broadcast&&Object.defineProperty(r,u.Broadcast,{value:!0,enumerable:!1}),t===f.Multicast&&Object.defineProperty(r,u.Multicast,{value:!0,enumerable:!1}),r},A=n.createContext({data:/* @__PURE__ */new Map});function O(e){return e?[...Object.keys(e)].toSorted().map(t=>`${t}=${String(e[t])}`).join("&"):""}function j(){const e=/* @__PURE__ */Symbol();return t=>t??{_:e}}function _(e,t){return{[u.Rehydrate]:!0,model:e,channel:t}}function k(e){if(e instanceof Error){if("TimeoutError"===e.name)return p.Timedout;if("AbortError"===e.name)return p.Supplanted}return p.Errored}function R(e){return e instanceof Error?e:new Error(String(e))}const C=r(void 0);function N({handler:e,children:t}){/* @__PURE__ */
2
+ return c(C.Provider,{value:e,children:t})}let U=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var z=/* @__PURE__ */(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(z||{}),L=/* @__PURE__ */(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(L||{}),T=/* @__PURE__ */(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(T||{});class B{[i]=!0;static keys=new Set(Object.values(T));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new B(this.value,this.operation);return n.property=e,n.process=t,n}}class ${static immer=(()=>{s();const e=new a;return e.setAutoFreeze(!1),e})();static tag="κ";static id=U}function F(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function W(t){if(e.isNullable(t)||D(t))return t;if(e.isArray(t))return t.map(e=>W(e));if(e.isObject(t)){const e=Object.entries(t).map(([e,t])=>[e,W(t)]);return{...Object.fromEntries(e),[$.tag]:t[$.tag]??$.id()}}return t}function H(e){if(Array.isArray(e))return e.filter(e=>$.tag in e).map(e=>e[$.tag]??"").join(",");const t=e[$.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function D(t){return e.isNullable(t)||e.isString(t)||e.isNumber(t)||e.isBoolean(t)||"symbol"==typeof t||"bigint"==typeof t}function I(t,n,r,o,c,i){return function s(a,u=n.path){if(a instanceof B){const n=F(r,u.join("."));if(Object.entries(a).filter(([e,t])=>!B.keys.has(e)&&t instanceof B).forEach(([e,t])=>s(t,u.concat(e))),D(a.value)){if(t===L.Hydrate)return a.value;const s=u.slice(0,-1),l=s.length>0?F(r,s.join(".")):r;return e.isNullable(l)||G(l,a,u.at(-1),o,c,i),n??a.value}if(t===L.Hydrate){const e=W(s(a.value,u));return G(e,a,null,o,c,i),e}const l=n??W(a.value);return G(l,a,null,o,c,i),e.isNullable(n)?l:(s(a.value,u),n)}if(e.isArray(a))return a.map((e,t)=>s(e,u.concat(t)));if(e.isObject(a)){const e=Object.entries(a).map(([e,t])=>[e,s(t,u.concat(e))]),n=Object.fromEntries(e);if(t===L.Hydrate){const e=W(n);return Object.entries(a).forEach(([t,n])=>{n instanceof B&&D(n.value)&&G(e,n,t,o,c,i)}),e}return n}return a}(n.value)}function G(e,t,n,r,o,c){const i=c(e),s=o.get(i)??[];o.set(i,[t.assign(n,r),...s])}class V{#e={};#t;#n=/* @__PURE__ */new Map;#r=/* @__PURE__ */new Set;#o=!1;constructor(e=H){this.#t=e}static pk(){return U()}static"κ"=V.pk;annotate(e,t){return new B(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(n,r,o,c,i){function s(c){const i=c.at(-1),s=F(n(),c),a=c.slice(0,-1),u=t.isNotEmpty(a)?F(n(),a):n();return[...e.isObject(s)||e.isArray(s)?r.get(o(s))?.filter(t=>e.isNullable(t.property))??[]:[],...e.isObject(u)?r.get(o(u))?.filter(e=>e.property===i)??[]:[]]}return function e(r){return new Proxy(()=>{},{get:(o,a)=>"pending"===a?()=>!t.isEmpty(s(r)):"remaining"===a?()=>t.length(s(r)):"box"===a?()=>({value:F(n(),r),inspect:e(r)}):"is"===a?e=>s(r).some(t=>0!==(t.operation&e)):"draft"===a?()=>t.head(s(r))?.value??F(n(),r):"settled"===a?()=>new Promise(e=>{if(t.isEmpty(s(r)))return e(F(n(),r));const o=()=>{t.isEmpty(s(r))&&(i(o),e(F(n(),r)))};c(o)}):e([...r,String(a)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#c(L.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#c(L.Produce,e)}#c(e,t){const n=/* @__PURE__ */Symbol("process"),[,r]=$.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>$.immer.applyPatches(t,[{...r,value:I(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=W(this.#e),this.#i(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#i()}#i(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const q=new V;function J(e,t){return q.annotate(e,t)}function K(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Q,X={exports:{}};const Y=/* @__PURE__ */K((Q||(Q=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function c(e,t,r,c,i){if("function"!=typeof r)throw new TypeError("The listener must be a function");var s=new o(r,c||e,i),a=n?n+t:t;return e._events[a]?e._events[a].fn?e._events[a]=[e._events[a],s]:e._events[a].push(s):(e._events[a]=s,e._eventsCount++),e}function i(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function s(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=/* @__PURE__ */Object.create(null),(new r).__proto__||(n=!1)),s.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},s.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,c=new Array(o);r<o;r++)c[r]=t[r].fn;return c},s.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},s.prototype.emit=function(e,t,r,o,c,i){var s=n?n+e:e;if(!this._events[s])return!1;var a,u,l=this._events[s],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,c),!0;case 6:return l.fn.call(l.context,t,r,o,c,i),!0}for(u=1,a=new Array(f-1);u<f;u++)a[u-1]=arguments[u];l.fn.apply(l.context,a)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!a)for(d=1,a=new Array(f-1);d<f;d++)a[d-1]=arguments[d];l[u].fn.apply(l[u].context,a)}}return!0},s.prototype.on=function(e,t,n){return c(this,e,t,n,!1)},s.prototype.once=function(e,t,n){return c(this,e,t,n,!0)},s.prototype.removeListener=function(e,t,r,o){var c=n?n+e:e;if(!this._events[c])return this;if(!t)return i(this,c),this;var s=this._events[c];if(s.fn)s.fn!==t||o&&!s.once||r&&s.context!==r||i(this,c);else{for(var a=0,u=[],l=s.length;a<l;a++)(s[a].fn!==t||o&&!s[a].once||r&&s[a].context!==r)&&u.push(s[a]);u.length?this._events[c]=1===u.length?u[0]:u:i(this,c)}return this},s.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&i(this,t):(this._events=new r,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prefixed=n,s.EventEmitter=s,e.exports=s}(X)),X.exports)),Z=n.createContext(new Y);function ee(){return n.useContext(Z)}function te({children:e}){const t=n.useMemo(()=>new Y,[]);/* @__PURE__ */
3
+ return c(Z.Provider,{value:t,children:e})}const ne=n.createContext(/* @__PURE__ */new Map);function re(){return n.useContext(ne)}function oe(){const[,e]=n.useReducer(e=>e+1,0);return e}function ce({action:t,renderer:r}){const o=ee(),c=re(),i=oe(),s=n.useMemo(()=>{const e=c.get(t);if(e)return e;const n={state:new V,listeners:/* @__PURE__ */new Set};return c.set(t,n),n},[t,c]);n.useLayoutEffect(()=>{function e(e){s.state.hydrate({value:e}),s.listeners.forEach(e=>e())}return s.listeners.add(i),o.on(t,e),()=>{s.listeners.delete(i),o.off(t,e)}},[t,o,s]);const a=s.state.model?.value;return e.isNullable(a)?null:r({value:a,inspect:s.state.inspect.value})}function ie({children:e}){const t=n.useMemo(()=>/* @__PURE__ */new Map,[]);/* @__PURE__ */
4
+ return c(ne.Provider,{value:t,children:e})}function se({children:e}){const t=n.useMemo(()=>({data:/* @__PURE__ */new Map}),[]);/* @__PURE__ */
5
+ return c(A.Provider,{value:t,children:e})}const ae=n.createContext(/* @__PURE__ */new Set);function ue({children:e}){const t=n.useMemo(()=>/* @__PURE__ */new Set,[]);/* @__PURE__ */
6
+ return c(ae.Provider,{value:t,children:e})}function le({children:e}){/* @__PURE__ */
7
+ return c(te,{children:/* @__PURE__ */c(ie,{children:/* @__PURE__ */c(se,{children:/* @__PURE__ */c(ue,{children:e})})})})}const fe=n.createContext(null);function de(){return n.useContext(fe)}function pe(e,t){return e?.get(t)??null}function he({action:t,scopeName:r,renderer:o}){const c=de(),i=oe(),s=n.useMemo(()=>pe(c,r),[c,r]),a=n.useMemo(()=>s?function(e,t){const n=e.store.get(t);if(n)return n;const r={state:new V,listeners:/* @__PURE__ */new Set};return e.store.set(t,r),r}(s,t):null,[t,s]);if(n.useLayoutEffect(()=>{if(s&&a)return a.listeners.add(i),s.emitter.on(t,e),()=>{a.listeners.delete(i),s.emitter.off(t,e)};function e(e){a&&(a.state.hydrate({value:e}),a.listeners.forEach(e=>e()))}},[t,s,a,i]),!a)return null;const u=a.state.model?.value;return e.isNullable(u)?null:o({value:u,inspect:a.state.inspect.value})}function me({name:e,children:t}){const r=de(),o=n.useMemo(()=>({name:e,emitter:new Y,store:/* @__PURE__ */new Map,listeners:/* @__PURE__ */new Map}),[]),i=n.useMemo(()=>{const t=new Map(r??[]);return t.set(e,o),t},[r,e,o]);/* @__PURE__ */
8
+ return c(fe.Provider,{value:i,children:t})}function ye(e){return(t,n)=>{t.actions.produce(t=>{t.model[e]=n})}}function be(r,c=()=>({})){const i=ee(),s=de(),a=o(C),f=n.useContext(ae),p=oe(),h=n.useRef(!1),m=n.useRef(null),y=n.useRef(new V),{model:b,save:v,invalidate:g}=function(e){const t=n.useContext(A),r=n.useRef(null);if(!r.current){const n=e=>{const n=O(e);t.data.delete(n)};if("object"==typeof(o=e)&&null!==o&&u.Rehydrate in o&&!0===o[u.Rehydrate]){const{channel:o,model:c}=e,i=function(e,t){const n=O(t);return e.data.get(n)||null}(t,o);r.current={model:i??c,save:e=>function(e,t,n){const r=O(t);e.data.set(r,n)}(t,o,e),invalidate:n}}else r.current={model:e,save:()=>{},invalidate:n}}var o;return r.current}(r);h.current||(h.current=!0,m.current=y.current.hydrate(b));const[M,j]=n.useState(()=>y.current.model),_=function(e){const t=n.useRef(e);return n.useLayoutEffect(()=>{t.current=e},[e]),n.useMemo(()=>{return n=t,Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>n.current[t],enumerable:!0}),e),{});var n},[e])}(c()),N=n.useMemo(()=>new Y,[]),U=n.useRef({handlers:/* @__PURE__ */new Map});U.current.handlers=/* @__PURE__ */new Map;const z=function(){const e=n.useRef(/* @__PURE__ */new Set),t=n.useRef(/* @__PURE__ */new Set);return n.useMemo(()=>({broadcast:e.current,multicast:t.current}),[])}(),L=n.useRef(d.Mounting),T=function(){const e=n.useRef({}),t=n.useRef(/* @__PURE__ */new Map),r=n.useRef(/* @__PURE__ */new Map);return n.useMemo(()=>({refs:e,pending:t,emitted:r}),[])}(),B=n.useRef(/* @__PURE__ */new Set),$=n.useRef(0),F=n.useCallback((e,t,n)=>{const r=new AbortController,o={controller:r,action:e,payload:t};return f.add(o),B.current.add(o),{model:M,get phase(){return L.current},task:o,data:_,tasks:f,nodes:T.refs.current,actions:{produce(e){if(r.signal.aborted)return;const t=y.current.produce(t=>e({model:t,inspect:y.current.inspect}));j(y.current.model),n.processes.add(t),m.current&&(n.processes.add(m.current),m.current=null)},dispatch(e,t,n){if(r.signal.aborted)return;const o=w(e),c=P(e)?e.channel:void 0;if(E(e)&&n?.scope){const e=pe(s,n.scope);return void(e&&e.emitter.emit(o,t,c))}(S(e)?i:N).emit(o,t,c)},annotate:(e,t)=>y.current.annotate(e,t),invalidate(e){g(e)}}}},[M]);n.useLayoutEffect(()=>{function t(t,n,r){return async function(o,c){const i=r();if(e.isNotNullable(c)&&e.isNotNullable(i)&&!function(e,t){for(const n of Object.keys(e))if(t[n]!==e[n])return!1;return!0}(c,i))return;const s={processes:/* @__PURE__ */new Set},u=Promise.withResolvers(),d=F(t,o,s);try{await n(d,o)}catch(h){const e=U.current.handlers.has(l.Error),n={reason:k(h),error:R(h),action:x(t),handled:e,tasks:f};a?.(n),e&&N.emit(l.Error,n)}finally{for(const e of f)if(e===d.task){f.delete(e),B.current.delete(e);break}s.processes.forEach(e=>y.current.prune(e)),s.processes.size>0&&p(),u.resolve()}}}$.current++;const n=/* @__PURE__ */new Set;return U.current.handlers.forEach((e,r)=>{for(const{getChannel:o,handler:c}of e){const e=t(r,c,o);if(E(r)){if(s)for(const t of s.values()){const o=t.emitter;o.on(r,e),n.add(()=>o.off(r,e))}N.on(r,e),z.multicast.add(r),n.add(()=>N.off(r,e))}else S(r)?(i.on(r,e),N.on(r,e),z.broadcast.add(r),n.add(()=>{i.off(r,e),N.off(r,e)})):(N.on(r,e),n.add(()=>N.off(r,e)))}}),()=>{const e=++$.current,t=new Set(n);queueMicrotask(()=>{if($.current===e){v(y.current.model);for(const e of B.current)e.controller.abort(),f.delete(e);B.current.clear(),L.current=d.Unmounting,N.emit(l.Unmount),L.current=d.Unmounted;for(const e of t)e()}else for(const e of t)e()})}},[N]),n.useLayoutEffect(()=>{for(const[e,t]of T.pending.current)T.emitted.current.get(e)!==t&&(T.emitted.current.set(e,t),N.emit(u.Node,t,{Name:e}));T.pending.current.clear()}),function({unicast:r,broadcastActions:o,phase:c,data:i}){const s=re(),a=n.useRef(null);n.useLayoutEffect(()=>{c.current===d.Mounting&&(r.emit(l.Mount),o.forEach(t=>{const n=s.get(t),o=n?.state.model?.value;e.isNullable(o)||r.emit(t,o)}),c.current=d.Mounted)},[]),n.useLayoutEffect(()=>{if(e.isNotNullable(a.current)){const e=function(e,t){return Object.keys(t).reduce((n,r)=>e[r]!==t[r]?{...n,[r]:t[r]}:n,{})}(a.current,i);t.isNotEmpty(Object.keys(e))&&r.emit(l.Update,e)}a.current=i},[i,r])}({unicast:N,broadcastActions:z.broadcast,phase:L,data:c()});const W=n.useMemo(()=>[M,{dispatch(e,t,n){const r=w(e),o=P(e)?e.channel:void 0;if(E(e)&&n?.scope){const e=pe(s,n.scope);return void(e&&e.emitter.emit(r,t,o))}(S(e)?i:N).emit(r,t,o)},consume:(e,t,r)=>E(e)&&r?.scope?n.createElement(he,{action:w(e),scopeName:r.scope,renderer:t}):n.createElement(ce,{action:w(e),renderer:t}),get inspect(){return y.current.inspect},get nodes(){return T.refs.current},node(e,t){T.refs.current[e]=t,T.pending.current.set(e,t)}}],[M,N]);return W.useAction=(e,t)=>{!function(e,t,r){const o=n.useRef(r);n.useLayoutEffect(()=>{o.current=r});const c=n.useRef(t);n.useLayoutEffect(()=>{c.current=t});const i=n.useCallback(async(e,t)=>{const n=o.current;if("GeneratorFunction"===n.constructor.name||"AsyncGeneratorFunction"===n.constructor.name){const r=n(e,t);for await(const e of r);}else await n(e,t)},[]),s=n.useCallback(()=>P(c.current)?c.current.channel:void 0,[]),a=w(t),u=e.current.handlers.get(a)??/* @__PURE__ */new Set;0===u.size&&e.current.handlers.set(a,u),u.add({getChannel:s,handler:i})}(U,e,t)},W}export{M as Action,le as Boundary,f as Distribution,N as Error,j as Id,l as Lifecycle,z as Op,z as Operation,p as Reason,_ as Rehydrate,me as Scope,V as State,ye as With,J as annotate,be as useActions,v as utils};
@@ -1 +1 @@
1
- var global,factory;global=this,factory=function(e,t,n,r,o){"use strict";function c(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const n in e)if("default"!==n){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}const s=c(n);class i{static Payload=Symbol("chizu.brand/Payload");static Broadcast=Symbol("chizu.brand/Broadcast");static Multicast=Symbol("chizu.brand/Multicast");static Action=Symbol("chizu.brand/Action");static Channel=Symbol("chizu.brand/Channel");static Node=Symbol("chizu.action.lifecycle/Node");static Rehydrate=Symbol("chizu.brand/Rehydrate")}class a{static Mount=Symbol("chizu.action.lifecycle/Mount");static Unmount=Symbol("chizu.action.lifecycle/Unmount");static Error=Symbol("chizu.action.lifecycle/Error");static Update=Symbol("chizu.action.lifecycle/Update");static Node=(()=>{const e=i.Node,t=function(t){return{[i.Action]:e,[i.Payload]:void 0,[i.Channel]:t,channel:t}};return Object.defineProperty(t,i.Action,{value:e,enumerable:!1}),Object.defineProperty(t,i.Payload,{value:void 0,enumerable:!1}),t})()}var u=(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(u||{}),l=(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(l||{}),f=(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Disallowed=2]="Disallowed",e[e.Errored=3]="Errored",e[e.Unmounted=4]="Unmounted",e))(f||{});class d extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}const p={actionPrefix:"chizu.action/",broadcastActionPrefix:"chizu.action/broadcast/",multicastActionPrefix:"chizu.action/multicast/",channelPrefix:"chizu.channel/",cachePrefix:"chizu.cache/"};function h(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(new d);const o=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(o),r(new d)},{once:!0})})}function m(e){return e?Boolean(e&&"symbol"!=typeof e):Symbol(`pk.${Date.now()}.${crypto.randomUUID()}`)}const y=Object.freeze(Object.defineProperty({__proto__:null,config:p,pk:m,sleep:h,"ζ":h,"κ":m},Symbol.toStringTag,{value:"Module"})),b=e=>"symbol"==typeof e;function v(e){return t.G.isString(e)||b(e)?e:(t.G.isObject(e)||t.G.isFunction(e))&&i.Action in e?e[i.Action]:e}function g(e){if(t.G.isString(e))return e.startsWith(p.broadcastActionPrefix);if(b(e))return e.description?.startsWith(p.broadcastActionPrefix)??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(i.Broadcast in e&&e[i.Broadcast])return!0;if(i.Action in e){const t=e[i.Action];return t.description?.startsWith(p.broadcastActionPrefix)??!1}}return!1}function w(e){const n=v(e),r=t.G.isString(n)?n:n.description??"";return r.startsWith(p.actionPrefix)&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function x(e){return t.G.isObject(e)&&i.Channel in e&&"channel"in e}function j(e){if(t.G.isString(e))return e.startsWith(p.multicastActionPrefix);if(b(e))return e.description?.startsWith(p.multicastActionPrefix)??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(i.Multicast in e&&e[i.Multicast])return!0;if(i.Action in e){const t=e[i.Action];return t.description?.startsWith(p.multicastActionPrefix)??!1}}return!1}const S=s.createContext({data:new Map});function P(e){return e?[...Object.keys(e)].toSorted().map(t=>`${t}=${String(e[t])}`).join("&"):""}function A(e){if(e instanceof Error){if("TimeoutError"===e.name)return f.Timedout;if("AbortError"===e.name)return f.Supplanted}return f.Errored}function M(e){return e instanceof Error?e:new Error(String(e))}const E=n.createContext(void 0);let O=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var R=(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(R||{}),C=(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(C||{}),G=(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(G||{});class _{[o.immerable]=!0;static keys=new Set(Object.values(G));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new _(this.value,this.operation);return n.property=e,n.process=t,n}}class k{static immer=(()=>{o.enablePatches();const e=new o.Immer;return e.setAutoFreeze(!1),e})();static tag="κ";static id=O}function N(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function z(e){if(t.G.isNullable(e)||L(e))return e;if(t.G.isArray(e))return e.map(e=>z(e));if(t.G.isObject(e)){const t=Object.entries(e).map(([e,t])=>[e,z(t)]);return{...Object.fromEntries(t),[k.tag]:e[k.tag]??k.id()}}return e}function U(e){if(Array.isArray(e))return e.filter(e=>k.tag in e).map(e=>e[k.tag]??"").join(",");const t=e[k.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function L(e){return t.G.isNullable(e)||t.G.isString(e)||t.G.isNumber(e)||t.G.isBoolean(e)||"symbol"==typeof e||"bigint"==typeof e}function T(e,n,r,o,c,s){return function i(a,u=n.path){if(a instanceof _){const n=N(r,u.join("."));if(Object.entries(a).filter(([e,t])=>!_.keys.has(e)&&t instanceof _).forEach(([e,t])=>i(t,u.concat(e))),L(a.value)){if(e===C.Hydrate)return a.value;const i=u.slice(0,-1),l=i.length>0?N(r,i.join(".")):r;return t.G.isNullable(l)||B(l,a,u.at(-1),o,c,s),n??a.value}if(e===C.Hydrate){const e=z(i(a.value,u));return B(e,a,null,o,c,s),e}const l=n??z(a.value);return B(l,a,null,o,c,s),t.G.isNullable(n)?l:(i(a.value,u),n)}if(t.G.isArray(a))return a.map((e,t)=>i(e,u.concat(t)));if(t.G.isObject(a)){const t=Object.entries(a).map(([e,t])=>[e,i(t,u.concat(e))]),n=Object.fromEntries(t);if(e===C.Hydrate){const e=z(n);return Object.entries(a).forEach(([t,n])=>{n instanceof _&&L(n.value)&&B(e,n,t,o,c,s)}),e}return n}return a}(n.value)}function B(e,t,n,r,o,c){const s=c(e),i=o.get(s)??[];o.set(s,[t.assign(n,r),...i])}class ${#e={};#t;#n=new Map;#r=new Set;#o=!1;constructor(e=U){this.#t=e}static pk(){return O()}static"κ"=$.pk;annotate(e,t){return new _(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(e,n,r,o,c){function s(o){const c=o.at(-1),s=N(e(),o),i=o.slice(0,-1),a=t.A.isNotEmpty(i)?N(e(),i):e();return[...t.G.isObject(s)||t.G.isArray(s)?n.get(r(s))?.filter(e=>t.G.isNullable(e.property))??[]:[],...t.G.isObject(a)?n.get(r(a))?.filter(e=>e.property===c)??[]:[]]}return function n(r){return new Proxy(()=>{},{get:(i,a)=>"pending"===a?()=>!t.A.isEmpty(s(r)):"remaining"===a?()=>t.A.length(s(r)):"box"===a?()=>({value:N(e(),r),inspect:n(r)}):"is"===a?e=>s(r).some(t=>0!==(t.operation&e)):"draft"===a?()=>t.A.head(s(r))?.value??N(e(),r):"settled"===a?()=>new Promise(n=>{if(t.A.isEmpty(s(r)))return n(N(e(),r));const i=()=>{t.A.isEmpty(s(r))&&(c(i),n(N(e(),r)))};o(i)}):n([...r,String(a)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#c(C.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#c(C.Produce,e)}#c(e,t){const n=Symbol("process"),[,r]=k.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>k.immer.applyPatches(t,[{...r,value:T(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=z(this.#e),this.#s(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.A.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#s()}#s(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const W=new $;function F(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var D,H={exports:{}},I=(D||(D=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function c(e,t,r,c,s){if("function"!=typeof r)throw new TypeError("The listener must be a function");var i=new o(r,c||e,s),a=n?n+t:t;return e._events[a]?e._events[a].fn?e._events[a]=[e._events[a],i]:e._events[a].push(i):(e._events[a]=i,e._eventsCount++),e}function s(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function i(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),i.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},i.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,c=new Array(o);r<o;r++)c[r]=t[r].fn;return c},i.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},i.prototype.emit=function(e,t,r,o,c,s){var i=n?n+e:e;if(!this._events[i])return!1;var a,u,l=this._events[i],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,c),!0;case 6:return l.fn.call(l.context,t,r,o,c,s),!0}for(u=1,a=new Array(f-1);u<f;u++)a[u-1]=arguments[u];l.fn.apply(l.context,a)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!a)for(d=1,a=new Array(f-1);d<f;d++)a[d-1]=arguments[d];l[u].fn.apply(l[u].context,a)}}return!0},i.prototype.on=function(e,t,n){return c(this,e,t,n,!1)},i.prototype.once=function(e,t,n){return c(this,e,t,n,!0)},i.prototype.removeListener=function(e,t,r,o){var c=n?n+e:e;if(!this._events[c])return this;if(!t)return s(this,c),this;var i=this._events[c];if(i.fn)i.fn!==t||o&&!i.once||r&&i.context!==r||s(this,c);else{for(var a=0,u=[],l=i.length;a<l;a++)(i[a].fn!==t||o&&!i[a].once||r&&i[a].context!==r)&&u.push(i[a]);u.length?this._events[c]=1===u.length?u[0]:u:s(this,c)}return this},i.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&s(this,t):(this._events=new r,this._eventsCount=0),this},i.prototype.off=i.prototype.removeListener,i.prototype.addListener=i.prototype.on,i.prefixed=n,i.EventEmitter=i,e.exports=i}(H)),H.exports);const q=F(I),V=s.createContext(new q);function J(){return s.useContext(V)}function K({children:e}){const t=s.useMemo(()=>new q,[]);return r.jsx(V.Provider,{value:t,children:e})}const Q=s.createContext(new Map);function X(){return s.useContext(Q)}function Y(){const[,e]=s.useReducer(e=>e+1,0);return e}function Z({action:e,renderer:n}){const r=J(),o=X(),c=Y(),i=s.useMemo(()=>{const t=o.get(e);if(t)return t;const n={state:new $,listeners:new Set};return o.set(e,n),n},[e,o]);s.useLayoutEffect(()=>{function t(e){i.state.hydrate({value:e}),i.listeners.forEach(e=>e())}return i.listeners.add(c),r.on(e,t),()=>{i.listeners.delete(c),r.off(e,t)}},[e,r,i]);const a=i.state.model?.value;return t.G.isNullable(a)?null:n({value:a,inspect:i.state.inspect.value})}function ee({children:e}){const t=s.useMemo(()=>new Map,[]);return r.jsx(Q.Provider,{value:t,children:e})}function te({children:e}){const t=s.useMemo(()=>({data:new Map}),[]);return r.jsx(S.Provider,{value:t,children:e})}const ne=s.createContext(new Set);function re({children:e}){const t=s.useMemo(()=>new Set,[]);return r.jsx(ne.Provider,{value:t,children:e})}const oe=s.createContext(null);function ce(){return s.useContext(oe)}function se(e,t){return e?.get(t)??null}function ie({action:e,scopeName:n,renderer:r}){const o=ce(),c=Y(),i=s.useMemo(()=>se(o,n),[o,n]),a=s.useMemo(()=>i?function(e,t){const n=e.store.get(t);if(n)return n;const r={state:new $,listeners:new Set};return e.store.set(t,r),r}(i,e):null,[e,i]);if(s.useLayoutEffect(()=>{if(i&&a)return a.listeners.add(c),i.emitter.on(e,t),()=>{a.listeners.delete(c),i.emitter.off(e,t)};function t(e){a&&(a.state.hydrate({value:e}),a.listeners.forEach(e=>e()))}},[e,i,a,c]),!a)return null;const u=a.state.model?.value;return t.G.isNullable(u)?null:r({value:u,inspect:a.state.inspect.value})}e.Action=(e,t=u.Unicast)=>{const n=t===u.Broadcast?Symbol(`${p.broadcastActionPrefix}${e}`):t===u.Multicast?Symbol(`${p.multicastActionPrefix}${e}`):Symbol(`${p.actionPrefix}${e}`),r=function(e){return{[i.Action]:n,[i.Payload]:void 0,[i.Channel]:e,channel:e}};return Object.defineProperty(r,i.Action,{value:n,enumerable:!1}),Object.defineProperty(r,i.Payload,{value:void 0,enumerable:!1}),t===u.Broadcast&&Object.defineProperty(r,i.Broadcast,{value:!0,enumerable:!1}),t===u.Multicast&&Object.defineProperty(r,i.Multicast,{value:!0,enumerable:!1}),r},e.Boundary=function({children:e}){return r.jsx(K,{children:r.jsx(ee,{children:r.jsx(te,{children:r.jsx(re,{children:e})})})})},e.Distribution=u,e.Error=function({handler:e,children:t}){return r.jsx(E.Provider,{value:e,children:t})},e.Lifecycle=a,e.Op=R,e.Operation=R,e.Reason=f,e.Rehydrate=function(e,t){return{[i.Rehydrate]:!0,model:e,channel:t}},e.Scope=function({name:e,children:t}){const n=ce(),o=s.useMemo(()=>({name:e,emitter:new q,store:new Map,listeners:new Map}),[]),c=s.useMemo(()=>{const t=new Map(n??[]);return t.set(e,o),t},[n,e,o]);return r.jsx(oe.Provider,{value:c,children:t})},e.State=$,e.With=function(e){return(t,n)=>{t.actions.produce(t=>{t.model[e]=n})}},e.annotate=function(e,t){return W.annotate(e,t)},e.useActions=function(e,r=()=>({})){const o=J(),c=ce(),u=n.useContext(E),f=s.useContext(ne),d=Y(),p=s.useRef(!1),h=s.useRef(null),m=s.useRef(new $),{model:y,save:b}=function(e){const t=s.useContext(S),n=s.useRef(null);if(!n.current)if("object"==typeof(r=e)&&null!==r&&i.Rehydrate in r&&!0===r[i.Rehydrate]){const{channel:r,model:o}=e,c=function(e,t){const n=P(t);return e.data.get(n)||null}(t,r);n.current={model:c??o,save:e=>function(e,t,n){const r=P(t);e.data.set(r,n)}(t,r,e)}}else n.current={model:e,save:()=>{}};var r;return n.current}(e);p.current||(p.current=!0,h.current=m.current.hydrate(y));const[O,R]=s.useState(()=>m.current.model),C=function(e){const t=s.useRef(e);return s.useLayoutEffect(()=>{t.current=e},[e]),s.useMemo(()=>{return n=t,Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>n.current[t],enumerable:!0}),e),{});var n},[e])}(r()),G=s.useMemo(()=>new q,[]),_=s.useRef({handlers:new Map});_.current.handlers=new Map;const k=function(){const e=s.useRef(new Set),t=s.useRef(new Set);return s.useMemo(()=>({broadcast:e.current,multicast:t.current}),[])}(),N=s.useRef(l.Mounting),z=function(){const e=s.useRef({}),t=s.useRef(new Map),n=s.useRef(new Map);return s.useMemo(()=>({refs:e,pending:t,emitted:n}),[])}(),U=s.useRef(new Set),L=s.useRef(0),T=s.useCallback((e,t,n)=>{const r=new AbortController,s={controller:r,action:e,payload:t};return f.add(s),U.current.add(s),{model:O,get phase(){return N.current},task:s,data:C,tasks:f,nodes:z.refs.current,actions:{produce(e){if(r.signal.aborted)return;const t=m.current.produce(t=>e({model:t,inspect:m.current.inspect}));R(m.current.model),n.processes.add(t),h.current&&(n.processes.add(h.current),h.current=null)},dispatch(e,t,n){if(r.signal.aborted)return;const s=v(e),i=x(e)?e.channel:void 0;if(j(e)&&n?.scope){const e=se(c,n.scope);return void(e&&e.emitter.emit(s,t,i))}(g(e)?o:G).emit(s,t,i)},annotate:(e,t)=>m.current.annotate(e,t)}}},[O]);s.useLayoutEffect(()=>{function e(e,n,r){return async function(o,c){const s=r();if(t.G.isNotNullable(c)&&t.G.isNotNullable(s)&&!function(e,t){for(const n of Object.keys(e))if(t[n]!==e[n])return!1;return!0}(c,s))return;const i={processes:new Set},l=Promise.withResolvers(),p=T(e,o,i);try{await n(p,o)}catch(h){const t=_.current.handlers.has(a.Error),n={reason:A(h),error:M(h),action:w(e),handled:t,tasks:f};u?.(n),t&&G.emit(a.Error,n)}finally{for(const e of f)if(e===p.task){f.delete(e),U.current.delete(e);break}i.processes.forEach(e=>m.current.prune(e)),i.processes.size>0&&d(),l.resolve()}}}L.current++;const n=new Set;return _.current.handlers.forEach((t,r)=>{for(const{getChannel:s,handler:i}of t){const t=e(r,i,s);if(j(r)){if(c)for(const e of c.values()){const o=e.emitter;o.on(r,t),n.add(()=>o.off(r,t))}G.on(r,t),k.multicast.add(r),n.add(()=>G.off(r,t))}else g(r)?(o.on(r,t),G.on(r,t),k.broadcast.add(r),n.add(()=>{o.off(r,t),G.off(r,t)})):(G.on(r,t),n.add(()=>G.off(r,t)))}}),()=>{const e=++L.current,t=new Set(n);queueMicrotask(()=>{if(L.current===e){b(m.current.model);for(const e of U.current)e.controller.abort(),f.delete(e);U.current.clear(),N.current=l.Unmounting,G.emit(a.Unmount),N.current=l.Unmounted;for(const e of t)e()}else for(const e of t)e()})}},[G]),s.useLayoutEffect(()=>{for(const[e,t]of z.pending.current)z.emitted.current.get(e)!==t&&(z.emitted.current.set(e,t),G.emit(i.Node,t,{Name:e}));z.pending.current.clear()}),function({unicast:e,broadcastActions:n,phase:r,data:o}){const c=X(),i=s.useRef(null);s.useLayoutEffect(()=>{r.current===l.Mounting&&(e.emit(a.Mount),n.forEach(n=>{const r=c.get(n),o=r?.state.model?.value;t.G.isNullable(o)||e.emit(n,o)}),r.current=l.Mounted)},[]),s.useLayoutEffect(()=>{if(t.G.isNotNullable(i.current)){const n=function(e,t){return Object.keys(t).reduce((n,r)=>e[r]!==t[r]?{...n,[r]:t[r]}:n,{})}(i.current,o);t.A.isNotEmpty(Object.keys(n))&&e.emit(a.Update,n)}i.current=o},[o,e])}({unicast:G,broadcastActions:k.broadcast,phase:N,data:r()});const B=s.useMemo(()=>[O,{dispatch(e,t,n){const r=v(e),s=x(e)?e.channel:void 0;if(j(e)&&n?.scope){const e=se(c,n.scope);return void(e&&e.emitter.emit(r,t,s))}(g(e)?o:G).emit(r,t,s)},consume:(e,t,n)=>j(e)&&n?.scope?s.createElement(ie,{action:v(e),scopeName:n.scope,renderer:t}):s.createElement(Z,{action:v(e),renderer:t}),get inspect(){return m.current.inspect},get nodes(){return z.refs.current},node(e,t){z.refs.current[e]=t,z.pending.current.set(e,t)}}],[O,G]);return B.useAction=(e,t)=>{!function(e,t,n){const r=s.useRef(n);s.useLayoutEffect(()=>{r.current=n});const o=s.useRef(t);s.useLayoutEffect(()=>{o.current=t});const c=s.useCallback(async(e,t)=>{const n=r.current;if("GeneratorFunction"===n.constructor.name||"AsyncGeneratorFunction"===n.constructor.name){const r=n(e,t);for await(const e of r);}else await n(e,t)},[]),i=s.useCallback(()=>x(o.current)?o.current.channel:void 0,[]),a=v(t),u=e.current.handlers.get(a)??new Set;0===u.size&&e.current.handlers.set(a,u),u.add({getChannel:i,handler:c})}(_,e,t)},B},e.utils=y,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})},"object"==typeof exports&&"undefined"!=typeof module?factory(exports,require("@mobily/ts-belt"),require("react"),require("react/jsx-runtime"),require("immer")):"function"==typeof define&&define.amd?define(["exports","@mobily/ts-belt","react","react/jsx-runtime","immer"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).Chizu={},global.TsBelt,global.React,global.jsxRuntime,global.Immer);
1
+ var global,factory;global=this,factory=function(e,t,n,r,o){"use strict";function c(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const n in e)if("default"!==n){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}const i=c(n);class s{static Payload=Symbol("chizu.brand/Payload");static Broadcast=Symbol("chizu.brand/Broadcast");static Multicast=Symbol("chizu.brand/Multicast");static Action=Symbol("chizu.brand/Action");static Channel=Symbol("chizu.brand/Channel");static Node=Symbol("chizu.action.lifecycle/Node");static Rehydrate=Symbol("chizu.brand/Rehydrate")}class a{static Mount=Symbol("chizu.action.lifecycle/Mount");static Unmount=Symbol("chizu.action.lifecycle/Unmount");static Error=Symbol("chizu.action.lifecycle/Error");static Update=Symbol("chizu.action.lifecycle/Update");static Node=(()=>{const e=s.Node,t=function(t){return{[s.Action]:e,[s.Payload]:void 0,[s.Channel]:t,channel:t}};return Object.defineProperty(t,s.Action,{value:e,enumerable:!1}),Object.defineProperty(t,s.Payload,{value:void 0,enumerable:!1}),t})()}var u=(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(u||{}),l=(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(l||{}),f=(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Disallowed=2]="Disallowed",e[e.Errored=3]="Errored",e[e.Unmounted=4]="Unmounted",e))(f||{});class d extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}const p={actionPrefix:"chizu.action/",broadcastActionPrefix:"chizu.action/broadcast/",multicastActionPrefix:"chizu.action/multicast/",channelPrefix:"chizu.channel/",cachePrefix:"chizu.cache/"};function h(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(new d);const o=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(o),r(new d)},{once:!0})})}function m(e){return e?Boolean(e&&"symbol"!=typeof e):Symbol(`pk.${Date.now()}.${crypto.randomUUID()}`)}const y=Object.freeze(Object.defineProperty({__proto__:null,config:p,pk:m,sleep:h,"ζ":h,"κ":m},Symbol.toStringTag,{value:"Module"})),b=e=>"symbol"==typeof e;function v(e){return t.G.isString(e)||b(e)?e:(t.G.isObject(e)||t.G.isFunction(e))&&s.Action in e?e[s.Action]:e}function g(e){if(t.G.isString(e))return e.startsWith(p.broadcastActionPrefix);if(b(e))return e.description?.startsWith(p.broadcastActionPrefix)??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(s.Broadcast in e&&e[s.Broadcast])return!0;if(s.Action in e){const t=e[s.Action];return t.description?.startsWith(p.broadcastActionPrefix)??!1}}return!1}function w(e){const n=v(e),r=t.G.isString(n)?n:n.description??"";return r.startsWith(p.actionPrefix)&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function x(e){return t.G.isObject(e)&&s.Channel in e&&"channel"in e}function j(e){if(t.G.isString(e))return e.startsWith(p.multicastActionPrefix);if(b(e))return e.description?.startsWith(p.multicastActionPrefix)??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(s.Multicast in e&&e[s.Multicast])return!0;if(s.Action in e){const t=e[s.Action];return t.description?.startsWith(p.multicastActionPrefix)??!1}}return!1}const S=i.createContext({data:new Map});function P(e){return e?[...Object.keys(e)].toSorted().map(t=>`${t}=${String(e[t])}`).join("&"):""}function A(e){if(e instanceof Error){if("TimeoutError"===e.name)return f.Timedout;if("AbortError"===e.name)return f.Supplanted}return f.Errored}function M(e){return e instanceof Error?e:new Error(String(e))}const E=n.createContext(void 0);let O=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var R=(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(R||{}),_=(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(_||{}),C=(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(C||{});class G{[o.immerable]=!0;static keys=new Set(Object.values(C));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new G(this.value,this.operation);return n.property=e,n.process=t,n}}class k{static immer=(()=>{o.enablePatches();const e=new o.Immer;return e.setAutoFreeze(!1),e})();static tag="κ";static id=O}function N(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function z(e){if(t.G.isNullable(e)||L(e))return e;if(t.G.isArray(e))return e.map(e=>z(e));if(t.G.isObject(e)){const t=Object.entries(e).map(([e,t])=>[e,z(t)]);return{...Object.fromEntries(t),[k.tag]:e[k.tag]??k.id()}}return e}function U(e){if(Array.isArray(e))return e.filter(e=>k.tag in e).map(e=>e[k.tag]??"").join(",");const t=e[k.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function L(e){return t.G.isNullable(e)||t.G.isString(e)||t.G.isNumber(e)||t.G.isBoolean(e)||"symbol"==typeof e||"bigint"==typeof e}function T(e,n,r,o,c,i){return function s(a,u=n.path){if(a instanceof G){const n=N(r,u.join("."));if(Object.entries(a).filter(([e,t])=>!G.keys.has(e)&&t instanceof G).forEach(([e,t])=>s(t,u.concat(e))),L(a.value)){if(e===_.Hydrate)return a.value;const s=u.slice(0,-1),l=s.length>0?N(r,s.join(".")):r;return t.G.isNullable(l)||B(l,a,u.at(-1),o,c,i),n??a.value}if(e===_.Hydrate){const e=z(s(a.value,u));return B(e,a,null,o,c,i),e}const l=n??z(a.value);return B(l,a,null,o,c,i),t.G.isNullable(n)?l:(s(a.value,u),n)}if(t.G.isArray(a))return a.map((e,t)=>s(e,u.concat(t)));if(t.G.isObject(a)){const t=Object.entries(a).map(([e,t])=>[e,s(t,u.concat(e))]),n=Object.fromEntries(t);if(e===_.Hydrate){const e=z(n);return Object.entries(a).forEach(([t,n])=>{n instanceof G&&L(n.value)&&B(e,n,t,o,c,i)}),e}return n}return a}(n.value)}function B(e,t,n,r,o,c){const i=c(e),s=o.get(i)??[];o.set(i,[t.assign(n,r),...s])}class ${#e={};#t;#n=new Map;#r=new Set;#o=!1;constructor(e=U){this.#t=e}static pk(){return O()}static"κ"=$.pk;annotate(e,t){return new G(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(e,n,r,o,c){function i(o){const c=o.at(-1),i=N(e(),o),s=o.slice(0,-1),a=t.A.isNotEmpty(s)?N(e(),s):e();return[...t.G.isObject(i)||t.G.isArray(i)?n.get(r(i))?.filter(e=>t.G.isNullable(e.property))??[]:[],...t.G.isObject(a)?n.get(r(a))?.filter(e=>e.property===c)??[]:[]]}return function n(r){return new Proxy(()=>{},{get:(s,a)=>"pending"===a?()=>!t.A.isEmpty(i(r)):"remaining"===a?()=>t.A.length(i(r)):"box"===a?()=>({value:N(e(),r),inspect:n(r)}):"is"===a?e=>i(r).some(t=>0!==(t.operation&e)):"draft"===a?()=>t.A.head(i(r))?.value??N(e(),r):"settled"===a?()=>new Promise(n=>{if(t.A.isEmpty(i(r)))return n(N(e(),r));const s=()=>{t.A.isEmpty(i(r))&&(c(s),n(N(e(),r)))};o(s)}):n([...r,String(a)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#c(_.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#c(_.Produce,e)}#c(e,t){const n=Symbol("process"),[,r]=k.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>k.immer.applyPatches(t,[{...r,value:T(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=z(this.#e),this.#i(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.A.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#i()}#i(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const W=new $;function F(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var I,D={exports:{}},H=(I||(I=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function c(e,t,r,c,i){if("function"!=typeof r)throw new TypeError("The listener must be a function");var s=new o(r,c||e,i),a=n?n+t:t;return e._events[a]?e._events[a].fn?e._events[a]=[e._events[a],s]:e._events[a].push(s):(e._events[a]=s,e._eventsCount++),e}function i(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function s(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),s.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},s.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,c=new Array(o);r<o;r++)c[r]=t[r].fn;return c},s.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},s.prototype.emit=function(e,t,r,o,c,i){var s=n?n+e:e;if(!this._events[s])return!1;var a,u,l=this._events[s],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,c),!0;case 6:return l.fn.call(l.context,t,r,o,c,i),!0}for(u=1,a=new Array(f-1);u<f;u++)a[u-1]=arguments[u];l.fn.apply(l.context,a)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!a)for(d=1,a=new Array(f-1);d<f;d++)a[d-1]=arguments[d];l[u].fn.apply(l[u].context,a)}}return!0},s.prototype.on=function(e,t,n){return c(this,e,t,n,!1)},s.prototype.once=function(e,t,n){return c(this,e,t,n,!0)},s.prototype.removeListener=function(e,t,r,o){var c=n?n+e:e;if(!this._events[c])return this;if(!t)return i(this,c),this;var s=this._events[c];if(s.fn)s.fn!==t||o&&!s.once||r&&s.context!==r||i(this,c);else{for(var a=0,u=[],l=s.length;a<l;a++)(s[a].fn!==t||o&&!s[a].once||r&&s[a].context!==r)&&u.push(s[a]);u.length?this._events[c]=1===u.length?u[0]:u:i(this,c)}return this},s.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&i(this,t):(this._events=new r,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prefixed=n,s.EventEmitter=s,e.exports=s}(D)),D.exports);const q=F(H),V=i.createContext(new q);function J(){return i.useContext(V)}function K({children:e}){const t=i.useMemo(()=>new q,[]);return r.jsx(V.Provider,{value:t,children:e})}const Q=i.createContext(new Map);function X(){return i.useContext(Q)}function Y(){const[,e]=i.useReducer(e=>e+1,0);return e}function Z({action:e,renderer:n}){const r=J(),o=X(),c=Y(),s=i.useMemo(()=>{const t=o.get(e);if(t)return t;const n={state:new $,listeners:new Set};return o.set(e,n),n},[e,o]);i.useLayoutEffect(()=>{function t(e){s.state.hydrate({value:e}),s.listeners.forEach(e=>e())}return s.listeners.add(c),r.on(e,t),()=>{s.listeners.delete(c),r.off(e,t)}},[e,r,s]);const a=s.state.model?.value;return t.G.isNullable(a)?null:n({value:a,inspect:s.state.inspect.value})}function ee({children:e}){const t=i.useMemo(()=>new Map,[]);return r.jsx(Q.Provider,{value:t,children:e})}function te({children:e}){const t=i.useMemo(()=>({data:new Map}),[]);return r.jsx(S.Provider,{value:t,children:e})}const ne=i.createContext(new Set);function re({children:e}){const t=i.useMemo(()=>new Set,[]);return r.jsx(ne.Provider,{value:t,children:e})}const oe=i.createContext(null);function ce(){return i.useContext(oe)}function ie(e,t){return e?.get(t)??null}function se({action:e,scopeName:n,renderer:r}){const o=ce(),c=Y(),s=i.useMemo(()=>ie(o,n),[o,n]),a=i.useMemo(()=>s?function(e,t){const n=e.store.get(t);if(n)return n;const r={state:new $,listeners:new Set};return e.store.set(t,r),r}(s,e):null,[e,s]);if(i.useLayoutEffect(()=>{if(s&&a)return a.listeners.add(c),s.emitter.on(e,t),()=>{a.listeners.delete(c),s.emitter.off(e,t)};function t(e){a&&(a.state.hydrate({value:e}),a.listeners.forEach(e=>e()))}},[e,s,a,c]),!a)return null;const u=a.state.model?.value;return t.G.isNullable(u)?null:r({value:u,inspect:a.state.inspect.value})}e.Action=(e,t=u.Unicast)=>{const n=t===u.Broadcast?Symbol(`${p.broadcastActionPrefix}${e}`):t===u.Multicast?Symbol(`${p.multicastActionPrefix}${e}`):Symbol(`${p.actionPrefix}${e}`),r=function(e){return{[s.Action]:n,[s.Payload]:void 0,[s.Channel]:e,channel:e}};return Object.defineProperty(r,s.Action,{value:n,enumerable:!1}),Object.defineProperty(r,s.Payload,{value:void 0,enumerable:!1}),t===u.Broadcast&&Object.defineProperty(r,s.Broadcast,{value:!0,enumerable:!1}),t===u.Multicast&&Object.defineProperty(r,s.Multicast,{value:!0,enumerable:!1}),r},e.Boundary=function({children:e}){return r.jsx(K,{children:r.jsx(ee,{children:r.jsx(te,{children:r.jsx(re,{children:e})})})})},e.Distribution=u,e.Error=function({handler:e,children:t}){return r.jsx(E.Provider,{value:e,children:t})},e.Id=function(){const e=Symbol();return t=>t??{_:e}},e.Lifecycle=a,e.Op=R,e.Operation=R,e.Reason=f,e.Rehydrate=function(e,t){return{[s.Rehydrate]:!0,model:e,channel:t}},e.Scope=function({name:e,children:t}){const n=ce(),o=i.useMemo(()=>({name:e,emitter:new q,store:new Map,listeners:new Map}),[]),c=i.useMemo(()=>{const t=new Map(n??[]);return t.set(e,o),t},[n,e,o]);return r.jsx(oe.Provider,{value:c,children:t})},e.State=$,e.With=function(e){return(t,n)=>{t.actions.produce(t=>{t.model[e]=n})}},e.annotate=function(e,t){return W.annotate(e,t)},e.useActions=function(e,r=()=>({})){const o=J(),c=ce(),u=n.useContext(E),f=i.useContext(ne),d=Y(),p=i.useRef(!1),h=i.useRef(null),m=i.useRef(new $),{model:y,save:b,invalidate:O}=function(e){const t=i.useContext(S),n=i.useRef(null);if(!n.current){const o=e=>{const n=P(e);t.data.delete(n)};if("object"==typeof(r=e)&&null!==r&&s.Rehydrate in r&&!0===r[s.Rehydrate]){const{channel:r,model:c}=e,i=function(e,t){const n=P(t);return e.data.get(n)||null}(t,r);n.current={model:i??c,save:e=>function(e,t,n){const r=P(t);e.data.set(r,n)}(t,r,e),invalidate:o}}else n.current={model:e,save:()=>{},invalidate:o}}var r;return n.current}(e);p.current||(p.current=!0,h.current=m.current.hydrate(y));const[R,_]=i.useState(()=>m.current.model),C=function(e){const t=i.useRef(e);return i.useLayoutEffect(()=>{t.current=e},[e]),i.useMemo(()=>{return n=t,Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>n.current[t],enumerable:!0}),e),{});var n},[e])}(r()),G=i.useMemo(()=>new q,[]),k=i.useRef({handlers:new Map});k.current.handlers=new Map;const N=function(){const e=i.useRef(new Set),t=i.useRef(new Set);return i.useMemo(()=>({broadcast:e.current,multicast:t.current}),[])}(),z=i.useRef(l.Mounting),U=function(){const e=i.useRef({}),t=i.useRef(new Map),n=i.useRef(new Map);return i.useMemo(()=>({refs:e,pending:t,emitted:n}),[])}(),L=i.useRef(new Set),T=i.useRef(0),B=i.useCallback((e,t,n)=>{const r=new AbortController,i={controller:r,action:e,payload:t};return f.add(i),L.current.add(i),{model:R,get phase(){return z.current},task:i,data:C,tasks:f,nodes:U.refs.current,actions:{produce(e){if(r.signal.aborted)return;const t=m.current.produce(t=>e({model:t,inspect:m.current.inspect}));_(m.current.model),n.processes.add(t),h.current&&(n.processes.add(h.current),h.current=null)},dispatch(e,t,n){if(r.signal.aborted)return;const i=v(e),s=x(e)?e.channel:void 0;if(j(e)&&n?.scope){const e=ie(c,n.scope);return void(e&&e.emitter.emit(i,t,s))}(g(e)?o:G).emit(i,t,s)},annotate:(e,t)=>m.current.annotate(e,t),invalidate(e){O(e)}}}},[R]);i.useLayoutEffect(()=>{function e(e,n,r){return async function(o,c){const i=r();if(t.G.isNotNullable(c)&&t.G.isNotNullable(i)&&!function(e,t){for(const n of Object.keys(e))if(t[n]!==e[n])return!1;return!0}(c,i))return;const s={processes:new Set},l=Promise.withResolvers(),p=B(e,o,s);try{await n(p,o)}catch(h){const t=k.current.handlers.has(a.Error),n={reason:A(h),error:M(h),action:w(e),handled:t,tasks:f};u?.(n),t&&G.emit(a.Error,n)}finally{for(const e of f)if(e===p.task){f.delete(e),L.current.delete(e);break}s.processes.forEach(e=>m.current.prune(e)),s.processes.size>0&&d(),l.resolve()}}}T.current++;const n=new Set;return k.current.handlers.forEach((t,r)=>{for(const{getChannel:i,handler:s}of t){const t=e(r,s,i);if(j(r)){if(c)for(const e of c.values()){const o=e.emitter;o.on(r,t),n.add(()=>o.off(r,t))}G.on(r,t),N.multicast.add(r),n.add(()=>G.off(r,t))}else g(r)?(o.on(r,t),G.on(r,t),N.broadcast.add(r),n.add(()=>{o.off(r,t),G.off(r,t)})):(G.on(r,t),n.add(()=>G.off(r,t)))}}),()=>{const e=++T.current,t=new Set(n);queueMicrotask(()=>{if(T.current===e){b(m.current.model);for(const e of L.current)e.controller.abort(),f.delete(e);L.current.clear(),z.current=l.Unmounting,G.emit(a.Unmount),z.current=l.Unmounted;for(const e of t)e()}else for(const e of t)e()})}},[G]),i.useLayoutEffect(()=>{for(const[e,t]of U.pending.current)U.emitted.current.get(e)!==t&&(U.emitted.current.set(e,t),G.emit(s.Node,t,{Name:e}));U.pending.current.clear()}),function({unicast:e,broadcastActions:n,phase:r,data:o}){const c=X(),s=i.useRef(null);i.useLayoutEffect(()=>{r.current===l.Mounting&&(e.emit(a.Mount),n.forEach(n=>{const r=c.get(n),o=r?.state.model?.value;t.G.isNullable(o)||e.emit(n,o)}),r.current=l.Mounted)},[]),i.useLayoutEffect(()=>{if(t.G.isNotNullable(s.current)){const n=function(e,t){return Object.keys(t).reduce((n,r)=>e[r]!==t[r]?{...n,[r]:t[r]}:n,{})}(s.current,o);t.A.isNotEmpty(Object.keys(n))&&e.emit(a.Update,n)}s.current=o},[o,e])}({unicast:G,broadcastActions:N.broadcast,phase:z,data:r()});const W=i.useMemo(()=>[R,{dispatch(e,t,n){const r=v(e),i=x(e)?e.channel:void 0;if(j(e)&&n?.scope){const e=ie(c,n.scope);return void(e&&e.emitter.emit(r,t,i))}(g(e)?o:G).emit(r,t,i)},consume:(e,t,n)=>j(e)&&n?.scope?i.createElement(se,{action:v(e),scopeName:n.scope,renderer:t}):i.createElement(Z,{action:v(e),renderer:t}),get inspect(){return m.current.inspect},get nodes(){return U.refs.current},node(e,t){U.refs.current[e]=t,U.pending.current.set(e,t)}}],[R,G]);return W.useAction=(e,t)=>{!function(e,t,n){const r=i.useRef(n);i.useLayoutEffect(()=>{r.current=n});const o=i.useRef(t);i.useLayoutEffect(()=>{o.current=t});const c=i.useCallback(async(e,t)=>{const n=r.current;if("GeneratorFunction"===n.constructor.name||"AsyncGeneratorFunction"===n.constructor.name){const r=n(e,t);for await(const e of r);}else await n(e,t)},[]),s=i.useCallback(()=>x(o.current)?o.current.channel:void 0,[]),a=v(t),u=e.current.handlers.get(a)??new Set;0===u.size&&e.current.handlers.set(a,u),u.add({getChannel:s,handler:c})}(k,e,t)},W},e.utils=y,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})},"object"==typeof exports&&"undefined"!=typeof module?factory(exports,require("@mobily/ts-belt"),require("react"),require("react/jsx-runtime"),require("immer")):"function"==typeof define&&define.amd?define(["exports","@mobily/ts-belt","react","react/jsx-runtime","immer"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).Chizu={},global.TsBelt,global.React,global.jsxRuntime,global.Immer);
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { Action } from './action/index.ts';
2
- export { Rehydrate } from './rehydrate/index.ts';
2
+ export { Rehydrate, Id } from './rehydrate/index.ts';
3
3
  export { Distribution, Lifecycle } from './types/index.ts';
4
4
  export { Error, Reason } from './error/index.tsx';
5
5
  export { Operation, Op, State } from 'immertation';
@@ -11,3 +11,4 @@ export * as utils from './utils/index.ts';
11
11
  export type { Box } from 'immertation';
12
12
  export type { Fault, Catcher } from './error/index.tsx';
13
13
  export type { Pk, Task, Tasks, Handlers } from './types/index.ts';
14
+ export type { StoreId } from './rehydrate/index.ts';
@@ -1,4 +1,33 @@
1
1
  import { Filter, Model } from '../types/index.ts';
2
+ /**
3
+ * Serialises a channel object into a deterministic string key.
4
+ * Keys are sorted alphabetically for deterministic output.
5
+ * Returns an empty string for unchanneled operations.
6
+ */
7
+ export declare function serializeChannel(channel?: Filter): string;
8
+ /**
9
+ * Phantom brand symbol for model type tracking on store identifiers.
10
+ * Uses a function type `(m: M) => M` to enforce invariance, preventing
11
+ * a store entry declared for one model from being used with a different model.
12
+ * @internal
13
+ */
14
+ declare const StoreModelBrand: unique symbol;
15
+ /**
16
+ * A `Filter` branded with a phantom model type `M`.
17
+ *
18
+ * Returned by `Id<M>()` and `Id<M, C>()`, this type carries the model at
19
+ * the type level so that `Rehydrate(model, storeId)` can verify at compile
20
+ * time that the model and the store entry agree on the model shape.
21
+ *
22
+ * The phantom brand uses a function type `(m: M) => M` to enforce invariance —
23
+ * `StoreId<A>` is not assignable to `StoreId<B>` unless `A` and `B` are
24
+ * identical, preventing accidental cross-component snapshot usage.
25
+ *
26
+ * @template M - The model type this store entry is scoped to.
27
+ */
28
+ export type StoreId<M extends Model = Model> = Filter & {
29
+ readonly [StoreModelBrand]?: (m: M) => M;
30
+ };
2
31
  /**
3
32
  * Branded wrapper for a model with rehydration metadata.
4
33
  * When passed to `useActions`, the model state is automatically saved to the
@@ -8,6 +37,58 @@ export type Rehydrated<M extends Model = Model> = {
8
37
  readonly model: M;
9
38
  readonly channel: Filter;
10
39
  };
40
+ /**
41
+ * Creates a typed store entry for rehydration snapshots.
42
+ *
43
+ * The first type parameter `M` binds the store entry to a specific model type,
44
+ * ensuring that `Rehydrate(model, storeId)` produces a compile-time error if
45
+ * the model and store entry disagree on the model shape.
46
+ *
47
+ * When called with only `M`, returns a nullary function that produces a unique
48
+ * `StoreId<M>` — useful for components with a single instance (unchanneled).
49
+ *
50
+ * When called with `M` and `C`, returns a unary function that passes through
51
+ * the channel object as `C & StoreId<M>` — useful for components with multiple
52
+ * instances keyed by some identifier (channeled).
53
+ *
54
+ * @template M - The model type this store entry is scoped to.
55
+ * @template C - The channel type, constrained to `Filter` (object of non-nullable primitives).
56
+ * @returns A function that produces a `StoreId<M>` for use with `Rehydrate` and `invalidate`.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import { Id, Rehydrate } from "chizu";
61
+ *
62
+ * type CounterModel = { count: number };
63
+ *
64
+ * class Store {
65
+ * // Unchanneled — one snapshot for all instances
66
+ * static Settings = Id<SettingsModel>();
67
+ *
68
+ * // Channeled — independent snapshot per UserId
69
+ * static Counter = Id<CounterModel, { UserId: number }>();
70
+ * }
71
+ *
72
+ * // Unchanneled usage
73
+ * const actions = useActions<SettingsModel, typeof Actions>(
74
+ * Rehydrate(model, Store.Settings()),
75
+ * );
76
+ *
77
+ * // Channeled usage
78
+ * const actions = useActions<CounterModel, typeof Actions>(
79
+ * Rehydrate(model, Store.Counter({ UserId: props.userId })),
80
+ * );
81
+ *
82
+ * // Compile error — model mismatch!
83
+ * // Rehydrate(settingsModel, Store.Counter({ UserId: 1 }));
84
+ *
85
+ * // Invalidate a specific snapshot
86
+ * context.actions.invalidate(Store.Counter({ UserId: 5 }));
87
+ * context.actions.invalidate(Store.Settings());
88
+ * ```
89
+ */
90
+ export declare function Id<M extends Model>(): () => StoreId<M>;
91
+ export declare function Id<M extends Model, C extends Filter>(): (channel: C) => C & StoreId<M>;
11
92
  /**
12
93
  * Wraps an initial model with rehydration metadata.
13
94
  *
@@ -15,22 +96,23 @@ export type Rehydrated<M extends Model = Model> = {
15
96
  * automatically snapshotted to the rehydrator on unmount and restored from it
16
97
  * on remount if a matching entry exists.
17
98
  *
18
- * The channel parameter acts as a key for the snapshot, allowing different
19
- * component instances to maintain independent rehydrated state.
99
+ * The channel must be a `StoreId<M>` produced by `Id<M>()` or `Id<M, C>()`.
100
+ * TypeScript verifies that the model type `M` of the store entry matches the
101
+ * model being passed, preventing accidental cross-component snapshot usage.
20
102
  *
21
103
  * @template M - The model type.
22
104
  * @param model - The initial model (used as fallback when no snapshot exists).
23
- * @param channel - Channel key identifying this component's snapshot.
105
+ * @param channel - A `StoreId<M>` identifying this component's snapshot.
24
106
  * @returns A branded object containing the model and rehydration metadata.
25
107
  *
26
108
  * @example
27
109
  * ```ts
28
110
  * const actions = useActions<Model, typeof Actions>(
29
- * Rehydrate(model, { UserId: props.userId }),
111
+ * Rehydrate(model, Store.Counter({ UserId: props.userId })),
30
112
  * );
31
113
  * ```
32
114
  */
33
- export declare function Rehydrate<M extends Model>(model: M, channel: Filter): Rehydrated<M>;
115
+ export declare function Rehydrate<M extends Model>(model: M, channel: StoreId<M>): Rehydrated<M>;
34
116
  /**
35
117
  * Type guard to detect whether a value is a `Rehydrated` wrapper.
36
118
  */
@@ -51,4 +133,6 @@ export declare function isRehydrated<M extends Model>(value: M | Rehydrated<M>):
51
133
  export declare function useRehydration<M extends Model>(initialModelOrRehydrated: M | Rehydrated<M>): {
52
134
  model: M;
53
135
  save: (model: M) => void;
136
+ invalidate: (channel: Filter) => void;
54
137
  };
138
+ export {};
@@ -503,6 +503,22 @@ export type HandlerContext<M extends Model, _AC extends Actions, D extends Props
503
503
  }) => void>(ƒ: F & AssertSync<F>): void;
504
504
  dispatch(action: ActionOrChanneled, payload?: unknown, options?: MulticastOptions): void;
505
505
  annotate<T>(operation: Operation, value: T): T;
506
+ /**
507
+ * Removes a rehydration snapshot from the store.
508
+ *
509
+ * Use this to invalidate persisted state for a specific channel key,
510
+ * so that the next mount of the target component starts fresh instead
511
+ * of restoring stale data.
512
+ *
513
+ * @param channel - The channel key identifying the snapshot to remove.
514
+ *
515
+ * @example
516
+ * ```ts
517
+ * context.actions.invalidate(Store.Counter({ UserId: 5 }));
518
+ * context.actions.invalidate(Store.Settings());
519
+ * ```
520
+ */
521
+ invalidate(channel: Filter): void;
506
522
  };
507
523
  };
508
524
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chizu",
3
- "version": "0.2.52",
3
+ "version": "0.2.53",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "packageManager": "yarn@1.22.22",
@@ -70,7 +70,7 @@
70
70
  "jest": "^30.2.0",
71
71
  "jest-environment-jsdom": "^30.2.0",
72
72
  "jsdom": "^27.4.0",
73
- "lodash": "^4.17.21",
73
+ "lodash": "^4.17.23",
74
74
  "lucide-react": "^0.562.0",
75
75
  "madge": "^8.0.0",
76
76
  "prettier": "^3.7.4",