@zeix/cause-effect 0.17.2 → 0.18.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.
Files changed (94) hide show
  1. package/.ai-context.md +163 -226
  2. package/.cursorrules +41 -35
  3. package/.github/copilot-instructions.md +166 -116
  4. package/.zed/settings.json +3 -0
  5. package/ARCHITECTURE.md +274 -0
  6. package/CLAUDE.md +197 -202
  7. package/COLLECTION_REFACTORING.md +161 -0
  8. package/GUIDE.md +298 -0
  9. package/README.md +241 -220
  10. package/REQUIREMENTS.md +100 -0
  11. package/bench/reactivity.bench.ts +577 -0
  12. package/index.dev.js +1326 -1174
  13. package/index.js +1 -1
  14. package/index.ts +58 -85
  15. package/package.json +9 -6
  16. package/src/errors.ts +118 -70
  17. package/src/graph.ts +601 -0
  18. package/src/nodes/collection.ts +474 -0
  19. package/src/nodes/effect.ts +149 -0
  20. package/src/nodes/list.ts +588 -0
  21. package/src/nodes/memo.ts +120 -0
  22. package/src/nodes/sensor.ts +139 -0
  23. package/src/nodes/state.ts +135 -0
  24. package/src/nodes/store.ts +383 -0
  25. package/src/nodes/task.ts +146 -0
  26. package/src/signal.ts +112 -64
  27. package/src/util.ts +26 -57
  28. package/test/batch.test.ts +96 -69
  29. package/test/benchmark.test.ts +473 -485
  30. package/test/collection.test.ts +455 -955
  31. package/test/effect.test.ts +293 -696
  32. package/test/list.test.ts +332 -857
  33. package/test/memo.test.ts +380 -0
  34. package/test/regression.test.ts +156 -0
  35. package/test/scope.test.ts +191 -0
  36. package/test/sensor.test.ts +454 -0
  37. package/test/signal.test.ts +220 -213
  38. package/test/state.test.ts +217 -271
  39. package/test/store.test.ts +346 -898
  40. package/test/task.test.ts +395 -0
  41. package/test/untrack.test.ts +167 -0
  42. package/test/util/dependency-graph.ts +2 -2
  43. package/tsconfig.build.json +11 -0
  44. package/tsconfig.json +5 -7
  45. package/types/index.d.ts +13 -15
  46. package/types/src/errors.d.ts +73 -19
  47. package/types/src/graph.d.ts +208 -0
  48. package/types/src/nodes/collection.d.ts +64 -0
  49. package/types/src/nodes/effect.d.ts +48 -0
  50. package/types/src/nodes/list.d.ts +65 -0
  51. package/types/src/nodes/memo.d.ts +57 -0
  52. package/types/src/nodes/sensor.d.ts +75 -0
  53. package/types/src/nodes/state.d.ts +78 -0
  54. package/types/src/nodes/store.d.ts +51 -0
  55. package/types/src/nodes/task.d.ts +73 -0
  56. package/types/src/signal.d.ts +43 -28
  57. package/types/src/util.d.ts +9 -16
  58. package/archive/benchmark.ts +0 -688
  59. package/archive/collection.ts +0 -310
  60. package/archive/computed.ts +0 -198
  61. package/archive/list.ts +0 -544
  62. package/archive/memo.ts +0 -140
  63. package/archive/state.ts +0 -90
  64. package/archive/store.ts +0 -357
  65. package/archive/task.ts +0 -191
  66. package/src/classes/collection.ts +0 -298
  67. package/src/classes/composite.ts +0 -171
  68. package/src/classes/computed.ts +0 -392
  69. package/src/classes/list.ts +0 -310
  70. package/src/classes/ref.ts +0 -96
  71. package/src/classes/state.ts +0 -131
  72. package/src/classes/store.ts +0 -227
  73. package/src/diff.ts +0 -138
  74. package/src/effect.ts +0 -96
  75. package/src/match.ts +0 -45
  76. package/src/resolve.ts +0 -49
  77. package/src/system.ts +0 -275
  78. package/test/computed.test.ts +0 -1126
  79. package/test/diff.test.ts +0 -955
  80. package/test/match.test.ts +0 -388
  81. package/test/ref.test.ts +0 -381
  82. package/test/resolve.test.ts +0 -154
  83. package/types/src/classes/collection.d.ts +0 -47
  84. package/types/src/classes/composite.d.ts +0 -15
  85. package/types/src/classes/computed.d.ts +0 -114
  86. package/types/src/classes/list.d.ts +0 -41
  87. package/types/src/classes/ref.d.ts +0 -48
  88. package/types/src/classes/state.d.ts +0 -61
  89. package/types/src/classes/store.d.ts +0 -51
  90. package/types/src/diff.d.ts +0 -28
  91. package/types/src/effect.d.ts +0 -15
  92. package/types/src/match.d.ts +0 -21
  93. package/types/src/resolve.d.ts +0 -29
  94. package/types/src/system.d.ts +0 -81
