@neurosell/reactivets 0.9.5

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Neurosell
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # ReactiveTS
2
+ A **reactive state engine for TypeScript** with fields, events, objects, arrays, computed values, effects, batching, path subscriptions, async support, cancellation, and built-in undo/redo history.
3
+
4
+ ---
5
+
6
+ [Get Started]() | [Other Libraries](https://github.com/neurosell) | [Website](https://neurosell.top/)
7
+
8
+ ---
9
+
10
+ ❓ **Why ReactiveTS?**<br/>
11
+ 🔹 **Lightweight Library** with zero dependencies;<br/>
12
+ 🔹 **Powerful** Reactive state engine written in Typescript;<br/>
13
+ 🔹 **History and Transactions** support;<br/>
14
+ 🔹 **Production ready** with benchmarks;<br/>
15
+
16
+ **ReactiveTS combines:**
17
+ * **Reactive fields** (signals);
18
+ * **Reactive objects & arrays** (Proxy-based);
19
+ * Computed values with **automatic dependency tracking**;
20
+ * **``useEffect``-like** side effects;
21
+ * **Path-level subscriptions** with wildcard support (``user.name``, ``items.*.id``);
22
+ * **Batching & transactions**;
23
+ * **Undo/Redo history** (including grouped transactions);
24
+ * **Async listeners** with cancellation;
25
+ * **Adapters:** ``toPromise``, ``fromEvent``, ``fromObservable``;
26
+ * **WeakMap proxy cache** for stable nested references;
27
+
28
+ ## Table of Contents
29
+ * [Installation](#installation)
30
+ * [Core Concepts]()
31
+ * [ReactiveField]()
32
+ * [ReactiveEvent]()
33
+ * [ReactiveObject]()
34
+ * [ReactiveArray]()
35
+ * [Computed]()
36
+ * [Selectors]()
37
+ * [Effect]()
38
+ * [Batching]()
39
+ * [History & Transactions]()
40
+ * [Path Subscriptions]()
41
+ * [Async & Cancellation]()
42
+ * [Views (``useFiltered``, ``useMapped``, ``useSorted``)]()
43
+ * [Adapters (``toPromise``, ``fromEvent``, ``fromObservable``)]()
44
+ * [Reactive Watcher (auto-unsubscribe)]()
45
+ * [Performance Notes]()
46
+ * [Comparison Philosophy]()
47
+ * [License]()
48
+
49
+ ### Installation
50
+
51
+ ```bash
52
+ npm install @neurosell/reactivets
53
+ ```
54
+
55
+ ### Core Concepts
56
+ [WIP]
57
+
58
+ ### Reactive Fields
59
+ [WIP]
60
+
61
+ ### Reactive Events
62
+ [WIP]
63
+
64
+ ### Reactive Objects
65
+ [WIP]
66
+
67
+ ### Reactive Arrays
68
+ [WIP]
69
+
70
+ ### Computed
71
+ [WIP]
72
+
73
+ ### Selectors
74
+ [WIP]
75
+
76
+ ### Effects
77
+ [WIP]
78
+
79
+ ### Batching
80
+ [WIP]
81
+
82
+ ### History and Transactions
83
+ [WIP]
84
+
85
+ ### Path Subscriptions
86
+ [WIP]
87
+
88
+ ### Async and Cancellation
89
+ [WIP]
90
+
91
+ ### Views (Filtering, Mapping, Sorting)
92
+ [WIP]
93
+
94
+ ### Adapters and Converters
95
+ [WIP]
96
+
97
+ ### Reactive Watcher
98
+ [WIP]
99
+
100
+ ### Performance Notes and Benchmark
101
+ [WIP]
102
+
103
+ ### Comparison Philosophy
104
+ [WIP]
105
+
106
+ ### License
107
+ [WIP]
@@ -0,0 +1,2 @@
1
+ var ReactiveTS=(function(exports){'use strict';var I=Object.defineProperty;var _=(s,e,t)=>e in s?I(s,e,{enumerable:true,configurable:true,writable:true,value:t}):s[e]=t;var c=(s,e,t)=>_(s,typeof e!="symbol"?e+"":e,t);var x=0,m=false,P=new Set;function F(){m=false;let s=Array.from(P);P.clear();for(let e of s)e();}function S(s){P.add(s),!(x>0)&&(m||(m=true,queueMicrotask(F)));}function f(s){x++;try{return s()}finally{x--,x===0&&P.size>0&&!m&&(m=true,queueMicrotask(F));}}var A=class{constructor(){c(this,"disposers",new Set);c(this,"_disposed",false);}get disposed(){return this._disposed}add(e){if(this._disposed){try{e();}catch(t){}return ()=>{}}return this.disposers.add(e),()=>this.disposers.delete(e)}watch(e){return this.add(e),e}dispose(){if(this._disposed)return;this._disposed=true;let e=Array.from(this.disposers);this.disposers.clear();for(let t of e)try{t();}catch(r){}}};var v=class{constructor(){c(this,"listeners",new Set);}get listenerCount(){return this.listeners.size}addListener(e,t={}){var o;let r={fn:e,batched:(o=t.batched)!=null?o:true,controller:new AbortController};if(t.signal){if(t.signal.aborted)return ()=>{};let i=()=>this.removeListener(e);t.signal.addEventListener("abort",i,{once:true}),r.externalAbortUnsub=()=>{var n;return (n=t.signal)==null?void 0:n.removeEventListener("abort",i)};}return this.listeners.add(r),()=>{var i;this.listeners.delete(r),(i=r.externalAbortUnsub)==null||i.call(r),r.controller.abort();}}removeListener(e){var t;for(let r of this.listeners)r.fn===e&&(this.listeners.delete(r),(t=r.externalAbortUnsub)==null||t.call(r),r.controller.abort());}removeAllListeners(){var e;for(let t of this.listeners)(e=t.externalAbortUnsub)==null||e.call(t),t.controller.abort();this.listeners.clear();}invokeOnce(e,t={}){let r=()=>{},o=async(i,n)=>{r(),await e(i,n);};return r=this.addListener(o,t),r}invoke(e){for(let t of Array.from(this.listeners)){let r=()=>{if(!t.controller.signal.aborted)try{let o=t.fn(e,{signal:t.controller.signal});o&&typeof o.then=="function"&&o.catch(()=>{});}catch(o){}};t.batched?S(r):r();}}async invokeAsync(e,t){let r=[];for(let o of Array.from(this.listeners)){if(t!=null&&t.aborted)break;let i=async()=>{if(o.controller.signal.aborted||t!=null&&t.aborted)return;let n;if(t){let p=()=>o.controller.abort();t.addEventListener("abort",p,{once:true}),n=()=>t.removeEventListener("abort",p);}try{await o.fn(e,{signal:o.controller.signal});}catch(p){}finally{n==null||n();}};r.push(o.batched?new Promise(n=>S(()=>{i().finally(n);})):i());}await Promise.all(r);}};var T=[];function g(s){T.push(s);}function L(){T.pop();}function b(s){let e=T[T.length-1];e&&e.addDependency(s);}var h=class{constructor(e,t={}){c(this,"_value");c(this,"equals");c(this,"changed",new v);c(this,"history");c(this,"historyLabel");var r;this._value=e,this.equals=(r=t.equals)!=null?r:Object.is,this.history=t.history,this.historyLabel=t.historyLabel;}get value(){return b(()=>this.addListener(()=>{})),this._value}set value(e){this.set(e);}get listenerCount(){return this.changed.listenerCount}set(e){var i;let t=this._value;if(this.equals(t,e))return;let r=this.history;r&&!r.isApplying&&r.push({label:(i=this.historyLabel)==null?void 0:i.call(this,t,e),undo:()=>this.set(t),redo:()=>this.set(e)}),this._value=e,this.changed.invoke(e);}update(e){this.set(e(this._value));}addListener(e,t){return this.changed.addListener(e,t)}removeListener(e){this.changed.removeListener(e);}removeAllListeners(){this.changed.removeAllListeners();}invokeOnce(e,t){return this.changed.invokeOnce(e,t)}};var C=class{constructor(){c(this,"past",[]);c(this,"future",[]);c(this,"applying",false);c(this,"tx",null);}get canUndo(){return this.past.length>0}get canRedo(){return this.future.length>0}get isApplying(){return this.applying}get inTransaction(){return this.tx!==null}beginTransaction(e){this.applying||this.tx||(this.tx={label:e,entries:[]});}endTransaction(){if(!this.tx)return;let{label:e,entries:t}=this.tx;if(this.tx=null,t.length===0)return;if(t.length===1){let o=t[0];this.push({...o,label:e!=null?e:o.label});return}let r={label:e,undo:()=>{for(let o=t.length-1;o>=0;o--)t[o].undo();},redo:()=>{for(let o of t)o.redo();}};this.push(r);}push(e){if(!this.applying){if(this.tx){this.tx.entries.push(e);return}this.past.push(e),this.future.length=0;}}undo(){let e=this.past.pop();if(e){this.applying=true;try{e.undo(),this.future.push(e);}finally{this.applying=false;}}}redo(){let e=this.future.pop();if(e){this.applying=true;try{e.redo(),this.past.push(e);}finally{this.applying=false;}}}clear(){this.past.length=0,this.future.length=0,this.tx=null;}};function z(s,e,t){s.beginTransaction(t);try{return e()}finally{s.endTransaction();}}function M(s){return s.map(e=>typeof e=="symbol"?e.toString():String(e)).join(".")}function k(s){return Array.isArray(s)?s.map(e=>String(e)):s.split(".").filter(Boolean)}function D(s){return s.map(e=>String(e))}function O(s,e,t="prefix"){if(t==="exact"&&s.length!==e.length||s.length>e.length)return false;for(let r=0;r<s.length;r++){let o=s[r],i=e[r];if(o!=="*"&&o!==i)return false}return t==="exact"?s.length===e.length:true}var U=class extends h{constructor(t,r={}){var o,i,n;super(void 0,{equals:(o=r.equals)!=null?o:Object.is});c(this,"compute");c(this,"deps",new Set);c(this,"depUnsubs",[]);c(this,"dirty",true);c(this,"equalsLocal");c(this,"lazy");this.compute=t,this.equalsLocal=(i=r.equals)!=null?i:Object.is,this.lazy=(n=r.lazy)!=null?n:false,this.lazy||this.computeNow();}get value(){return this.dirty&&this.computeNow(),super.value}dispose(){for(let t of this.depUnsubs)try{t();}catch(r){}this.depUnsubs=[],this.deps.clear();}computeNow(){for(let i of this.depUnsubs)try{i();}catch(n){}this.depUnsubs=[],this.deps.clear(),g({addDependency:i=>{this.deps.add(i);}});let r;try{r=this.compute();}finally{L();}for(let i of this.deps){let n=i();this.depUnsubs.push(n);}this.dirty=false;let o=super.value;this.equalsLocal(o,r)||super.set(r);}static trackField(t,r){return ()=>t.addListener(()=>r())}};function y(s,e){return new U(s,e)}function j(s,e,t){return y(()=>e(s.value),t)}function J(s,e={}){let t,r=[],o=new Set,i=false,n=()=>{if(i)return;if(t){try{t();}catch(a){}t=void 0;}for(let a of r)try{a();}catch(u){}r=[],o.clear(),g({addDependency:a=>o.add(a)});try{let a=s();typeof a=="function"&&(t=a);}finally{L();}for(let a of o)r.push(a());};return e.lazy||n(),()=>{if(i=true,t){try{t();}catch(p){}t=void 0;}for(let p of r)try{p();}catch(a){}r=[],o.clear();}}function B(s,e={}){let{predicate:t,signal:r,timeoutMs:o}=e;return new Promise((i,n)=>{if(r!=null&&r.aborted){n(new DOMException("Aborted","AbortError"));return}let p,a=l=>{try{l==null||l();}catch(R){}p&&clearTimeout(p);};o!=null&&(p=setTimeout(()=>{a(d),n(new Error(`toPromise timeout after ${o}ms`));},o));let u=()=>{a(d),n(new DOMException("Aborted","AbortError"));};r==null||r.addEventListener("abort",u,{once:true});let d=s.addListener(l=>{t&&!t(l)||(r==null||r.removeEventListener("abort",u),a(d),i(l));},{signal:r});})}function V(s,e={}){let{predicate:t,signal:r,timeoutMs:o,immediate:i}=e;if(i){let a=s.value;if(!t||t(a))return Promise.resolve(a)}let n=new v,p=s.addListener(a=>n.invoke(a),{signal:r});return B(n,{predicate:t,signal:r,timeoutMs:o}).finally(()=>{try{p();}catch(a){}})}function N(s,e,t){let r=new v,o=n=>r.invoke(n);return s.addEventListener(e,o,t),{event:r,dispose:()=>s.removeEventListener(e,o,t)}}function W(s){let e=new v,t=s.subscribe(o=>e.invoke(o),()=>{},()=>{});return {event:e,dispose:typeof t=="function"?t:()=>{try{t.unsubscribe();}catch(o){}}}}function $(s,e){return y(()=>s.value.filter(e))}function G(s,e){return y(()=>s.value.map(e))}function K(s,e,t){return y(()=>[...s.value].sort(e),t)}var E=class{constructor(e,t={}){c(this,"changes",new v);c(this,"history");c(this,"root");c(this,"proxyCache",new WeakMap);c(this,"proxy");c(this,"version",new h(0));this.root=e,this.history=t.history,this.proxy=this.makeProxy(e,[]);}get value(){return b(()=>this.version.addListener(()=>{})),this.version.value,this.proxy}addListener(e,t){return this.changes.addListener(e,t)}addPathListener(e,t,r={}){var n;let o=k(e),i=(n=r.mode)!=null?n:"prefix";return this.changes.addListener(p=>{let a=D(p.path);if(O(o,a,i))return t(p)},r)}removeAllListeners(){this.changes.removeAllListeners();}bumpVersion(){this.version.update(e=>e+1);}invokePatch(e){this.bumpVersion(),this.changes.invoke(e);}applyPatch(e){let t=this.getTargetByPath(this.root,e.path.slice(0,-1)),r=e.path[e.path.length-1];e.op==="set"?t[r]=e.next:e.op==="delete"?delete t[r]:e.op==="splice"&&this.getTargetByPath(this.root,e.path).splice(e.index,e.deleteCount,...e.items);}invertPatch(e){return e.op==="set"?{op:"set",path:e.path,prev:e.next,next:e.prev}:e.op==="delete"?{op:"set",path:e.path,prev:void 0,next:e.prev}:{op:"splice",path:e.path,index:e.index,deleteCount:e.items.length,items:e.removed,removed:e.items}}recordHistory(e){let t=this.history;if(!t||t.isApplying)return;let r=this.invertPatch(e);t.push({undo:()=>f(()=>{this.applyPatch(r),this.invokePatch(r);}),redo:()=>f(()=>{this.applyPatch(e),this.invokePatch(e);})});}getTargetByPath(e,t){let r=e;for(let o of t)r=r[o];return r}makeProxy(e,t){if(e&&typeof e=="object"){let i=this.proxyCache.get(e);if(i)return i}let r=this,o=new Proxy(e,{get(i,n,p){let a=Reflect.get(i,n,p);return a&&typeof a=="object"?r.makeProxy(a,t.concat(n)):a},set(i,n,p,a){let u=Reflect.get(i,n,a);if(Object.is(u,p))return true;if(!Reflect.set(i,n,p,a))return false;let l={op:"set",path:t.concat(n),prev:u,next:p};return r.recordHistory(l),r.invokePatch(l),true},deleteProperty(i,n){if(!Reflect.has(i,n))return true;let p=i[n];if(!Reflect.deleteProperty(i,n))return false;let u={op:"delete",path:t.concat(n),prev:p};return r.recordHistory(u),r.invokePatch(u),true}});return e&&typeof e=="object"&&this.proxyCache.set(e,o),o}};var w=class{constructor(e=[],t={}){c(this,"changes",new v);c(this,"history");c(this,"root");c(this,"proxy");c(this,"version",new h(0));this.root=e,this.history=t.history,this.proxy=this.makeProxy(e,[]);}get value(){return b(()=>this.version.addListener(()=>{})),this.version.value,this.proxy}addListener(e,t){return this.changes.addListener(e,t)}addPathListener(e,t,r={}){var n;let o=k(e),i=(n=r.mode)!=null?n:"prefix";return this.changes.addListener(p=>{let a=D(p.path);if(O(o,a,i))return t(p)},r)}removeAllListeners(){this.changes.removeAllListeners();}bumpVersion(){this.version.update(e=>e+1);}invokePatch(e){this.bumpVersion(),this.changes.invoke(e);}applyPatch(e){if(e.op==="splice"){this.getTargetByPath(this.root,e.path).splice(e.index,e.deleteCount,...e.items);return}let t=this.getTargetByPath(this.root,e.path.slice(0,-1)),r=e.path[e.path.length-1];e.op==="set"?t[r]=e.next:e.op==="delete"&&delete t[r];}invertPatch(e){return e.op==="set"?{op:"set",path:e.path,prev:e.next,next:e.prev}:e.op==="delete"?{op:"set",path:e.path,prev:void 0,next:e.prev}:{op:"splice",path:e.path,index:e.index,deleteCount:e.items.length,items:e.removed,removed:e.items}}recordHistory(e){let t=this.history;if(!t||t.isApplying)return;let r=this.invertPatch(e);t.push({undo:()=>f(()=>{this.applyPatch(r),this.invertPatch(r);}),redo:()=>f(()=>{this.applyPatch(e),this.invokePatch(e);})});}getTargetByPath(e,t){let r=e;for(let o of t)r=r[o];return r}makeProxy(e,t){let r=this,o={get(i,n,p){return n==="push"?(...a)=>{let u=i.length,l={op:"splice",path:t,index:u,deleteCount:0,items:a,removed:[]},R=i.push(...a);return r.recordHistory(l),r.invokePatch(l),R}:n==="pop"?()=>{if(i.length===0)return;let a=i.length-1,u=[i[a]],d={op:"splice",path:t,index:a,deleteCount:1,items:[],removed:u},l=i.pop();return r.recordHistory(d),r.invokePatch(d),l}:n==="splice"?(a,u,...d)=>{let l=u!=null?u:i.length-a,R=i.slice(a,a+l),H={op:"splice",path:t,index:a,deleteCount:l,items:d,removed:R},q=i.splice(a,l,...d);return r.recordHistory(H),r.invokePatch(H),q}:Reflect.get(i,n,p)},set(i,n,p,a){let u=Reflect.get(i,n,a);if(Object.is(u,p))return true;if(!Reflect.set(i,n,p,a))return false;let l={op:"set",path:t.concat(n),prev:u,next:p};return r.recordHistory(l),r.invokePatch(l),true},deleteProperty(i,n){if(!Reflect.has(i,n))return true;let p=i[n];if(!Reflect.deleteProperty(i,n))return false;let u={op:"delete",path:t.concat(n),prev:p};return r.recordHistory(u),r.invokePatch(u),true}};return new Proxy(e,o)}};exports.ReactiveArray=w;exports.ReactiveComputed=U;exports.ReactiveEvent=v;exports.ReactiveField=h;exports.ReactiveHistoryStack=C;exports.ReactiveObject=E;exports.ReactiveWatcher=A;exports.fromEvent=N;exports.fromObservable=W;exports.pathToString=M;exports.toPromise=B;exports.toPromiseField=V;exports.useBatch=f;exports.useComputed=y;exports.useEffect=J;exports.useFiltered=$;exports.useMapped=G;exports.useReactiveTransaction=z;exports.useSelect=j;exports.useSorted=K;return exports;})({});//# sourceMappingURL=reactivets.global.js.map
2
+ //# sourceMappingURL=reactivets.global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/scheduler.ts","../src/core/disposable.ts","../src/core/event.ts","../src/core/tracking.ts","../src/core/field.ts","../src/core/history.ts","../src/core/patch.ts","../src/core/computed.ts","../src/core/effect.ts","../src/core/adapters.ts","../src/core/views.ts","../src/reactive/object.ts","../src/reactive/array.ts"],"names":["batchDepth","scheduled","queue","flush","jobs","job","useSchedule","useBatch","fn","ReactiveWatcher","__publicField","unsub","e","list","d","ReactiveEvent","options","_a","stored","onAbort","l","wrapper","p","ctx","payload","run","res","signal","tasks","off","r","stack","beginTracking","tracker","endTracking","useTracking","subscribeFactory","t","ReactiveField","initial","next","prev","history","ReactiveHistoryStack","label","entries","composite","i","entry","useReactiveTransaction","pathToString","path","parsePathSpec","spec","x","patchPathToSegments","matchPath","specSegs","pathSegs","mode","s","ReactiveComputed","compute","_b","_c","u","subFactory","dep","field","onChange","useComputed","useSelect","source","map","useEffect","cleanup","depUnsubs","deps","stopped","c","toPromise","ev","predicate","timeoutMs","resolve","reject","timer","v","toPromiseField","immediate","fromEvent","target","type","event","handler","fromObservable","obs","sub","useFiltered","useMapped","useSorted","compareFn","ReactiveObject","obj","patch","segs","key","h","inverse","cur","basePath","cached","self","proxy","prop","receiver","value","ReactiveArray","arr","items","index","removed","deleteCount","dc"],"mappings":"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","file":"reactivets.global.js","sourcesContent":["/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n/**\n * Scheduler Job Method\n */\ntype ReactiveJob = () => void;\n\n// Setup Scheduler Variables\nlet batchDepth : number = 0; // Batching Depth\nlet scheduled : boolean = false; // Is Scheduled\nconst queue : Set<ReactiveJob> = new Set<ReactiveJob>(); // Jobs Queue\n\n/**\n * Add and Complete all scheduled tasks\n */\nfunction flush() {\n scheduled = false;\n const jobs = Array.from(queue);\n queue.clear();\n for (const job of jobs) job();\n}\n\n/**\n * Schedule Reactive Task and run after tick\n * @param job {ReactiveJob} Reactive Job\n */\nexport function useSchedule(job: ReactiveJob): void {\n queue.add(job);\n if (batchDepth > 0) return;\n if (!scheduled) {\n scheduled = true;\n queueMicrotask(flush);\n }\n}\n\n/**\n * Use Batcher for Reactive Jobs with Depth\n * @param fn {Function} Reactive Task\n */\nexport function useBatch<ReactiveTask>(fn: () => ReactiveTask): ReactiveTask {\n batchDepth++;\n try {\n return fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0 && queue.size > 0 && !scheduled) {\n scheduled = true;\n queueMicrotask(flush);\n }\n }\n}\n\n/**\n * Check if Reactive Batching is in Progress\n * @return {boolean} Has Batched Subscribers in Progress\n */\nexport function isReactiveBatching(): boolean {\n return batchDepth > 0;\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n/**\n * Unsubscribe Method\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Disposable Interface\n */\nexport interface IDisposable {\n /**\n * Dispose Method\n */\n dispose(): void;\n}\n\n/**\n * Multiple Merge Unsubscribe methods\n * @param fns {Array<Unsubscribe|undefined>} Reactive Unsubscribe Method\n * @return {Unsubscribe} Return Unsubscribe Method\n */\nexport function mergeUnsubscribe(...fns: Array<Unsubscribe | undefined>): Unsubscribe {\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n for (const fn of fns) {\n try {\n fn?.();\n } catch {\n // unsubscribe must never crash userland\n }\n }\n };\n}\n\n/**\n * Reactive Watcher for Automatic Dispose\n */\nexport class ReactiveWatcher implements IDisposable {\n // Disposers\n private disposers = new Set<Unsubscribe>();\n private _disposed = false;\n\n /**\n * Is Disposed\n */\n public get disposed(): boolean {\n return this._disposed;\n }\n\n /**\n * Add Watcher for Reactive Subscriber\n * @param unsub {Unsubscribe} Unsubscribe Method\n * @return {Unsubscribe} Return Unsubscribe Method\n */\n public add(unsub: Unsubscribe): Unsubscribe {\n if (this._disposed) {\n try { unsub(); } catch {}\n return () => {};\n }\n this.disposers.add(unsub);\n return () : boolean => this.disposers.delete(unsub);\n }\n\n /**\n * Add Watcher for Reactive Subscriber and Return them\n * @param unsub {Unsubscribe} Unsubscribe Method\n * @return {Unsubscribe} Return Unsubscribe Method\n */\n public watch(unsub: Unsubscribe): Unsubscribe {\n this.add(unsub);\n return unsub;\n }\n\n /**\n * Dispose All Added Reactive Subscribers\n */\n public dispose(): void {\n if (this._disposed) return;\n this._disposed = true;\n\n const list = Array.from(this.disposers);\n this.disposers.clear();\n for (const d of list) {\n try { d(); } catch {}\n }\n }\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Import Required\nimport type { Unsubscribe } from \"./disposable\";\nimport { useSchedule } from \"./scheduler\";\n\n/**\n * Reactive Listener Options\n */\nexport type ReactiveListenerOptions = {\n signal?: AbortSignal; // For Async Operations\n batched?: boolean; // default true for batching\n};\n\n/**\n * Reactive Listener Context\n */\nexport type ReactiveListenerContext = {\n signal: AbortSignal;\n};\n\n/**\n * Reactive Listener\n */\nexport type ReactiveListener<ReactiveData> = (payload: ReactiveData, ctx: ReactiveListenerContext) => void | Promise<void>;\n\n/**\n * Stored Reactive Listener\n */\ntype StoredReactiveListener<ReactiveData> = {\n fn: ReactiveListener<ReactiveData>; // Listener Function\n batched: boolean; // Batching Option\n controller: AbortController; // Async Abort Controller\n externalAbortUnsub?: () => void; // External Abort Unsubscribe Method\n};\n\n/**\n * Reactive Types Base\n */\nexport interface IReactiveTypeBase<ReactiveData> {\n get listenerCount() : number;\n addListener(fn: ReactiveListener<ReactiveData>, options: ReactiveListenerOptions): Unsubscribe;\n removeListener(fn: ReactiveListener<ReactiveData>): void;\n removeAllListeners(): void;\n invokeOnce(fn: ReactiveListener<ReactiveData>, options: ReactiveListenerOptions): Unsubscribe;\n}\n\n/**\n * Reactive Event\n */\nexport class ReactiveEvent<ReactiveData = void> implements IReactiveTypeBase<ReactiveData> {\n // Reactive Listeners\n private listeners : Set<StoredReactiveListener<ReactiveData>> = new Set<StoredReactiveListener<ReactiveData>>();\n\n /**\n * @return {number} Reactive Listeners Count\n */\n get listenerCount(): number {\n return this.listeners.size;\n }\n\n /**\n * Add Reactive Listener\n * @param fn {ReactiveListener} Reactive Listener\n * @param options {ReactiveListenerOptions} Listener Options\n * @return {Unsubscribe} Unsubscribe Method\n */\n public addListener(fn: ReactiveListener<ReactiveData>, options: ReactiveListenerOptions = {}): Unsubscribe {\n // Create Stored Listener\n const stored: StoredReactiveListener<ReactiveData> = {\n fn,\n batched: options.batched ?? true,\n controller: new AbortController()\n };\n\n // For Async Operations\n if (options.signal) {\n if (options.signal.aborted) return () => {};\n const onAbort = () => this.removeListener(fn);\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n stored.externalAbortUnsub = () => options.signal?.removeEventListener(\"abort\", onAbort);\n }\n\n // Add Listener\n this.listeners.add(stored);\n\n // Return Unsubscribe Method\n return () => {\n this.listeners.delete(stored);\n stored.externalAbortUnsub?.();\n stored.controller.abort();\n };\n }\n\n /**\n * Remove Reactive Listener\n * @param fn {ReactiveListener} Reactive Listener\n */\n public removeListener(fn: ReactiveListener<ReactiveData>): void {\n for (const l of this.listeners) {\n if (l.fn === fn) {\n this.listeners.delete(l);\n l.externalAbortUnsub?.();\n l.controller.abort();\n }\n }\n }\n\n /**\n * Remove All Reactive Listeners\n */\n public removeAllListeners(): void {\n for (const l of this.listeners) {\n l.externalAbortUnsub?.();\n l.controller.abort();\n }\n this.listeners.clear();\n }\n\n /**\n * Invoke Listener Once and Dispose\n * @param fn {ReactiveListener} Reactive Listener\n * @param options {ReactiveListenerOptions} Listener Options\n * @return {Unsubscribe} Unsubscribe Function\n */\n public invokeOnce(fn: ReactiveListener<ReactiveData>, options: ReactiveListenerOptions = {}): Unsubscribe {\n let unsub: Unsubscribe = () => {};\n const wrapper: ReactiveListener<ReactiveData> = async (p, ctx) => {\n unsub();\n await fn(p, ctx);\n };\n unsub = this.addListener(wrapper, options);\n return unsub;\n }\n\n /**\n * Invoke Reactive Event Sync\n * @param payload Reactive Event Data\n */\n public invoke(payload: ReactiveData): void {\n for (const l of Array.from(this.listeners)) {\n const run = () => {\n if (l.controller.signal.aborted) return;\n try {\n const res = l.fn(payload, { signal: l.controller.signal });\n if (res && typeof (res as Promise<void>).then === \"function\") {\n (res as Promise<void>).catch(() => {});\n }\n } catch {\n // ignore\n }\n };\n\n if (l.batched) useSchedule(run);\n else run();\n }\n }\n\n /**\n * Invoke Reactive Event Async\n * @param payload Reactive Event Data\n * @param signal {AbortSignal} Cancellation Signal\n * @return {Promise}\n */\n public async invokeAsync(payload: ReactiveData, signal?: AbortSignal): Promise<void> {\n const tasks: Promise<void>[] = [];\n\n for (const l of Array.from(this.listeners)) {\n if (signal?.aborted) break;\n\n const run = async () => {\n if (l.controller.signal.aborted) return;\n if (signal?.aborted) return;\n\n let off: (() => void) | undefined;\n if (signal) {\n const onAbort = () => l.controller.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n off = () => signal.removeEventListener(\"abort\", onAbort);\n }\n\n try {\n await l.fn(payload, { signal: l.controller.signal });\n } catch {\n // ignore\n } finally {\n off?.();\n }\n };\n\n tasks.push(l.batched ? new Promise<void>((r) => useSchedule(() => void run().finally(r))) : run());\n }\n\n await Promise.all(tasks);\n }\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Import Required\nimport { Unsubscribe } from \"./disposable\";\n\n/**\n * Tracking Interface\n */\nexport interface ITrackable {\n /**\n * Track Subscribe\n * @param subscribe {Unsubscribe} Unsubscribe Method\n */\n __track(subscribe: () => Unsubscribe): void;\n}\n\n/**\n * Dependency Tracking Type\n */\ntype Tracker = {\n /**\n * Add Dependency\n * @param subscribeFactory {Unsubscribe} Subscribe Factory\n */\n addDependency(subscribeFactory: () => Unsubscribe): void;\n};\n\n// Define Tracking Stack\nconst stack : Tracker[] = [];\n\n/**\n * Begin Reactive Dependency Tracking\n * @param tracker\n */\nexport function beginTracking(tracker: Tracker): void {\n stack.push(tracker);\n}\n\n/**\n * End Reactive Dependency Tracking\n */\nexport function endTracking(): void {\n stack.pop();\n}\n\n/**\n * Use Tracking for Computed\n * @param subscribeFactory {Unsubscribe} Subscription Factory\n */\nexport function useTracking(subscribeFactory: () => Unsubscribe): void {\n const t = stack[stack.length - 1];\n if (!t) return;\n t.addDependency(subscribeFactory);\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Import Required\nimport type { Unsubscribe } from \"./disposable\";\nimport { ReactiveEvent, IReactiveTypeBase, type ReactiveListener, type ReactiveListenerOptions } from \"./event\";\nimport { ReactiveHistoryStack } from \"./history\";\nimport { useTracking } from \"./tracking\";\n\n// Field Listener and Compare Methods\nexport type ReactiveFieldListener<T> = ReactiveListener<T>;\nexport type ReactiveCompare<T> = (a: T, b: T) => boolean;\n\n/**\n * Reactive Field Options\n */\nexport type ReactiveFieldOptions<T> = {\n equals?: ReactiveCompare<T>; // Equals Method\n history?: ReactiveHistoryStack; // Reactive History Stack\n historyLabel?: (prev: T, next: T) => string | undefined; // Reactive History Name\n};\n\n/**\n * Reactive Field\n */\nexport class ReactiveField<ReactiveData> implements IReactiveTypeBase<ReactiveData> {\n // Current Field Values and History\n private _value: ReactiveData;\n private readonly equals: ReactiveCompare<ReactiveData>;\n private readonly changed = new ReactiveEvent<ReactiveData>();\n private readonly history?: ReactiveHistoryStack;\n private readonly historyLabel?: (prev: ReactiveData, next: ReactiveData) => string | undefined;\n\n /**\n * Creates Reactive Field\n * @param initial Reactive Field Initial Value\n * @param options Reactive Field Options\n */\n constructor(initial: ReactiveData, options: ReactiveFieldOptions<ReactiveData> = {}) {\n this._value = initial;\n this.equals = options.equals ?? Object.is;\n this.history = options.history;\n this.historyLabel = options.historyLabel;\n }\n\n /**\n * Get Current Reactive Value\n */\n public get value(): ReactiveData {\n // dependency tracking hook\n useTracking(() => this.addListener(() => {}));\n return this._value;\n }\n\n /**\n * Set Current Reactive Value\n * @param next New Value\n */\n public set value(next: ReactiveData) {\n this.set(next);\n }\n\n /**\n * Return Field Listener Count\n */\n public get listenerCount(): number {\n return this.changed.listenerCount;\n }\n\n /**\n * Set Reactive Field Value\n * @param next New Reactive Field Value\n */\n public set(next: ReactiveData): void {\n const prev = this._value;\n if (this.equals(prev, next)) return;\n\n const history = this.history;\n const shouldPush = !!history && !history.isApplying;\n\n if (shouldPush) {\n history!.push({\n label: this.historyLabel?.(prev, next),\n undo: () => this.set(prev),\n redo: () => this.set(next)\n });\n }\n\n this._value = next;\n this.changed.invoke(next);\n }\n\n /**\n * Update Current Reactive Field\n * @param fn\n */\n public update(fn: (current: ReactiveData) => ReactiveData): void {\n this.set(fn(this._value));\n }\n\n /**\n * Add Listener to Reactive Field\n * @param fn {ReactiveListener} Reactive Listener\n * @param options {ReactiveListenerOptions} Listener Options\n * @return {Unsubscribe} Unsubscribe Method\n */\n public addListener(fn: ReactiveFieldListener<ReactiveData>, options?: ReactiveListenerOptions): Unsubscribe {\n return this.changed.addListener(fn, options);\n }\n\n /**\n * Remove Listener from Reactive Field\n * @param fn {ReactiveListener} Reactive Listener\n */\n public removeListener(fn: ReactiveFieldListener<ReactiveData>): void {\n this.changed.removeListener(fn);\n }\n\n /**\n * Remove All Listeners from Reactive Field\n */\n public removeAllListeners(): void {\n this.changed.removeAllListeners();\n }\n\n /**\n * Invoke Listener Once and Dispose Field\n * @param fn {ReactiveListener} Reactive Listener\n * @param options {ReactiveListenerOptions} Listener Options\n * @return {Unsubscribe} Unsubscribe Method\n */\n public invokeOnce(fn: ReactiveFieldListener<ReactiveData>, options?: ReactiveListenerOptions): Unsubscribe {\n return this.changed.invokeOnce(fn, options);\n }\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n/**\n * Reactive History Entry Interface\n */\nexport interface IReactiveHistoryEntry {\n label?: string; // History Name (Not Required)\n undo(): void; // Undo History\n redo(): void; // Redo History\n}\n\n/**\n * Reactive Transaction\n */\ntype ReactiveTransaction = {\n label?: string; // Transaction Name (Not Required)\n entries: IReactiveHistoryEntry[]; // History Entry\n};\n\n/**\n * Reactive History Stack\n */\nexport class ReactiveHistoryStack {\n // History Parameters\n private past: IReactiveHistoryEntry[] = [];\n private future: IReactiveHistoryEntry[] = [];\n private applying = false;\n private tx: ReactiveTransaction | null = null;\n\n /**\n * @return {boolean} Is Undo available\n */\n public get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n /**\n * @return {boolean} Is Redo available\n */\n public get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n /**\n * @return {boolean} Is History Applying\n */\n public get isApplying(): boolean {\n return this.applying;\n }\n\n /**\n * @return {boolean} Is current in transaction\n */\n public get inTransaction(): boolean {\n return this.tx !== null;\n }\n\n /**\n * Begin Transaction\n * @param label {string} Transaction Name\n */\n public beginTransaction(label?: string): void {\n if (this.applying) return;\n if (this.tx) return; // no nested for simplicity\n this.tx = {label, entries: []};\n }\n\n /**\n * End Transaction\n */\n public endTransaction(): void {\n if (!this.tx) return;\n const {label, entries} = this.tx;\n this.tx = null;\n\n if (entries.length === 0) return;\n if (entries.length === 1) {\n const e = entries[0]!;\n this.push({...e, label: label ?? e.label});\n return;\n }\n\n // Create Composite for History\n const composite: IReactiveHistoryEntry = {\n label,\n undo: () => {\n // undo in reverse\n for (let i = entries.length - 1; i >= 0; i--) entries[i]!.undo();\n },\n redo: () => {\n // redo in forward\n for (const e of entries) e.redo();\n }\n };\n\n this.push(composite);\n }\n\n /**\n * Push into History\n * @param entry {IReactiveHistoryEntry} History Entry\n */\n public push(entry: IReactiveHistoryEntry): void {\n if (this.applying) return;\n\n if (this.tx) {\n this.tx.entries.push(entry);\n return;\n }\n\n this.past.push(entry);\n this.future.length = 0;\n }\n\n /**\n * Undo Transaction\n */\n public undo(): void {\n const entry = this.past.pop();\n if (!entry) return;\n this.applying = true;\n try {\n entry.undo();\n this.future.push(entry);\n } finally {\n this.applying = false;\n }\n }\n\n /**\n * Redo Transaction\n */\n public redo(): void {\n const entry = this.future.pop();\n if (!entry) return;\n this.applying = true;\n try {\n entry.redo();\n this.past.push(entry);\n } finally {\n this.applying = false;\n }\n }\n\n /**\n * Clear History\n */\n public clear(): void {\n this.past.length = 0;\n this.future.length = 0;\n this.tx = null;\n }\n}\n\n/**\n * Use Reactive Transaction\n * @param history {ReactiveHistoryStack} History Stack\n * @param fn Transaction\n * @param label {string} Transaction Name\n */\nexport function useReactiveTransaction<Transaction>(history: ReactiveHistoryStack, fn: () => Transaction, label?: string): Transaction {\n history.beginTransaction(label);\n try {\n return fn();\n } finally {\n history.endTransaction();\n }\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Path and Patch\nexport type Path = Array<string | number | symbol>;\nexport type Patch =\n | { op: \"set\"; path: Path; prev: unknown; next: unknown }\n | { op: \"delete\"; path: Path; prev: unknown }\n | { op: \"splice\"; path: Path; index: number; deleteCount: number; items: unknown[]; removed: unknown[] };\n\n// Path Spec\nexport type PathSpec = string | Path;\n\n/**\n * Convert path to string\n * @param path\n */\nexport function pathToString(path: Path): string {\n return path\n .map((p) => (typeof p === \"symbol\" ? p.toString() : String(p)))\n .join(\".\");\n}\n\n/**\n * Parse path spec\n * @param spec {PathSpec}\n */\nexport function parsePathSpec(spec: PathSpec): string[] {\n if (Array.isArray(spec)) return spec.map((x) => String(x));\n // \"user.name\" or \"items.*.id\"\n return spec.split(\".\").filter(Boolean);\n}\n\n/**\n * Patch Path to Segments\n * @param path\n */\nexport function patchPathToSegments(path: Path): string[] {\n return path.map((x) => String(x));\n}\n\n/**\n * Match Path\n *\n * matches:\n * - exact: \"user.name\"\n * - prefix: \"user\" matches \"user.name\", \"user.age\"\n * - wildcard: \"items.*.id\" matches \"items.0.id\", \"items.10.id\"\n */\nexport function matchPath(specSegs: string[], pathSegs: string[], mode: \"exact\" | \"prefix\" = \"prefix\"): boolean {\n if (mode === \"exact\" && specSegs.length !== pathSegs.length) return false;\n if (specSegs.length > pathSegs.length) return false;\n\n for (let i = 0; i < specSegs.length; i++) {\n const s = specSegs[i]!;\n const p = pathSegs[i]!;\n if (s === \"*\") continue;\n if (s !== p) return false;\n }\n\n return mode === \"exact\" ? specSegs.length === pathSegs.length : true;\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Import Required\nimport { ReactiveField, type ReactiveCompare } from \"./field\";\nimport { beginTracking, endTracking } from \"./tracking\";\nimport type { Unsubscribe } from \"./disposable\";\n\n// For Dependency Unsubscribe\ntype DepSub = () => Unsubscribe;\n\n/**\n * Computed Options\n */\nexport type ComputedOptions<T> = {\n equals?: ReactiveCompare<T>; // Compare Method\n lazy?: boolean; // If true - enable lazy compute upon reading. By default false - batching\n};\n\n/**\n * Computed Class for Dependency Collection for any Reactive Types\n */\nexport class ReactiveComputed<T> extends ReactiveField<T> {\n // Computed Data\n private readonly compute: () => T;\n private deps = new Set<DepSub>();\n private depUnsubs: Unsubscribe[] = [];\n private dirty = true;\n private readonly equalsLocal: ReactiveCompare<T>;\n private readonly lazy: boolean;\n\n /**\n * Create Compute\n * @param compute {Function} Compute Method\n * @param options {ComputedOptions} Compute Options\n */\n constructor(compute: () => T, options: ComputedOptions<T> = {}) {\n // Will be replaced at first computeNow()\n super(undefined as unknown as T, { equals: options.equals ?? Object.is });\n this.compute = compute;\n this.equalsLocal = options.equals ?? Object.is;\n this.lazy = options.lazy ?? false;\n\n if (!this.lazy) {\n this.computeNow();\n }\n }\n\n /**\n * Get Current Value\n */\n public override get value(): T {\n if (this.dirty) this.computeNow();\n return super.value;\n }\n\n /**\n * Dispose\n */\n public dispose(): void {\n for (const u of this.depUnsubs) {\n try { u(); } catch {}\n }\n this.depUnsubs = [];\n this.deps.clear();\n }\n\n /**\n * Compute Now\n * @private\n */\n private computeNow(): void {\n // unsubscribe previous deps\n for (const u of this.depUnsubs) {\n try { u(); } catch {}\n }\n this.depUnsubs = [];\n this.deps.clear();\n\n const tracker = {\n addDependency: (subFactory: DepSub) => {\n this.deps.add(subFactory);\n }\n };\n\n beginTracking(tracker);\n let next!: T;\n try {\n next = this.compute();\n } finally {\n endTracking();\n }\n\n // subscribe to deps with recompute invalidation\n for (const dep of this.deps) {\n const unsub = dep();\n this.depUnsubs.push(unsub);\n }\n\n this.dirty = false;\n\n // set only if changed\n const prev = super.value;\n if (!this.equalsLocal(prev, next)) {\n super.set(next);\n } else {\n // keep stable value\n // still ensure internal _value is correct (it is)\n }\n }\n\n /**\n * Helper to create dependency subscriptions from any ReactiveField/Event.\n */\n static trackField<T>(field: ReactiveField<T>, onChange: () => void): DepSub {\n return () => field.addListener(() => onChange());\n }\n}\n\n/**\n * Compute Function\n */\nexport function useComputed<T>(fn: () => T, options?: ComputedOptions<T>): ReactiveComputed<T> {\n return new ReactiveComputed(fn, options);\n}\n\n/**\n * Selector Method\n * @param source {ReactiveField} Source Field\n * @param map Map Function\n * @param options Selector Options\n */\nexport function useSelect<A, B>(\n source: ReactiveField<A>,\n map: (a: A) => B,\n options?: { equals?: ReactiveCompare<B>; lazy?: boolean }\n): ReactiveComputed<B> {\n return useComputed(() => map(source.value), options);\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Import Required\nimport { beginTracking, endTracking } from \"./tracking\";\nimport type { Unsubscribe } from \"./disposable\";\n\n// For Dependency Checking\ntype DepSub = () => Unsubscribe;\n\n// Effect Cleanup Functions\nexport type ReactiveEffectCleanup = void | (() => void);\nexport type ReactiveEffectFn = () => ReactiveEffectCleanup;\n\n/**\n * Effect Options\n */\nexport type ReactiveEffectOptions = {\n lazy?: boolean;\n};\n\n/**\n * Use Reactive Effect\n * @param fn {ReactiveEffectFn} Reactive Effect Function\n * @param options {ReactiveEffectOptions} Effect Options\n * @return {Unsubscribe} Unsubscribe Method\n */\nexport function useEffect(fn: ReactiveEffectFn, options: ReactiveEffectOptions = {}): Unsubscribe {\n // Internal Parameters\n let cleanup: (() => void) | undefined;\n let depUnsubs: Unsubscribe[] = [];\n let deps = new Set<DepSub>();\n let stopped = false;\n\n // Run Effect\n const run = () => {\n if (stopped) return;\n\n // cleanup\n if (cleanup) {\n try { cleanup(); } catch {}\n cleanup = undefined;\n }\n\n // unsub deps\n for (const u of depUnsubs) {\n try { u(); } catch {}\n }\n depUnsubs = [];\n deps.clear();\n\n const tracker = {\n addDependency: (subFactory: DepSub) => deps.add(subFactory)\n };\n\n beginTracking(tracker);\n try {\n const c = fn();\n if (typeof c === \"function\") cleanup = c;\n } finally {\n endTracking();\n }\n\n for (const dep of deps) {\n depUnsubs.push(dep());\n }\n };\n\n // If Lazy Option Enabled\n if (!options.lazy) run();\n\n return () => {\n stopped = true;\n if (cleanup) {\n try { cleanup(); } catch {}\n cleanup = undefined;\n }\n for (const u of depUnsubs) {\n try { u(); } catch {}\n }\n depUnsubs = [];\n deps.clear();\n };\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Import Required\nimport { ReactiveEvent } from \"./event\";\nimport { ReactiveField } from \"./field\";\nimport type { Unsubscribe } from \"./disposable\";\n\n/**\n * To Promise Option\n */\nexport type ToPromiseOptions<T> = {\n predicate?: (v: T) => boolean;\n signal?: AbortSignal;\n timeoutMs?: number;\n immediate?: boolean;\n};\n\n/**\n * Convert to Promise\n * @param ev {ReactiveEvent} Reactive Event\n * @param options {ToPromiseOptions} Options\n * @return {Promise} Promise\n */\nexport function toPromise<T>(ev: ReactiveEvent<T>, options: ToPromiseOptions<T> = {}): Promise<T> {\n // Options\n const { predicate, signal, timeoutMs } = options;\n\n // Return Promise\n return new Promise<T>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n\n let timer: any;\n const cleanup = (unsub?: Unsubscribe) => {\n try { unsub?.(); } catch {}\n if (timer) clearTimeout(timer);\n };\n\n if (timeoutMs != null) {\n timer = setTimeout(() => {\n cleanup(unsub);\n reject(new Error(`toPromise timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n }\n\n const onAbort = () => {\n cleanup(unsub);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n const unsub = ev.addListener((v) => {\n if (predicate && !predicate(v)) return;\n signal?.removeEventListener(\"abort\", onAbort);\n cleanup(unsub);\n resolve(v);\n }, { signal });\n });\n}\n\n/**\n * To Promise Field\n * @param field {ReactiveField} Reactive Field\n * @param options {ToPromiseOptions} Options\n * @return {Promise<ReactiveField>} Promise Field\n */\nexport function toPromiseField<T>(field: ReactiveField<T>, options: ToPromiseOptions<T> = {}): Promise<T> {\n const { predicate, signal, timeoutMs, immediate } = options;\n\n if (immediate) {\n const v = field.value;\n if (!predicate || predicate(v)) return Promise.resolve(v);\n }\n\n const ev = new ReactiveEvent<T>();\n const unsub = field.addListener((v) => ev.invoke(v), { signal });\n\n return toPromise(ev, { predicate, signal, timeoutMs }).finally(() => {\n try { unsub(); } catch {}\n });\n}\n\n/**\n * Get From Event\n * @param target {EventTarget} Event Target\n * @param type {string} Event Type\n * @param options {AddEventListenerOptions} Event Listener Options\n */\nexport function fromEvent<T = Event>(\n target: EventTarget,\n type: string,\n options?: AddEventListenerOptions\n): { event: ReactiveEvent<T>; dispose: Unsubscribe } {\n const event = new ReactiveEvent<T>();\n const handler = (e: Event) => event.invoke(e as T);\n target.addEventListener(type, handler, options);\n const dispose = () => target.removeEventListener(type, handler, options);\n return { event, dispose };\n}\n\n/**\n * Observable Like\n */\nexport type ObservableLike<T> = {\n // Subscribe\n subscribe(next: (v: T) => void, error?: (e: unknown) => void, complete?: () => void): Unsubscribe | { unsubscribe(): void };\n};\n\n/**\n * Convert from Observable\n * @param obs {ObservableLike} Observable Like\n */\nexport function fromObservable<T>(obs: ObservableLike<T>): { event: ReactiveEvent<T>; dispose: Unsubscribe } {\n const event = new ReactiveEvent<T>();\n\n const sub = obs.subscribe(\n (v) => event.invoke(v),\n () => {},\n () => {}\n );\n\n const dispose =\n typeof sub === \"function\"\n ? sub\n : () => {\n try { sub.unsubscribe(); } catch {}\n };\n\n return { event, dispose };\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\nimport { useComputed, type ReactiveComputed } from \"./computed\";\nimport type { ReactiveCompare } from \"./field\";\nimport { ReactiveArray } from \"../reactive/array\";\n\n/**\n * Use Filtered (React on Array Changes via Version Tracking Array)\n * @param list {ReactiveArray} Reactive Array\n * @param predicate {Function} Predicate Method\n */\nexport function useFiltered<T>(list: ReactiveArray<T>, predicate: (x: T, i: number) => boolean): ReactiveComputed<T[]> {\n return useComputed(() => list.value.filter(predicate));\n}\n\n/**\n * Get Mapped\n * @param list {ReactiveArray} Reactive Array\n * @param map {Function} Map\n */\nexport function useMapped<T, R>(list: ReactiveArray<T>, map: (x: T, i: number) => R): ReactiveComputed<R[]> {\n return useComputed(() => list.value.map(map));\n}\n\n/**\n * Use Sorted\n * @param list {ReactiveArray} Reactive Array\n * @param compareFn {Function} Compare Function\n * @param options Options\n */\nexport function useSorted<T>(\n list: ReactiveArray<T>,\n compareFn: (a: T, b: T) => number,\n options?: { equals?: ReactiveCompare<T[]> }\n): ReactiveComputed<T[]> {\n return useComputed(() => [...list.value].sort(compareFn), options);\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\n// Import Required\nimport { ReactiveEvent, type ReactiveListenerOptions } from \"../core/event\";\nimport type { Unsubscribe } from \"../core/disposable\";\nimport type { Patch, Path, PathSpec } from \"../core/patch\";\nimport { ReactiveHistoryStack } from \"../core/history\";\nimport { useBatch } from \"../core/scheduler\";\nimport { ReactiveField } from \"../core/field\";\nimport { parsePathSpec, patchPathToSegments, matchPath } from \"../core/patch\";\nimport { useTracking } from \"../core/tracking\";\n\n/**\n * Reactive Object Options\n */\nexport type ReactiveObjectOptions = {\n history?: ReactiveHistoryStack;\n};\n\n/**\n * Path Listener Options\n */\nexport type PathListenerOptions = ReactiveListenerOptions & {\n mode?: \"exact\" | \"prefix\";\n};\n\nexport class ReactiveObject<ReactiveData extends object> {\n // Reactive Changes and History with Root\n private readonly changes = new ReactiveEvent<Patch>();\n private readonly history?: ReactiveHistoryStack;\n private readonly root: ReactiveData;\n\n // Proxy Caching\n private readonly proxyCache = new WeakMap<object, any>();\n private readonly proxy: ReactiveData;\n\n // Version\n private readonly version = new ReactiveField<number>(0);\n\n /**\n * Reactive Object\n * @param obj Reactive Data\n * @param options {ReactiveObjectOptions} Object Options\n */\n constructor(obj: ReactiveData, options: ReactiveObjectOptions = {}) {\n this.root = obj;\n this.history = options.history;\n this.proxy = this.makeProxy(obj, []);\n }\n\n /**\n * Current Reactive Object Value\n */\n public get value(): ReactiveData {\n // dependency tracking for computed/effect:\n useTracking(() => this.version.addListener(() => {}));\n // read version to participate in tracking when using select/computed\n void this.version.value;\n return this.proxy;\n }\n\n /**\n * Add Reactive Listener\n * @param fn {Function} Reactive Listener\n * @param options {ReactiveListenerOptions} Listener Options\n */\n public addListener(fn: (patch: Patch) => void | Promise<void>, options?: ReactiveListenerOptions): Unsubscribe {\n return this.changes.addListener(fn, options);\n }\n\n /**\n * Add Reactive Listener for Object Path\n * @param spec {PathSpec} Path\n * @param fn {Function} Reactive Listener\n * @param options {PathListenerOptions} Listener Options\n */\n public addPathListener(spec: PathSpec, fn: (patch: Patch) => void | Promise<void>, options: PathListenerOptions = {}): Unsubscribe {\n const specSegs = parsePathSpec(spec);\n const mode = options.mode ?? \"prefix\";\n return this.changes.addListener((patch) => {\n const segs = patchPathToSegments(patch.path);\n if (matchPath(specSegs, segs, mode)) return fn(patch);\n }, options);\n }\n\n /**\n * Remove All Listeners\n */\n public removeAllListeners(): void {\n this.changes.removeAllListeners();\n }\n\n /**\n * Bump Current Object Version\n * @private\n */\n private bumpVersion(): void {\n this.version.update((v) => v + 1);\n }\n\n /**\n * Invoke Patch\n * @param patch {Patch} Patch Options\n * @private\n */\n private invokePatch(patch: Patch): void {\n this.bumpVersion();\n this.changes.invoke(patch);\n }\n\n /**\n * Apply Patch\n * @param patch {Patch} Patch Options\n * @private\n */\n private applyPatch(patch: Patch): void {\n const target = this.getTargetByPath(this.root, patch.path.slice(0, -1));\n const key = patch.path[patch.path.length - 1] as any;\n\n if (patch.op === \"set\") {\n (target as any)[key] = patch.next;\n } else if (patch.op === \"delete\") {\n delete (target as any)[key];\n } else if (patch.op === \"splice\") {\n const arr = this.getTargetByPath(this.root, patch.path) as any[];\n arr.splice(patch.index, patch.deleteCount, ...patch.items);\n }\n }\n\n /**\n * Invert Patch\n * @param p {Patch} Patch Options\n * @private\n */\n private invertPatch(p: Patch): Patch {\n if (p.op === \"set\") return { op: \"set\", path: p.path, prev: p.next, next: p.prev };\n if (p.op === \"delete\") return { op: \"set\", path: p.path, prev: undefined, next: p.prev };\n return {\n op: \"splice\",\n path: p.path,\n index: p.index,\n deleteCount: p.items.length,\n items: p.removed,\n removed: p.items\n };\n }\n\n /**\n * Record History\n * @param patch {Patch} Patch Options\n * @private\n */\n private recordHistory(patch: Patch): void {\n const h = this.history;\n if (!h || h.isApplying) return;\n const inverse = this.invertPatch(patch);\n\n h.push({\n undo: () => useBatch(() => { this.applyPatch(inverse); this.invokePatch(inverse); }),\n redo: () => useBatch(() => { this.applyPatch(patch); this.invokePatch(patch); })\n });\n }\n\n /**\n * Get Target by Path\n * @param obj Object\n * @param path {Path} Path to Target\n * @private\n */\n private getTargetByPath(obj: any, path: Path): any {\n let cur = obj;\n for (const p of path) cur = cur[p as any];\n return cur;\n }\n\n /**\n * Make Proxy\n * @param obj Object\n * @param basePath {Path} Base Path\n * @private\n */\n private makeProxy(obj: any, basePath: Path): any {\n if (obj && typeof obj === \"object\") {\n const cached = this.proxyCache.get(obj);\n if (cached) return cached;\n }\n\n const self = this;\n\n const proxy = new Proxy(obj, {\n get(target, prop, receiver) {\n const v = Reflect.get(target, prop, receiver);\n if (v && typeof v === \"object\") {\n return self.makeProxy(v, basePath.concat(prop));\n }\n return v;\n },\n\n set(target, prop, value, receiver) {\n const prev = Reflect.get(target, prop, receiver);\n if (Object.is(prev, value)) return true;\n\n const ok = Reflect.set(target, prop, value, receiver);\n if (!ok) return false;\n\n const patch: Patch = { op: \"set\", path: basePath.concat(prop), prev, next: value };\n self.recordHistory(patch);\n self.invokePatch(patch);\n return true;\n },\n\n deleteProperty(target, prop) {\n if (!Reflect.has(target, prop)) return true;\n const prev = (target as any)[prop];\n const ok = Reflect.deleteProperty(target, prop);\n if (!ok) return false;\n\n const patch: Patch = { op: \"delete\", path: basePath.concat(prop), prev };\n self.recordHistory(patch);\n self.invokePatch(patch);\n return true;\n }\n });\n\n if (obj && typeof obj === \"object\") {\n this.proxyCache.set(obj, proxy);\n }\n return proxy;\n }\n}","/**\n * ReactiveTS Library\n * A simple and lightweight reactive extensions library for typescript projects\n * Contains Reactive Fields, Arrays and Objects with async support, history mode\n * and effectors.\n *\n * @developer Elijah Rastorguev\n * @version 0.9.5\n * @author Neurosell\n * @modified 21.02.2025\n * @github https://github.com/Neurosell/ReactiveTS/\n */\nimport { ReactiveEvent, type ReactiveListenerOptions } from \"../core/event\";\nimport type { Unsubscribe } from \"../core/disposable\";\nimport type { Patch, Path, PathSpec } from \"../core/patch\";\nimport { ReactiveHistoryStack } from \"../core/history\";\nimport { useBatch } from \"../core/scheduler\";\nimport { ReactiveField } from \"../core/field\";\nimport { parsePathSpec, patchPathToSegments, matchPath } from \"../core/patch\";\nimport { useTracking } from \"../core/tracking\";\n\n/**\n * Reactive Array Options\n */\nexport type ReactiveArrayOptions = {\n history?: ReactiveHistoryStack;\n};\n\n/**\n * Path Listener Options\n */\nexport type PathListenerOptions = ReactiveListenerOptions & {\n mode?: \"exact\" | \"prefix\";\n};\n\n/**\n * Reactive Array\n */\nexport class ReactiveArray<T> {\n // Changes, History And Root\n private readonly changes = new ReactiveEvent<Patch>();\n private readonly history?: ReactiveHistoryStack;\n private readonly root: T[];\n private readonly proxy: T[];\n\n // Version\n private readonly version = new ReactiveField<number>(0);\n\n /**\n * Create Reactive Array\n * @param arr {Array} Array\n * @param options {ReactiveArrayOptions} Options\n */\n constructor(arr: T[] = [], options: ReactiveArrayOptions = {}) {\n this.root = arr;\n this.history = options.history;\n this.proxy = this.makeProxy(arr, []);\n }\n\n /**\n * Get Current Reactive Array Value\n */\n public get value(): T[] {\n useTracking(() => this.version.addListener(() => {}));\n void this.version.value;\n return this.proxy;\n }\n\n /**\n * Add Reactive Listener\n * @param fn {Function} Listener\n * @param options {ReactiveListenerOptions} Options\n */\n public addListener(fn: (patch: Patch) => void | Promise<void>, options?: ReactiveListenerOptions): Unsubscribe {\n return this.changes.addListener(fn, options);\n }\n\n /**\n * Add Reactive Listener for Path\n * @param spec {PathSpec} Path\n * @param fn {Function} Listener\n * @param options {PathListenerOptions} Options\n */\n public addPathListener(spec: PathSpec, fn: (patch: Patch) => void | Promise<void>, options: PathListenerOptions = {}): Unsubscribe {\n const specSegs = parsePathSpec(spec);\n const mode = options.mode ?? \"prefix\";\n return this.changes.addListener((patch) => {\n const segs = patchPathToSegments(patch.path);\n if (matchPath(specSegs, segs, mode)) return fn(patch);\n }, options);\n }\n\n /**\n * Remove All Listeners\n */\n public removeAllListeners(): void {\n this.changes.removeAllListeners();\n }\n\n /**\n * Bump Array Version\n * @private\n */\n private bumpVersion(): void {\n this.version.update((v) => v + 1);\n }\n\n /**\n * Invoke Patch\n * @param patch {Patch} Patch Options\n * @private\n */\n private invokePatch(patch: Patch): void {\n this.bumpVersion();\n this.changes.invoke(patch);\n }\n\n /**\n * Apply Patch\n * @param patch {Patch} Patch Options\n * @private\n */\n private applyPatch(patch: Patch): void {\n if (patch.op === \"splice\") {\n const arr = this.getTargetByPath(this.root, patch.path) as any[];\n arr.splice(patch.index, patch.deleteCount, ...patch.items);\n return;\n }\n const target = this.getTargetByPath(this.root, patch.path.slice(0, -1));\n const key = patch.path[patch.path.length - 1] as any;\n\n if (patch.op === \"set\") (target as any)[key] = patch.next;\n else if (patch.op === \"delete\") delete (target as any)[key];\n }\n\n /**\n * Invert Patch\n * @param p {Patch} Patch Options\n * @private\n */\n private invertPatch(p: Patch): Patch {\n if (p.op === \"set\") return { op: \"set\", path: p.path, prev: p.next, next: p.prev };\n if (p.op === \"delete\") return { op: \"set\", path: p.path, prev: undefined, next: p.prev };\n return {\n op: \"splice\",\n path: p.path,\n index: p.index,\n deleteCount: p.items.length,\n items: p.removed,\n removed: p.items\n };\n }\n\n /**\n * Record History\n * @param patch {Patch} Patch Options\n * @private\n */\n private recordHistory(patch: Patch): void {\n const h = this.history;\n if (!h || h.isApplying) return;\n const inverse = this.invertPatch(patch);\n\n h.push({\n undo: () => useBatch(() => { this.applyPatch(inverse); this.invertPatch(inverse); }),\n redo: () => useBatch(() => { this.applyPatch(patch); this.invokePatch(patch); })\n });\n }\n\n /**\n * Get Target by Path\n * @param obj Object\n * @param path Path\n * @private\n */\n private getTargetByPath(obj: any, path: Path): any {\n let cur = obj;\n for (const p of path) cur = cur[p as any];\n return cur;\n }\n\n /**\n * Make Proxy\n * @param arr {Array} Array\n * @param basePath {Path} Base Path\n * @private\n */\n private makeProxy(arr: any[], basePath: Path): any[] {\n const self = this;\n\n const handler: ProxyHandler<any[]> = {\n get(target, prop, receiver) {\n if (prop === \"push\") {\n return (...items: any[]) => {\n const index = target.length;\n const removed: any[] = [];\n const patch: Patch = { op: \"splice\", path: basePath, index, deleteCount: 0, items, removed };\n const res = target.push(...items);\n self.recordHistory(patch);\n self.invokePatch(patch);\n return res;\n };\n }\n if (prop === \"pop\") {\n return () => {\n if (target.length === 0) return undefined;\n const index = target.length - 1;\n const removed = [target[index]];\n const patch: Patch = { op: \"splice\", path: basePath, index, deleteCount: 1, items: [], removed };\n const res = target.pop();\n self.recordHistory(patch);\n self.invokePatch(patch);\n return res;\n };\n }\n if (prop === \"splice\") {\n return (index: number, deleteCount?: number, ...items: any[]) => {\n const dc = deleteCount ?? (target.length - index);\n const removed = target.slice(index, index + dc);\n const patch: Patch = { op: \"splice\", path: basePath, index, deleteCount: dc, items, removed };\n const res = target.splice(index, dc, ...items);\n self.recordHistory(patch);\n self.invokePatch(patch);\n return res;\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n\n set(target, prop, value, receiver) {\n const prev = Reflect.get(target, prop, receiver);\n if (Object.is(prev, value)) return true;\n const ok = Reflect.set(target, prop, value, receiver);\n if (!ok) return false;\n\n const patch: Patch = { op: \"set\", path: basePath.concat(prop), prev, next: value };\n self.recordHistory(patch);\n self.invokePatch(patch);\n return true;\n },\n\n deleteProperty(target, prop) {\n if (!Reflect.has(target, prop)) return true;\n const prev = (target as any)[prop];\n const ok = Reflect.deleteProperty(target, prop);\n if (!ok) return false;\n\n const patch: Patch = { op: \"delete\", path: basePath.concat(prop), prev };\n self.recordHistory(patch);\n self.invokePatch(patch);\n return true;\n }\n };\n\n return new Proxy(arr, handler);\n }\n}"]}