@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.
- package/.ai-context.md +169 -227
- package/.cursorrules +41 -35
- package/.github/copilot-instructions.md +176 -116
- package/ARCHITECTURE.md +276 -0
- package/CHANGELOG.md +29 -0
- package/CLAUDE.md +201 -143
- package/GUIDE.md +298 -0
- package/README.md +246 -193
- package/REQUIREMENTS.md +100 -0
- package/bench/reactivity.bench.ts +577 -0
- package/context7.json +4 -0
- package/examples/events-sensor.ts +187 -0
- package/examples/selector-sensor.ts +173 -0
- package/index.dev.js +1390 -1008
- package/index.js +1 -1
- package/index.ts +60 -74
- package/package.json +5 -2
- package/skills/changelog-keeper/SKILL.md +59 -0
- package/skills/changelog-keeper/agents/openai.yaml +4 -0
- package/src/errors.ts +118 -74
- package/src/graph.ts +612 -0
- package/src/nodes/collection.ts +512 -0
- package/src/nodes/effect.ts +149 -0
- package/src/nodes/list.ts +589 -0
- package/src/nodes/memo.ts +148 -0
- package/src/nodes/sensor.ts +149 -0
- package/src/nodes/state.ts +135 -0
- package/src/nodes/store.ts +378 -0
- package/src/nodes/task.ts +174 -0
- package/src/signal.ts +112 -66
- package/src/util.ts +26 -57
- package/test/batch.test.ts +96 -62
- package/test/benchmark.test.ts +473 -487
- package/test/collection.test.ts +456 -707
- package/test/effect.test.ts +293 -696
- package/test/list.test.ts +335 -592
- package/test/memo.test.ts +574 -0
- package/test/regression.test.ts +156 -0
- package/test/scope.test.ts +191 -0
- package/test/sensor.test.ts +454 -0
- package/test/signal.test.ts +220 -213
- package/test/state.test.ts +217 -265
- package/test/store.test.ts +346 -446
- package/test/task.test.ts +529 -0
- package/test/untrack.test.ts +167 -0
- package/types/index.d.ts +13 -15
- package/types/src/errors.d.ts +73 -17
- package/types/src/graph.d.ts +218 -0
- package/types/src/nodes/collection.d.ts +69 -0
- package/types/src/nodes/effect.d.ts +48 -0
- package/types/src/nodes/list.d.ts +66 -0
- package/types/src/nodes/memo.d.ts +63 -0
- package/types/src/nodes/sensor.d.ts +81 -0
- package/types/src/nodes/state.d.ts +78 -0
- package/types/src/nodes/store.d.ts +51 -0
- package/types/src/nodes/task.d.ts +79 -0
- package/types/src/signal.d.ts +43 -29
- package/types/src/util.d.ts +9 -16
- package/archive/benchmark.ts +0 -683
- package/archive/collection.ts +0 -253
- package/archive/composite.ts +0 -85
- package/archive/computed.ts +0 -195
- package/archive/list.ts +0 -483
- package/archive/memo.ts +0 -139
- package/archive/state.ts +0 -90
- package/archive/store.ts +0 -298
- package/archive/task.ts +0 -189
- package/src/classes/collection.ts +0 -245
- package/src/classes/computed.ts +0 -349
- package/src/classes/list.ts +0 -343
- package/src/classes/ref.ts +0 -70
- package/src/classes/state.ts +0 -102
- package/src/classes/store.ts +0 -262
- package/src/diff.ts +0 -138
- package/src/effect.ts +0 -93
- package/src/match.ts +0 -45
- package/src/resolve.ts +0 -49
- package/src/system.ts +0 -257
- package/test/computed.test.ts +0 -1108
- package/test/diff.test.ts +0 -955
- package/test/match.test.ts +0 -388
- package/test/ref.test.ts +0 -353
- package/test/resolve.test.ts +0 -154
- package/types/src/classes/collection.d.ts +0 -45
- package/types/src/classes/computed.d.ts +0 -94
- package/types/src/classes/list.d.ts +0 -43
- package/types/src/classes/ref.d.ts +0 -35
- package/types/src/classes/state.d.ts +0 -49
- package/types/src/classes/store.d.ts +0 -52
- package/types/src/diff.d.ts +0 -28
- package/types/src/effect.d.ts +0 -15
- package/types/src/match.d.ts +0 -21
- package/types/src/resolve.d.ts +0 -29
- 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.
|
|
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
|
|
11
|
-
|
|
33
|
+
type CollectionChanges,
|
|
34
|
+
type CollectionOptions,
|
|
35
|
+
createCollection,
|
|
36
|
+
type DeriveCollectionCallback,
|
|
12
37
|
isCollection,
|
|
13
|
-
|
|
14
|
-
} from './src/classes/collection'
|
|
38
|
+
} from './src/nodes/collection'
|
|
15
39
|
export {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
46
|
+
createList,
|
|
47
|
+
isEqual,
|
|
29
48
|
isList,
|
|
30
49
|
type KeyConfig,
|
|
31
|
-
List,
|
|
32
|
-
|
|
33
|
-
} from './src/
|
|
34
|
-
export {
|
|
35
|
-
export {
|
|
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
|
-
|
|
42
|
-
} from './src/
|
|
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
|
|
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.
|
|
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 -
|
|
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...`
|
package/src/errors.ts
CHANGED
|
@@ -1,123 +1,167 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
27
|
+
super(`[${where}] Circular dependency detected`)
|
|
14
28
|
this.name = 'CircularDependencyError'
|
|
15
29
|
}
|
|
16
30
|
}
|
|
17
31
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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(`
|
|
46
|
-
this.name = '
|
|
73
|
+
super(`[${where}] Signal value ${valueString(value)} is invalid`)
|
|
74
|
+
this.name = 'InvalidSignalValueError'
|
|
47
75
|
}
|
|
48
76
|
}
|
|
49
77
|
|
|
50
|
-
|
|
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(`
|
|
53
|
-
this.name = '
|
|
89
|
+
super(`[${where}] Callback ${valueString(value)} is invalid`)
|
|
90
|
+
this.name = 'InvalidCallbackError'
|
|
54
91
|
}
|
|
55
92
|
}
|
|
56
93
|
|
|
57
|
-
|
|
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(`
|
|
60
|
-
this.name = '
|
|
104
|
+
super(`[${where}] Active owner is required`)
|
|
105
|
+
this.name = 'RequiredOwnerError'
|
|
61
106
|
}
|
|
62
107
|
}
|
|
63
108
|
|
|
64
|
-
class
|
|
65
|
-
constructor(
|
|
109
|
+
class DuplicateKeyError extends Error {
|
|
110
|
+
constructor(where: string, key: string, value?: unknown) {
|
|
66
111
|
super(
|
|
67
|
-
`Could not
|
|
112
|
+
`[${where}] Could not add key "${key}"${
|
|
113
|
+
value ? ` with value ${JSON.stringify(value)}` : ''
|
|
114
|
+
} because it already exists`,
|
|
68
115
|
)
|
|
69
|
-
this.name = '
|
|
116
|
+
this.name = 'DuplicateKeyError'
|
|
70
117
|
}
|
|
71
118
|
}
|
|
72
119
|
|
|
73
|
-
/* === Functions === */
|
|
120
|
+
/* === Validation Functions === */
|
|
74
121
|
|
|
75
|
-
function
|
|
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
|
|
86
|
-
):
|
|
87
|
-
if (
|
|
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
|
-
|
|
131
|
+
function validateReadValue<T extends {}>(
|
|
91
132
|
where: string,
|
|
92
|
-
value:
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
101
|
-
|
|
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
|
-
|
|
104
|
-
):
|
|
105
|
-
if (!
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
159
|
+
InvalidSignalValueError,
|
|
160
|
+
UnsetSignalValueError,
|
|
161
|
+
InvalidCallbackError,
|
|
162
|
+
RequiredOwnerError,
|
|
163
|
+
DuplicateKeyError,
|
|
121
164
|
validateSignalValue,
|
|
122
|
-
|
|
165
|
+
validateReadValue,
|
|
166
|
+
validateCallback,
|
|
123
167
|
}
|