package/index.js CHANGED
@@ -1 +1 @@
1
- var Z$=($)=>typeof $==="string",Q$=($)=>typeof $==="number",p=($)=>typeof $==="symbol",q=($)=>typeof $==="function",H=($)=>q($)&&$.constructor.name==="AsyncFunction",_$=($)=>q($)&&$.constructor.name!=="AsyncFunction",U$=($)=>$!=null&&typeof $==="object",L=($,J)=>Object.prototype.toString.call($)===`[object ${J}]`,P=($)=>L($,"Object"),B$=($)=>P($)||Array.isArray($),Y$=($,J=(z)=>z!=null)=>Array.isArray($)&&$.every(J);var y=($)=>$ instanceof DOMException&&$.name==="AbortError",C=($)=>Z$($)?`"${$}"`:!!$&&typeof $==="object"?JSON.stringify($):String($);var b,o=new WeakMap,x$=new Set,L$=0,x=Symbol(),A="add",N="change",m="cleanup",K="remove",v="sort",F="watch",S=($)=>{let J=new Set,z=$;return z.on=(X,Z)=>{if(X===m)J.add(Z);else throw new M("watcher",X)},z.stop=()=>{try{for(let X of J)X()}finally{J.clear()}},z},I=($,J)=>{if(!$.size&&J?.size){let z=j(J);if(z){let X=o.get($)??new Set;if(X.add(z),!o.has($))o.set($,X)}}if(b&&!$.has(b)){let z=b;z.on(m,()=>{if($.delete(z),!$.size){let X=o.get($);if(X)try{for(let Z of X)Z()}finally{X.clear(),o.delete($)}}}),$.add(z)}},G=($)=>{if(!$.size)return!1;for(let J of $)if(L$)x$.add(J);else J();return!0},s=()=>{while(x$.size){let $=Array.from(x$);x$.clear();for(let J of $)J()}},N$=($)=>{L$++;try{$()}finally{s(),L$--}},W=($,J)=>{let z=b;b=$||void 0;try{J()}finally{b=z}},j=($,J)=>{if(!$)return;let z=[],X=[],Z=(Q)=>{if(X.length){if(X.length===1)throw X[0];throw AggregateError(X,`Errors in hook ${Q?"cleanup":"callback"}:`)}};for(let Q of $)try{let B=Q(J);if(q(B))z.push(B)}catch(B){X.push(R(B))}if(Z(),!z.length)return;if(z.length===1)return z[0];return()=>{for(let Q of z)try{Q()}catch(B){X.push(R(B))}Z(!0)}},f=($,J)=>J.includes($);var V=($,J,z)=>{if(Object.is($,J))return!0;if(typeof $!==typeof J)return!1;if(!U$($)||!U$(J))return!1;if(!z)z=new WeakSet;if(z.has($)||z.has(J))throw new _("isEqual");z.add($),z.add(J);try{if(Array.isArray($)&&Array.isArray(J)){if($.length!==J.length)return!1;for(let X=0;X<$.length;X++)if(!V($[X],J[X],z))return!1;return!0}if(Array.isArray($)!==Array.isArray(J))return!1;if(P($)&&P(J)){let X=Object.keys($),Z=Object.keys(J);if(X.length!==Z.length)return!1;for(let Q of X){if(!(Q in J))return!1;if(!V($[Q],J[Q],z))return!1}return!0}return!1}finally{z.delete($),z.delete(J)}},t=($,J)=>{let z=B$($),X=B$(J);if(!z||!X){let D=!Object.is($,J);return{changed:D,add:D&&X?J:{},change:{},remove:D&&z?$:{}}}let Z=new WeakSet,Q={},B={},Y={},k=Object.keys($),X$=Object.keys(J),T=new Set([...k,...X$]);for(let D of T){let w=D in $,i=D in J;if(!w&&i){Q[D]=J[D];continue}else if(w&&!i){Y[D]=x;continue}let g$=$[D],m$=J[D];if(!V(g$,m$,Z))B[D]=m$}return{add:Q,change:B,remove:Y,changed:!!(Object.keys(Q).length||Object.keys(B).length||Object.keys(Y).length)}};var G$="Computed";class c{#z=new Set;#X;#J;#$;#B=!0;#Q=!1;#Z;#x;constructor($,J=x){E(this.constructor.name,$,q$),U(this.constructor.name,J),this.#X=$,this.#J=J}#G(){if(!this.#Z)this.#Z=S(()=>{if(this.#B=!0,!G(this.#z))this.#Z?.stop()}),this.#Z.on(m,()=>{this.#Z=void 0});return this.#Z}get[Symbol.toStringTag](){return G$}get(){if(I(this.#z,this.#x),s(),this.#B){let $=this.#G();W($,()=>{if(this.#Q)throw new _("memo");let J;this.#Q=!0;try{J=this.#X(this.#J)}catch(z){this.#J=x,this.#$=R(z),this.#Q=!1;return}if(J==null||x===J)this.#J=x,this.#$=void 0;else this.#J=J,this.#$=void 0,this.#B=!1;this.#Q=!1})}if(this.#$)throw this.#$;return this.#J}on($,J){if($===F)return this.#x||=new Set,this.#x.add(J),()=>{this.#x?.delete(J)};throw new M(this.constructor.name,$)}}class r{#z=new Set;#X;#J;#$;#B=!0;#Q=!1;#Z=!1;#x;#G;#q;constructor($,J=x){E(this.constructor.name,$,F$),U(this.constructor.name,J),this.#X=$,this.#J=J}#F(){if(!this.#x)this.#x=S(()=>{if(this.#B=!0,this.#G?.abort(),!G(this.#z))this.#x?.stop()}),this.#x.on(m,()=>{this.#G?.abort(),this.#G=void 0,this.#x=void 0});return this.#x}get[Symbol.toStringTag](){return G$}get(){I(this.#z,this.#q),s();let $=(Q)=>{if(!V(Q,this.#J))this.#J=Q,this.#Z=!0;this.#$=void 0,this.#B=!1},J=()=>{this.#Z=x!==this.#J,this.#J=x,this.#$=void 0},z=(Q)=>{let B=R(Q);this.#Z=!this.#$||B.name!==this.#$.name||B.message!==this.#$.message,this.#J=x,this.#$=B},X=(Q)=>(B)=>{if(this.#Q=!1,this.#G=void 0,Q(B),this.#Z&&!G(this.#z))this.#x?.stop()},Z=()=>W(this.#F(),()=>{if(this.#Q)throw new _("task");if(this.#Z=!1,this.#G)return this.#J;this.#G=new AbortController,this.#G.signal.addEventListener("abort",()=>{this.#Q=!1,this.#G=void 0,Z()},{once:!0});let Q;this.#Q=!0;try{Q=this.#X(this.#J,this.#G.signal)}catch(B){if(y(B))J();else z(B);this.#Q=!1;return}if(Q instanceof Promise)Q.then(X($),X(z));else if(Q==null||x===Q)J();else $(Q);this.#Q=!1});if(this.#B)Z();if(this.#$)throw this.#$;return this.#J}on($,J){if($===F)return this.#q||=new Set,this.#q.add(J),()=>{this.#q?.delete(J)};throw new M(this.constructor.name,$)}}var R$=($,J=x)=>H($)?new r($,J):new c($,J),P$=($)=>L($,G$),q$=($)=>_$($)&&$.length<2,F$=($)=>H($)&&$.length<3;class l{signals=new Map;#z;#X;#J=new Map;#$={};#B=!1;constructor($,J,z){this.#z=J,this.#X=z,this.change({add:$,change:{},remove:{},changed:!0},!0)}#Q($){let J=S(()=>{W(J,()=>{if(this.signals.get($)?.get(),!this.#B)j(this.#$.change,[$])})});this.#J.set($,J),J()}add($,J){if(!this.#z($,J))return!1;if(this.signals.set($,this.#X(J)),this.#$.change?.size)this.#Q($);if(!this.#B)j(this.#$.add,[$]);return!0}remove($){if(!this.signals.delete($))return!1;let z=this.#J.get($);if(z)z.stop(),this.#J.delete($);if(!this.#B)j(this.#$.remove,[$]);return!0}change($,J){if(this.#B=!0,Object.keys($.add).length){for(let X in $.add)this.add(X,$.add[X]);let z=()=>j(this.#$.add,Object.keys($.add));if(J)setTimeout(z,0);else z()}if(Object.keys($.change).length)N$(()=>{for(let z in $.change){let X=$.change[z];if(!this.#z(z,X))continue;let Z=this.signals.get(z);if(A$(`list item "${z}"`,X,Z))Z.set(X)}}),j(this.#$.change,Object.keys($.change));if(Object.keys($.remove).length){for(let z in $.remove)this.remove(z);j(this.#$.remove,Object.keys($.remove))}return this.#B=!1,$.changed}clear(){let $=Array.from(this.signals.keys());return this.signals.clear(),this.#J.clear(),j(this.#$.remove,$),!0}on($,J){if(!f($,[A,N,K]))throw new M("Composite",$);if(this.#$[$]||=new Set,this.#$[$].add(J),$===N&&!this.#J.size){this.#B=!0;for(let z of this.signals.keys())this.#Q(z);this.#B=!1}return()=>{if(this.#$[$]?.delete(J),$===N&&!this.#$.change?.size){if(this.#J.size){for(let z of this.#J.values())z.stop();this.#J.clear()}}}}}var n="State";class g{#z=new Set;#X;#J;constructor($){U(n,$),this.#X=$}get[Symbol.toStringTag](){return n}get(){return I(this.#z,this.#J),this.#X}set($){if(U(n,$),V(this.#X,$))return;if(this.#X=$,this.#z.size)G(this.#z);if(x===this.#X)this.#z.clear()}update($){E(`${n} update`,$),this.set($(this.#X))}on($,J){if($===F)return this.#J||=new Set,this.#J.add(J),()=>{this.#J?.delete(J)};throw new M(this.constructor.name,$)}}var M$=($)=>L($,n);var d="List";class a{#z;#X=new Set;#J={};#$=[];#B;constructor($,J){U(d,$,Array.isArray);let z=0;this.#B=Z$(J)?()=>`${J}${z++}`:q(J)?(X)=>J(X):()=>String(z++),this.#z=new l(this.#Q($),(X,Z)=>{return U(`${d} for key "${X}"`,Z),!0},(X)=>new g(X))}#Q($){let J={};for(let z=0;z<$.length;z++){let X=$[z];if(X===void 0)continue;let Z=this.#$[z];if(!Z)Z=this.#B(X),this.#$[z]=Z;J[Z]=X}return J}get#Z(){return this.#$.map(($)=>this.#z.signals.get($)?.get()).filter(($)=>$!==void 0)}get[Symbol.toStringTag](){return d}get[Symbol.isConcatSpreadable](){return!0}*[Symbol.iterator](){for(let $ of this.#$){let J=this.#z.signals.get($);if(J)yield J}}get length(){return I(this.#X,this.#J[F]),this.#$.length}get(){return I(this.#X,this.#J[F]),this.#Z}set($){if(x===$){this.#z.clear(),G(this.#X),this.#X.clear();return}let J=this.#Z,z=t(this.#Q(J),this.#Q($)),X=Object.keys(z.remove);if(this.#z.change(z)){for(let Q of X){let B=this.#$.indexOf(Q);if(B!==-1)this.#$.splice(B,1)}this.#$=this.#$.filter(()=>!0),G(this.#X)}}update($){this.set($(this.get()))}at($){return this.#z.signals.get(this.#$[$])}keys(){return this.#$.values()}byKey($){return this.#z.signals.get($)}keyAt($){return this.#$[$]}indexOfKey($){return this.#$.indexOf($)}add($){let J=this.#B($);if(this.#z.signals.has(J))throw new h("store",J,$);if(!this.#$.includes(J))this.#$.push(J);if(this.#z.add(J,$))G(this.#X);return J}remove($){let J=Q$($)?this.#$[$]:$;if(this.#z.remove(J)){let X=Q$($)?$:this.#$.indexOf(J);if(X>=0)this.#$.splice(X,1);this.#$=this.#$.filter(()=>!0),G(this.#X)}}sort($){let z=this.#$.map((X)=>[X,this.#z.signals.get(X)?.get()]).sort(q($)?(X,Z)=>$(X[1],Z[1]):(X,Z)=>String(X[1]).localeCompare(String(Z[1]))).map(([X])=>X);if(!V(this.#$,z))this.#$=z,G(this.#X),j(this.#J.sort,this.#$)}splice($,J,...z){let X=this.#$.length,Z=$<0?Math.max(0,X+$):Math.min($,X),Q=Math.max(0,Math.min(J??Math.max(0,X-Math.max(0,Z)),X-Z)),B={},Y={};for(let T=0;T<Q;T++){let D=Z+T,w=this.#$[D];if(w){let i=this.#z.signals.get(w);if(i)Y[w]=i.get()}}let k=this.#$.slice(0,Z);for(let T of z){let D=this.#B(T);k.push(D),B[D]=T}k.push(...this.#$.slice(Z+Q));let X$=!!(Object.keys(B).length||Object.keys(Y).length);if(X$)this.#z.change({add:B,change:{},remove:Y,changed:X$}),this.#$=k.filter(()=>!0),G(this.#X);return Object.values(Y)}on($,J){if(f($,[v,F]))return this.#J[$]||=new Set,this.#J[$].add(J),()=>{this.#J[$]?.delete(J)};else if(f($,[A,N,K]))return this.#z.on($,J);throw new M(d,$)}deriveCollection($){return new $$(this,$)}}var e=($)=>L($,d);var O="Store";class K${#z;#X=new Set;#J;constructor($){U(O,$,P),this.#z=new l($,(J,z)=>{return U(`${O} for key "${J}"`,z),!0},(J)=>T$(J))}get#$(){let $={};for(let[J,z]of this.#z.signals.entries())$[J]=z.get();return $}get[Symbol.toStringTag](){return O}get[Symbol.isConcatSpreadable](){return!1}*[Symbol.iterator](){for(let[$,J]of this.#z.signals.entries())yield[$,J]}keys(){return this.#z.signals.keys()}byKey($){return this.#z.signals.get($)}get(){return I(this.#X,this.#J),this.#$}set($){if(x===$){this.#z.clear(),G(this.#X),this.#X.clear();return}let J=this.#$;if(this.#z.change(t(J,$)))G(this.#X)}update($){this.set($(this.get()))}add($,J){if(this.#z.signals.has($))throw new h(O,$,J);if(this.#z.add($,J))G(this.#X);return $}remove($){if(this.#z.remove($))G(this.#X)}on($,J){if($===F)return this.#J||=new Set,this.#J.add(J),()=>{this.#J?.delete(J)};else if(f($,[A,N,K]))return this.#z.on($,J);throw new M(O,$)}}var D$=($)=>{let J=new K$($);return new Proxy(J,{get(z,X){if(X in z){let Z=Reflect.get(z,X);return q(Z)?Z.bind(z):Z}if(!p(X))return z.byKey(X)},has(z,X){if(X in z)return!0;return z.byKey(String(X))!==void 0},ownKeys(z){return Array.from(z.keys())},getOwnPropertyDescriptor(z,X){if(X in z)return Reflect.getOwnPropertyDescriptor(z,X);if(p(X))return;let Z=z.byKey(String(X));return Z?{enumerable:!0,configurable:!0,writable:!0,value:Z}:void 0}})},I$=($)=>L($,O);var O$=($)=>M$($)||P$($)||I$($),S$=($)=>M$($)||I$($)||e($);function w$($){if(q$($))return new c($);if(F$($))return new r($);if(Y$($))return new a($);if(P($))return D$($);return new g($)}function T$($){if(Y$($))return new a($);if(P($))return D$($);return new g($)}class _ extends Error{constructor($){super(`Circular dependency detected in ${$}`);this.name="CircularDependencyError"}}class h extends Error{constructor($,J,z){super(`Could not add ${$} key "${J}"${z?` with value ${C(z)}`:""} because it already exists`);this.name="DuplicateKeyError"}}class J$ extends TypeError{constructor($,J){super(`Invalid ${$} callback ${C(J)}`);this.name="InvalidCallbackError"}}class j$ extends TypeError{constructor($,J){super(`Invalid ${$} source ${C(J)}`);this.name="InvalidCollectionSourceError"}}class M extends TypeError{constructor($,J){super(`Invalid hook "${J}" in ${$}`);this.name="InvalidHookError"}}class W$ extends TypeError{constructor($,J){super(`Invalid signal value ${C(J)} in ${$}`);this.name="InvalidSignalValueError"}}class f$ extends TypeError{constructor($){super(`Nullish signal values are not allowed in ${$}`);this.name="NullishSignalValueError"}}class V$ extends Error{constructor($,J){super(`Could not set ${$} to ${C(J)} because signal is read-only`);this.name="ReadonlySignalError"}}var R=($)=>$ instanceof Error?$:Error(String($)),E=($,J,z=q)=>{if(!z(J))throw new J$($,J)},U=($,J,z=()=>!(p(J)&&J!==x)||q(J))=>{if(J==null)throw new f$($);if(!z(J))throw new W$($,J)},A$=($,J,z)=>{if(!S$(z))throw new V$($,J);return!0};var u="Collection";class $${#z=new Set;#X;#J;#$=new Map;#B=new Map;#Q={};#Z=[];constructor($,J){if(E(u,J),q($))$=$();if(!p$($))throw new j$(u,$);this.#X=$,this.#J=J;for(let z=0;z<this.#X.length;z++){let X=this.#X.keyAt(z);if(!X)continue;this.#x(X)}this.#X.on(A,(z)=>{if(!z)return;for(let X of z)if(!this.#$.has(X)){this.#x(X);let Z=this.#$.get(X);if(Z&&H$(this.#J))Z.get()}G(this.#z),j(this.#Q.add,z)}),this.#X.on(K,(z)=>{if(!z)return;for(let X of z){if(!this.#$.has(X))continue;this.#$.delete(X);let Z=this.#Z.indexOf(X);if(Z>=0)this.#Z.splice(Z,1);let Q=this.#B.get(X);if(Q)Q.stop(),this.#B.delete(X)}this.#Z=this.#Z.filter(()=>!0),G(this.#z),j(this.#Q.remove,z)}),this.#X.on(v,(z)=>{if(z)this.#Z=[...z];G(this.#z),j(this.#Q.sort,z)})}#x($){let J=H$(this.#J)?async(X,Z)=>{let Q=this.#X.byKey($)?.get();if(Q===x)return x;return this.#J(Q,Z)}:()=>{let X=this.#X.byKey($)?.get();if(X===x)return x;return this.#J(X)},z=R$(J);if(this.#$.set($,z),!this.#Z.includes($))this.#Z.push($);if(this.#Q.change?.size)this.#G($);return!0}#G($){let J=S(()=>{W(J,()=>{this.#$.get($)?.get()})});this.#B.set($,J),J()}get[Symbol.toStringTag](){return u}get[Symbol.isConcatSpreadable](){return!0}*[Symbol.iterator](){for(let $ of this.#Z){let J=this.#$.get($);if(J)yield J}}keys(){return this.#Z.values()}get(){return I(this.#z,this.#Q[F]),this.#Z.map(($)=>this.#$.get($)?.get()).filter(($)=>$!=null&&$!==x)}at($){return this.#$.get(this.#Z[$])}byKey($){return this.#$.get($)}keyAt($){return this.#Z[$]}indexOfKey($){return this.#Z.indexOf($)}on($,J){if(f($,[A,N,K,v,F])){if(this.#Q[$]||=new Set,this.#Q[$].add(J),$===N&&!this.#B.size)for(let z of this.#$.keys())this.#G(z);return()=>{if(this.#Q[$]?.delete(J),$===N&&!this.#Q.change?.size){if(this.#B.size){for(let z of this.#B.values())z.stop();this.#B.clear()}}}}throw new M(u,$)}deriveCollection($){return new $$(this,$)}get length(){return I(this.#z,this.#Q[F]),this.#Z.length}}var E$=($)=>L($,u),p$=($)=>e($)||E$($),H$=($)=>H($);var z$="Ref";class C${#z=new Set;#X;#J;constructor($,J){U(z$,$,J),this.#X=$}get[Symbol.toStringTag](){return z$}get(){return I(this.#z,this.#J),this.#X}notify(){G(this.#z)}on($,J){if($===F)return this.#J||=new Set,this.#J.add(J),()=>{this.#J?.delete(J)};throw new M(z$,$)}}var y$=($)=>L($,z$);var b$=($)=>{if(!q($)||$.length>1)throw new J$("effect",$);let J=H($),z=!1,X,Z=S(()=>W(Z,()=>{if(z)throw new _("effect");z=!0,X?.abort(),X=void 0;let Q;try{if(J){X=new AbortController;let B=X;$(X.signal).then((Y)=>{if(q(Y)&&X===B)Z.on(m,Y)}).catch((Y)=>{if(!y(Y))console.error("Error in async effect callback:",Y)})}else if(Q=$(),q(Q))Z.on(m,Q)}catch(B){if(!y(B))console.error("Error in effect callback:",B)}z=!1}));return Z(),()=>{X?.abort();try{Z.stop()}catch(Q){console.error("Error in effect cleanup:",Q)}}};function v$($,J){try{if($.pending)J.nil?.();else if($.errors)J.err?.($.errors);else if($.ok)J.ok($.values)}catch(z){let X=R(z);if(J.err&&(!$.errors||!$.errors.includes(X)))J.err($.errors?[...$.errors,X]:[X]);else throw X}}function n$($){let J=[],z=!1,X={};for(let[Z,Q]of Object.entries($))try{let B=Q.get();if(B===x)z=!0;else X[Z]=B}catch(B){J.push(R(B))}if(z)return{ok:!1,pending:!0};if(J.length>0)return{ok:!1,errors:J};return{ok:!0,values:X}}export{C as valueString,U as validateSignalValue,E as validateCallback,j as triggerHook,W as trackSignalReads,I as subscribeActiveWatcher,n$ as resolve,G as notifyWatchers,v$ as match,F$ as isTaskCallback,p as isSymbol,Z$ as isString,I$ as isStore,M$ as isState,O$ as isSignal,y$ as isRef,B$ as isRecordOrArray,P as isRecord,L as isObjectOfType,Q$ as isNumber,S$ as isMutableSignal,q$ as isMemoCallback,e as isList,f as isHandledHook,q as isFunction,V as isEqual,P$ as isComputed,E$ as isCollection,H as isAsyncFunction,y as isAbortError,A$ as guardMutableSignal,s as flushPendingReactions,t as diff,S as createWatcher,D$ as createStore,w$ as createSignal,R as createError,b$ as createEffect,R$ as createComputed,N$ as batchSignalWrites,x as UNSET,r as Task,O as TYPE_STORE,n as TYPE_STATE,z$ as TYPE_REF,d as TYPE_LIST,G$ as TYPE_COMPUTED,u as TYPE_COLLECTION,g as State,C$ as Ref,V$ as ReadonlySignalError,f$ as NullishSignalValueError,c as Memo,a as List,W$ as InvalidSignalValueError,j$ as InvalidCollectionSourceError,J$ as InvalidCallbackError,F as HOOK_WATCH,v as HOOK_SORT,K as HOOK_REMOVE,m as HOOK_CLEANUP,N as HOOK_CHANGE,A as HOOK_ADD,h as DuplicateKeyError,$$ as DerivedCollection,_ as CircularDependencyError,K$ as BaseStore};
1
+ function Y($){return typeof $==="function"}function v($){return Y($)&&$.constructor.name==="AsyncFunction"}function q$($){return Y($)&&$.constructor.name!=="AsyncFunction"}function C($,J){return Object.prototype.toString.call($)===`[object ${J}]`}function O($){return C($,"Object")}function I$($,J=(z)=>z!=null){return Array.isArray($)&&$.every(J)}function j$($){return typeof $==="string"?`"${$}"`:!!$&&typeof $==="object"?JSON.stringify($):String($)}class n extends Error{constructor($){super(`[${$}] Circular dependency detected`);this.name="CircularDependencyError"}}class C$ extends TypeError{constructor($){super(`[${$}] Signal value cannot be null or undefined`);this.name="NullishSignalValueError"}}class c extends Error{constructor($){super(`[${$}] Signal value is unset`);this.name="UnsetSignalValueError"}}class a extends TypeError{constructor($,J){super(`[${$}] Signal value ${j$(J)} is invalid`);this.name="InvalidSignalValueError"}}class V$ extends TypeError{constructor($,J){super(`[${$}] Callback ${j$(J)} is invalid`);this.name="InvalidCallbackError"}}class m$ extends Error{constructor($){super(`[${$}] Active owner is required`);this.name="RequiredOwnerError"}}class l extends Error{constructor($,J,z){super(`[${$}] Could not add key "${J}"${z?` with value ${JSON.stringify(z)}`:""} because it already exists`);this.name="DuplicateKeyError"}}function F($,J,z){if(J==null)throw new C$($);if(z&&!z(J))throw new a($,J)}function e($,J){if(J==null)throw new c($)}function _($,J,z=Y){if(!z(J))throw new V$($,J)}var h="State",p="Memo",y="Task",g="Sensor",w="List",S="Collection",k="Store",f=0,x$=1,G=2,Z$=4,j=null,E=null,N$=[],V=0,A$=!1,u=($,J)=>$===J,S$=($,J)=>!1;function h$($,J){let z=J.sourcesTail;if(z){let X=J.sources;while(X){if(X===$)return!0;if(X===z)break;X=X.nextSource}}return!1}function R($,J){let z=J.sourcesTail;if(z?.source===$)return;let X=null,U=J.flags&Z$;if(U){if(X=z?z.nextSource:J.sources,X?.source===$){J.sourcesTail=X;return}}let B=$.sinksTail;if(B?.sink===J&&(!U||h$(B,J)))return;let M={source:$,sink:J,nextSource:X,prevSink:B,nextSink:null};if(J.sourcesTail=$.sinksTail=M,z)z.nextSource=M;else J.sources=M;if(B)B.nextSink=M;else $.sinks=M}function p$($){let{source:J,nextSource:z,nextSink:X,prevSink:U}=$;if(X)X.prevSink=U;else J.sinksTail=U;if(U)U.nextSink=X;else J.sinks=X;if(!J.sinks&&J.stop)J.stop(),J.stop=void 0;return z}function Q$($){let J=$.sourcesTail,z=J?J.nextSource:$.sources;while(z)z=p$(z);if(J)J.nextSource=null;else $.sources=null}function A($,J=G){let z=$.flags;if("sinks"in $){if((z&(G|x$))>=J)return;if($.flags=z|J,"controller"in $&&$.controller)$.controller.abort(),$.controller=void 0;for(let X=$.sinks;X;X=X.nextSink)A(X.sink,x$)}else{if(z&G)return;$.flags=G,N$.push($)}}function H$($,J){if($.equals($.value,J))return;$.value=J;for(let z=$.sinks;z;z=z.nextSink)A(z.sink);if(V===0)L()}function i($,J){if(!$.cleanup)$.cleanup=J;else if(Array.isArray($.cleanup))$.cleanup.push(J);else $.cleanup=[$.cleanup,J]}function G$($){if(!$.cleanup)return;if(Array.isArray($.cleanup))for(let J=0;J<$.cleanup.length;J++)$.cleanup[J]();else $.cleanup();$.cleanup=null}function y$($){let J=j;j=$,$.sourcesTail=null,$.flags=Z$;let z=!1;try{let X=$.fn($.value);if($.error||!$.equals(X,$.value))$.value=X,$.error=void 0,z=!0}catch(X){z=!0,$.error=X instanceof Error?X:Error(String(X))}finally{j=J,Q$($)}if(z){for(let X=$.sinks;X;X=X.nextSink)if(X.sink.flags&x$)X.sink.flags|=G}$.flags=f}function g$($){$.controller?.abort();let J=new AbortController;$.controller=J,$.error=void 0;let z=j;j=$,$.sourcesTail=null,$.flags=Z$;let X;try{X=$.fn($.value,J.signal)}catch(U){$.controller=void 0,$.error=U instanceof Error?U:Error(String(U));return}finally{j=z,Q$($)}X.then((U)=>{if(J.signal.aborted)return;if($.controller=void 0,$.error||!$.equals(U,$.value)){$.value=U,$.error=void 0;for(let B=$.sinks;B;B=B.nextSink)A(B.sink);if(V===0)L()}},(U)=>{if(J.signal.aborted)return;$.controller=void 0;let B=U instanceof Error?U:Error(String(U));if(!$.error||B.name!==$.error.name||B.message!==$.error.message){$.error=B;for(let M=$.sinks;M;M=M.nextSink)A(M.sink);if(V===0)L()}}),$.flags=f}function Y$($){G$($);let J=j,z=E;j=E=$,$.sourcesTail=null,$.flags=Z$;try{let X=$.fn();if(typeof X==="function")i($,X)}finally{j=J,E=z,Q$($)}$.flags=f}function b($){if($.flags&x$)for(let J=$.sources;J;J=J.nextSource){if("fn"in J.source)b(J.source);if($.flags&G)break}if($.flags&Z$)throw new n("controller"in $?y:("value"in $)?p:"Effect");if($.flags&G)if("controller"in $)g$($);else if("value"in $)y$($);else Y$($);else $.flags=f}function L(){if(A$)return;A$=!0;try{for(let $=0;$<N$.length;$++){let J=N$[$];if(J.flags&G)b(J)}N$.length=0}finally{A$=!1}}function o($){V++;try{$()}finally{if(V--,V===0)L()}}function d($){let J=j;j=null;try{return $()}finally{j=J}}function k$($){let J=E,z={cleanup:null};E=z;try{let X=$();if(typeof X==="function")i(z,X);let U=()=>G$(z);if(J)i(J,U);return U}finally{E=J}}function T($,J){F(h,$,J?.guard);let z={value:$,sinks:null,sinksTail:null,equals:J?.equals??u,guard:J?.guard};return{[Symbol.toStringTag]:h,get(){if(j)R(z,j);return z.value},set(X){F(h,X,z.guard),H$(z,X)},update(X){_(h,X);let U=X(z.value);F(h,U,z.guard),H$(z,U)}}}function W$($){return C($,h)}function B$($,J){if($.length!==J.length)return!1;for(let z=0;z<$.length;z++)if($[z]!==J[z])return!1;return!0}function t($,J,z){if(Object.is($,J))return!0;if(typeof $!==typeof J)return!1;if($==null||typeof $!=="object"||J==null||typeof J!=="object")return!1;if(!z)z=new WeakSet;if(z.has($)||z.has(J))throw new n("isEqual");z.add($),z.add(J);try{let X=Array.isArray($);if(X!==Array.isArray(J))return!1;if(X){let U=$,B=J;if(U.length!==B.length)return!1;for(let M=0;M<U.length;M++)if(!t(U[M],B[M],z))return!1;return!0}if(O($)&&O(J)){let U=Object.keys($),B=Object.keys(J);if(U.length!==B.length)return!1;for(let M of U){if(!(M in J))return!1;if(!t($[M],J[M],z))return!1}return!0}return!1}finally{z.delete($),z.delete(J)}}function v$($,J,z,X,U){let B=new WeakSet,M={},K={},W={},Q=[],H=!1,m=new Map;for(let D=0;D<$.length;D++){let Z=z[D];if(Z&&$[D])m.set(Z,$[D])}let P=new Set;for(let D=0;D<J.length;D++){let Z=J[D];if(Z===void 0)continue;let q=U?X(Z):z[D]??X(Z);if(P.has(q))throw new l(w,q,Z);if(Q.push(q),P.add(q),!m.has(q))M[q]=Z,H=!0;else{let N=m.get(q);if(!t(N,Z,B))K[q]=Z,H=!0}}for(let[D]of m)if(!P.has(D))W[D]=null,H=!0;if(!H&&!B$(z,Q))H=!0;return{add:M,change:K,remove:W,newKeys:Q,changed:H}}function $$($,J){F(w,$,Array.isArray);let z=new Map,X=[],U=0,B=J?.keyConfig,M=Y(B),K=typeof B==="string"?()=>`${B}${U++}`:M?(Z)=>B(Z):()=>String(U++),W=()=>X.map((Z)=>z.get(Z)?.get()).filter((Z)=>Z!==void 0),Q={fn:W,value:$,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:t,error:void 0},H=(Z)=>{let q={};for(let N=0;N<Z.length;N++){let x=Z[N];if(x===void 0)continue;let I=X[N];if(!I)I=K(x),X[N]=I;q[I]=x}return q},m=(Z)=>{let q=!1;for(let N in Z.add){let x=Z.add[N];F(`${w} item for key "${N}"`,x),z.set(N,T(x)),q=!0}if(Object.keys(Z.change).length)o(()=>{for(let N in Z.change){let x=Z.change[N];F(`${w} item for key "${N}"`,x);let I=z.get(N);if(I)I.set(x)}});for(let N in Z.remove){z.delete(N);let x=X.indexOf(N);if(x!==-1)X.splice(x,1);q=!0}if(q)Q.sources=null,Q.sourcesTail=null;return Z.changed},P=H($);for(let Z in P){let q=P[Z];F(`${w} item for key "${Z}"`,q),z.set(Z,T(q))}Q.value=$,Q.flags=0;let D={[Symbol.toStringTag]:w,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of X){let q=z.get(Z);if(q)yield q}},get length(){if(j){if(!Q.sinks&&J?.watched)Q.stop=J.watched();R(Q,j)}return X.length},get(){if(j){if(!Q.sinks&&J?.watched)Q.stop=J.watched();R(Q,j)}if(Q.sources){if(Q.flags)Q.value=d(W),Q.flags=f}else if(b(Q),Q.error)throw Q.error;return Q.value},set(Z){let q=Q.flags&G?W():Q.value,N=v$(q,Z,X,K,M);if(N.changed){if(X=N.newKeys,m(N),A(Q),Q.flags|=G,V===0)L()}},update(Z){D.set(Z(D.get()))},at(Z){return z.get(X[Z])},keys(){if(j){if(!Q.sinks&&J?.watched)Q.stop=J.watched();R(Q,j)}return X.values()},byKey(Z){return z.get(Z)},keyAt(Z){return X[Z]},indexOfKey(Z){return X.indexOf(Z)},add(Z){let q=K(Z);if(z.has(q))throw new l(w,q,Z);if(!X.includes(q))X.push(q);if(F(`${w} item for key "${q}"`,Z),z.set(q,T(Z)),Q.sources=null,Q.sourcesTail=null,A(Q),Q.flags|=G,V===0)L();return q},remove(Z){let q=typeof Z==="number"?X[Z]:Z;if(z.delete(q)){let x=typeof Z==="number"?Z:X.indexOf(q);if(x>=0)X.splice(x,1);if(Q.sources=null,Q.sourcesTail=null,A(Q),Q.flags|=G,V===0)L()}},sort(Z){let N=X.map((x)=>[x,z.get(x)?.get()]).sort(Y(Z)?(x,I)=>Z(x[1],I[1]):(x,I)=>String(x[1]).localeCompare(String(I[1]))).map(([x])=>x);if(!B$(X,N)){if(X=N,A(Q),Q.flags|=G,V===0)L()}},splice(Z,q,...N){let x=X.length,I=Z<0?Math.max(0,x+Z):Math.min(Z,x),_$=Math.max(0,Math.min(q??Math.max(0,x-Math.max(0,I)),x-I)),P$={},X$={};for(let r=0;r<_$;r++){let s=I+r,R$=X[s];if(R$){let b$=z.get(R$);if(b$)X$[R$]=b$.get()}}let F$=X.slice(0,I);for(let r of N){let s=K(r);if(z.has(s)&&!(s in X$))throw new l(w,s,r);F$.push(s),P$[s]=r}F$.push(...X.slice(I+_$));let w$=!!(Object.keys(P$).length||Object.keys(X$).length);if(w$){if(m({add:P$,change:{},remove:X$,changed:w$}),X=F$,A(Q),Q.flags|=G,V===0)L()}return Object.values(X$)},deriveCollection(Z){return D$(D,Z)}};return D}function U$($){return C($,w)}function J$($,J){if(_(p,$,q$),J?.value!==void 0)F(p,J.value,J?.guard);let z={fn:$,value:J?.value,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:J?.equals??u,error:void 0};return{[Symbol.toStringTag]:p,get(){if(j)R(z,j);if(b(z),z.error)throw z.error;return e(p,z.value),z.value}}}function L$($){return C($,p)}function z$($,J){if(_(y,$,v),J?.value!==void 0)F(y,J.value,J?.guard);let z={fn:$,value:J?.value,sources:null,sourcesTail:null,sinks:null,sinksTail:null,flags:G,equals:J?.equals??u,controller:void 0,error:void 0};return{[Symbol.toStringTag]:y,get(){if(j)R(z,j);if(b(z),z.error)throw z.error;return e(y,z.value),z.value},isPending(){return!!z.controller},abort(){z.controller?.abort(),z.controller=void 0}}}function f$($){return C($,y)}function D$($,J){if(_(S,J),!u$($))throw TypeError(`[${S}] Invalid collection source: expected a List or Collection`);let z=v(J),X=new Map,U=(H)=>{let m=z?z$(async(P,D)=>{let Z=$.byKey(H)?.get();if(Z==null)return P;return J(Z,D)}):J$(()=>{let P=$.byKey(H)?.get();if(P==null)return;return J(P)});X.set(H,m)};function B(){let H=Array.from($.keys()),m=M.value;if(!B$(m,H)){let P=new Set(m),D=new Set(H);for(let Z of m)if(!D.has(Z))X.delete(Z);for(let Z of H)if(!P.has(Z))U(Z)}return H}let M={fn:B,value:[],flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:B$,error:void 0};function K(){if(M.sources){if(M.flags)M.value=d(B),M.flags=f}else if(b(M),M.error)throw M.error;return M.value}let W=Array.from($.keys());for(let H of W)U(H);M.value=W;let Q={[Symbol.toStringTag]:S,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let H of M.value){let m=X.get(H);if(m)yield m}},get length(){if(j)R(M,j);return K().length},keys(){if(j)R(M,j);return K().values()},get(){if(j)R(M,j);let H=K(),m=[];for(let P of H)try{let D=X.get(P)?.get();if(D!=null)m.push(D)}catch(D){if(!(D instanceof c))throw D}return m},at(H){return X.get(M.value[H])},byKey(H){return X.get(H)},keyAt(H){return M.value[H]},indexOfKey(H){return M.value.indexOf(H)},deriveCollection(H){return D$(Q,H)}};return Q}function c$($,J){let z=J?.value??[];if(z.length)F(S,z,Array.isArray);_(S,$);let X=new Map,U=[],B=0,M=J?.keyConfig,K=typeof M==="string"?()=>`${M}${B++}`:Y(M)?(Z)=>M(Z):()=>String(B++),W=J?.createItem??((Z,q)=>T(q));function Q(){let Z=[];for(let q of U)try{let N=X.get(q)?.get();if(N!=null)Z.push(N)}catch(N){if(!(N instanceof c))throw N}return Z}let H={fn:Q,value:z,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:()=>!1,error:void 0};function m(Z){if(!Z.changed)return;let q=!1;o(()=>{for(let N in Z.add){let x=Z.add[N];if(X.set(N,W(N,x)),!U.includes(N))U.push(N);q=!0}for(let N in Z.change){let x=X.get(N);if(x&&W$(x))x.set(Z.change[N])}for(let N in Z.remove){X.delete(N);let x=U.indexOf(N);if(x!==-1)U.splice(x,1);q=!0}if(q)H.sources=null,H.sourcesTail=null;H.flags=f,A(H),H.flags|=G})}for(let Z of z){let q=K(Z);X.set(q,W(q,Z)),U.push(q)}H.value=z,H.flags=G;function P(){if(!H.sinks)H.stop=$(m)}let D={[Symbol.toStringTag]:S,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of U){let q=X.get(Z);if(q)yield q}},get length(){if(j)P(),R(H,j);return U.length},keys(){if(j)P(),R(H,j);return U.values()},get(){if(j)P(),R(H,j);if(H.sources){if(H.flags)H.value=d(Q),H.flags=f}else if(b(H),H.error)throw H.error;return H.value},at(Z){return X.get(U[Z])},byKey(Z){return X.get(Z)},keyAt(Z){return U[Z]},indexOfKey(Z){return U.indexOf(Z)},deriveCollection(Z){return D$(D,Z)}};return D}function T$($){return C($,S)}function u$($){return U$($)||T$($)}function d$($){_("Effect",$);let J={fn:$,flags:G,sources:null,sourcesTail:null,cleanup:null},z=()=>{G$(J),J.fn=void 0,J.flags=f,J.sourcesTail=null,Q$(J)};if(E)i(E,z);return Y$(J),z}function t$($,J){if(!E)throw new m$("match");let{ok:z,err:X=console.error,nil:U}=J,B,M=!1,K=Array($.length);for(let Q=0;Q<$.length;Q++)try{K[Q]=$[Q].get()}catch(H){if(H instanceof c){M=!0;continue}if(!B)B=[];B.push(H instanceof Error?H:Error(String(H)))}let W;try{if(M)W=U?.();else if(B)W=X(B);else W=z(K)}catch(Q){X([Q instanceof Error?Q:Error(String(Q))])}if(typeof W==="function")return W;if(W instanceof Promise){let Q=E,H=new AbortController;i(Q,()=>H.abort()),W.then((m)=>{if(!H.signal.aborted&&typeof m==="function")i(Q,m)}).catch((m)=>{X([m instanceof Error?m:Error(String(m))])})}}function r$($,J){if(_(g,$,q$),J?.value!==void 0)F(g,J.value,J?.guard);let z={value:J?.value,sinks:null,sinksTail:null,equals:J?.equals??u,guard:J?.guard,stop:void 0};return{[Symbol.toStringTag]:g,get(){if(j){if(!z.sinks)z.stop=$((X)=>{F(g,X,z.guard),H$(z,X)});R(z,j)}return e(g,z.value),z.value}}}function s$($){return C($,g)}function l$($,J){let z=O($)||Array.isArray($),X=O(J)||Array.isArray(J);if(!z||!X){let m=!Object.is($,J);return{changed:m,add:m&&X?J:{},change:{},remove:m&&z?$:{}}}let U=new WeakSet,B={},M={},K={},W=!1,Q=Object.keys($),H=Object.keys(J);for(let m of H)if(m in $){if(!t($[m],J[m],U))M[m]=J[m],W=!0}else B[m]=J[m],W=!0;for(let m of Q)if(!(m in J))K[m]=void 0,W=!0;return{add:B,change:M,remove:K,changed:W}}function M$($,J){F(k,$,O);let z=new Map,X=(W,Q)=>{if(F(`${k} for key "${W}"`,Q),Array.isArray(Q))z.set(W,$$(Q));else if(O(Q))z.set(W,M$(Q));else z.set(W,T(Q))},U=()=>{let W={};return z.forEach((Q,H)=>{W[H]=Q.get()}),W},B={fn:U,value:$,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:t,error:void 0},M=(W)=>{let Q=!1;for(let H in W.add)X(H,W.add[H]),Q=!0;if(Object.keys(W.change).length)o(()=>{for(let H in W.change){let m=W.change[H];F(`${k} for key "${H}"`,m);let P=z.get(H);if(P)if(O(m)!==K$(P))X(H,m),Q=!0;else P.set(m)}});for(let H in W.remove)z.delete(H),Q=!0;if(Q)B.sources=null,B.sourcesTail=null;return W.changed};for(let W of Object.keys($))X(W,$[W]);let K={[Symbol.toStringTag]:k,[Symbol.isConcatSpreadable]:!1,*[Symbol.iterator](){for(let W of Array.from(z.keys())){let Q=z.get(W);if(Q)yield[W,Q]}},keys(){if(j){if(!B.sinks&&J?.watched)B.stop=J.watched();R(B,j)}return z.keys()},byKey(W){return z.get(W)},get(){if(j){if(!B.sinks&&J?.watched)B.stop=J.watched();R(B,j)}if(B.sources){if(B.flags)B.value=d(U),B.flags=f}else if(b(B),B.error)throw B.error;return B.value},set(W){let Q=B.flags&G?U():B.value,H=l$(Q,W);if(M(H)){if(A(B),B.flags|=G,V===0)L()}},update(W){K.set(W(K.get()))},add(W,Q){if(z.has(W))throw new l(k,W,Q);if(X(W,Q),B.sources=null,B.sourcesTail=null,A(B),B.flags|=G,V===0)L();return W},remove(W){if(z.delete(W)){if(B.sources=null,B.sourcesTail=null,A(B),B.flags|=G,V===0)L()}}};return new Proxy(K,{get(W,Q){if(Q in W){let H=Reflect.get(W,Q);return Y(H)?H.bind(W):H}if(typeof Q!=="symbol")return W.byKey(Q)},has(W,Q){if(Q in W)return!0;return W.byKey(String(Q))!==void 0},ownKeys(W){return Array.from(W.keys())},getOwnPropertyDescriptor(W,Q){if(Q in W)return Reflect.getOwnPropertyDescriptor(W,Q);if(typeof Q==="symbol")return;let H=W.byKey(String(Q));return H?{enumerable:!0,configurable:!0,writable:!0,value:H}:void 0}})}function K$($){return C($,k)}function i$($,J){return v($)?z$($,J):J$($,J)}function o$($){if(O$($))return $;if($==null)throw new a("createSignal",$);if(v($))return z$($);if(Y($))return J$($);if(I$($))return $$($);if(O($))return M$($);return T($)}function n$($){if(E$($))return $;if($==null||Y($)||O$($))throw new a("createMutableSignal",$);if(I$($))return $$($);if(O($))return M$($);return T($)}function a$($){return L$($)||f$($)}function O$($){let J=[h,p,y,g,w,S,k],z=Object.prototype.toString.call($).slice(8,-1);return J.includes(z)}function E$($){return W$($)||K$($)||U$($)}export{j$ as valueString,d as untrack,t$ as match,f$ as isTask,K$ as isStore,W$ as isState,O$ as isSignal,s$ as isSensor,O as isRecord,C as isObjectOfType,E$ as isMutableSignal,L$ as isMemo,U$ as isList,Y as isFunction,t as isEqual,a$ as isComputed,T$ as isCollection,v as isAsyncFunction,z$ as createTask,M$ as createStore,T as createState,o$ as createSignal,r$ as createSensor,k$ as createScope,n$ as createMutableSignal,J$ as createMemo,$$ as createList,d$ as createEffect,i$ as createComputed,c$ as createCollection,o as batch,c as UnsetSignalValueError,S$ as SKIP_EQUALITY,m$ as RequiredOwnerError,C$ as NullishSignalValueError,a as InvalidSignalValueError,V$ as InvalidCallbackError,n as CircularDependencyError};
package/index.ts CHANGED
@@ -1,114 +1,87 @@
1
1
  /**
2
2
  * @name Cause & Effect
3
- * @version 0.17.2
3
+ * @version 0.18.0
4
4
  * @author Esther Brunner
5
5
  */
