@deijose/nix-js 2.5.1 → 2.5.2

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.
@@ -12,4 +12,4 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=requi
12
12
  <span style="color:#f87171;font-size:13px">
13
13
  ⚠ ${e instanceof Error?e.message:String(e)}
14
14
  </span>
15
- `}var a=new Map,o=3e5,s=null,c=o;function l(){null===s&&(s=setInterval(()=>{let e=Date.now();for(let[t,s]of a)s.subscribers<=0&&e-s.fetchedAt>c&&a.delete(t);0===a.size&&null!==s&&(clearInterval(s),s=null)},6e4))}function u(e){let t=a.get(e);if(t&&t.fetchedAt>0)return t}function d(e,t){let s=a.get(e);a.set(e,{data:t,fetchedAt:Date.now(),subscribers:s?.subscribers??0}),l()}function f(e){let t=a.get(e);t?t.subscribers++:a.set(e,{fetchedAt:0,subscribers:1})}function p(e){let t=a.get(e);t&&(t.subscribers=Math.max(0,t.subscribers-1))}function m(e,t){let s=a.get(e);return!!s&&Date.now()-s.fetchedAt<t}function h(s,l,o={}){let{fallback:c,errorFallback:h,resetOnRefresh:b=!1,invalidate:g,cacheKey:v,staleTime:x=0}=o,y=c??r(),_=h??i;class w extends n.NixComponent{_state;_disposeWatcher;constructor(){super();let t=v?u(v):void 0;this._state=e.signal(t&&void 0!==t.data?{status:"resolved",data:t.data}:{status:"pending"})}onMount(){v&&f(v);let t=v?u(v):void 0;if(t&&m(v,x)||(t?this._fetch():this._run()),g){let t=!0;this._disposeWatcher=e.effect(()=>{g.value,t?t=!1:(v&&a.delete(v),this._run())})}return()=>{this._disposeWatcher?.(),v&&p(v)}}_run(){(b||"pending"===this._state.peek().status)&&(this._state.value={status:"pending"}),this._fetch()}_fetch(){s().then(e=>{v&&d(v,e),this._state.value={status:"resolved",data:e}},e=>{this._state.value={status:"error",error:e}})}render(){return t.l`<div class="nix-suspense" style="display:contents">${()=>{let e=this._state.value;return"pending"===e.status?y:"error"===e.status?_(e.error):l(e.data)}}</div>`}}return new w}function g(e,t){let s=null;return()=>s?new s:h(async()=>(s=(await e()).default,s),e=>new e,{fallback:t})}exports.lazy=g,exports.suspend=h;
15
+ `}var a=new Map,o=3e5,s=null,c=o;function l(){null===s&&(s=setInterval(()=>{let e=Date.now();for(let[t,s]of a)s.subscribers<=0&&e-s.fetchedAt>c&&a.delete(t);0===a.size&&null!==s&&(clearInterval(s),s=null)},6e4))}function u(e){let t=a.get(e);if(t&&t.fetchedAt>0)return t}function d(e,t){let s=a.get(e);a.set(e,{data:t,fetchedAt:Date.now(),subscribers:s?.subscribers??0}),l()}function f(e){let t=a.get(e);t?t.subscribers++:a.set(e,{fetchedAt:0,subscribers:1})}function p(e){let t=a.get(e);t&&(t.subscribers=Math.max(0,t.subscribers-1))}function m(e,t){let s=a.get(e);return!!s&&Date.now()-s.fetchedAt<t}function h(s,l,o={}){let{fallback:c,errorFallback:h,resetOnRefresh:b=!1,invalidate:g,cacheKey:v,staleTime:x=0}=o,_=c??r(),y=h??i;class w extends n.NixComponent{_state;_disposeWatcher;constructor(){super();let t=v?u(v):void 0;this._state=e.signal(t&&void 0!==t.data?{status:"resolved",data:t.data}:{status:"pending"})}onMount(){v&&f(v);let t=v?u(v):void 0;if(t&&m(v,x)||(t?this._fetch():this._run()),g){let t=!0;this._disposeWatcher=e.effect(()=>{g.value,t?t=!1:(v&&a.delete(v),this._run())})}return()=>{this._disposeWatcher?.(),v&&p(v)}}_run(){(b||"pending"===this._state.peek().status)&&(this._state.value={status:"pending"}),this._fetch()}_fetch(){s().then(e=>{v&&d(v,e),this._state.value={status:"resolved",data:e}},e=>{this._state.value={status:"error",error:e}})}render(){return t.l`<div class="nix-suspense" style="display:contents">${()=>{let e=this._state.value;return"pending"===e.status?_:"error"===e.status?y(e.error):l(e.data)}}</div>`}}return new w}function g(e,s){let n=void 0===s||t._(s)?{fallback:s}:s,a=n.selector??(e=>e.default),r=null;return()=>r?new r:h(async()=>(r=a(await e()),r),e=>new e,{fallback:n.fallback})}exports.lazy=g,exports.suspend=h;
package/dist/lib/async.js CHANGED
@@ -1,4 +1,4 @@
1
- import{effect as e,signal as t}from"./signals.js";import{l as n}from"./template2.js";import{NixComponent as r}from"./lifecycle.js";function i(){return n`
1
+ import{effect as e,signal as t}from"./signals.js";import{_ as n,l as r}from"./template2.js";import{NixComponent as i}from"./lifecycle.js";function a(){return r`
2
2
  <span style="color:#52525b;font-size:13px;display:inline-flex;align-items:center;gap:6px">
3
3
  <span class="nix-spinner" style="
4
4
  display:inline-block;width:14px;height:14px;border-radius:50%;
@@ -8,8 +8,8 @@ import{effect as e,signal as t}from"./signals.js";import{l as n}from"./template2
8
8
  Loading…
9
9
  </span>
10
10
  <style>@keyframes nix-spin{to{transform:rotate(360deg)}}</style>
11
- `}function a(e){return n`
11
+ `}function o(e){return r`
12
12
  <span style="color:#f87171;font-size:13px">
13
13
  ⚠ ${e instanceof Error?e.message:String(e)}
14
14
  </span>
15
- `}var o=new Map,s=3e5,c=null,l=s;function u(){null===c&&(c=setInterval(()=>{let e=Date.now();for(let[t,s]of o)s.subscribers<=0&&e-s.fetchedAt>l&&o.delete(t);0===o.size&&null!==c&&(clearInterval(c),c=null)},6e4))}function d(e){let t=o.get(e);if(t&&t.fetchedAt>0)return t}function f(e,t){let s=o.get(e);o.set(e,{data:t,fetchedAt:Date.now(),subscribers:s?.subscribers??0}),u()}function p(e){let t=o.get(e);t?t.subscribers++:o.set(e,{fetchedAt:0,subscribers:1})}function m(e){let t=o.get(e);t&&(t.subscribers=Math.max(0,t.subscribers-1))}function h(e,t){let s=o.get(e);return!!s&&Date.now()-s.fetchedAt<t}function g(s,l,c={}){let{fallback:u,errorFallback:b,resetOnRefresh:g=!1,invalidate:_,cacheKey:v,staleTime:x=0}=c,y=u??i(),w=b??a;return new class extends r{_state;_disposeWatcher;constructor(){super();let e=v?d(v):void 0;this._state=t(e&&void 0!==e.data?{status:"resolved",data:e.data}:{status:"pending"})}onMount(){v&&p(v);let t=v?d(v):void 0;if(t&&h(v,x)||(t?this._fetch():this._run()),_){let t=!0;this._disposeWatcher=e(()=>{_.value,t?t=!1:(v&&o.delete(v),this._run())})}return()=>{this._disposeWatcher?.(),v&&m(v)}}_run(){(g||"pending"===this._state.peek().status)&&(this._state.value={status:"pending"}),this._fetch()}_fetch(){s().then(e=>{v&&f(v,e),this._state.value={status:"resolved",data:e}},e=>{this._state.value={status:"error",error:e}})}render(){return n`<div class="nix-suspense" style="display:contents">${()=>{let e=this._state.value;return"pending"===e.status?y:"error"===e.status?w(e.error):l(e.data)}}</div>`}}}function _(e,t){let s=null;return()=>s?new s:g(async()=>(s=(await e()).default,s),e=>new e,{fallback:t})}export{_ as lazy,g as suspend};
15
+ `}var s=new Map,c=3e5,l=null,u=c;function d(){null===l&&(l=setInterval(()=>{let e=Date.now();for(let[t,n]of s)n.subscribers<=0&&e-n.fetchedAt>u&&s.delete(t);0===s.size&&null!==l&&(clearInterval(l),l=null)},6e4))}function f(e){let t=s.get(e);if(t&&t.fetchedAt>0)return t}function p(e,t){let n=s.get(e);s.set(e,{data:t,fetchedAt:Date.now(),subscribers:n?.subscribers??0}),d()}function m(e){let t=s.get(e);t?t.subscribers++:s.set(e,{fetchedAt:0,subscribers:1})}function h(e){let t=s.get(e);t&&(t.subscribers=Math.max(0,t.subscribers-1))}function g(e,t){let n=s.get(e);return!!n&&Date.now()-n.fetchedAt<t}function _(n,l,u={}){let{fallback:c,errorFallback:d,resetOnRefresh:b=!1,invalidate:_,cacheKey:v,staleTime:x=0}=u,y=c??a(),w=d??o;return new class extends i{_state;_disposeWatcher;constructor(){super();let e=v?f(v):void 0;this._state=t(e&&void 0!==e.data?{status:"resolved",data:e.data}:{status:"pending"})}onMount(){v&&m(v);let t=v?f(v):void 0;if(t&&g(v,x)||(t?this._fetch():this._run()),_){let t=!0;this._disposeWatcher=e(()=>{_.value,t?t=!1:(v&&s.delete(v),this._run())})}return()=>{this._disposeWatcher?.(),v&&h(v)}}_run(){(b||"pending"===this._state.peek().status)&&(this._state.value={status:"pending"}),this._fetch()}_fetch(){n().then(e=>{v&&p(v,e),this._state.value={status:"resolved",data:e}},e=>{this._state.value={status:"error",error:e}})}render(){return r`<div class="nix-suspense" style="display:contents">${()=>{let e=this._state.value;return"pending"===e.status?y:"error"===e.status?w(e.error):l(e.data)}}</div>`}}}function v(e,t){let s=void 0===t||n(t)?{fallback:t}:t,a=s.selector??(e=>e.default),r=null;return()=>r?new r:_(async()=>(r=a(await e()),r),e=>new e,{fallback:s.fallback})}export{v as lazy,_ as suspend};
@@ -1,6 +1,6 @@
1
1
  import { Signal } from "./reactivity";
