@zeix/cause-effect 0.17.3 → 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 (89) hide show
  1. package/.ai-context.md +163 -232
  2. package/.cursorrules +41 -35
  3. package/.github/copilot-instructions.md +166 -116
  4. package/ARCHITECTURE.md +274 -0
  5. package/CLAUDE.md +199 -143
  6. package/COLLECTION_REFACTORING.md +161 -0
  7. package/GUIDE.md +298 -0
  8. package/README.md +232 -197
  9. package/REQUIREMENTS.md +100 -0
  10. package/bench/reactivity.bench.ts +577 -0
  11. package/index.dev.js +1325 -997
  12. package/index.js +1 -1
  13. package/index.ts +58 -74
  14. package/package.json +4 -1
  15. package/src/errors.ts +118 -74
  16. package/src/graph.ts +601 -0
  17. package/src/nodes/collection.ts +474 -0
  18. package/src/nodes/effect.ts +149 -0
  19. package/src/nodes/list.ts +588 -0
  20. package/src/nodes/memo.ts +120 -0
  21. package/src/nodes/sensor.ts +139 -0
  22. package/src/nodes/state.ts +135 -0
  23. package/src/nodes/store.ts +383 -0
  24. package/src/nodes/task.ts +146 -0
  25. package/src/signal.ts +112 -66
  26. package/src/util.ts +26 -57
  27. package/test/batch.test.ts +96 -62
  28. package/test/benchmark.test.ts +473 -487
  29. package/test/collection.test.ts +466 -706
  30. package/test/effect.test.ts +293 -696
  31. package/test/list.test.ts +335 -592
  32. package/test/memo.test.ts +380 -0
  33. package/test/regression.test.ts +156 -0
  34. package/test/scope.test.ts +191 -0
  35. package/test/sensor.test.ts +454 -0
  36. package/test/signal.test.ts +220 -213
  37. package/test/state.test.ts +217 -265
  38. package/test/store.test.ts +346 -446
  39. package/test/task.test.ts +395 -0
  40. package/test/untrack.test.ts +167 -0
  41. package/types/index.d.ts +13 -15
  42. package/types/src/errors.d.ts +73 -17
  43. package/types/src/graph.d.ts +208 -0
  44. package/types/src/nodes/collection.d.ts +64 -0
  45. package/types/src/nodes/effect.d.ts +48 -0
  46. package/types/src/nodes/list.d.ts +65 -0
  47. package/types/src/nodes/memo.d.ts +57 -0
  48. package/types/src/nodes/sensor.d.ts +75 -0
  49. package/types/src/nodes/state.d.ts +78 -0
  50. package/types/src/nodes/store.d.ts +51 -0
  51. package/types/src/nodes/task.d.ts +73 -0
  52. package/types/src/signal.d.ts +43 -29
  53. package/types/src/util.d.ts +9 -16
  54. package/archive/benchmark.ts +0 -683
  55. package/archive/collection.ts +0 -253
  56. package/archive/composite.ts +0 -85
  57. package/archive/computed.ts +0 -195
  58. package/archive/list.ts +0 -483
  59. package/archive/memo.ts +0 -139
  60. package/archive/state.ts +0 -90
  61. package/archive/store.ts +0 -298
  62. package/archive/task.ts +0 -189
  63. package/src/classes/collection.ts +0 -245
  64. package/src/classes/computed.ts +0 -349
  65. package/src/classes/list.ts +0 -343
  66. package/src/classes/ref.ts +0 -70
  67. package/src/classes/state.ts +0 -102
  68. package/src/classes/store.ts +0 -262
  69. package/src/diff.ts +0 -138
  70. package/src/effect.ts +0 -93
  71. package/src/match.ts +0 -45
  72. package/src/resolve.ts +0 -49
  73. package/src/system.ts +0 -257
  74. package/test/computed.test.ts +0 -1108
  75. package/test/diff.test.ts +0 -955
  76. package/test/match.test.ts +0 -388
  77. package/test/ref.test.ts +0 -353
  78. package/test/resolve.test.ts +0 -154
  79. package/types/src/classes/collection.d.ts +0 -45
  80. package/types/src/classes/computed.d.ts +0 -94
  81. package/types/src/classes/list.d.ts +0 -43
  82. package/types/src/classes/ref.d.ts +0 -35
  83. package/types/src/classes/state.d.ts +0 -49
  84. package/types/src/classes/store.d.ts +0 -52
  85. package/types/src/diff.d.ts +0 -28
  86. package/types/src/effect.d.ts +0 -15
  87. package/types/src/match.d.ts +0 -21
  88. package/types/src/resolve.d.ts +0 -29
  89. 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 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,103 +1,87 @@
1
1
  /**
2
2
  * @name Cause & Effect
3
- * @version 0.17.3
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
- 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
82
  isAsyncFunction,
95
83
  isFunction,
96
- isNumber,
97
84
  isObjectOfType,
98
85
  isRecord,
99
- isRecordOrArray,
100
- isString,
101
- isSymbol,
102
86
  valueString,
103
87
  } 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.0",
4
4
  "author": "Esther Brunner",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -9,6 +9,7 @@
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": {
@@ -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
  }
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
  }