6
6
 
7
+ export {
8
+ CircularDependencyError,
9
+ type Guard,
10
+ InvalidCallbackError,
11
+ InvalidSignalValueError,
12
+ NullishSignalValueError,
13
+ RequiredOwnerError,
14
+ UnsetSignalValueError,
15
+ } from './src/errors'
16
+ export {
17
+ batch,
18
+ type Cleanup,
19
+ type ComputedOptions,
20
+ createScope,
21
+ type EffectCallback,
22
+ type MemoCallback,
23
+ type Signal,
24
+ type SignalOptions,
25
+ SKIP_EQUALITY,
26
+ type TaskCallback,
27
+ untrack,
28
+ } from './src/graph'
7
29
  export {
8
30
  type Collection,
9
31
  type CollectionCallback,
10
- type CollectionSource,
11
- DerivedCollection,
32
+ type CollectionOptions,
33
+ createCollection,
34
+ type DeriveCollectionCallback,
12
35
  isCollection,
13
- TYPE_COLLECTION,
14
- } from './src/classes/collection'
36
+ } from './src/nodes/collection'
15
37
  export {
16
- type Computed,
17
- createComputed,
18
- isComputed,
19
- isMemoCallback,
20
- isTaskCallback,
21
- Memo,
22
- type MemoCallback,
23
- Task,
24
- type TaskCallback,
25
- TYPE_COMPUTED,
26
- } from './src/classes/computed'
38
+ createEffect,
39
+ type MatchHandlers,
40
+ type MaybePromise,
41
+ match,
42
+ } from './src/nodes/effect'
27
43
  export {
28
- type ArrayToRecord,
44
+ createList,
45
+ type DiffResult,
46
+ isEqual,
29
47
  isList,
30
48
  type KeyConfig,
31
- List,
32
- TYPE_LIST,
33
- } from './src/classes/list'
34
- export { isRef, Ref, TYPE_REF } from './src/classes/ref'
35
- export { isState, State, TYPE_STATE } from './src/classes/state'
49
+ type List,
50
+ type ListOptions,
51
+ } from './src/nodes/list'
52
+ export { createMemo, isMemo, type Memo } from './src/nodes/memo'
53
+ export {
54
+ createSensor,
55
+ isSensor,
56
+ type Sensor,
57
+ type SensorCallback,
58
+ } from './src/nodes/sensor'
59
+ export {
60
+ createState,
61
+ isState,
62
+ type State,
63
+ type UpdateCallback,
64
+ } from './src/nodes/state'
36
65
  export {
37
- BaseStore,
38
66
  createStore,
39
67
  isStore,
40
68
  type Store,
41
- TYPE_STORE,
42
- } from './src/classes/store'
43
- export {
44
- type DiffResult,
45
- diff,
46
- isEqual,
47
- type UnknownArray,
48
- type UnknownRecord,
49
- } from './src/diff'
50
- export {
51
- createEffect,
52
- type EffectCallback,
53
- type MaybeCleanup,
54
- } from './src/effect'
55
- export {
56
- CircularDependencyError,
57
- createError,
58
- DuplicateKeyError,
59
- type Guard,
60
- guardMutableSignal,
61
- InvalidCallbackError,
62
- InvalidCollectionSourceError,
63
- InvalidSignalValueError,
64
- NullishSignalValueError,
65
- ReadonlySignalError,
66
- validateCallback,
67
- validateSignalValue,
68
- } from './src/errors'
69
- export { type MatchHandlers, match } from './src/match'
70
- export { type ResolveResult, resolve } from './src/resolve'
69
+ type StoreOptions,
70
+ } from './src/nodes/store'
71
+ export { createTask, isTask, type Task } from './src/nodes/task'
71
72
  export {
73
+ createComputed,
74
+ createMutableSignal,
72
75
  createSignal,
76
+ isComputed,
73
77
  isMutableSignal,
74
78
  isSignal,
75
- type Signal,
76
- type SignalValues,
77
- type UnknownSignalRecord,
79
+ type MutableSignal,
78
80
  } from './src/signal'