2
2
  import { NixComponent } from "./lifecycle";
3
- import type { NixTemplate } from "./template";
3
+ import { type NixTemplate } from "./template";
4
4
  export interface SuspenseOptions {
5
5
  fallback?: NixTemplate;
6
6
  errorFallback?: (err: unknown) => NixTemplate;
@@ -19,10 +19,14 @@ export interface SuspenseOptions {
19
19
  * ```
20
20
  */
21
21
  export declare function suspend<T>(asyncFn: () => Promise<T>, renderFn: (data: T) => NixTemplate | NixComponent, options?: SuspenseOptions): NixComponent;
22
+ export interface LazyOptions {
23
+ /** Component selector when the module uses a named export. Defaults to `mod.default`. */
24
+ selector?: (mod: Record<string, unknown>) => new () => NixComponent;
25
+ /** Template shown while the component is loading. */
26
+ fallback?: NixTemplate;
27
+ }
22
28
  /**
23
29
  * Wraps a dynamic import for lazy-loading route components.
24
- * The module is loaded once and cached. The imported module must use a default export.
30
+ * The module is loaded once and cached. Supports both default and named exports.
25
31
  */
26
- export declare function lazy(importFn: () => Promise<{
27
- default: new () => NixComponent;
28
- }>, fallback?: NixTemplate): () => NixComponent;
32
+ export declare function lazy(importFn: () => Promise<Record<string, unknown>>, options?: NixTemplate | LazyOptions): () => NixComponent;
@@ -1,4 +1,4 @@
1
- import { type NixPlugin, type Store } from "./store";
1
+ import { type NixPlugin, type Store, type GuardFn } from "./store";
2
2
  /**
3
3
  * Minimal interface that any storage adapter must implement.
4
4
  * Compatible with localStorage, sessionStorage, AsyncStorage, IndexedDB, etc.
@@ -37,10 +37,6 @@ export declare function loggerPlugin<T extends Record<string, unknown>>(opts?: {
37
37
  /** Optional filter to skip logging for specific changes. */
38
38
  filter?: (diff: Partial<T>) => boolean;
39
39
  }): NixPlugin<T>;
40
- /**
41
- * Function type for mutation guards.
42
- */
43
- type GuardFn<T extends Record<string, unknown>> = (next: Partial<T>, current: T) => Partial<T> | void;
44
40
  /**
45
41
  * Intercepts $patch and $reset calls to validate or transform state before it is applied.
46
42
  */
@@ -38,8 +38,7 @@ export declare function signal<T>(initialValue: T): Signal<T>;
38
38
  * and on disposal.
39
39
  */
40
40
  export declare function effect(fn: () => void | (() => void)): () => void;
41
- /** Derived signal that recalculates when its dependencies change. */
42
- export declare function computed<T>(fn: () => T): Signal<T> & {
41
+ export declare function computed<T>(fn: () => T, equals?: (a: T, b: T) => boolean): Signal<T> & {
43
42
  dispose(): void;
44
43
  };
45
44
  /** Groups multiple signal writes so effects flush once at the end. */
@@ -71,6 +71,11 @@ export type GettersFactory<T extends object, G extends Record<string, Signal<unk
71
71
  * computed(() => store.someSignal.value) — derive new nodes
72
72
  * store.$snapshot() — passive read for logging/persistence
73
73
  */
74
+ /**
75
+ * Function type for mutation guards.
76
+ * Intercepts $patch and $reset to validate or transform state before it is applied.
77
+ */
78
+ export type GuardFn<T extends object> = (next: Partial<T>, current: T) => Partial<T> | void;
74
79
  export type NixPlugin<T extends object, A extends object = Record<never, never>, G extends Record<string, Signal<unknown>> = Record<never, never>> = (store: Store<T, A, G>) => (() => void) | void;
75
80
  /**
76
81
  * Options object for createStore. NoInfer<T> on factory parameters ensures
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");function t(t,r={}){let{storage:n=localStorage,exclude:o=[],serialize:l=JSON.stringify,deserialize:i=JSON.parse,debounce:c=0}=r;return r=>{let s;return e.untrack(async()=>{try{let e=await n.getItem(t);if(!e)return;let l=i(e),c={};for(let e of Object.keys(l))e in r.$state&&!o.includes(e)&&(c[e]=l[e]);Object.keys(c).length>0&&r.$patch(c)}catch{}}),e.watch(r.$stateSignal,e=>{let r=()=>{try{let r=0===o.length?e:Object.fromEntries(Object.entries(e).filter(([e])=>!o.includes(e)));n.setItem(t,l(r))}catch{}};c>0?(clearTimeout(s),s=setTimeout(r,c)):r()})}}function n(t={}){let{collapsed:r=!0,filter:n}=t;return t=>{let o=r?console.groupCollapsed:console.group;return e.watch(t.$stateSignal,(e,r)=>{if(!r)return;let l={};for(let t of Object.keys(e))Object.is(e[t],r[t])||(l[t]=e[t]);0!==Object.keys(l).length&&(n&&!n(l)||(o(`%c[nix:${t.$id}]%c ${Object.keys(l).join(", ")}`,"color:#7F77DD;font-weight:500","color:inherit;font-weight:400"),console.log("prev →",r),console.log("next →",e),console.log("diff →",l),console.groupEnd()))},{immediate:!0})}}function r(t){return r=>{let n=r.$patch.bind(r),o=r.$reset.bind(r);return r.$patch=function(o){let l=o,i=e.untrack(()=>r.$state);for(let e of t){let t=e(l,i);void 0!==t&&(l=t)}n(l)},r.$reset=function(){let n=e.untrack(()=>r.$state);for(let e of t)e(n,n);o()},()=>{r.$patch=n,r.$reset=o}}}function i(t,r){return n=>e.watch(t.$stateSignal,e=>{r(e,n)})}exports.bridgePlugin=i,exports.guardPlugin=r,exports.loggerPlugin=n,exports.persistPlugin=t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");function t(t,r={}){let{storage:n=localStorage,exclude:o=[],serialize:l=JSON.stringify,deserialize:i=JSON.parse,debounce:s=0}=r;return r=>{let c;return e.untrack(async()=>{try{let e=await n.getItem(t);if(!e)return;let l=i(e),s={};for(let e of Object.keys(l))e in r.$state&&!o.includes(e)&&(s[e]=l[e]);Object.keys(s).length>0&&r.$patch(s)}catch{}}),e.watch(r.$stateSignal,e=>{let r=()=>{try{let r=0===o.length?e:Object.fromEntries(Object.entries(e).filter(([e])=>!o.includes(e)));n.setItem(t,l(r))}catch{}};s>0?(clearTimeout(c),c=setTimeout(r,s)):r()})}}function n(t={}){let{collapsed:r=!0,filter:n}=t;return t=>{let o=r?console.groupCollapsed:console.group;return e.watch(t.$stateSignal,(e,r)=>{if(!r)return;let l={};for(let t of Object.keys(e))Object.is(e[t],r[t])||(l[t]=e[t]);0!==Object.keys(l).length&&(n&&!n(l)||(o(`%c[nix:${t.$id}]%c ${Object.keys(l).join(", ")}`,"color:#7F77DD;font-weight:500","color:inherit;font-weight:400"),console.log("prev →",r),console.log("next →",e),console.log("diff →",l),console.groupEnd()))},{immediate:!0})}}function r(e){return t=>{let r=t._guardFns;for(let t of e)r.push(t);return()=>{for(let t of e){let e=r.indexOf(t);e>=0&&r.splice(e,1)}}}}function i(t,r){return n=>e.watch(t.$stateSignal,e=>{r(e,n)})}exports.bridgePlugin=i,exports.guardPlugin=r,exports.loggerPlugin=n,exports.persistPlugin=t;
@@ -1 +1 @@
1
- import{untrack as e,watch as t}from"./signals.js";function n(n,r={}){let{storage:l=localStorage,exclude:o=[],serialize:i=JSON.stringify,deserialize:s=JSON.parse,debounce:c=0}=r;return r=>{let a;return e(async()=>{try{let e=await l.getItem(n);if(!e)return;let t=s(e),i={};for(let e of Object.keys(t))e in r.$state&&!o.includes(e)&&(i[e]=t[e]);Object.keys(i).length>0&&r.$patch(i)}catch{}}),t(r.$stateSignal,e=>{let t=()=>{try{let t=0===o.length?e:Object.fromEntries(Object.entries(e).filter(([e])=>!o.includes(e)));l.setItem(n,i(t))}catch{}};c>0?(clearTimeout(a),a=setTimeout(t,c)):t()})}}function r(e={}){let{collapsed:n=!0,filter:r}=e;return e=>{let l=n?console.groupCollapsed:console.group;return t(e.$stateSignal,(t,n)=>{if(!n)return;let o={};for(let e of Object.keys(t))Object.is(t[e],n[e])||(o[e]=t[e]);0!==Object.keys(o).length&&(r&&!r(o)||(l(`%c[nix:${e.$id}]%c ${Object.keys(o).join(", ")}`,"color:#7F77DD;font-weight:500","color:inherit;font-weight:400"),console.log("prev →",n),console.log("next →",t),console.log("diff →",o),console.groupEnd()))},{immediate:!0})}}function i(t){return n=>{let r=n.$patch.bind(n),l=n.$reset.bind(n);return n.$patch=function(l){let o=l,i=e(()=>n.$state);for(let e of t){let t=e(o,i);void 0!==t&&(o=t)}r(o)},n.$reset=function(){let r=e(()=>n.$state);for(let e of t)e(r,r);l()},()=>{n.$patch=r,n.$reset=l}}}function a(e,n){return r=>t(e.$stateSignal,e=>{n(e,r)})}export{a as bridgePlugin,i as guardPlugin,r as loggerPlugin,n as persistPlugin};
1
+ import{untrack as e,watch as t}from"./signals.js";function n(n,r={}){let{storage:l=localStorage,exclude:o=[],serialize:i=JSON.stringify,deserialize:s=JSON.parse,debounce:c=0}=r;return r=>{let a;return e(async()=>{try{let e=await l.getItem(n);if(!e)return;let t=s(e),i={};for(let e of Object.keys(t))e in r.$state&&!o.includes(e)&&(i[e]=t[e]);Object.keys(i).length>0&&r.$patch(i)}catch{}}),t(r.$stateSignal,e=>{let t=()=>{try{let t=0===o.length?e:Object.fromEntries(Object.entries(e).filter(([e])=>!o.includes(e)));l.setItem(n,i(t))}catch{}};c>0?(clearTimeout(a),a=setTimeout(t,c)):t()})}}function r(e={}){let{collapsed:n=!0,filter:r}=e;return e=>{let l=n?console.groupCollapsed:console.group;return t(e.$stateSignal,(t,n)=>{if(!n)return;let o={};for(let e of Object.keys(t))Object.is(t[e],n[e])||(o[e]=t[e]);0!==Object.keys(o).length&&(r&&!r(o)||(l(`%c[nix:${e.$id}]%c ${Object.keys(o).join(", ")}`,"color:#7F77DD;font-weight:500","color:inherit;font-weight:400"),console.log("prev →",n),console.log("next →",t),console.log("diff →",o),console.groupEnd()))},{immediate:!0})}}function i(e){return t=>{let n=t._guardFns;for(let t of e)n.push(t);return()=>{for(let t of e){let e=n.indexOf(t);e>=0&&n.splice(e,1)}}}}function a(e,n){return r=>t(e.$stateSignal,e=>{n(e,r)})}export{a as bridgePlugin,i as guardPlugin,r as loggerPlugin,n as persistPlugin};
@@ -1 +1 @@
1
- function e(){return{ctxPool:[],ctxStack:[],activeEffect:null,activeDeps:null,activeErrorHandler:null,errorHandlerStack:[],batchLevel:0,pendingEffectsSet:new Set,pendingEffectsArr:[],effectDepth:0,notifyBuf:[],notifyBase:0,signalDebugHooks:null}}Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var t=Symbol.for("@deijose/nix-js/reactivity-state"),n=globalThis,r=(()=>{let r=n[t];if(r)return r;let l=e();return n[t]=l,l})();function i(e){r.errorHandlerStack.push(r.activeErrorHandler),r.activeErrorHandler=e}function a(){r.activeErrorHandler=r.errorHandlerStack.pop()??null}var o=100,s=64,c=16,l=32;function u(e){r.signalDebugHooks=e}function d(){return r.notifyBuf.length}var f=class{_value;_subs=new Set;constructor(e){this._value=e,r.signalDebugHooks?.onCreate?.(this,e)}get value(){return r.activeEffect&&(this._subs.add(r.activeEffect),r.activeDeps?.add(this)),this._value}set value(e){Object.is(this._value,e)||(this._value=e,r.signalDebugHooks?.onWrite?.(this,e),this._notify())}update(e){this.value=e(this._value)}peek(){return this._value}_removeSub(e){this._subs.delete(e)}_notify(){if(r.batchLevel>0){for(let e of this._subs)r.pendingEffectsSet.has(e)||(r.pendingEffectsSet.add(e),r.pendingEffectsArr.push(e));return}let e=r.notifyBase,t=0;for(let n of this._subs)r.notifyBuf[e+t++]=n;r.notifyBase=e+t;try{for(let n=0;n<t;n++){let t=r.notifyBuf[e+n];r.notifyBuf[e+n]=null,t?.()}}finally{r.notifyBase=e,0===e&&r.notifyBuf.length>s&&t<c&&(r.notifyBuf.length=l)}}dispose(){this._subs.clear()}};function p(e){return new f(e)}function m(e){let t,n=!1,l=new Set,f=new Set,i=r.activeErrorHandler,c=()=>{if(n)return;"function"==typeof t&&t();let s=l;l=f,f=s,f.clear();let a=r.ctxPool.length>0?r.ctxPool.pop():{effect:null,deps:null};if(a.effect=r.activeEffect,a.deps=r.activeDeps,r.ctxStack.push(a),r.activeEffect=c,r.activeDeps=f,r.effectDepth++,r.effectDepth>o){r.effectDepth=0;let e=r.ctxStack.pop();throw r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e),Error("[Nix] Maximum effect re-execution depth exceeded (possible infinite loop).")}try{t=e()}catch(e){if(!i)throw e;i(e)}finally{r.effectDepth--;let e=r.ctxStack.pop();r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e);for(let e of l)f.has(e)||e._removeSub(c)}};return c(),()=>{n=!0,"function"==typeof t&&t();for(let e of f)e._removeSub(c);f.clear(),l.clear()}}function h(e){let t=new f(void 0),r=null,n=!1,l=!1,o=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(t),"value");if(!o?.get||!o?.set)throw Error("[Nix] Internal error: Signal.value descriptor not found.");Object.defineProperty(t,"value",{get(){return n||l||(n=!0,_(()=>{r=m(()=>{t.value=e()})})),o.get.call(this)},set(e){o.set.call(this,e)},configurable:!0});let i=t.dispose;return t.dispose=()=>{l=!0,r?.(),r=null,i.call(t)},t}function g(e){r.batchLevel++;try{e()}finally{if(r.batchLevel--,0===r.batchLevel&&r.pendingEffectsArr.length>0){let e=r.pendingEffectsArr.length;for(let t=0;t<e;t++)r.pendingEffectsArr[t]();r.pendingEffectsArr.length=0,r.pendingEffectsSet.clear()}}}function _(e){let t=r.activeEffect,n=r.activeDeps;r.activeEffect=null,r.activeDeps=null;try{return e()}finally{r.activeEffect=t,r.activeDeps=n}}function v(e,t,r={}){let n,{immediate:l=!1,once:o=!1}=r,i=e instanceof f?()=>e.value:e,c=!0,s=!1,a=m(()=>{let e=i();if(c){if(c=!1,l&&!s){let r=e;_(()=>t(r,void 0)),o&&(s=!0,Promise.resolve().then(a))}n=e}else if(!s){let r=e,l=n;n=e,_(()=>t(r,l)),o&&(s=!0,Promise.resolve().then(a))}});return()=>{s=!0,a()}}function y(e){return e?Promise.resolve().then(e):Promise.resolve()}exports.Signal=f,exports._getNotifyBufSize=d,exports._popErrorHandler=a,exports._pushErrorHandler=i,exports._setSignalDebugHooks=u,exports.batch=g,exports.computed=h,exports.effect=m,exports.nextTick=y,exports.signal=p,exports.untrack=_,exports.watch=v;
1
+ function e(){return{ctxPool:[],ctxStack:[],activeEffect:null,activeDeps:null,activeErrorHandler:null,errorHandlerStack:[],batchLevel:0,pendingEffectsSet:new Set,pendingEffectsArr:[],effectDepth:0,notifyBuf:[],notifyBase:0,signalDebugHooks:null}}Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var t=Symbol.for("@deijose/nix-js/reactivity-state"),n=globalThis,r=(()=>{let r=n[t];if(r)return r;let l=e();return n[t]=l,l})();function i(e){r.errorHandlerStack.push(r.activeErrorHandler),r.activeErrorHandler=e}function a(){r.activeErrorHandler=r.errorHandlerStack.pop()??null}var o=100,s=64,c=16,l=32;function u(e){r.signalDebugHooks=e}function d(){return r.notifyBuf.length}var f=class{_value;_subs=new Set;constructor(e){this._value=e,r.signalDebugHooks?.onCreate?.(this,e)}get value(){return r.activeEffect&&(this._subs.add(r.activeEffect),r.activeDeps?.add(this)),this._value}set value(e){Object.is(this._value,e)||(this._value=e,r.signalDebugHooks?.onWrite?.(this,e),this._notify())}update(e){this.value=e(this._value)}peek(){return this._value}_removeSub(e){this._subs.delete(e)}_notify(){if(r.batchLevel>0){for(let e of this._subs)r.pendingEffectsSet.has(e)||(r.pendingEffectsSet.add(e),r.pendingEffectsArr.push(e));return}let e=r.notifyBase,t=0;for(let n of this._subs)r.notifyBuf[e+t++]=n;r.notifyBase=e+t;try{for(let n=0;n<t;n++){let t=r.notifyBuf[e+n];r.notifyBuf[e+n]=null,t?.()}}finally{r.notifyBase=e,0===e&&r.notifyBuf.length>s&&t<c&&(r.notifyBuf.length=l)}}dispose(){this._subs.clear()}};function p(e){return new f(e)}function m(e){let t,n=!1,l=new Set,i=new Set,f=r.activeErrorHandler,c=()=>{if(n)return;"function"==typeof t&&t();let s=l;l=i,i=s,i.clear();let a=r.ctxPool.length>0?r.ctxPool.pop():{effect:null,deps:null};if(a.effect=r.activeEffect,a.deps=r.activeDeps,r.ctxStack.push(a),r.activeEffect=c,r.activeDeps=i,r.effectDepth++,r.effectDepth>o){r.effectDepth=0;let e=r.ctxStack.pop();throw r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e),Error("[Nix] Maximum effect re-execution depth exceeded (possible infinite loop).")}try{t=e()}catch(e){if(!f)throw e;f(e)}finally{r.effectDepth--;let e=r.ctxStack.pop();r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e);for(let e of l)i.has(e)||e._removeSub(c)}};return c(),()=>{n=!0,"function"==typeof t&&t();for(let e of i)e._removeSub(c);i.clear(),l.clear()}}var h=Symbol("nix-computed-uninitialized");function g(e,t=Object.is){let r=new f(h),n=null,l=!1,i=!1,o=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(r),"value");if(!o?.get||!o?.set)throw Error("[Nix] Internal error: Signal.value descriptor not found.");Object.defineProperty(r,"value",{get(){return l||i||(l=!0,v(()=>{n=m(()=>{let n=e(),l=r.peek();(l===h||!t(n,l))&&(r.value=n)})})),o.get.call(this)},set(e){o.set.call(this,e)},configurable:!0});let c=r.dispose;return r.dispose=()=>{i=!0,n?.(),n=null,c.call(r)},r}function _(e){r.batchLevel++;try{e()}finally{if(r.batchLevel--,0===r.batchLevel&&r.pendingEffectsArr.length>0){let e=r.pendingEffectsArr.length;for(let t=0;t<e;t++)r.pendingEffectsArr[t]();r.pendingEffectsArr.length=0,r.pendingEffectsSet.clear()}}}function v(e){let t=r.activeEffect,n=r.activeDeps;r.activeEffect=null,r.activeDeps=null;try{return e()}finally{r.activeEffect=t,r.activeDeps=n}}function y(e,t,r={}){let n,{immediate:l=!1,once:i=!1}=r,o=e instanceof f?()=>e.value:e,c=!0,s=!1,a=m(()=>{let e=o();if(c){if(c=!1,l&&!s){let r=e;v(()=>t(r,void 0)),i&&(s=!0,Promise.resolve().then(a))}n=e}else if(!s){let r=e,l=n;n=e,v(()=>t(r,l)),i&&(s=!0,Promise.resolve().then(a))}});return()=>{s=!0,a()}}function b(e){return e?Promise.resolve().then(e):Promise.resolve()}exports.Signal=f,exports._getNotifyBufSize=d,exports._popErrorHandler=a,exports._pushErrorHandler=i,exports._setSignalDebugHooks=u,exports.batch=_,exports.computed=g,exports.effect=m,exports.nextTick=b,exports.signal=p,exports.untrack=v,exports.watch=y;
@@ -1 +1 @@
1
- function e(){return{ctxPool:[],ctxStack:[],activeEffect:null,activeDeps:null,activeErrorHandler:null,errorHandlerStack:[],batchLevel:0,pendingEffectsSet:new Set,pendingEffectsArr:[],effectDepth:0,notifyBuf:[],notifyBase:0,signalDebugHooks:null}}var t=Symbol.for("@deijose/nix-js/reactivity-state"),n=globalThis,r=(()=>{let r=n[t];if(r)return r;let f=e();return n[t]=f,f})();function i(e){r.errorHandlerStack.push(r.activeErrorHandler),r.activeErrorHandler=e}function a(){r.activeErrorHandler=r.errorHandlerStack.pop()??null}var o=100,s=64,c=16,l=32;function u(e){r.signalDebugHooks=e}function d(){return r.notifyBuf.length}var f=class{_value;_subs=new Set;constructor(e){this._value=e,r.signalDebugHooks?.onCreate?.(this,e)}get value(){return r.activeEffect&&(this._subs.add(r.activeEffect),r.activeDeps?.add(this)),this._value}set value(e){Object.is(this._value,e)||(this._value=e,r.signalDebugHooks?.onWrite?.(this,e),this._notify())}update(e){this.value=e(this._value)}peek(){return this._value}_removeSub(e){this._subs.delete(e)}_notify(){if(r.batchLevel>0){for(let e of this._subs)r.pendingEffectsSet.has(e)||(r.pendingEffectsSet.add(e),r.pendingEffectsArr.push(e));return}let e=r.notifyBase,t=0;for(let n of this._subs)r.notifyBuf[e+t++]=n;r.notifyBase=e+t;try{for(let n=0;n<t;n++){let t=r.notifyBuf[e+n];r.notifyBuf[e+n]=null,t?.()}}finally{r.notifyBase=e,0===e&&r.notifyBuf.length>s&&t<c&&(r.notifyBuf.length=l)}}dispose(){this._subs.clear()}};function p(e){return new f(e)}function m(e){let t,n=!1,f=new Set,l=new Set,i=r.activeErrorHandler,c=()=>{if(n)return;"function"==typeof t&&t();let s=f;f=l,l=s,l.clear();let a=r.ctxPool.length>0?r.ctxPool.pop():{effect:null,deps:null};if(a.effect=r.activeEffect,a.deps=r.activeDeps,r.ctxStack.push(a),r.activeEffect=c,r.activeDeps=l,r.effectDepth++,r.effectDepth>o){r.effectDepth=0;let e=r.ctxStack.pop();throw r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e),Error("[Nix] Maximum effect re-execution depth exceeded (possible infinite loop).")}try{t=e()}catch(e){if(!i)throw e;i(e)}finally{r.effectDepth--;let e=r.ctxStack.pop();r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e);for(let e of f)l.has(e)||e._removeSub(c)}};return c(),()=>{n=!0,"function"==typeof t&&t();for(let e of l)e._removeSub(c);l.clear(),f.clear()}}function h(e){let t=new f(void 0),r=null,n=!1,l=!1,i=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(t),"value");if(!i?.get||!i?.set)throw Error("[Nix] Internal error: Signal.value descriptor not found.");Object.defineProperty(t,"value",{get(){return n||l||(n=!0,_(()=>{r=m(()=>{t.value=e()})})),i.get.call(this)},set(e){i.set.call(this,e)},configurable:!0});let c=t.dispose;return t.dispose=()=>{l=!0,r?.(),r=null,c.call(t)},t}function g(e){r.batchLevel++;try{e()}finally{if(r.batchLevel--,0===r.batchLevel&&r.pendingEffectsArr.length>0){let e=r.pendingEffectsArr.length;for(let t=0;t<e;t++)r.pendingEffectsArr[t]();r.pendingEffectsArr.length=0,r.pendingEffectsSet.clear()}}}function _(e){let t=r.activeEffect,n=r.activeDeps;r.activeEffect=null,r.activeDeps=null;try{return e()}finally{r.activeEffect=t,r.activeDeps=n}}function v(e,t,r={}){let n,{immediate:l=!1,once:i=!1}=r,c=e instanceof f?()=>e.value:e,o=!0,s=!1,a=m(()=>{let e=c();if(o){if(o=!1,l&&!s){let r=e;_(()=>t(r,void 0)),i&&(s=!0,Promise.resolve().then(a))}n=e}else if(!s){let r=e,f=n;n=e,_(()=>t(r,f)),i&&(s=!0,Promise.resolve().then(a))}});return()=>{s=!0,a()}}function y(e){return e?Promise.resolve().then(e):Promise.resolve()}export{f as Signal,d as _getNotifyBufSize,a as _popErrorHandler,i as _pushErrorHandler,u as _setSignalDebugHooks,g as batch,h as computed,m as effect,y as nextTick,p as signal,_ as untrack,v as watch};
1
+ function e(){return{ctxPool:[],ctxStack:[],activeEffect:null,activeDeps:null,activeErrorHandler:null,errorHandlerStack:[],batchLevel:0,pendingEffectsSet:new Set,pendingEffectsArr:[],effectDepth:0,notifyBuf:[],notifyBase:0,signalDebugHooks:null}}var t=Symbol.for("@deijose/nix-js/reactivity-state"),n=globalThis,r=(()=>{let r=n[t];if(r)return r;let l=e();return n[t]=l,l})();function i(e){r.errorHandlerStack.push(r.activeErrorHandler),r.activeErrorHandler=e}function a(){r.activeErrorHandler=r.errorHandlerStack.pop()??null}var o=100,s=64,c=16,l=32;function u(e){r.signalDebugHooks=e}function d(){return r.notifyBuf.length}var f=class{_value;_subs=new Set;constructor(e){this._value=e,r.signalDebugHooks?.onCreate?.(this,e)}get value(){return r.activeEffect&&(this._subs.add(r.activeEffect),r.activeDeps?.add(this)),this._value}set value(e){Object.is(this._value,e)||(this._value=e,r.signalDebugHooks?.onWrite?.(this,e),this._notify())}update(e){this.value=e(this._value)}peek(){return this._value}_removeSub(e){this._subs.delete(e)}_notify(){if(r.batchLevel>0){for(let e of this._subs)r.pendingEffectsSet.has(e)||(r.pendingEffectsSet.add(e),r.pendingEffectsArr.push(e));return}let e=r.notifyBase,t=0;for(let n of this._subs)r.notifyBuf[e+t++]=n;r.notifyBase=e+t;try{for(let n=0;n<t;n++){let t=r.notifyBuf[e+n];r.notifyBuf[e+n]=null,t?.()}}finally{r.notifyBase=e,0===e&&r.notifyBuf.length>s&&t<c&&(r.notifyBuf.length=l)}}dispose(){this._subs.clear()}};function p(e){return new f(e)}function m(e){let t,n=!1,l=new Set,i=new Set,f=r.activeErrorHandler,c=()=>{if(n)return;"function"==typeof t&&t();let s=l;l=i,i=s,i.clear();let a=r.ctxPool.length>0?r.ctxPool.pop():{effect:null,deps:null};if(a.effect=r.activeEffect,a.deps=r.activeDeps,r.ctxStack.push(a),r.activeEffect=c,r.activeDeps=i,r.effectDepth++,r.effectDepth>o){r.effectDepth=0;let e=r.ctxStack.pop();throw r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e),Error("[Nix] Maximum effect re-execution depth exceeded (possible infinite loop).")}try{t=e()}catch(e){if(!f)throw e;f(e)}finally{r.effectDepth--;let e=r.ctxStack.pop();r.activeEffect=e.effect,r.activeDeps=e.deps,e.effect=null,e.deps=null,r.ctxPool.push(e);for(let e of l)i.has(e)||e._removeSub(c)}};return c(),()=>{n=!0,"function"==typeof t&&t();for(let e of i)e._removeSub(c);i.clear(),l.clear()}}var h=Symbol("nix-computed-uninitialized");function g(e,t=Object.is){let r=new f(h),n=null,l=!1,i=!1,c=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(r),"value");if(!c?.get||!c?.set)throw Error("[Nix] Internal error: Signal.value descriptor not found.");Object.defineProperty(r,"value",{get(){return l||i||(l=!0,v(()=>{n=m(()=>{let n=e(),l=r.peek();(l===h||!t(n,l))&&(r.value=n)})})),c.get.call(this)},set(e){c.set.call(this,e)},configurable:!0});let o=r.dispose;return r.dispose=()=>{i=!0,n?.(),n=null,o.call(r)},r}function _(e){r.batchLevel++;try{e()}finally{if(r.batchLevel--,0===r.batchLevel&&r.pendingEffectsArr.length>0){let e=r.pendingEffectsArr.length;for(let t=0;t<e;t++)r.pendingEffectsArr[t]();r.pendingEffectsArr.length=0,r.pendingEffectsSet.clear()}}}function v(e){let t=r.activeEffect,n=r.activeDeps;r.activeEffect=null,r.activeDeps=null;try{return e()}finally{r.activeEffect=t,r.activeDeps=n}}function y(e,t,r={}){let n,{immediate:l=!1,once:i=!1}=r,c=e instanceof f?()=>e.value:e,o=!0,s=!1,a=m(()=>{let e=c();if(o){if(o=!1,l&&!s){let r=e;v(()=>t(r,void 0)),i&&(s=!0,Promise.resolve().then(a))}n=e}else if(!s){let r=e,l=n;n=e,v(()=>t(r,l)),i&&(s=!0,Promise.resolve().then(a))}});return()=>{s=!0,a()}}function b(e){return e?Promise.resolve().then(e):Promise.resolve()}export{f as Signal,d as _getNotifyBufSize,a as _popErrorHandler,i as _pushErrorHandler,u as _setSignalDebugHooks,_ as batch,g as computed,m as effect,b as nextTick,p as signal,v as untrack,y as watch};
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");var t=class extends e.Signal{label;constructor(e,t="ReadonlySignal"){super(e.peek()),this.label=t,Object.defineProperty(this,"value",{get:()=>e.value,set:()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},configurable:!1}),this.update=()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},this.dispose=()=>{throw Error(`[Nix] Cannot dispose "${this.label}" directly.`)}}},n=new Set(["$id","$state","$stateSignal","$snapshot","$reset","$patch","$watch","$dispose"]);function r(e){if("__proto__"===e||"constructor"===e||"prototype"===e)throw Error(`[Nix] Store key "${e}" is not allowed for security reasons.`);if(n.has(e))throw Error(`[Nix] Store key "${e}" is reserved.`)}function i(e,t){return!n.has(e)||(console.warn(`[Nix] Store ${t} "${e}" is reserved and will be ignored.`),!1)}function a(e,r){return new t(e,r)}function o(t,o){let{name:l="store",actions:s,getters:c,plugins:f=[]}=o??{},u=Object.keys(t),d={};for(let o of u)r(o),d[o]=e.signal(t[o]);let $,g=d,h=e.computed(()=>{let e={};for(let t of u)e[t]=d[t].value;return e}),b=a(h,`store "${l}".$stateSignal`);try{$=structuredClone(t)}catch(e){throw Error(`[Nix] Store "${l}" initialState contains non-serializable data (functions, DOM nodes, Symbols, or WeakRefs). Remove these before creating the store. Original error: ${e}`)}let p=Object.assign(Object.create(null),g,{$reset:function(){e.batch(()=>{for(let e of u)d[e].value=$[e]})},$patch:function(t){e.batch(()=>{for(let e of Object.keys(t))Object.prototype.hasOwnProperty.call(d,e)&&(d[e].value=t[e])})},$watch:function(t,r){return e.watch(h,t,r)},$snapshot:function(){let e={};for(let t of u)e[t]=d[t].peek();return e}});Object.defineProperty(p,"$id",{value:l,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(p,"$state",{get:()=>h.value,enumerable:!0,configurable:!1}),Object.defineProperty(p,"$stateSignal",{value:b,writable:!1,enumerable:!1,configurable:!1});let y=new Set([...u,...Array.from(n)]);if(s){let e=s(g);for(let t of Object.keys(e))if(i(t,"action")){if(y.has(t)){console.warn(`[Nix] Store "${l}": action "${t}" collides with an existing signal or getter and will be ignored.`);continue}y.add(t),p[t]=e[t]}}if(c){let t=c(g);for(let r of Object.keys(t)){if(!i(r,"getter"))continue;if(y.has(r)){console.warn(`[Nix] Store "${l}": getter "${r}" collides with an existing signal or action and will be ignored.`);continue}let o=t[r];if(!(o instanceof e.Signal))throw TypeError(`[Nix] Store "${l}": getter "${r}" must return a Signal (wrap it with computed()). Got: ${typeof o}`);y.add(r),p[r]=a(o,`getter "${r}" in store "${l}"`)}}let w=[()=>h.dispose()];for(let e of f)try{let t=e(p);"function"==typeof t&&w.push(t)}catch(e){console.error(`[Nix] Plugin initialization failed for store "${l}":`,e)}return p.$dispose=()=>{for(let e of w)e()},p}exports.ReadonlySignal=t,exports.createStore=o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");var t=class extends e.Signal{label;constructor(e,t="ReadonlySignal"){super(e.peek()),this.label=t,Object.defineProperty(this,"value",{get:()=>e.value,set:()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},configurable:!1}),this.update=()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},this.dispose=()=>{throw Error(`[Nix] Cannot dispose "${this.label}" directly.`)}}},n=new Set(["$id","$state","$stateSignal","$snapshot","$reset","$patch","$watch","$dispose"]);function r(e){if("__proto__"===e||"constructor"===e||"prototype"===e)throw Error(`[Nix] Store key "${e}" is not allowed for security reasons.`);if(n.has(e))throw Error(`[Nix] Store key "${e}" is reserved.`)}function i(e,t){return!n.has(e)||(console.warn(`[Nix] Store ${t} "${e}" is reserved and will be ignored.`),!1)}function a(e,r){return new t(e,r)}function o(t,o){let{name:l="store",actions:s,getters:c,plugins:f=[]}=o??{},u=Object.keys(t),d={};for(let o of u)r(o),d[o]=e.signal(t[o]);let b,g=d,$=e.computed(()=>{let e={};for(let t of u)e[t]=d[t].value;return e}),h=a($,`store "${l}".$stateSignal`);try{b=structuredClone(t)}catch(e){throw Error(`[Nix] Store "${l}" initialState contains non-serializable data (functions, DOM nodes, Symbols, or WeakRefs). Remove these before creating the store. Original error: ${e}`)}let p=[];function y(){let e={};for(let t of u)e[t]=d[t].peek();return e}let w=Object.assign(Object.create(null),g,{$reset:function(){let t=y();for(let e of p)e(t,t);e.batch(()=>{for(let e of u)d[e].value=b[e]})},$patch:function(t){let r=t,o=y();for(let e of p){let t=e(r,o);void 0!==t&&(r=t)}e.batch(()=>{for(let e of Object.keys(r))Object.prototype.hasOwnProperty.call(d,e)&&(d[e].value=r[e])})},$watch:function(t,r){return e.watch($,t,r)},$snapshot:y});Object.defineProperty(w,"$id",{value:l,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(w,"$state",{get:()=>$.value,enumerable:!0,configurable:!1}),Object.defineProperty(w,"$stateSignal",{value:h,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(w,"_guardFns",{value:p,writable:!1,enumerable:!1,configurable:!1});let S=new Set([...u,...Array.from(n)]);if(s){let e=s(g);for(let t of Object.keys(e))if(i(t,"action")){if(S.has(t)){console.warn(`[Nix] Store "${l}": action "${t}" collides with an existing signal or getter and will be ignored.`);continue}S.add(t),w[t]=e[t]}}if(c){let t=c(g);for(let r of Object.keys(t)){if(!i(r,"getter"))continue;if(S.has(r)){console.warn(`[Nix] Store "${l}": getter "${r}" collides with an existing signal or action and will be ignored.`);continue}let o=t[r];if(!(o instanceof e.Signal))throw TypeError(`[Nix] Store "${l}": getter "${r}" must return a Signal (wrap it with computed()). Got: ${typeof o}`);S.add(r),w[r]=a(o,`getter "${r}" in store "${l}"`)}}let x=[()=>$.dispose()];for(let e of f)try{let t=e(w);"function"==typeof t&&x.push(t)}catch(e){console.error(`[Nix] Plugin initialization failed for store "${l}":`,e)}return w.$dispose=()=>{for(let e of x)e()},w}exports.ReadonlySignal=t,exports.createStore=o;
package/dist/lib/store.js CHANGED
@@ -1 +1 @@
1
- import{Signal as e,batch as t,computed as n,signal as r,watch as i}from"./signals.js";var a=class extends e{label;constructor(e,t="ReadonlySignal"){super(e.peek()),this.label=t,Object.defineProperty(this,"value",{get:()=>e.value,set:()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},configurable:!1}),this.update=()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},this.dispose=()=>{throw Error(`[Nix] Cannot dispose "${this.label}" directly.`)}}},o=new Set(["$id","$state","$stateSignal","$snapshot","$reset","$patch","$watch","$dispose"]);function s(e){if("__proto__"===e||"constructor"===e||"prototype"===e)throw Error(`[Nix] Store key "${e}" is not allowed for security reasons.`);if(o.has(e))throw Error(`[Nix] Store key "${e}" is reserved.`)}function c(e,t){return!o.has(e)||(console.warn(`[Nix] Store ${t} "${e}" is reserved and will be ignored.`),!1)}function l(e,t){return new a(e,t)}function u(a,f){let{name:u="store",actions:d,getters:$,plugins:h=[]}=f??{},g=Object.keys(a),p={};for(let e of g)s(e),p[e]=r(a[e]);let b,w=p,y=n(()=>{let e={};for(let t of g)e[t]=p[t].value;return e}),S=l(y,`store "${u}".$stateSignal`);try{b=structuredClone(a)}catch(e){throw Error(`[Nix] Store "${u}" initialState contains non-serializable data (functions, DOM nodes, Symbols, or WeakRefs). Remove these before creating the store. Original error: ${e}`)}let x=Object.assign(Object.create(null),w,{$reset:function(){t(()=>{for(let e of g)p[e].value=b[e]})},$patch:function(e){t(()=>{for(let t of Object.keys(e))Object.prototype.hasOwnProperty.call(p,t)&&(p[t].value=e[t])})},$watch:function(e,t){return i(y,e,t)},$snapshot:function(){let e={};for(let t of g)e[t]=p[t].peek();return e}});Object.defineProperty(x,"$id",{value:u,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(x,"$state",{get:()=>y.value,enumerable:!0,configurable:!1}),Object.defineProperty(x,"$stateSignal",{value:S,writable:!1,enumerable:!1,configurable:!1});let O=new Set([...g,...Array.from(o)]);if(d){let e=d(w);for(let t of Object.keys(e))if(c(t,"action")){if(O.has(t)){console.warn(`[Nix] Store "${u}": action "${t}" collides with an existing signal or getter and will be ignored.`);continue}O.add(t),x[t]=e[t]}}if($){let t=$(w);for(let r of Object.keys(t)){if(!c(r,"getter"))continue;if(O.has(r)){console.warn(`[Nix] Store "${u}": getter "${r}" collides with an existing signal or action and will be ignored.`);continue}let o=t[r];if(!(o instanceof e))throw TypeError(`[Nix] Store "${u}": getter "${r}" must return a Signal (wrap it with computed()). Got: ${typeof o}`);O.add(r),x[r]=l(o,`getter "${r}" in store "${u}"`)}}let j=[()=>y.dispose()];for(let e of h)try{let t=e(x);"function"==typeof t&&j.push(t)}catch(e){console.error(`[Nix] Plugin initialization failed for store "${u}":`,e)}return x.$dispose=()=>{for(let e of j)e()},x}export{a as ReadonlySignal,u as createStore};
1
+ import{Signal as e,batch as t,computed as n,signal as r,watch as i}from"./signals.js";var a=class extends e{label;constructor(e,t="ReadonlySignal"){super(e.peek()),this.label=t,Object.defineProperty(this,"value",{get:()=>e.value,set:()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},configurable:!1}),this.update=()=>{throw Error(`[Nix] "${this.label}" is read-only.`)},this.dispose=()=>{throw Error(`[Nix] Cannot dispose "${this.label}" directly.`)}}},o=new Set(["$id","$state","$stateSignal","$snapshot","$reset","$patch","$watch","$dispose"]);function s(e){if("__proto__"===e||"constructor"===e||"prototype"===e)throw Error(`[Nix] Store key "${e}" is not allowed for security reasons.`);if(o.has(e))throw Error(`[Nix] Store key "${e}" is reserved.`)}function c(e,t){return!o.has(e)||(console.warn(`[Nix] Store ${t} "${e}" is reserved and will be ignored.`),!1)}function l(e,t){return new a(e,t)}function u(a,f){let{name:u="store",actions:d,getters:$,plugins:b=[]}=f??{},g=Object.keys(a),h={};for(let e of g)s(e),h[e]=r(a[e]);let p,w=h,y=n(()=>{let e={};for(let t of g)e[t]=h[t].value;return e}),S=l(y,`store "${u}".$stateSignal`);try{p=structuredClone(a)}catch(e){throw Error(`[Nix] Store "${u}" initialState contains non-serializable data (functions, DOM nodes, Symbols, or WeakRefs). Remove these before creating the store. Original error: ${e}`)}let x=[];function O(){let e={};for(let t of g)e[t]=h[t].peek();return e}let v=Object.assign(Object.create(null),w,{$reset:function(){let e=O();for(let t of x)t(e,e);t(()=>{for(let e of g)h[e].value=p[e]})},$patch:function(e){let r=e,o=O();for(let e of x){let t=e(r,o);void 0!==t&&(r=t)}t(()=>{for(let e of Object.keys(r))Object.prototype.hasOwnProperty.call(h,e)&&(h[e].value=r[e])})},$watch:function(e,t){return i(y,e,t)},$snapshot:O});Object.defineProperty(v,"$id",{value:u,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(v,"$state",{get:()=>y.value,enumerable:!0,configurable:!1}),Object.defineProperty(v,"$stateSignal",{value:S,writable:!1,enumerable:!1,configurable:!1}),Object.defineProperty(v,"_guardFns",{value:x,writable:!1,enumerable:!1,configurable:!1});let j=new Set([...g,...Array.from(o)]);if(d){let e=d(w);for(let t of Object.keys(e))if(c(t,"action")){if(j.has(t)){console.warn(`[Nix] Store "${u}": action "${t}" collides with an existing signal or getter and will be ignored.`);continue}j.add(t),v[t]=e[t]}}if($){let t=$(w);for(let r of Object.keys(t)){if(!c(r,"getter"))continue;if(j.has(r)){console.warn(`[Nix] Store "${u}": getter "${r}" collides with an existing signal or action and will be ignored.`);continue}let o=t[r];if(!(o instanceof e))throw TypeError(`[Nix] Store "${u}": getter "${r}" must return a Signal (wrap it with computed()). Got: ${typeof o}`);j.add(r),v[r]=l(o,`getter "${r}" in store "${u}"`)}}let m=[()=>y.dispose()];for(let e of b)try{let t=e(v);"function"==typeof t&&m.push(t)}catch(e){console.error(`[Nix] Plugin initialization failed for store "${u}":`,e)}return v.$dispose=()=>{for(let e of m)e()},v}export{a as ReadonlySignal,u as createStore};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deijose/nix-js",
3
- "version": "2.5.1",
3
+ "version": "2.5.2",
4
4
  "description": "A lightweight, fully reactive micro-framework — no virtual DOM, no compiler, just signals and tagged templates.",
5
5
  "license": "MIT",
6
6
  "author": "Deiver Vasquez",