@zeix/cause-effect 0.17.3 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.ai-context.md +169 -227
  2. package/.cursorrules +41 -35
  3. package/.github/copilot-instructions.md +176 -116
  4. package/ARCHITECTURE.md +276 -0
  5. package/CHANGELOG.md +29 -0
  6. package/CLAUDE.md +201 -143
  7. package/GUIDE.md +298 -0
  8. package/README.md +246 -193
  9. package/REQUIREMENTS.md +100 -0
  10. package/bench/reactivity.bench.ts +577 -0
  11. package/context7.json +4 -0
  12. package/examples/events-sensor.ts +187 -0
  13. package/examples/selector-sensor.ts +173 -0
  14. package/index.dev.js +1390 -1008
  15. package/index.js +1 -1
  16. package/index.ts +60 -74
  17. package/package.json +5 -2
  18. package/skills/changelog-keeper/SKILL.md +59 -0
  19. package/skills/changelog-keeper/agents/openai.yaml +4 -0
  20. package/src/errors.ts +118 -74
  21. package/src/graph.ts +612 -0
  22. package/src/nodes/collection.ts +512 -0
  23. package/src/nodes/effect.ts +149 -0
  24. package/src/nodes/list.ts +589 -0
  25. package/src/nodes/memo.ts +148 -0
  26. package/src/nodes/sensor.ts +149 -0
  27. package/src/nodes/state.ts +135 -0
  28. package/src/nodes/store.ts +378 -0
  29. package/src/nodes/task.ts +174 -0
  30. package/src/signal.ts +112 -66
  31. package/src/util.ts +26 -57
  32. package/test/batch.test.ts +96 -62
  33. package/test/benchmark.test.ts +473 -487
  34. package/test/collection.test.ts +456 -707
  35. package/test/effect.test.ts +293 -696
  36. package/test/list.test.ts +335 -592
  37. package/test/memo.test.ts +574 -0
  38. package/test/regression.test.ts +156 -0
  39. package/test/scope.test.ts +191 -0
  40. package/test/sensor.test.ts +454 -0
  41. package/test/signal.test.ts +220 -213
  42. package/test/state.test.ts +217 -265
  43. package/test/store.test.ts +346 -446
  44. package/test/task.test.ts +529 -0
  45. package/test/untrack.test.ts +167 -0
  46. package/types/index.d.ts +13 -15
  47. package/types/src/errors.d.ts +73 -17
  48. package/types/src/graph.d.ts +218 -0
  49. package/types/src/nodes/collection.d.ts +69 -0
  50. package/types/src/nodes/effect.d.ts +48 -0
  51. package/types/src/nodes/list.d.ts +66 -0
  52. package/types/src/nodes/memo.d.ts +63 -0
  53. package/types/src/nodes/sensor.d.ts +81 -0
  54. package/types/src/nodes/state.d.ts +78 -0
  55. package/types/src/nodes/store.d.ts +51 -0
  56. package/types/src/nodes/task.d.ts +79 -0
  57. package/types/src/signal.d.ts +43 -29
  58. package/types/src/util.d.ts +9 -16
  59. package/archive/benchmark.ts +0 -683
  60. package/archive/collection.ts +0 -253
  61. package/archive/composite.ts +0 -85
  62. package/archive/computed.ts +0 -195
  63. package/archive/list.ts +0 -483
  64. package/archive/memo.ts +0 -139
  65. package/archive/state.ts +0 -90
  66. package/archive/store.ts +0 -298
  67. package/archive/task.ts +0 -189
  68. package/src/classes/collection.ts +0 -245
  69. package/src/classes/computed.ts +0 -349
  70. package/src/classes/list.ts +0 -343
  71. package/src/classes/ref.ts +0 -70
  72. package/src/classes/state.ts +0 -102
  73. package/src/classes/store.ts +0 -262
  74. package/src/diff.ts +0 -138
  75. package/src/effect.ts +0 -93
  76. package/src/match.ts +0 -45
  77. package/src/resolve.ts +0 -49
  78. package/src/system.ts +0 -257
  79. package/test/computed.test.ts +0 -1108
  80. package/test/diff.test.ts +0 -955
  81. package/test/match.test.ts +0 -388
  82. package/test/ref.test.ts +0 -353
  83. package/test/resolve.test.ts +0 -154
  84. package/types/src/classes/collection.d.ts +0 -45
  85. package/types/src/classes/computed.d.ts +0 -94
  86. package/types/src/classes/list.d.ts +0 -43
  87. package/types/src/classes/ref.d.ts +0 -35
  88. package/types/src/classes/state.d.ts +0 -49
  89. package/types/src/classes/store.d.ts +0 -52
  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 -78