79
81
  export {
80
- batchSignalWrites,
81
- type Cleanup,
82
- createWatcher,
83
- flushPendingReactions,
84
- HOOK_ADD,
85
- HOOK_CHANGE,
86
- HOOK_CLEANUP,
87
- HOOK_REMOVE,
88
- HOOK_SORT,
89
- HOOK_WATCH,
90
- type Hook,
91
- type CleanupHook,
92
- type WatchHook,
93
- type HookCallback,
94
- type HookCallbacks,
95
- isHandledHook,
96
- notifyWatchers,
97
- subscribeActiveWatcher,
98
- trackSignalReads,
99
- triggerHook,
100
- UNSET,
101
- type Watcher,
102
- } from './src/system'
103
- export {
104
- isAbortError,
105
82
  isAsyncFunction,
106
83
  isFunction,
107
- isNumber,
108
84
  isObjectOfType,
109
85
  isRecord,
110
- isRecordOrArray,
111
- isString,
112
- isSymbol,
113
86
  valueString,
114
87
  } from './src/util'
package/package.json CHANGED
@@ -1,18 +1,21 @@
1
1
  {
2
2
  "name": "@zeix/cause-effect",
3
- "version": "0.17.2",
3
+ "version": "0.18.0",
4
4
  "author": "Esther Brunner",
5
+ "type": "module",
5
6
  "main": "index.js",
6
7
  "module": "index.ts",
8
+ "types": "types/index.d.ts",
7
9
  "devDependencies": {
8
10
  "@biomejs/biome": "2.1.4",
9
11
  "@types/bun": "latest",
12
+ "mitata": "^1.0.34",
10
13
  "random": "^5.4.1"
11
14
  },
12
15
  "peerDependencies": {
13
16
  "typescript": "^5.6.3"
14
17
  },
15
- "description": "Cause & Effect - reactive state management with signals.",
18
+ "description": "Cause & Effect - fine-grained reactive state management library.",
16
19
  "license": "MIT",
17
20
  "keywords": [
18
21
  "Cause & Effect",
@@ -24,10 +27,10 @@
24
27
  "access": "public"
25
28
  },
26
29
  "scripts": {
27
- "build": "bunx tsc && bun build index.ts --outdir ./ --minify && bun build index.ts --outfile index.dev.js",
30
+ "build": "bunx tsc --project tsconfig.build.json && bun build index.ts --outdir ./ --minify && bun build index.ts --outfile index.dev.js",
31
+ "build:next": "bunx tsc --project tsconfig.build.next.json && bun build next.ts --outdir ./ --minify && bun build next.ts --outfile next.dev.js",
32
+ "bench": "bun run bench/reactivity.bench.ts",
28
33
  "test": "bun test",
29
34
  "lint": "bunx biome lint --write"
30
- },
31
- "type": "module",
32
- "types": "types/index.d.ts"
35
+ }
33
36
  }
