UNPKG

signalforge

Version:

Fine-grained reactive state management with automatic dependency tracking - Ultra-optimized, zero dependencies

2 lines (1 loc) 13 kB
"use strict";var R=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var Pe=Object.prototype.hasOwnProperty;var Ue=(t,e)=>{for(var r in e)R(t,r,{get:e[r],enumerable:!0})},ke=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ae(e))!Pe.call(t,i)&&i!==r&&R(t,i,{get:()=>e[i],enumerable:!(n=we(e,i))||n.enumerable});return t};var Ee=t=>ke(R({},"__esModule",{value:!0}),t);var Ne={};Ue(Ne,{batch:()=>le,combine:()=>fe,createArraySignal:()=>he,createComputed:()=>d,createEffect:()=>f,createPersistentSignal:()=>q,createRecordSignal:()=>Te,createResource:()=>Se,createSignal:()=>c,createStorageAdapter:()=>H,debounce:()=>ve,derive:()=>ge,detectEnvironment:()=>b,filter:()=>ye,flushSync:()=>de,getStorageAdapter:()=>k,map:()=>pe,memo:()=>me,monitor:()=>_e,persist:()=>E,resetStorageAdapter:()=>L,safeParse:()=>T,safeStringify:()=>h,throttle:()=>be,untrack:()=>ce});module.exports=Ee(Ne);var $=[],_=new Map,Me=0,C=!0;function Re(){return`signal_${++Me}_${Date.now()}`}function j(t,e,r){let n={id:Re(),type:t,createdAt:Date.now(),label:r};if(_.set(n.id,n),C){for(let i of $)if(i.onSignalCreate)try{i.onSignalCreate(n,e)}catch(o){console.error(`Error in plugin "${i.name}" onSignalCreate:`,o)}}return n}function J(t,e,r,n="set"){if(!C)return;let i=_.get(t);if(!i)return;let o={signal:i,oldValue:e,newValue:r,timestamp:Date.now(),source:n};for(let s of $)if(s.onSignalUpdate)try{s.onSignalUpdate(o)}catch(u){console.error(`Error in plugin "${s.name}" onSignalUpdate:`,u)}}function G(t){if(!C)return;let e=_.get(t);if(e){for(let r of $)if(r.onSignalDestroy)try{r.onSignalDestroy(e)}catch(n){console.error(`Error in plugin "${r.name}" onSignalDestroy:`,n)}_.delete(t)}}var g=1,I=2,D=4,K=8,Q=16,Y=1e4,X=new Array(Y),w=0;function $e(t){w<Y&&(t.value=void 0,t.subscribers=null,t.listeners=null,t.dependencies=null,t.computeFn=null,t.flags=0,X[w++]=t)}var x=new WeakMap,Z=new Map;var F=1e4,ee=new Array(F),m=0,S=0,z=!1;function Ce(t){if(t.flags&I)return;let e=(S+1)%F;e===m&&(console.error("[SignalForge] Batch queue overflow \u2192 forcing flush"),O()),t.flags|=I,ee[S]=t,S=e,z||(z=!0,queueMicrotask(O))}function O(){for(z=!1;m!==S;){let t=ee[m];m=(m+1)%F,t.flags&=~I,t.flags&g&&v(t)}}var te=new Array(100),re=0,l=null;function De(t){te[re++]=l,l=t}function Ie(){l=te[--re]}var Ke=function(){return this._node.value},ze=function(t){this._node.subscribers||(this._node.subscribers=new Set),this._node.subscribers.add(t)},Oe=function(t){this._node.subscribers&&this._node.subscribers.delete(t)};function V(t,e=null){let r=w>0?X[--w]:{value:void 0,subscribers:null,listeners:null,dependencies:null,computeFn:null,flags:0};return r.value=t,r.computeFn=e,r.flags=e?Q|g:0,e&&v(r),r}function ne(t,e){return l?(l!==t&&(ie(t,l),Be(l,e)),t.flags&g&&t.computeFn&&v(t),t.value):(t.flags&g&&t.computeFn&&v(t),t.value)}function Fe(t,e,r){if(t.flags&Q)throw new Error("Cannot set computed signal");if(typeof r=="function"&&(r=r(t.value)),Object.is(r,t.value))return;let n=t.value;t.value=r;let i=x.get(e);i&&J(i,n,r,"set"),oe(t)}function ie(t,e){t.subscribers||(t.subscribers=new Set),t.subscribers.add(e)}function Ve(t,e){t.subscribers&&t.subscribers.delete(e)}function Be(t,e){t.dependencies||(t.dependencies=new Set),t.dependencies.has(e)||(t.dependencies.add(e),ie(e._node,t))}function ae(t){if(t.dependencies){for(let e of t.dependencies)Ve(e._node,t);t.dependencies.clear()}}function B(t){if(!(t.flags&g)&&(t.flags|=g,Ce(t),t.subscribers))for(let e of t.subscribers)B(e)}function v(t){if(t.computeFn&&!(t.flags&D)){t.flags|=D,ae(t),De(t);try{let e=t.computeFn();t.flags&=~g,t.flags&=~D,Object.is(e,t.value)||(t.value=e,oe(t))}finally{Ie()}}}function oe(t){if(t.subscribers)for(let e of t.subscribers)B(e);if(t.flags&K&&t.listeners)for(let e of t.listeners)e(t.value)}function se(t,e){return t.listeners||(t.listeners=new Set),t.listeners.add(e),t.flags|=K,()=>{t.listeners.delete(e),t.listeners.size===0&&(t.flags&=~K)}}function N(t){ae(t),t.subscribers&&t.subscribers.clear(),t.listeners&&t.listeners.clear(),$e(t)}function c(t){let e=V(t,null),r={get:()=>ne(e,r),set:i=>Fe(e,r,i),subscribe:i=>se(e,i),destroy:()=>{let i=x.get(r);i&&(G(i),Z.delete(i),x.delete(r)),N(e)},_node:e,_peek:Ke,_addSubscriber:ze,_removeSubscriber:Oe},n=j("signal",t);return x.set(r,n.id),Z.set(n.id,r),r}function d(t){let e,r=l;l=null;try{e=t()}finally{l=r}let n=V(e,t),i={get:()=>ne(n,i),set:()=>{throw new Error("Cannot set a computed signal")},subscribe:o=>se(n,o),destroy:()=>N(n),_node:n,_peek:()=>n.value,_addSubscriber:o=>{n.subscribers||(n.subscribers=new Set),n.subscribers.add(o)},_removeSubscriber:o=>{n.subscribers&&n.subscribers.delete(o)},_markDirty:()=>B(n),_recompute:()=>v(n)};return i}function f(t){let e=V(void 0,t);return()=>N(e)}function le(t){let e=t();return ue(),e}function ue(){m!==S&&O()}function ce(t){let e=l;l=null;try{return t()}finally{l=e}}var de=ue;function b(){let t=typeof global<"u"?global:void 0,e=typeof window<"u"?window:void 0;return typeof navigator<"u"&&navigator.product==="ReactNative"||e?.navigator?.product==="ReactNative"||t?.HermesInternal||t?.__fbBatchedBridgeConfig||t?.nativeModuleProxy||t?.__turboModuleProxy?"react-native":e?.localStorage||t?.localStorage?"web":"node"}function h(t,e=!1){let r=new WeakSet;try{return JSON.stringify(t,(n,i)=>{if(i===void 0)return"__undefined__";if(i===null)return null;if(typeof i=="function")return e&&`${n}`,"__function__";if(i instanceof Date)return{__type__:"Date",value:i.toISOString()};if(i instanceof RegExp)return{__type__:"RegExp",value:i.toString()};if(typeof i=="object"&&i!==null){if(r.has(i))return e&&`${n}`,"__circular__";r.add(i)}return i})}catch(n){e&&console.error("[StorageAdapter] Serialization error:",n);try{return JSON.stringify(t)}catch{return"{}"}}}function T(t,e=!1){try{return JSON.parse(t,(r,n)=>{if(n!=="__undefined__"&&n!=="__function__"){if(n==="__circular__")return null;if(n&&typeof n=="object"){if(n.__type__==="Date")return new Date(n.value);if(n.__type__==="RegExp"){let i=n.value.match(/^\/(.+)\/([gimuy]*)$/);if(i)return new RegExp(i[1],i[2])}}return n}})}catch(r){return e&&console.error("[StorageAdapter] Deserialization error:",r),null}}var A=class{constructor(e={}){this.prefix=e.prefix||"signalforge_",this.devMode=e.devMode??W,this.serialize=e.serialize||(r=>h(r,this.devMode)),this.deserialize=e.deserialize||(r=>T(r,this.devMode))}getKey(e){return`${this.prefix}${e}`}async load(e){try{let r=localStorage.getItem(this.getKey(e));return r===null?null:this.deserialize(r)}catch(r){return this.devMode&&console.error(`[StorageAdapter] Failed to load "${e}":`,r),null}}async save(e,r){try{let n=this.serialize(r);localStorage.setItem(this.getKey(e),n)}catch(n){throw this.devMode&&console.error(`[StorageAdapter] Failed to save "${e}":`,n),n}}async clear(e){try{localStorage.removeItem(this.getKey(e))}catch(r){throw this.devMode&&console.error(`[StorageAdapter] Failed to clear "${e}":`,r),r}}isAvailable(){try{let e="__storage_test__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return!1}}async getAllKeys(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n&&n.startsWith(this.prefix)&&e.push(n.slice(this.prefix.length))}return e}catch(e){return this.devMode&&console.error("[StorageAdapter] Failed to get all keys:",e),[]}}async clearAll(){try{let e=await this.getAllKeys();for(let r of e)await this.clear(r)}catch(e){throw this.devMode&&console.error("[StorageAdapter] Failed to clear all:",e),e}}},P=class{constructor(e={}){this.prefix=e.prefix||"signalforge_",this.devMode=e.devMode??W,this.serialize=e.serialize||(r=>h(r,this.devMode)),this.deserialize=e.deserialize||(r=>T(r,this.devMode));try{this.AsyncStorage=require("@react-native-async-storage/async-storage").default}catch{try{this.AsyncStorage=require("react-native").AsyncStorage}catch{this.devMode&&console.error("[StorageAdapter] AsyncStorage not found. Install @react-native-async-storage/async-storage"),this.AsyncStorage=null}}}getKey(e){return`${this.prefix}${e}`}async load(e){if(!this.AsyncStorage)return this.devMode,null;try{let r=await this.AsyncStorage.getItem(this.getKey(e));return r===null?null:this.deserialize(r)}catch(r){return this.devMode&&console.error(`[StorageAdapter] Failed to load "${e}":`,r),null}}async save(e,r){if(!this.AsyncStorage){this.devMode;return}try{let n=this.serialize(r);await this.AsyncStorage.setItem(this.getKey(e),n)}catch(n){throw this.devMode&&console.error(`[StorageAdapter] Failed to save "${e}":`,n),n}}async clear(e){if(!this.AsyncStorage){this.devMode;return}try{await this.AsyncStorage.removeItem(this.getKey(e))}catch(r){throw this.devMode&&console.error(`[StorageAdapter] Failed to clear "${e}":`,r),r}}isAvailable(){return this.AsyncStorage!==null}async getAllKeys(){if(!this.AsyncStorage)return[];try{return(await this.AsyncStorage.getAllKeys()).filter(r=>r.startsWith(this.prefix)).map(r=>r.slice(this.prefix.length))}catch(e){return this.devMode&&console.error("[StorageAdapter] Failed to get all keys:",e),[]}}async clearAll(){if(this.AsyncStorage)try{let r=(await this.getAllKeys()).map(n=>this.getKey(n));await this.AsyncStorage.multiRemove(r)}catch(e){throw this.devMode&&console.error("[StorageAdapter] Failed to clear all:",e),e}}},U=class{constructor(e={}){this.storage=new Map;this.prefix=e.prefix||"signalforge_",this.devMode=e.devMode??W,this.devMode}getKey(e){return`${this.prefix}${e}`}async load(e){let r=this.storage.get(this.getKey(e));return r!==void 0?r:null}async save(e,r){let n=JSON.parse(JSON.stringify(r));this.storage.set(this.getKey(e),n)}async clear(e){this.storage.delete(this.getKey(e))}isAvailable(){return!0}async getAllKeys(){let e=[];for(let r of this.storage.keys())r.startsWith(this.prefix)&&e.push(r.slice(this.prefix.length));return e}async clearAll(){let e=await this.getAllKeys();for(let r of e)this.storage.delete(this.getKey(r))}},p=null;function k(t={}){if(p)return p;switch(b()){case"web":p=new A(t);break;case"react-native":p=new P(t);break;case"node":case"unknown":default:p=new U(t);break}return p}function L(){p=null}function H(t=b(),e={}){switch(t){case"web":return new A(e);case"react-native":return new P(e);case"node":case"unknown":default:return new U(e)}}function E(t,e={}){let r=e.adapter||k(),n=e.key||`signal_${Math.random().toString(36).slice(2)}`,i=e.serialize||(a=>a),o=e.deserialize||(a=>a);r.load(n).then(a=>{if(a!==null)try{let y=o(a);t.set(y)}catch(y){e.onError&&e.onError(y)}}).catch(a=>{e.onError&&e.onError(a)});let s,u=f(()=>{let a=t.get(),y=()=>{try{let M=i(a);r.save(n,M).catch(xe=>{e.onError&&e.onError(xe)})}catch(M){e.onError&&e.onError(M)}};e.debounce?(s!==void 0&&clearTimeout(s),s=setTimeout(y,e.debounce)):y()});return()=>{u(),s!==void 0&&clearTimeout(s)}}function q(t,e,r={}){let n=c(e);return E(n,{...r,key:t}),n}var W=typeof globalThis.__DEV__<"u"?globalThis.__DEV__:process.env.NODE_ENV!=="production";function ge(t,e){return d(()=>{let r=t.map(n=>n.get());return e(...r)})}function fe(t){return d(()=>t.map(e=>e.get()))}function pe(t,e){return d(()=>e(t.get()))}function ye(t,e,r){return d(()=>{let n=t.get();return e(n)?n:r})}function me(t,e=Object.is){let r=t._peek?t._peek():t.get();return d(()=>{let n=t.get();return e(n,r)||(r=n),r})}function Se(t){let e=c({status:"pending",data:void 0,error:void 0});return t().then(r=>{e.set({status:"success",data:r,error:void 0})}).catch(r=>{e.set({status:"error",data:void 0,error:r})}),e}function ve(t,e){let r=c(t._peek?t._peek():t.get()),n;return f(()=>{let i=t.get();n!==void 0&&clearTimeout(n),n=setTimeout(()=>{r.set(i)},e)}),r}function be(t,e){let r=c(t._peek?t._peek():t.get()),n=0,i,o;return f(()=>{let s=t.get(),u=Date.now(),a=u-n;a>=e?(r.set(s),n=u,i=void 0):(i=s,o===void 0&&(o=setTimeout(()=>{i!==void 0&&(r.set(i),n=Date.now(),i=void 0),o=void 0},e-a)))}),r}function he(t=[]){let e=c(t);return{...e,push(...r){e.set(n=>[...n,...r])},pop(){let r;return e.set(n=>{let i=[...n];return r=i.pop(),i}),r},filter(r){e.set(n=>n.filter(r))},map(r){return e.get().map(r)},find(r){return e.get().find(r)},remove(r){e.set(n=>n.filter(i=>i!==r))},clear(){e.set([])},get length(){return e.get().length}}}function Te(t={}){let e=c(t);return{...e,setKey(r,n){e.set(i=>({...i,[r]:n}))},deleteKey(r){e.set(n=>{let i={...n};return delete i[r],i})},hasKey(r){return r in e.get()},getKey(r){return e.get()[r]},keys(){return Object.keys(e.get())},values(){return Object.values(e.get())},entries(){return Object.entries(e.get())},clear(){e.set({})}}}function _e(t,e){let r=0,n=0,i=0,o=0;return{get(){let s=performance.now(),u=t.get(),a=performance.now()-s;return r++,i+=a,r%100===0&&`${e}${r}${(i/r).toFixed(3)}`,u},set(s){let u=performance.now();t.set(s);let a=performance.now()-u;n++,o+=a,`${e}${n}${a.toFixed(3)}`},subscribe:t.subscribe.bind(t),destroy:t.destroy.bind(t),_node:t._node,_addSubscriber:t._addSubscriber?t._addSubscriber.bind(t):void 0,_removeSubscriber:t._removeSubscriber?t._removeSubscriber.bind(t):void 0,_peek:t._peek?t._peek.bind(t):void 0}}