package/index.js CHANGED
@@ -1 +1 @@
1
- var M,V=new WeakMap,U$=new WeakMap,Y$=new WeakMap,s=new Set,B$=0,Z=Symbol(),Y=($,G)=>{let J=new Set,z=$;return z.run=()=>{let Q=M;M=z;try{G()}finally{M=Q}},z.onCleanup=(Q)=>{J.add(Q)},z.stop=()=>{try{for(let Q of J)Q()}finally{J.clear()}},z},q$=($)=>{let G=M;M=void 0;try{$()}finally{M=G}},K=($,G,J)=>{if(U$.set($,G),J)Y$.set($,J)},q=($)=>{if(!M||V.get($)?.has(M))return!1;let G=M;if(!V.has($))V.set($,new Set);let J=V.get($);if(j$(J),!J.size){let z=U$.get($);if(z)q$(z)}return J.add(G),G.onCleanup(()=>{if(J.delete(G),!J.size){let z=Y$.get($);if(z)q$(z)}}),!0};var C=($)=>{let G=V.get($);if(!G)return;for(let J of G)J.stop();G.clear()},x=($)=>{let G=V.get($);if(!G?.size)return!1;for(let J of G)if(B$)s.add(J);else J();return!0};var y=()=>{while(s.size){let $=Array.from(s);s.clear();for(let G of $)G()}},d=($)=>{B$++;try{$()}finally{y(),B$--}},C$=($,G)=>{let J=M;M=$||void 0;try{G()}finally{M=J}};var l=($)=>typeof $==="string",a=($)=>typeof $==="number",E=($)=>typeof $==="symbol",H=($)=>typeof $==="function",j=($)=>H($)&&$.constructor.name==="AsyncFunction",P$=($)=>H($)&&$.constructor.name!=="AsyncFunction",A$=($)=>$!=null&&typeof $==="object",I=($,G)=>Object.prototype.toString.call($)===`[object ${G}]`,L=($)=>I($,"Object"),e=($)=>L($)||Array.isArray($),H$=($,G=(J)=>J!=null)=>Array.isArray($)&&$.every(G);var T=($)=>$ instanceof DOMException&&$.name==="AbortError",_=($)=>l($)?`"${$}"`:!!$&&typeof $==="object"?JSON.stringify($):String($);var N=($,G,J)=>{if(Object.is($,G))return!0;if(typeof $!==typeof G)return!1;if(!A$($)||!A$(G))return!1;if(!J)J=new WeakSet;if(J.has($)||J.has(G))throw new R("isEqual");J.add($),J.add(G);try{if(Array.isArray($)&&Array.isArray(G)){if($.length!==G.length)return!1;for(let z=0;z<$.length;z++)if(!N($[z],G[z],J))return!1;return!0}if(Array.isArray($)!==Array.isArray(G))return!1;if(L($)&&L(G)){let z=Object.keys($),Q=Object.keys(G);if(z.length!==Q.length)return!1;for(let X of z){if(!(X in G))return!1;if(!N($[X],G[X],J))return!1}return!0}return!1}finally{J.delete($),J.delete(G)}},k=($,G)=>{let J=e($),z=e(G);if(!J||!z){let A=!Object.is($,G);return{changed:A,add:A&&z?G:{},change:{},remove:A&&J?$:{}}}let Q=new WeakSet,X={},B={},F={},g=Object.keys($),t=Object.keys(G),U=new Set([...g,...t]);for(let A of U){let S=A in $,b=A in G;if(!S&&b){X[A]=G[A];continue}else if(S&&!b){F[A]=Z;continue}let V$=$[A],R$=G[A];if(!N(V$,R$,Q))B[A]=R$}return{add:X,change:B,remove:F,changed:!!(Object.keys(X).length||Object.keys(B).length||Object.keys(F).length)}};var $$="Computed";class v{#G;#$;#J;#z=!0;#Q=!1;#X;constructor($,G){m(this.constructor.name,$,G$);let J=G?.initialValue??Z;if(D(this.constructor.name,J,G?.guard),this.#G=$,this.#$=J,G?.watched)K(this,G.watched,G.unwatched)}#Z(){return this.#X||=Y(()=>{if(this.#z=!0,!x(this))this.#X?.stop()},()=>{if(this.#Q)throw new R("memo");let $;this.#Q=!0;try{$=this.#G(this.#$)}catch(G){this.#$=Z,this.#J=P(G),this.#Q=!1;return}if($==null||Z===$)this.#$=Z,this.#J=void 0;else this.#$=$,this.#J=void 0,this.#z=!1;this.#Q=!1}),this.#X.onCleanup(()=>{this.#X=void 0}),this.#X}get[Symbol.toStringTag](){return $$}get(){if(q(this),y(),this.#z)this.#Z().run();if(this.#J)throw this.#J;return this.#$}}class h{#G;#$;#J;#z=!0;#Q=!1;#X=!1;#Z;#x;constructor($,G){m(this.constructor.name,$,J$);let J=G?.initialValue??Z;if(D(this.constructor.name,J,G?.guard),this.#G=$,this.#$=J,G?.watched)K(this,G.watched,G.unwatched)}#B(){if(!this.#Z){let $=(Q)=>{if(!N(Q,this.#$))this.#$=Q,this.#X=!0;this.#J=void 0,this.#z=!1},G=()=>{this.#X=Z!==this.#$,this.#$=Z,this.#J=void 0},J=(Q)=>{let X=P(Q);this.#X=!this.#J||X.name!==this.#J.name||X.message!==this.#J.message,this.#$=Z,this.#J=X},z=(Q)=>(X)=>{if(this.#Q=!1,this.#x=void 0,Q(X),this.#X&&!x(this))this.#Z?.stop()};this.#Z=Y(()=>{if(this.#z=!0,this.#x?.abort(),!x(this))this.#Z?.stop()},()=>{if(this.#Q)throw new R("task");if(this.#X=!1,this.#x)return this.#$;this.#x=new AbortController,this.#x.signal.addEventListener("abort",()=>{this.#Q=!1,this.#x=void 0,this.#B().run()},{once:!0});let Q;this.#Q=!0;try{Q=this.#G(this.#$,this.#x.signal)}catch(X){if(T(X))G();else J(X);this.#Q=!1;return}if(Q instanceof Promise)Q.then(z($),z(J));else if(Q==null||Z===Q)G();else $(Q);this.#Q=!1}),this.#Z.onCleanup(()=>{this.#x?.abort(),this.#x=void 0,this.#Z=void 0})}return this.#Z}get[Symbol.toStringTag](){return $$}get(){if(q(this),y(),this.#z)this.#B().run();if(this.#J)throw this.#J;return this.#$}}var D$=($,G)=>j($)?new h($,G):new v($,G),F$=($)=>I($,$$),G$=($)=>P$($)&&$.length<2,J$=($)=>j($)&&$.length<3;var f="State";class W{#G;constructor($,G){if(D(f,$,G?.guard),this.#G=$,G?.watched)K(this,G.watched,G.unwatched)}get[Symbol.toStringTag](){return f}get(){return q(this),this.#G}set($){if(D(f,$),N(this.#G,$))return;if(this.#G=$,x(this),Z===this.#G)C(this)}update($){m(`${f} update`,$),this.set($(this.#G))}}var z$=($)=>I($,f);var O="List";class o{#G=new Map;#$=[];#J;#z;constructor($,G){D(O,$,Array.isArray);let J=0,z=G?.keyConfig;if(this.#J=l(z)?()=>`${z}${J++}`:H(z)?(Q)=>z(Q):()=>String(J++),this.#z=(Q,X)=>{return D(`${O} item for key "${Q}"`,X,G?.guard),!0},this.#Z({add:this.#Q($),change:{},remove:{},changed:!0}),G?.watched)K(this,G.watched,G.unwatched)}#Q($){let G={};for(let J=0;J<$.length;J++){let z=$[J];if(z===void 0)continue;let Q=this.#$[J];if(!Q)Q=this.#J(z),this.#$[J]=Q;G[Q]=z}return G}#X($,G){if(!this.#z($,G))return!1;return this.#G.set($,new W(G)),!0}#Z($){if(Object.keys($.add).length)for(let G in $.add)this.#X(G,$.add[G]);if(Object.keys($.change).length)d(()=>{for(let G in $.change){let J=$.change[G];if(!this.#z(G,J))continue;let z=this.#G.get(G);if(u(`${O} item "${G}"`,J,z))z.set(J)}});if(Object.keys($.remove).length){for(let G in $.remove){this.#G.delete(G);let J=this.#$.indexOf(G);if(J!==-1)this.#$.splice(J,1)}this.#$=this.#$.filter(()=>!0)}return $.changed}get#x(){return this.#$.map(($)=>this.#G.get($)?.get()).filter(($)=>$!==void 0)}get[Symbol.toStringTag](){return O}get[Symbol.isConcatSpreadable](){return!0}*[Symbol.iterator](){for(let $ of this.#$){let G=this.#G.get($);if(G)yield G}}get length(){return q(this),this.#$.length}get(){return q(this),this.#x}set($){if(Z===$){this.#G.clear(),x(this),C(this);return}let G=k(this.#Q(this.#x),this.#Q($));if(this.#Z(G))x(this)}update($){this.set($(this.get()))}at($){return this.#G.get(this.#$[$])}keys(){return q(this),this.#$.values()}byKey($){return this.#G.get($)}keyAt($){return this.#$[$]}indexOfKey($){return this.#$.indexOf($)}add($){let G=this.#J($);if(this.#G.has(G))throw new w("store",G,$);if(!this.#$.includes(G))this.#$.push(G);if(this.#X(G,$))x(this);return G}remove($){let G=a($)?this.#$[$]:$;if(this.#G.delete(G)){let z=a($)?$:this.#$.indexOf(G);if(z>=0)this.#$.splice(z,1);this.#$=this.#$.filter(()=>!0),x(this)}}sort($){let J=this.#$.map((z)=>[z,this.#G.get(z)?.get()]).sort(H($)?(z,Q)=>$(z[1],Q[1]):(z,Q)=>String(z[1]).localeCompare(String(Q[1]))).map(([z])=>z);if(!N(this.#$,J))this.#$=J,x(this)}splice($,G,...J){let z=this.#$.length,Q=$<0?Math.max(0,z+$):Math.min($,z),X=Math.max(0,Math.min(G??Math.max(0,z-Math.max(0,Q)),z-Q)),B={},F={};for(let U=0;U<X;U++){let A=Q+U,S=this.#$[A];if(S){let b=this.#G.get(S);if(b)F[S]=b.get()}}let g=this.#$.slice(0,Q);for(let U of J){let A=this.#J(U);g.push(A),B[A]=U}g.push(...this.#$.slice(Q+X));let t=!!(Object.keys(B).length||Object.keys(F).length);if(t)this.#Z({add:B,change:{},remove:F,changed:t}),this.#$=g.filter(()=>!0),x(this);return Object.values(F)}deriveCollection($,G){return new i(this,$,G)}}var n=($)=>I($,O);var p="Store";class I${#G=new Map;constructor($,G){if(D(p,$,G?.guard??L),this.#Q({add:$,change:{},remove:{},changed:!0}),G?.watched)K(this,G.watched,G.unwatched)}get#$(){let $={};for(let[G,J]of this.#G.entries())$[G]=J.get();return $}#J($,G){return D(`${p} for key "${$}"`,G),!0}#z($,G){if(!this.#J($,G))return!1;return this.#G.set($,m$(G)),!0}#Q($){if(Object.keys($.add).length)for(let G in $.add)this.#z(G,$.add[G]);if(Object.keys($.change).length)d(()=>{for(let G in $.change){let J=$.change[G];if(!this.#J(G,J))continue;let z=this.#G.get(G);if(u(`list item "${G}"`,J,z))z.set(J)}});if(Object.keys($.remove).length)for(let G in $.remove)this.remove(G);return $.changed}get[Symbol.toStringTag](){return p}get[Symbol.isConcatSpreadable](){return!1}*[Symbol.iterator](){for(let[$,G]of this.#G.entries())yield[$,G]}keys(){return q(this),this.#G.keys()}byKey($){return this.#G.get($)}get(){return q(this),this.#$}set($){if(Z===$){this.#G.clear(),x(this),C(this);return}if(this.#Q(k(this.#$,$)))x(this)}update($){this.set($(this.get()))}add($,G){if(this.#G.has($))throw new w(p,$,G);if(this.#z($,G))x(this);return $}remove($){if(this.#G.delete($))x(this)}}var Q$=($,G)=>{let J=new I$($,G);return new Proxy(J,{get(z,Q){if(Q in z){let X=Reflect.get(z,Q);return H(X)?X.bind(z):X}if(!E(Q))return z.byKey(Q)},has(z,Q){if(Q in z)return!0;return z.byKey(String(Q))!==void 0},ownKeys(z){return Array.from(z.keys())},getOwnPropertyDescriptor(z,Q){if(Q in z)return Reflect.getOwnPropertyDescriptor(z,Q);if(E(Q))return;let X=z.byKey(String(Q));return X?{enumerable:!0,configurable:!0,writable:!0,value:X}:void 0}})},X$=($)=>I($,p);var E$=($)=>z$($)||F$($)||X$($),K$=($)=>z$($)||X$($)||n($);function T$($){if(G$($))return new v($);if(J$($))return new h($);if(H$($))return new o($);if(L($))return Q$($);return new W($)}function m$($){if(H$($))return new o($);if(L($))return Q$($);return new W($)}class R extends Error{constructor($){super(`Circular dependency detected in ${$}`);this.name="CircularDependencyError"}}class w extends Error{constructor($,G,J){super(`Could not add ${$} key "${G}"${J?` with value ${_(J)}`:""} because it already exists`);this.name="DuplicateKeyError"}}class _$ extends Error{constructor($="unexpected condition"){super(`Assertion failed: ${$}`);this.name="FailedAssertionError"}}class c extends TypeError{constructor($,G){super(`Invalid ${$} callback ${_(G)}`);this.name="InvalidCallbackError"}}class Z$ extends TypeError{constructor($,G){super(`Invalid ${$} source ${_(G)}`);this.name="InvalidCollectionSourceError"}}class M$ extends TypeError{constructor($,G){super(`Invalid signal value ${_(G)} in ${$}`);this.name="InvalidSignalValueError"}}class L$ extends TypeError{constructor($){super(`Nullish signal values are not allowed in ${$}`);this.name="NullishSignalValueError"}}class N$ extends Error{constructor($,G){super(`Could not set ${$} to ${_(G)} because signal is read-only`);this.name="ReadonlySignalError"}}function j$($,G){if(!$)throw new _$(G)}var P=($)=>$ instanceof Error?$:Error(String($)),m=($,G,J=H)=>{if(!J(G))throw new c($,G)},D=($,G,J=()=>!(E(G)&&G!==Z)||H(G))=>{if(G==null)throw new L$($);if(!J(G))throw new M$($,G)},u=($,G,J)=>{if(!K$(J))throw new N$($,G);return!0};var r="Collection";class i{#G;#$;#J=new Map;#z=[];#Q=!0;#X;constructor($,G,J){if(m(r,G),H($))$=$();if(!f$($))throw new Z$(r,$);this.#G=$,this.#$=G;for(let z=0;z<this.#G.length;z++){let Q=this.#G.keyAt(z);if(!Q)continue;this.#x(Q)}if(J?.watched)K(this,J.watched,J.unwatched)}#Z(){return this.#X||=Y(()=>{if(this.#Q=!0,!x(this))this.#X?.stop()},()=>{let $=Array.from(this.#G.keys()),G=new Set([...this.#z,...$]),J=[],z=[];for(let Q of G){let X=this.#z.includes(Q),B=$.includes(Q);if(!X&&B)J.push(Q);else if(X&&!B)z.push(Q)}for(let Q of z)this.#J.delete(Q);for(let Q of J)this.#x(Q);this.#z=$,this.#Q=!1}),this.#X.onCleanup(()=>{this.#X=void 0}),this.#X}#x($){let G=O$(this.#$)?async(z,Q)=>{let X=this.#G.byKey($)?.get();if(X===Z)return Z;return this.#$(X,Q)}:()=>{let z=this.#G.byKey($)?.get();if(z===Z)return Z;return this.#$(z)},J=D$(G);if(this.#J.set($,J),!this.#z.includes($))this.#z.push($);return!0}get[Symbol.toStringTag](){return r}get[Symbol.isConcatSpreadable](){return!0}*[Symbol.iterator](){for(let $ of this.#z){let G=this.#J.get($);if(G)yield G}}keys(){if(q(this),this.#Q)this.#Z().run();return this.#z.values()}get(){if(q(this),this.#Q)this.#Z().run();return this.#z.map(($)=>this.#J.get($)?.get()).filter(($)=>$!=null&&$!==Z)}at($){return this.#J.get(this.#z[$])}byKey($){return this.#J.get($)}keyAt($){return this.#z[$]}indexOfKey($){return this.#z.indexOf($)}deriveCollection($,G){return new i(this,$,G)}get length(){if(q(this),this.#Q)this.#Z().run();return this.#z.length}}var W$=($)=>I($,r),f$=($)=>n($)||W$($),O$=($)=>j($);var x$="Ref";class S${#G;constructor($,G){if(D(x$,$,G?.guard),this.#G=$,G?.watched)K(this,G.watched,G.unwatched)}get[Symbol.toStringTag](){return x$}get(){return q(this),this.#G}notify(){x(this)}}var w$=($)=>I($,x$);var p$=($)=>{if(!H($)||$.length>1)throw new c("effect",$);let G=j($),J=!1,z,Q=Y(()=>{Q.run()},()=>{if(J)throw new R("effect");J=!0,z?.abort(),z=void 0;let X;try{if(G){z=new AbortController;let B=z;$(z.signal).then((F)=>{if(H(F)&&z===B)Q.onCleanup(F)}).catch((F)=>{if(!T(F))console.error("Error in async effect callback:",F)})}else if(X=$(),H(X))Q.onCleanup(X)}catch(B){if(!T(B))console.error("Error in effect callback:",B)}J=!1});return Q(),()=>{z?.abort();try{Q.stop()}catch(X){console.error("Error in effect cleanup:",X)}}};function g$($,G){try{if($.pending)G.nil?.();else if($.errors)G.err?.($.errors);else if($.ok)G.ok($.values)}catch(J){let z=P(J);if(G.err&&(!$.errors||!$.errors.includes(z)))G.err($.errors?[...$.errors,z]:[z]);else throw z}}function b$($){let G=[],J=!1,z={};for(let[Q,X]of Object.entries($))try{let B=X.get();if(B===Z)J=!0;else z[Q]=B}catch(B){G.push(P(B))}if(J)return{ok:!1,pending:!0};if(G.length>0)return{ok:!1,errors:G};return{ok:!0,values:z}}export{_ as valueString,D as validateSignalValue,m as validateCallback,q$ as untrack,C$ as track,q as subscribeTo,b$ as resolve,x as notifyOf,g$ as match,J$ as isTaskCallback,E as isSymbol,l as isString,X$ as isStore,z$ as isState,E$ as isSignal,w$ as isRef,e as isRecordOrArray,L as isRecord,I as isObjectOfType,a as isNumber,K$ as isMutableSignal,G$ as isMemoCallback,n as isList,H as isFunction,N as isEqual,F$ as isComputed,W$ as isCollection,j as isAsyncFunction,T as isAbortError,u as guardMutableSignal,y as flush,k as diff,Y as createWatcher,Q$ as createStore,T$ as createSignal,P as createError,p$ as createEffect,D$ as createComputed,d as batch,Z as UNSET,h as Task,p as TYPE_STORE,f as TYPE_STATE,x$ as TYPE_REF,O as TYPE_LIST,$$ as TYPE_COMPUTED,r as TYPE_COLLECTION,W as State,S$ as Ref,N$ as ReadonlySignalError,L$ as NullishSignalValueError,v as Memo,o as List,M$ as InvalidSignalValueError,Z$ as InvalidCollectionSourceError,c as InvalidCallbackError,w as DuplicateKeyError,i as DerivedCollection,R as CircularDependencyError,I$ as BaseStore};
1
+ function y($){return typeof $==="function"}function l($){return y($)&&$.constructor.name==="AsyncFunction"}function $$($){return y($)&&$.constructor.name!=="AsyncFunction"}function Y($,J){return Object.prototype.toString.call($)===`[object ${J}]`}function L($){return Y($,"Object")}function C$($,J=(z)=>z!=null){return Array.isArray($)&&$.every(J)}function V$($){return typeof $==="string"?`"${$}"`:!!$&&typeof $==="object"?JSON.stringify($):String($)}class J$ extends Error{constructor($){super(`[${$}] Circular dependency detected`);this.name="CircularDependencyError"}}class I$ extends TypeError{constructor($){super(`[${$}] Signal value cannot be null or undefined`);this.name="NullishSignalValueError"}}class t extends Error{constructor($){super(`[${$}] Signal value is unset`);this.name="UnsetSignalValueError"}}class z$ extends TypeError{constructor($,J){super(`[${$}] Signal value ${V$(J)} is invalid`);this.name="InvalidSignalValueError"}}class x$ extends TypeError{constructor($,J){super(`[${$}] Callback ${V$(J)} is invalid`);this.name="InvalidCallbackError"}}class G$ extends Error{constructor($){super(`[${$}] Active owner is required`);this.name="RequiredOwnerError"}}class n 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 K($,J,z){if(J==null)throw new I$($);if(z&&!z(J))throw new z$($,J)}function X$($,J){if(J==null)throw new t($)}function _($,J,z=y){if(!z(J))throw new x$($,J)}var k="State",v="Memo",u="Task",c="Sensor",b="List",g="Collection",d="Store",T=0,D$=1,D=2,H$=4,U=null,p=null,m$=[],C=0,A$=!1,r=($,J)=>$===J,w$=($,J)=>!1;function p$($,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 O($,J){let z=J.sourcesTail;if(z?.source===$)return;let X=null,Q=J.flags&H$;if(Q){if(X=z?z.nextSource:J.sources,X?.source===$){J.sourcesTail=X;return}}let H=$.sinksTail;if(H?.sink===J&&(!Q||p$(H,J)))return;let B={source:$,sink:J,nextSource:X,prevSink:H,nextSink:null};if(J.sourcesTail=$.sinksTail=B,z)z.nextSource=B;else J.sources=B;if(H)H.nextSink=B;else $.sinks=B}function y$($){let{source:J,nextSource:z,nextSink:X,prevSink:Q}=$;if(X)X.prevSink=Q;else J.sinksTail=Q;if(Q)Q.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=y$(z);if(J)J.nextSource=null;else $.sources=null}function I($,J=D){let z=$.flags;if("sinks"in $){if((z&(D|D$))>=J)return;if($.flags=z|J,"controller"in $&&$.controller)$.controller.abort(),$.controller=void 0;for(let X=$.sinks;X;X=X.nextSink)I(X.sink,D$)}else{if(z&D)return;$.flags=D,m$.push($)}}function B$($,J){if($.equals($.value,J))return;$.value=J;for(let z=$.sinks;z;z=z.nextSink)I(z.sink);if(C===0)A()}function a($,J){if(!$.cleanup)$.cleanup=J;else if(Array.isArray($.cleanup))$.cleanup.push(J);else $.cleanup=[$.cleanup,J]}function P$($){if(!$.cleanup)return;if(Array.isArray($.cleanup))for(let J=0;J<$.cleanup.length;J++)$.cleanup[J]();else $.cleanup();$.cleanup=null}function g$($){let J=U;U=$,$.sourcesTail=null,$.flags=H$;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{U=J,Q$($)}if(z){for(let X=$.sinks;X;X=X.nextSink)if(X.sink.flags&D$)X.sink.flags|=D}$.flags=T}function k$($){$.controller?.abort();let J=new AbortController;$.controller=J,$.error=void 0;let z=U;U=$,$.sourcesTail=null,$.flags=H$;let X;try{X=$.fn($.value,J.signal)}catch(Q){$.controller=void 0,$.error=Q instanceof Error?Q:Error(String(Q));return}finally{U=z,Q$($)}X.then((Q)=>{if(J.signal.aborted)return;if($.controller=void 0,$.error||!$.equals(Q,$.value)){$.value=Q,$.error=void 0;for(let H=$.sinks;H;H=H.nextSink)I(H.sink);if(C===0)A()}},(Q)=>{if(J.signal.aborted)return;$.controller=void 0;let H=Q instanceof Error?Q:Error(String(Q));if(!$.error||H.name!==$.error.name||H.message!==$.error.message){$.error=H;for(let B=$.sinks;B;B=B.nextSink)I(B.sink);if(C===0)A()}}),$.flags=T}function Y$($){P$($);let J=U,z=p;U=p=$,$.sourcesTail=null,$.flags=H$;try{let X=$.fn();if(typeof X==="function")a($,X)}finally{U=J,p=z,Q$($)}$.flags=T}function E($){if($.flags&D$)for(let J=$.sources;J;J=J.nextSource){if("fn"in J.source)E(J.source);if($.flags&D)break}if($.flags&H$)throw new J$("controller"in $?u:("value"in $)?v:"Effect");if($.flags&D)if("controller"in $)k$($);else if("value"in $)g$($);else Y$($);else $.flags=T}function A(){if(A$)return;A$=!0;try{for(let $=0;$<m$.length;$++){let J=m$[$];if(J.flags&D)E(J)}m$.length=0}finally{A$=!1}}function e($){C++;try{$()}finally{if(C--,C===0)A()}}function s($){let J=U;U=null;try{return $()}finally{U=J}}function v$($){let J=p,z={cleanup:null};p=z;try{let X=$();if(typeof X==="function")a(z,X);let Q=()=>P$(z);if(J)a(J,Q);return Q}finally{p=J}}function h($,J){K(k,$,J?.guard);let z={value:$,sinks:null,sinksTail:null,equals:J?.equals??r,guard:J?.guard};return{[Symbol.toStringTag]:k,get(){if(U)O(z,U);return z.value},set(X){K(k,X,z.guard),B$(z,X)},update(X){_(k,X);let Q=X(z.value);K(k,Q,z.guard),B$(z,Q)}}}function q$($){return Y($,k)}function i($,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 J$("isEqual");z.add($),z.add(J);try{let X=Array.isArray($);if(X!==Array.isArray(J))return!1;if(X){let Q=$,H=J;if(Q.length!==H.length)return!1;for(let B=0;B<Q.length;B++)if(!i(Q[B],H[B],z))return!1;return!0}if(L($)&&L(J)){let Q=Object.keys($),H=Object.keys(J);if(Q.length!==H.length)return!1;for(let B of Q){if(!(B in J))return!1;if(!i($[B],J[B],z))return!1}return!0}return!1}finally{z.delete($),z.delete(J)}}function M$($,J){if($.length!==J.length)return!1;for(let z=0;z<$.length;z++)if($[z]!==J[z])return!1;return!0}function f$($){let J=0,z=typeof $==="function";return[typeof $==="string"?()=>`${$}${J++}`:z?(X)=>$(X)||String(J++):()=>String(J++),z]}function u$($,J,z,X,Q){let H=new WeakSet,B={},q={},F={},P=[],W=!1,j=new Map;for(let G=0;G<$.length;G++){let Z=z[G];if(Z&&$[G])j.set(Z,$[G])}let N=new Set;for(let G=0;G<J.length;G++){let Z=J[G];if(Z===void 0)continue;let M=Q?X(Z):z[G]??X(Z);if(N.has(M))throw new n(b,M,Z);if(P.push(M),N.add(M),!j.has(M))B[M]=Z,W=!0;else if(!i(j.get(M),Z,H))q[M]=Z,W=!0}for(let[G]of j)if(!N.has(G))F[G]=null,W=!0;if(!W&&!M$(z,P))W=!0;return{add:B,change:q,remove:F,newKeys:P,changed:W}}function Z$($,J){K(b,$,Array.isArray);let z=new Map,X=[],[Q,H]=f$(J?.keyConfig),B=()=>X.map((Z)=>z.get(Z)?.get()).filter((Z)=>Z!==void 0),q={fn:B,value:$,flags:D,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:i,error:void 0},F=(Z)=>{let M={};for(let m=0;m<Z.length;m++){let V=Z[m];if(V===void 0)continue;let R=X[m];if(!R)R=Q(V),X[m]=R;M[R]=V}return M},P=(Z)=>{let M=!1;for(let m in Z.add){let V=Z.add[m];K(`${b} item for key "${m}"`,V),z.set(m,h(V)),M=!0}if(Object.keys(Z.change).length)e(()=>{for(let m in Z.change){let V=Z.change[m];K(`${b} item for key "${m}"`,V);let R=z.get(m);if(R)R.set(V)}});for(let m in Z.remove){z.delete(m);let V=X.indexOf(m);if(V!==-1)X.splice(V,1);M=!0}if(M)q.sources=null,q.sourcesTail=null;return Z.changed},W=J?.watched,j=W?()=>{if(U){if(!q.sinks)q.stop=W();O(q,U)}}:()=>{if(U)O(q,U)},N=F($);for(let Z in N){let M=N[Z];K(`${b} item for key "${Z}"`,M),z.set(Z,h(M))}q.value=$,q.flags=0;let G={[Symbol.toStringTag]:b,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of X){let M=z.get(Z);if(M)yield M}},get length(){return j(),X.length},get(){if(j(),q.sources){if(q.flags)q.value=s(B),q.flags=T}else if(E(q),q.error)throw q.error;return q.value},set(Z){let M=q.flags&D?B():q.value,m=u$(M,Z,X,Q,H);if(m.changed){X=m.newKeys,P(m),q.flags|=D;for(let V=q.sinks;V;V=V.nextSink)I(V.sink);if(C===0)A()}},update(Z){G.set(Z(G.get()))},at(Z){return z.get(X[Z])},keys(){return j(),X.values()},byKey(Z){return z.get(Z)},keyAt(Z){return X[Z]},indexOfKey(Z){return X.indexOf(Z)},add(Z){let M=Q(Z);if(z.has(M))throw new n(b,M,Z);if(!X.includes(M))X.push(M);K(`${b} item for key "${M}"`,Z),z.set(M,h(Z)),q.sources=null,q.sourcesTail=null,q.flags|=D;for(let m=q.sinks;m;m=m.nextSink)I(m.sink);if(C===0)A();return M},remove(Z){let M=typeof Z==="number"?X[Z]:Z;if(z.delete(M)){let V=typeof Z==="number"?Z:X.indexOf(M);if(V>=0)X.splice(V,1);q.sources=null,q.sourcesTail=null,q.flags|=D;for(let R=q.sinks;R;R=R.nextSink)I(R.sink);if(C===0)A()}},sort(Z){let m=X.map((V)=>[V,z.get(V)?.get()]).sort(y(Z)?(V,R)=>Z(V[1],R[1]):(V,R)=>String(V[1]).localeCompare(String(R[1]))).map(([V])=>V);if(!M$(X,m)){X=m,q.flags|=D;for(let V=q.sinks;V;V=V.nextSink)I(V.sink);if(C===0)A()}},splice(Z,M,...m){let V=X.length,R=Z<0?Math.max(0,V+Z):Math.min(Z,V),x=Math.max(0,Math.min(M??Math.max(0,V-Math.max(0,R)),V-R)),w={},f={};for(let S=0;S<x;S++){let o=R+S,O$=X[o];if(O$){let E$=z.get(O$);if(E$)f[O$]=E$.get()}}let K$=X.slice(0,R);for(let S of m){let o=Q(S);if(z.has(o)&&!(o in f))throw new n(b,o,S);K$.push(o),w[o]=S}K$.push(...X.slice(R+x));let T$=!!(Object.keys(w).length||Object.keys(f).length);if(T$){P({add:w,change:{},remove:f,changed:T$}),X=K$,q.flags|=D;for(let S=q.sinks;S;S=S.nextSink)I(S.sink);if(C===0)A()}return Object.values(f)},deriveCollection(Z){return F$(G,Z)}};return G}function U$($){return Y($,b)}function j$($,J){if(_(v,$,$$),J?.value!==void 0)K(v,J.value,J?.guard);let z={fn:$,value:J?.value,flags:D,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:J?.equals??r,error:void 0,stop:void 0},X=J?.watched,Q=X?()=>{if(U){if(!z.sinks)z.stop=X(()=>{z.flags|=D;for(let H=z.sinks;H;H=H.nextSink)I(H.sink);if(C===0)A()});O(z,U)}}:()=>{if(U)O(z,U)};return{[Symbol.toStringTag]:v,get(){if(Q(),E(z),z.error)throw z.error;return X$(v,z.value),z.value}}}function L$($){return Y($,v)}function W$($,J){if(_(u,$,l),J?.value!==void 0)K(u,J.value,J?.guard);let z={fn:$,value:J?.value,sources:null,sourcesTail:null,sinks:null,sinksTail:null,flags:D,equals:J?.equals??r,controller:void 0,error:void 0,stop:void 0},X=J?.watched,Q=X?()=>{if(U){if(!z.sinks)z.stop=X(()=>{z.flags|=D;for(let H=z.sinks;H;H=H.nextSink)I(H.sink);if(C===0)A()});O(z,U)}}:()=>{if(U)O(z,U)};return{[Symbol.toStringTag]:u,get(){if(Q(),E(z),z.error)throw z.error;return X$(u,z.value),z.value},isPending(){return!!z.controller},abort(){z.controller?.abort(),z.controller=void 0}}}function _$($){return Y($,u)}function F$($,J){if(_(g,J),!d$($))throw TypeError(`[${g}] Invalid collection source: expected a List or Collection`);let z=l(J),X=new Map,Q=(W)=>{let j=z?W$(async(N,G)=>{let Z=$.byKey(W)?.get();if(Z==null)return N;return J(Z,G)}):j$(()=>{let N=$.byKey(W)?.get();if(N==null)return;return J(N)});X.set(W,j)};function H(){let W=Array.from($.keys()),j=B.value;if(!M$(j,W)){let N=new Set(j),G=new Set(W);for(let Z of j)if(!G.has(Z))X.delete(Z);for(let Z of W)if(!N.has(Z))Q(Z)}return W}let B={fn:H,value:[],flags:D,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:M$,error:void 0};function q(){if(B.sources){if(B.flags)B.value=s(H),B.flags=T}else if(E(B),B.error)throw B.error;return B.value}let F=Array.from($.keys());for(let W of F)Q(W);B.value=F;let P={[Symbol.toStringTag]:g,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let W of B.value){let j=X.get(W);if(j)yield j}},get length(){if(U)O(B,U);return q().length},keys(){if(U)O(B,U);return q().values()},get(){if(U)O(B,U);let W=q(),j=[];for(let N of W)try{let G=X.get(N)?.get();if(G!=null)j.push(G)}catch(G){if(!(G instanceof t))throw G}return j},at(W){return X.get(B.value[W])},byKey(W){return X.get(W)},keyAt(W){return B.value[W]},indexOfKey(W){return B.value.indexOf(W)},deriveCollection(W){return F$(P,W)}};return P}function c$($,J){let z=J?.value??[];if(z.length)K(g,z,Array.isArray);_(g,$,$$);let X=new Map,Q=[],H=new Map,[B,q]=f$(J?.keyConfig),F=(Z)=>H.get(Z)??(q?B(Z):void 0),P=J?.createItem??h;function W(){let Z=[];for(let M of Q)try{let m=X.get(M)?.get();if(m!=null)Z.push(m)}catch(m){if(!(m instanceof t))throw m}return Z}let j={fn:W,value:z,flags:D,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:w$,error:void 0};for(let Z of z){let M=B(Z);X.set(M,P(Z)),H.set(Z,M),Q.push(M)}j.value=z,j.flags=D;function N(){if(U){if(!j.sinks)j.stop=$((Z)=>{let{add:M,change:m,remove:V}=Z;if(!M?.length&&!m?.length&&!V?.length)return;let R=!1;e(()=>{if(M)for(let x of M){let w=B(x);if(X.set(w,P(x)),H.set(x,w),!Q.includes(w))Q.push(w);R=!0}if(m)for(let x of m){let w=F(x);if(!w)continue;let f=X.get(w);if(f&&q$(f))H.delete(f.get()),f.set(x),H.set(x,w)}if(V)for(let x of V){let w=F(x);if(!w)continue;H.delete(x),X.delete(w);let f=Q.indexOf(w);if(f!==-1)Q.splice(f,1);R=!0}if(R)j.sources=null,j.sourcesTail=null;j.flags=D;for(let x=j.sinks;x;x=x.nextSink)I(x.sink)})});O(j,U)}}let G={[Symbol.toStringTag]:g,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of Q){let M=X.get(Z);if(M)yield M}},get length(){return N(),Q.length},keys(){return N(),Q.values()},get(){if(N(),j.sources){if(j.flags)j.value=s(W),j.flags=T}else if(E(j),j.error)throw j.error;return j.value},at(Z){return X.get(Q[Z])},byKey(Z){return X.get(Z)},keyAt(Z){return Q[Z]},indexOfKey(Z){return Q.indexOf(Z)},deriveCollection(Z){return F$(G,Z)}};return G}function S$($){return Y($,g)}function d$($){return U$($)||S$($)}function l$($){_("Effect",$);let J={fn:$,flags:D,sources:null,sourcesTail:null,cleanup:null},z=()=>{P$(J),J.fn=void 0,J.flags=T,J.sourcesTail=null,Q$(J)};if(p)a(p,z);return Y$(J),z}function t$($,J){if(!p)throw new G$("match");let{ok:z,err:X=console.error,nil:Q}=J,H,B=!1,q=Array($.length);for(let P=0;P<$.length;P++)try{q[P]=$[P].get()}catch(W){if(W instanceof t){B=!0;continue}if(!H)H=[];H.push(W instanceof Error?W:Error(String(W)))}let F;try{if(B)F=Q?.();else if(H)F=X(H);else F=z(q)}catch(P){X([P instanceof Error?P:Error(String(P))])}if(typeof F==="function")return F;if(F instanceof Promise){let P=p,W=new AbortController;a(P,()=>W.abort()),F.then((j)=>{if(!W.signal.aborted&&typeof j==="function")a(P,j)}).catch((j)=>{X([j instanceof Error?j:Error(String(j))])})}}function r$($,J){if(_(c,$,$$),J?.value!==void 0)K(c,J.value,J?.guard);let z={value:J?.value,sinks:null,sinksTail:null,equals:J?.equals??r,guard:J?.guard,stop:void 0};return{[Symbol.toStringTag]:c,get(){if(U){if(!z.sinks)z.stop=$((X)=>{K(c,X,z.guard),B$(z,X)});O(z,U)}return X$(c,z.value),z.value}}}function s$($){return Y($,c)}function i$($,J){let z=L($)||Array.isArray($),X=L(J)||Array.isArray(J);if(!z||!X){let j=!Object.is($,J);return{changed:j,add:j&&X?J:{},change:{},remove:j&&z?$:{}}}let Q=new WeakSet,H={},B={},q={},F=!1,P=Object.keys($),W=Object.keys(J);for(let j of W)if(j in $){if(!i($[j],J[j],Q))B[j]=J[j],F=!0}else H[j]=J[j],F=!0;for(let j of P)if(!(j in J))q[j]=void 0,F=!0;return{add:H,change:B,remove:q,changed:F}}function N$($,J){K(d,$,L);let z=new Map,X=(W,j)=>{if(K(`${d} for key "${W}"`,j),Array.isArray(j))z.set(W,Z$(j));else if(L(j))z.set(W,N$(j));else z.set(W,h(j))},Q=()=>{let W={};return z.forEach((j,N)=>{W[N]=j.get()}),W},H={fn:Q,value:$,flags:D,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:i,error:void 0},B=(W)=>{let j=!1;for(let N in W.add)X(N,W.add[N]),j=!0;if(Object.keys(W.change).length)e(()=>{for(let N in W.change){let G=W.change[N];K(`${d} for key "${N}"`,G);let Z=z.get(N);if(Z)if(L(G)!==R$(Z))X(N,G),j=!0;else Z.set(G)}});for(let N in W.remove)z.delete(N),j=!0;if(j)H.sources=null,H.sourcesTail=null;return W.changed},q=J?.watched,F=q?()=>{if(U){if(!H.sinks)H.stop=q();O(H,U)}}:()=>{if(U)O(H,U)};for(let W of Object.keys($))X(W,$[W]);let P={[Symbol.toStringTag]:d,[Symbol.isConcatSpreadable]:!1,*[Symbol.iterator](){for(let W of Array.from(z.keys())){let j=z.get(W);if(j)yield[W,j]}},keys(){return F(),z.keys()},byKey(W){return z.get(W)},get(){if(F(),H.sources){if(H.flags)H.value=s(Q),H.flags=T}else if(E(H),H.error)throw H.error;return H.value},set(W){let j=H.flags&D?Q():H.value,N=i$(j,W);if(B(N)){H.flags|=D;for(let G=H.sinks;G;G=G.nextSink)I(G.sink);if(C===0)A()}},update(W){P.set(W(P.get()))},add(W,j){if(z.has(W))throw new n(d,W,j);X(W,j),H.sources=null,H.sourcesTail=null,H.flags|=D;for(let N=H.sinks;N;N=N.nextSink)I(N.sink);if(C===0)A();return W},remove(W){if(z.delete(W)){H.sources=null,H.sourcesTail=null,H.flags|=D;for(let N=H.sinks;N;N=N.nextSink)I(N.sink);if(C===0)A()}}};return new Proxy(P,{get(W,j){if(j in W)return Reflect.get(W,j);if(typeof j!=="symbol")return W.byKey(j)},has(W,j){if(j in W)return!0;return W.byKey(String(j))!==void 0},ownKeys(W){return Array.from(W.keys())},getOwnPropertyDescriptor(W,j){if(j in W)return Reflect.getOwnPropertyDescriptor(W,j);if(typeof j==="symbol")return;let N=W.byKey(String(j));return N?{enumerable:!0,configurable:!0,writable:!0,value:N}:void 0}})}function R$($){return Y($,d)}function o$($,J){return l($)?W$($,J):j$($,J)}function n$($){if(b$($))return $;if($==null)throw new z$("createSignal",$);if(l($))return W$($);if(y($))return j$($);if(C$($))return Z$($);if(L($))return N$($);return h($)}function a$($){if(h$($))return $;if($==null||y($)||b$($))throw new z$("createMutableSignal",$);if(C$($))return Z$($);if(L($))return N$($);return h($)}function e$($){return L$($)||_$($)}function b$($){let J=[k,v,u,c,b,g,d],z=Object.prototype.toString.call($).slice(8,-1);return J.includes(z)}function h$($){return q$($)||R$($)||U$($)}export{V$ as valueString,s as untrack,t$ as match,_$ as isTask,R$ as isStore,q$ as isState,b$ as isSignal,s$ as isSensor,L as isRecord,Y as isObjectOfType,h$ as isMutableSignal,L$ as isMemo,U$ as isList,y as isFunction,i as isEqual,e$ as isComputed,S$ as isCollection,l as isAsyncFunction,W$ as createTask,N$ as createStore,h as createState,n$ as createSignal,r$ as createSensor,v$ as createScope,a$ as createMutableSignal,j$ as createMemo,Z$ as createList,l$ as createEffect,o$ as createComputed,c$ as createCollection,e as batch,t as UnsetSignalValueError,w$ as SKIP_EQUALITY,G$ as RequiredOwnerError,I$ as NullishSignalValueError,z$ as InvalidSignalValueError,x$ as InvalidCallbackError,J$ as CircularDependencyError};
package/index.ts CHANGED
@@ -1,103 +1,89 @@
1
1
  /**
2
2
  * @name Cause & Effect
3
- * @version 0.17.3
3
+ * @version 0.18.1
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 MaybeCleanup,
23
+ type MemoCallback,
24
+ type Signal,
25
+ type SignalOptions,
26
+ SKIP_EQUALITY,
27
+ type TaskCallback,
28
+ untrack,
29
+ } from './src/graph'
7
30
  export {
8
31
  type Collection,
9
32
  type CollectionCallback,
10
- type CollectionSource,
11
- DerivedCollection,
33
+ type CollectionChanges,
34
+ type CollectionOptions,
35
+ createCollection,
36
+ type DeriveCollectionCallback,
12
37
  isCollection,
13
- TYPE_COLLECTION,
14
- } from './src/classes/collection'
38
+ } from './src/nodes/collection'
15
39
  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'
40
+ createEffect,
41
+ type MatchHandlers,
42
+ type MaybePromise,
43
+ match,
44
+ } from './src/nodes/effect'
27
45
  export {
28
- type ArrayToRecord,
46
+ createList,
47
+ isEqual,
29
48
  isList,
30
49
  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'
50
+ type List,
51
+ type ListOptions,
52
+ } from './src/nodes/list'
53
+ export { createMemo, isMemo, type Memo } from './src/nodes/memo'
54
+ export {
55
+ createSensor,
56
+ isSensor,
57
+ type Sensor,
58
+ type SensorCallback,
59
+ type SensorOptions,
60
+ } from './src/nodes/sensor'
61
+ export {
62
+ createState,
63
+ isState,
64
+ type State,
65
+ type UpdateCallback,
66
+ } from './src/nodes/state'
36
67
  export {
37
- BaseStore,
38
68
  createStore,
39
69
  isStore,
40
70
  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'
71
+ type StoreOptions,
72
+ } from './src/nodes/store'
73
+ export { createTask, isTask, type Task } from './src/nodes/task'
71
74
  export {
75
+ createComputed,
76
+ createMutableSignal,
72
77
  createSignal,
78
+ isComputed,
73
79
  isMutableSignal,
74
80
  isSignal,
75
- type Signal,
76
- type SignalValues,
77
- type UnknownSignalRecord,
81
+ type MutableSignal,
78
82
  } from './src/signal'
79
83
  export {
80
- batch,
81
- type Cleanup,
82
- createWatcher,
83
- flush,
84
- notifyOf,
85
- type SignalOptions,
86
- subscribeTo,
87
- track,
88
- UNSET,
89
- untrack,
90
- type Watcher,
91
- } from './src/system'
92
- export {
93
- isAbortError,
94
84
  isAsyncFunction,
95
85
  isFunction,
96
- isNumber,
97
86
  isObjectOfType,
98
87
  isRecord,
99
- isRecordOrArray,
100
- isString,
101
- isSymbol,
102
88
  valueString,
103
89
  } from './src/util'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeix/cause-effect",
3
- "version": "0.17.3",
3
+ "version": "0.18.1",
4
4
  "author": "Esther Brunner",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -9,12 +9,13 @@
9
9
  "devDependencies": {
10
10
  "@biomejs/biome": "2.1.4",
11
11
  "@types/bun": "latest",
12
+ "mitata": "^1.0.34",
12
13
  "random": "^5.4.1"
13
14
  },
14
15
  "peerDependencies": {
15
16
  "typescript": "^5.6.3"
16
17
  },
17
- "description": "Cause & Effect - fine-grained reactive state management library.",
18
+ "description": "Cause & Effect - reactive state management primitives library for TypeScript.",
18
19
  "license": "MIT",
19
20
  "keywords": [
20
21
  "Cause & Effect",
@@ -27,6 +28,8 @@
27
28
  },
28
29
  "scripts": {
29
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",
30
33
  "test": "bun test",
31
34
  "lint": "bunx biome lint --write"
32
35
  }
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: changelog
3
+ description: Update CHANGELOG.md with user-facing changes. Use after meaningful code changes, when asked to add release notes, or to prepare a release.
4
+ user_invocable: true
5
+ ---
6
+
7
+ # Changelog Keeper
8
+
9
+ Maintain `CHANGELOG.md` following [Keep a Changelog](https://keepachangelog.com) conventions.
10
+
11
+ ## Structure
12
+
13
+ The changelog uses this heading hierarchy:
14
+
15
+ ```markdown
16
+ # Changelog
17
+
18
+ ## [Unreleased]
19
+
20
+ ### Added
21
+ ### Changed
22
+ ### Deprecated
23
+ ### Removed
24
+ ### Fixed
25
+ ### Security
26
+
27
+ ## 0.18.1
28
+
29
+ ### Added
30
+ ...
31
+ ```
32
+
33
+ - `## [Unreleased]` is always the first version section. New changes go here.
34
+ - Only include categories that have entries.
35
+ - Version 0.18.0 is the baseline. Do not document changes before it.
36
+
37
+ ## Adding entries
38
+
39
+ 1. Read `CHANGELOG.md`.
40
+ 2. Determine which changes are user-facing by inspecting the diff (`git diff main..HEAD -- src/ index.ts` or as directed).
41
+ 3. Classify each change into exactly one category: Added, Changed, Deprecated, Removed, Fixed, or Security.
42
+ 4. Write concise bullets describing user-visible behavior. Use backticks for public API names.
43
+ 5. Do not duplicate existing entries.
44
+ 6. Edit the file in place using the Edit tool.
45
+
46
+ ## Preparing a release
47
+
48
+ When asked to release a version:
49
+
50
+ 1. Move all `[Unreleased]` entries under a new `## X.Y.Z` heading.
51
+ 2. Leave an empty `## [Unreleased]` section above it.
52
+ 3. Update `version` in `package.json` and the `@version` tag in `index.ts` to match.
53
+
54
+ ## Entry style
55
+
56
+ - One behavior change per bullet.
57
+ - Factual and concise; skip implementation-only details.
58
+ - Include migration notes under Changed or Removed when behavior breaks compatibility.
59
+ - Bold the API name or short summary at the start: `- **\`createMemo\` \`watched\` option**: description...`
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Changelog Keeper"
3
+ short_description: "Maintain Keep a Changelog format and entries"
4
+ default_prompt: "Use $changelog-keeper to update CHANGELOG.md after recent code changes."
package/src/errors.ts CHANGED
@@ -1,123 +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'
26
- }
27
- }
28
-
29
- class FailedAssertionError extends Error {
30
- constructor(message: string = 'unexpected condition') {
31
- super(`Assertion failed: ${message}`)
32
- this.name = 'FailedAssertionError'
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'
33
44
  }
34
45
  }
35
46
 
36
- class InvalidCallbackError extends TypeError {
37
- constructor(where: string, value: unknown) {
38
- super(`Invalid ${where} callback ${valueString(value)}`)
39
- 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'
40
59
  }
41
60
  }
42
61
 
43
- 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
+ */
44
72
  constructor(where: string, value: unknown) {
45
- super(`Invalid ${where} source ${valueString(value)}`)
46
- this.name = 'InvalidCollectionSourceError'
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
- function assert(condition: unknown, msg?: string): asserts condition {
76
- if (!condition) throw new FailedAssertionError(msg)
77
- }
78
-
79
- const createError = /*#__PURE__*/ (reason: unknown): Error =>
80
- reason instanceof Error ? reason : Error(String(reason))
81
-
82
- const validateCallback = (
122
+ function validateSignalValue<T extends {}>(
83
123
  where: string,
84
124
  value: unknown,
85
- guard: (value: unknown) => boolean = isFunction,
86
- ): void => {
87
- 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)
88
129
  }
89
130
 
90
- const validateSignalValue = (
131
+ function validateReadValue<T extends {}>(
91
132
  where: string,
92
- value: unknown,
93
- guard: (value: unknown) => boolean = () =>
94
- !(isSymbol(value) && value !== UNSET) || isFunction(value),
95
- ): void => {
96
- if (value == null) throw new NullishSignalValueError(where)
97
- 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)
98
136
  }
99
137
 
100
- const guardMutableSignal = <T extends {}>(
101
- 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,
144
+ value: unknown,
145
+ guard: (value: unknown) => value is T,
146
+ ): asserts value is T
147
+ function validateCallback(
148
+ where: string,
102
149
  value: unknown,
103
- signal: unknown,
104
- ): signal is MutableSignal<T> => {
105
- if (!isMutableSignal(signal)) throw new ReadonlySignalError(what, value)
106
- return true
150
+ guard: (value: unknown) => boolean = isFunction,
151
+ ): void {
152
+ if (!guard(value)) throw new InvalidCallbackError(where, value)
107
153
  }
108
154
 
109
155
  export {
110
156
  type Guard,
111
157
  CircularDependencyError,
112
- DuplicateKeyError,
113
- InvalidCallbackError,
114
- InvalidCollectionSourceError,
115
- InvalidSignalValueError,
116
158
  NullishSignalValueError,
117
- ReadonlySignalError,
118
- assert,
119
- createError,
120
- validateCallback,
159
+ InvalidSignalValueError,
160
+ UnsetSignalValueError,
161
+ InvalidCallbackError,
162
+ RequiredOwnerError,
163
+ DuplicateKeyError,
121
164
  validateSignalValue,
122
- guardMutableSignal,
165
+ validateReadValue,
166
+ validateCallback,
123
167
  }