package/src/errors.ts CHANGED
@@ -1,119 +1,167 @@
1
- import { isMutableSignal, type MutableSignal } from './signal'
2
- import { UNSET } from './system'
3
- import { isFunction, isSymbol, valueString } from './util'
1
+ import { isFunction, valueString } from './util'
4
2
 
5
3
  /* === Types === */
6
4
 
7
- type Guard<T> = (value: unknown) => value is T
8
-
9
- /* === Classes === */
10
-
5
+ /**
6
+ * A type guard function that validates whether an unknown value is of type T.
7
+ * Used to ensure type safety when updating signals.
8
+ *
9
+ * @template T - The type to guard against
10
+ * @param value - The value to check
11
+ * @returns True if the value is of type T
12
+ */
13
+ type Guard<T extends {}> = (value: unknown) => value is T
14
+
15
+ /* === Error Classes === */
16
+
17
+ /**
18
+ * Error thrown on re-entrance on an already running function.
19
+ */
11
20
  class CircularDependencyError extends Error {
21
+ /**
22
+ * Constructs a new CircularDependencyError.
23
+ *
24
+ * @param where - The location where the error occurred.
25
+ */
12
26
  constructor(where: string) {
13
- super(`Circular dependency detected in ${where}`)
27
+ super(`[${where}] Circular dependency detected`)
14
28
  this.name = 'CircularDependencyError'
15
29
  }
16
30
  }
