@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.
- package/.ai-context.md +163 -232
- package/.cursorrules +41 -35
- package/.github/copilot-instructions.md +166 -116
- package/ARCHITECTURE.md +274 -0
- package/CLAUDE.md +199 -143
- package/COLLECTION_REFACTORING.md +161 -0
- package/GUIDE.md +298 -0
- package/README.md +232 -197
- package/REQUIREMENTS.md +100 -0
- package/bench/reactivity.bench.ts +577 -0
- package/index.dev.js +1325 -997
- package/index.js +1 -1
- package/index.ts +58 -74
- package/package.json +4 -1
- package/src/errors.ts +118 -74
- package/src/graph.ts +601 -0
- package/src/nodes/collection.ts +474 -0
- package/src/nodes/effect.ts +149 -0
- package/src/nodes/list.ts +588 -0
- package/src/nodes/memo.ts +120 -0
- package/src/nodes/sensor.ts +139 -0
- package/src/nodes/state.ts +135 -0
- package/src/nodes/store.ts +383 -0
- package/src/nodes/task.ts +146 -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 +466 -706
- package/test/effect.test.ts +293 -696
- package/test/list.test.ts +335 -592
- package/test/memo.test.ts +380 -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 +395 -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 +208 -0
- package/types/src/nodes/collection.d.ts +64 -0
- package/types/src/nodes/effect.d.ts +48 -0
- package/types/src/nodes/list.d.ts +65 -0
- package/types/src/nodes/memo.d.ts +57 -0
- package/types/src/nodes/sensor.d.ts +75 -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 +73 -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 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.
|
|
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
|
|
11
|
-
|
|
32
|
+
type CollectionOptions,
|
|
33
|
+
createCollection,
|
|
34
|
+
type DeriveCollectionCallback,
|
|
12
35
|
isCollection,
|
|
13
|
-
|
|
14
|
-
} from './src/classes/collection'
|
|
36
|
+
} from './src/nodes/collection'
|
|
15
37
|
export {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
44
|
+
createList,
|
|
45
|
+
type DiffResult,
|
|
46
|
+
isEqual,
|
|
29
47
|
isList,
|
|
30
48
|
type KeyConfig,
|
|
31
|
-
List,
|
|
32
|
-
|
|
33
|
-
} from './src/
|
|
34
|
-
export {
|
|
35
|
-
export {
|
|
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
|
-
|
|
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'
|
|
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
|
|
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.
|
|
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 {
|
|
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
|
}
|