17
31
 
18
- class DuplicateKeyError extends Error {
19
- constructor(where: string, key: string, value?: unknown) {
20
- super(
21
- `Could not add ${where} key "${key}"${
22
- value ? ` with value ${valueString(value)}` : ''
23
- } because it already exists`,
24
- )
25
- this.name = 'DuplicateKeyError'
32
+ /**
33
+ * Error thrown when a signal value is null or undefined.
34
+ */
35
+ class NullishSignalValueError extends TypeError {
36
+ /**
37
+ * Constructs a new NullishSignalValueError.
38
+ *
39
+ * @param where - The location where the error occurred.
40
+ */
41
+ constructor(where: string) {
42
+ super(`[${where}] Signal value cannot be null or undefined`)
43
+ this.name = 'NullishSignalValueError'
26
44
  }
27
45
  }
28
46
 
29
- class InvalidCallbackError extends TypeError {
30
- constructor(where: string, value: unknown) {
31
- super(`Invalid ${where} callback ${valueString(value)}`)
32
- this.name = 'InvalidCallbackError'
47
+ /**
48
+ * Error thrown when a signal is read before it has a value.
49
+ */
50
+ class UnsetSignalValueError extends Error {
51
+ /**
52
+ * Constructs a new UnsetSignalValueError.
53
+ *
54
+ * @param where - The location where the error occurred.
55
+ */
56
+ constructor(where: string) {
57
+ super(`[${where}] Signal value is unset`)
58
+ this.name = 'UnsetSignalValueError'
33
59
  }
34
60
  }
35
61
 
36
- class InvalidCollectionSourceError extends TypeError {
62
+ /**
63
+ * Error thrown when a signal value is invalid.
64
+ */
65
+ class InvalidSignalValueError extends TypeError {
66
+ /**
67
+ * Constructs a new InvalidSignalValueError.
68
+ *
69
+ * @param where - The location where the error occurred.
70
+ * @param value - The invalid value.
71
+ */
37
72
  constructor(where: string, value: unknown) {
38
- super(`Invalid ${where} source ${valueString(value)}`)
39
- this.name = 'InvalidCollectionSourceError'
40
- }
41
- }
42
-
43
- class InvalidHookError extends TypeError {
44
- constructor(where: string, type: string) {
45
- super(`Invalid hook "${type}" in ${where}`)
46
- this.name = 'InvalidHookError'
73
+ super(`[${where}] Signal value ${valueString(value)} is invalid`)
74
+ this.name = 'InvalidSignalValueError'
47
75
  }
48
76
  }
49
77
 
50
- class InvalidSignalValueError extends TypeError {
78
+ /**
79
+ * Error thrown when a callback is invalid.
80
+ */
81
+ class InvalidCallbackError extends TypeError {
82
+ /**
83
+ * Constructs a new InvalidCallbackError.
84
+ *
85
+ * @param where - The location where the error occurred.
86
+ * @param value - The invalid value.
87
+ */
51
88
  constructor(where: string, value: unknown) {
52
- super(`Invalid signal value ${valueString(value)} in ${where}`)
53
- this.name = 'InvalidSignalValueError'
89
+ super(`[${where}] Callback ${valueString(value)} is invalid`)
90
+ this.name = 'InvalidCallbackError'
54
91
  }
55
92
  }
56
93
 
57
- class NullishSignalValueError extends TypeError {
94
+ /**
95
+ * Error thrown when an API requiring an owner is called without one.
96
+ */
97
+ class RequiredOwnerError extends Error {
98
+ /**
99
+ * Constructs a new RequiredOwnerError.
100
+ *
101
+ * @param where - The location where the error occurred.
102
+ */
58
103
  constructor(where: string) {
59
- super(`Nullish signal values are not allowed in ${where}`)
60
- this.name = 'NullishSignalValueError'
104
+ super(`[${where}] Active owner is required`)
105
+ this.name = 'RequiredOwnerError'
61
106
  }
62
107
  }
63
108
 
64
- class ReadonlySignalError extends Error {
65
- constructor(what: string, value: unknown) {
109
+ class DuplicateKeyError extends Error {
110
+ constructor(where: string, key: string, value?: unknown) {
66
111
  super(
67
- `Could not set ${what} to ${valueString(value)} because signal is read-only`,
112
+ `[${where}] Could not add key "${key}"${
113
+ value ? ` with value ${JSON.stringify(value)}` : ''
114
+ } because it already exists`,
68
115
  )
69
- this.name = 'ReadonlySignalError'
116
+ this.name = 'DuplicateKeyError'
70
117
  }
71
118
  }
72
119
 
73
- /* === Functions === */
120
+ /* === Validation Functions === */
74
121
 
75
- const createError = /*#__PURE__*/ (reason: unknown): Error =>
76
- reason instanceof Error ? reason : Error(String(reason))
77
-
78
- const validateCallback = (
122
+ function validateSignalValue<T extends {}>(
79
123
  where: string,
80
124
  value: unknown,
81
- guard: (value: unknown) => boolean = isFunction,
82
- ): void => {
83
- if (!guard(value)) throw new InvalidCallbackError(where, value)
125
+ guard?: Guard<T>,
126
+ ): asserts value is T {
127
+ if (value == null) throw new NullishSignalValueError(where)
128
+ if (guard && !guard(value)) throw new InvalidSignalValueError(where, value)
84
129
  }
85
130
 
86
- const validateSignalValue = (
131
+ function validateReadValue<T extends {}>(
87
132
  where: string,
88
- value: unknown,
89
- guard: (value: unknown) => boolean = () =>
90
- !(isSymbol(value) && value !== UNSET) || isFunction(value),
91
- ): void => {
92
- if (value == null) throw new NullishSignalValueError(where)
93
- if (!guard(value)) throw new InvalidSignalValueError(where, value)
133
+ value: T | null | undefined,
134
+ ): asserts value is T {
135
+ if (value == null) throw new UnsetSignalValueError(where)
94
136
  }
95
137
 
96
- const guardMutableSignal = <T extends {}>(
97
- what: string,
138
+ function validateCallback(
139
+ where: string,
140
+ value: unknown,
141
+ ): asserts value is (...args: unknown[]) => unknown
142
+ function validateCallback<T>(
143
+ where: string,
98
144
  value: unknown,
99
- signal: unknown,
100
- ): signal is MutableSignal<T> => {
101
- if (!isMutableSignal(signal)) throw new ReadonlySignalError(what, value)
102
- return true
145
+ guard: (value: unknown) => value is T,
146
+ ): asserts value is T
147
+ function validateCallback(
148
+ where: string,
149
+ value: unknown,
150
+ guard: (value: unknown) => boolean = isFunction,
151
+ ): void {
152
+ if (!guard(value)) throw new InvalidCallbackError(where, value)
103
153
  }
104
154
 
105
155
  export {
106
156
  type Guard,
107
157
  CircularDependencyError,
108
- DuplicateKeyError,
109
- InvalidCallbackError,
110
- InvalidCollectionSourceError,
111
- InvalidHookError,
112
- InvalidSignalValueError,
113
158
  NullishSignalValueError,
114
- ReadonlySignalError,
115
- createError,
116
- validateCallback,
159
+ InvalidSignalValueError,
160
+ UnsetSignalValueError,
161
+ InvalidCallbackError,
162
+ RequiredOwnerError,
163
+ DuplicateKeyError,
117
164
  validateSignalValue,
118
- guardMutableSignal,
165
+ validateReadValue,
166
+ validateCallback,
119
167
  }