sinho 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.d.ts CHANGED
@@ -71,6 +71,7 @@ declare const useSignal: (<T>(value: T, opts?: SetSignalOptions) => readonly [Si
71
71
  * and updated at the same time.
72
72
  */
73
73
  declare const useBatch: <T>(fn: () => T) => T;
74
+ declare function flushBatch(): void;
74
75
  /**
75
76
  * Creates a memoized signal.
76
77
  *
@@ -1130,4 +1131,4 @@ declare namespace JSX {
1130
1131
  }
1131
1132
  }
1132
1133
 
1133
- export { type AttributeOptions, type Children, type Cleanup, Component, type ComponentConstructor, type ComponentOptions, type Context, type DangerousHtml, Else, ElseIf, type EventConstructor, For, Fragment, type FunctionalComponent, If, JSX, MaybeSignal, type Metadata, Portal, type PropOptions, type RefSignal, type RefSignalSetter, type SetSignalOptions, type Signal, type SignalLike, type SignalSetter, Style, type Styles, type SubscopeOptions, type Template, createContext, createElement, css, defineComponents, event, h, isComponent, jsx, jsx as jsxDEV, jsx as jsxs, prop, useBatch, useContext, useMountEffect as useEffect, useMemo, useRef, useSignal, useSubscope };
1134
+ export { type AttributeOptions, type Children, type Cleanup, Component, type ComponentConstructor, type ComponentOptions, type Context, type DangerousHtml, Else, ElseIf, type EventConstructor, For, Fragment, type FunctionalComponent, If, JSX, MaybeSignal, type Metadata, Portal, type PropOptions, type RefSignal, type RefSignalSetter, type SetSignalOptions, type Signal, type SignalLike, type SignalSetter, Style, type Styles, type SubscopeOptions, type Template, createContext, createElement, css, defineComponents, event, flushBatch, h, isComponent, jsx, jsx as jsxDEV, jsx as jsxs, prop, useBatch, useContext, useMountEffect as useEffect, useMemo, useRef, useSignal, useSubscope };
package/dist/bundle.js CHANGED
@@ -61,12 +61,11 @@ const useSignal = (value, opts) => {
61
61
  if (innerOpts?.force) {
62
62
  value = newValue;
63
63
  }
64
- else {
65
- currBatch._setters.push(() => (value = newValue));
66
- }
67
- if (!innerOpts?.silent) {
68
- signal._effects.forEach((effect) => currBatch._effects.add(effect));
69
- }
64
+ currBatch._setters.push([
65
+ signal,
66
+ () => (value = newValue),
67
+ innerOpts?.silent,
68
+ ]);
70
69
  }
71
70
  }
72
71
  else {
@@ -82,27 +81,50 @@ const useSignal = (value, opts) => {
82
81
  * and updated at the same time.
83
82
  */
84
83
  const useBatch = (fn) => {
85
- const prevBatch = currBatch;
86
- currBatch = { _setters: [], _effects: new Set() };
87
- try {
88
- const result = fn();
89
- while (currBatch._setters.length > 0 || currBatch._effects.size > 0) {
90
- // Clean effect subscope
91
- const effects = currBatch._effects;
92
- currBatch._effects = new Set();
93
- effects.forEach((effect) => effect._clean?.());
94
- // Run signal updates
95
- currBatch._setters.forEach((setter) => setter());
96
- currBatch._setters = [];
97
- // Run effects
98
- effects.forEach((effect) => effect._run());
99
- }
100
- return result;
101
- }
102
- finally {
103
- currBatch = prevBatch;
84
+ const createBatch = !currBatch;
85
+ if (createBatch)
86
+ currBatch = { _setters: [], _effects: new Set() };
87
+ const result = fn();
88
+ if (createBatch) {
89
+ flushBatch();
90
+ currBatch = undefined;
104
91
  }
92
+ return result;
105
93
  };
94
+ function flushBatch() {
95
+ const mutatedSignals = new Set();
96
+ while (currBatch &&
97
+ (currBatch._setters.length > 0 || currBatch._effects.size > 0)) {
98
+ const settersCount = currBatch._setters.length;
99
+ const effects = currBatch._effects;
100
+ currBatch._effects = new Set();
101
+ // Collect and clean effects
102
+ for (const [signal, , silent] of currBatch._setters) {
103
+ if (!silent) {
104
+ signal._effects.forEach((effect) => {
105
+ effect._clean?.();
106
+ effects.add(effect);
107
+ });
108
+ }
109
+ }
110
+ // Run signal updates
111
+ for (const [signal, setter] of currBatch._setters) {
112
+ setter();
113
+ mutatedSignals.add(signal);
114
+ }
115
+ currBatch._setters = [];
116
+ // Run effects
117
+ for (const effect of effects) {
118
+ if (!settersCount ||
119
+ [...effect._deps].every((dep) => mutatedSignals.has(dep))) {
120
+ effect._run();
121
+ }
122
+ else {
123
+ currBatch._effects.add(effect);
124
+ }
125
+ }
126
+ }
127
+ }
106
128
  /**
107
129
  * Creates an effect which will rerun when any accessed signal changes.
108
130
  *
@@ -619,12 +641,7 @@ const setAttr = (node, name, value, heuristic) => {
619
641
  ].includes(name) &&
620
642
  name in node) {
621
643
  try {
622
- if (isComponent(node)) {
623
- node[name] = value;
624
- }
625
- else {
626
- node[name] = value == null ? "" : value;
627
- }
644
+ node[name] = value;
628
645
  return;
629
646
  }
630
647
  catch (e) { }
@@ -1075,4 +1092,4 @@ const jsx = (type, props, key) => {
1075
1092
  return createElement(type, props);
1076
1093
  };
1077
1094
 
1078
- export { Component, Else, ElseIf, For, Fragment, If, MaybeSignal, Portal, Style, createContext, createElement, css, defineComponents, event, h, isComponent, jsx, jsx as jsxDEV, jsx as jsxs, prop, useBatch, useContext, useMountEffect as useEffect, useMemo, useRef, useSignal, useSubscope };
1095
+ export { Component, Else, ElseIf, For, Fragment, If, MaybeSignal, Portal, Style, createContext, createElement, css, defineComponents, event, flushBatch, h, isComponent, jsx, jsx as jsxDEV, jsx as jsxs, prop, useBatch, useContext, useMountEffect as useEffect, useMemo, useRef, useSignal, useSubscope };
@@ -1 +1 @@
1
- const t=t=>({t:t,o:[],i:[],l:{...t?.l},u(t){const n=o;o=this;try{return t()}finally{o=n}},h(){for(let t=this.i.length-1;t>=0;t--)this.i[t].h();this.i=[];for(let t=this.o.length-1;t>=0;t--){const n=this.o[t];n._?.(),n.u=()=>{},n.p.forEach((t=>t.o.delete(n))),n.p.clear()}this.o=[]}});let n,e,o=t(),s=!1;const r=()=>o,c=(t,o)=>{const r=()=>(!s&&n&&(n.p.add(r),r.o.add(n)),r.peek());r.o=new Set,r.peek=()=>t;const c=(n,s)=>{if(s={...o,...s},e){const o="function"==typeof n?n(r.peek()):n;(s?.force||o!==r.peek())&&(s?.force?t=o:e.m.push((()=>t=o)),s?.silent||r.o.forEach((t=>e.o.add(t))))}else i((()=>c(n,s)))};return[r,c]},i=t=>{const n=e;e={m:[],o:new Set};try{const n=t();for(;e.m.length>0||e.o.size>0;){const t=e.o;e.o=new Set,t.forEach((t=>t._?.())),e.m.forEach((t=>t())),e.m=[],t.forEach((t=>t.u()))}return n}finally{e=n}},l=(t,e)=>{const r=!!e,c={v:o,p:new Set,u(){const o=n,c=s;n=this;try{this.p.forEach((t=>t.o.delete(this))),this.p.clear(),e&&(s=!1,e.forEach((t=>t()))),s=r,this._?.();const n=this.v.u((()=>i(t)));this._=n?()=>{this.v.u((()=>i(n))),this._=null}:null}finally{n=o,s=c}}};o.o.push(c),c.u(),c.p.size||c._||o.o.pop()},u=(t,n)=>{const[e,o]=c();let s=!0;return l((()=>{o(t,s?{...n,force:!0}:n),s=!1})),e},f=(n,e)=>{const s=o,r=t(s);Object.assign(r.l,e?.details),s.i.push(r);return[r.u(n),()=>{const t=s.i.indexOf(r);t>=0&&s.i.splice(t,1),r.h()}]},a=(t,n)=>{const[e,o]=c(t,n);return e.set=o,e},d={upgrade:t=>()=>d.get(t),get:t=>"function"==typeof t?t():t,peek(t){const n=s;s=!0;try{return this.get(t)}finally{s=n}}},h=(t={})=>({S:[],M(t){return this.k?.next().value??t()},...t}),_=()=>{const t=r();return t.l.C??=h()},p=(t,n)=>{const e=_(),o=h({...e,...t}),[s,r]=f(n,{details:{C:o}});return l((()=>r)),s},m=t=>(t[0]??"").toLowerCase()+t.slice(1).replace(/[A-Z]/g,(t=>"-"+t.toLowerCase())),y=t=>t.startsWith("on:")?t.slice(3):m(t.slice(2)),w=Symbol(),b=(t,n)=>({[w]:Math.random().toString(36).slice(2),N:t,j:n}),g=t=>!!t?.[w],v=(t,n,e)=>{n.addEventListener(t[w],(t=>{const n=d.get(e);void 0!==n&&(t.stopPropagation(),t.detail(n))}))},x=t=>{const n=_();return u((()=>{let e=t.N;return n.H?.dispatchEvent(new CustomEvent(t[w],{detail:t=>e=t,bubbles:!0,composed:!0})),e}))},S=(t,n)=>({L:"p",T:t,...n}),M=(t=CustomEvent)=>({L:"e",A:t}),k=Symbol();let C;const E=(t,n)=>{C?C.push([t,n]):l(t,n)},N=(t,n={},e={})=>{const o=[],s=new Map;for(const t in n){const e=n[t];if("p"==e.L&&e.attribute){"function"==typeof e.attribute&&(e.attribute={transform:e.attribute});const n=e.attribute={name:m(t),static:!1,transform:t=>t,...e.attribute};s.set(n.name,{name:t,meta:e}),n.static||o.push(n.name)}}e.shadow??={mode:"open"};class i extends HTMLElement{static[k]={O:t};static observedAttributes=o;props={};events={};[k]={};constructor(){super();for(const t in n){const e=n[t];if("p"==e.L){const n=g(e.T)?e.T:null,[o,s]=c(n?void 0:e.T);this.props[t]=o,n&&v(n,this,o),Object.defineProperty(this,t,{get:o.peek,set:t=>s((()=>t),{force:!0})})}else if("e"==e.L&&t.startsWith("on")){const n=y(t);this.events[t]=t=>this.dispatchEvent(new e.A(n,t))}}}connectedCallback(){const t=(n=this,e.shadow?n.shadowRoot??n.attachShadow(e.shadow):n);var n;this[k].D=f((()=>p({I:!1,H:this,k:t.childNodes.values()},(()=>{this[k].v=r();const n=C;C=[];try{t?.append(...this.render().build()),C.forEach((([t,n])=>l(t,n)))}finally{C=n}}))))[1]}disconnectedCallback(){this[k].D?.()}attributeChangedCallback(t,n,e){const o=s.get(t);o&&(this[o.name]=null!=e?o.meta.attribute.transform.call(this,e):g(o.meta.T)?void 0:o.meta.T)}}return i},j=t=>!!t?.[k],H=(...t)=>{const[n,e]="string"==typeof t[0]?[t[0],t.slice(1)]:["",t];for(const t of e)customElements.define(n+t[k].O,t)},L=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,T=(t,n,e)=>{"-"==n[0]?t.style.setProperty(n,""+e):t.style[n]=null==e?"":"number"!=typeof e||L.test(n)?""+e:e+"px"},A=(t,n,e,o)=>{const s=null==e||!1===e&&!n.includes("-");if(n.startsWith("prop:"))t[n.slice(5)]=e;else if(n.startsWith("attr:"))n=n.slice(5),s?t.removeAttribute(n):t.setAttribute(n,e);else if(!["innerHTML","outerHTML"].includes(n)){if(!["tabIndex","role",...o?["width","height","href","list","form","download","rowSpan","colSpan"]:[]].includes(n)&&n in t)try{return void(j(t)?t[n]=e:t[n]=e??"")}catch(t){}"function"==typeof e||(s?t.removeAttribute(n):t.setAttribute(n,e))}},O=t=>({build(){const n=t();return n.build?.()??n}}),D=({text:t,marker:n})=>O((()=>{const e=_(),o=n&&e.M((()=>document.createComment(""))),s=e.M((()=>document.createTextNode("")));return l((()=>{const n=""+(d.get(t)??"");s.textContent!=n&&(s.textContent=n)})),o?[o,s]:[s]})),I=({children:t})=>O((()=>Array.isArray(t)?t.flatMap((t=>I({children:t}).build())):null==t?[]:"object"==typeof t?t:D({text:t}))),$=(t,n,e,o)=>{const{ref:s,style:c,children:u,dangerouslySetInnerHTML:f,...a}=e;for(const n in c??{}){const e=c[n];l((()=>{T(t,n,d.get(e))}))}for(const n in a){const e=a[n];if(n.startsWith("on")){const o=r(),s=t=>{o.u((()=>i((()=>e(t)))))},c=y(n);l((()=>(t.addEventListener(c,s),()=>t.removeEventListener(c,s))))}else l((()=>{A(t,n,d.get(e),o)}))}return f&&l((()=>{const n=d.get(f).__html;t.innerHTML!=n&&(t.innerHTML=n)})),s&&l((()=>(s.set(t),()=>s.set(void 0)))),null!=e.children&&t.append(...p({I:n,k:t.childNodes.values()},(()=>I({children:e.children}).build()))),t},z=(t,n={},e)=>(null!=e&&(n.children=e),j(t)?((t,n)=>O((()=>{const e=_().M((()=>new t));return customElements.upgrade(e),$(e,!1,n),[e]})))(t,n):"function"==typeof t?O((()=>t(n))):((t,n={})=>O((()=>{const e=_(),o="svg"==t||!!e.I;return[$(e.M((()=>o?document.createElementNS("http://www.w3.org/2000/svg",t):document.createElement(t))),o,n,!0)]})))(t,n)),P=new Proxy(z,{get:(t,n)=>(e,o)=>t(n,e,o)}),V=(t,n)=>{const[e,o]=c({$:[],P:new Map});let s=new Map;return l((()=>{const e=[],r=s,c=((t,n)=>{const e=new Map;for(let o=0;o<t.length;o++){const s=n(t[o],o);if(e.has(s))throw Error(`Duplicate key '${s}'`);e.set(s,o)}return e})(t(),n),i=(t=NaN)=>e.map((t=>"r"==t.V?n=>n<t.Z?n:n==t.Z?NaN:n-1:"a"==t.V?n=>n<t.Z?n:n+1:"m"==t.V?n=>t.q<=n&&n<t.B?n+1:n==t.B?t.q:n:t=>t)).reduce(((t,n)=>n(t)),t);for(const t of r.keys()){const n=i(r.get(t));c.has(t)||e.push({V:"r",F:t,Z:n})}for(let o=0;o<t().length;o++){const s=n(t()[o],o),c=i(r.get(s));isNaN(c)?e.push({V:"a",F:s,Z:o}):c!=o&&e.push({V:"m",F:s,B:c,q:o})}e.length>0&&o({$:e,P:c}),s=c})),e},Z=t=>O((()=>{const n=_(),e=d.upgrade(t.each??[]),o=n.M((()=>document.createComment(""))),s=t.key??((t,n)=>n),r=[o],i=new Map,u=V(e,s),a=t=>{for(let n=t-1;n>=0;n--){const n=s(e()[t-1],t-1),o=i.get(n)?.G??[];if(o.length>0)return o[o.length-1]}return o};return l((()=>{for(const n of u().$)if("r"==n.V){const{G:t=[],D:e}=i.get(n.F)??{};e?.();const o=r.indexOf(t[0]);o>0&&r.splice(o,t.length),t.forEach((t=>t.parentNode?.removeChild(t))),i.delete(n.F)}else if("a"==n.V){let o=[];const[,s]=f((()=>{const[s,i]=c(n.Z),[f,d]=c(e()[n.Z]);l((()=>{0<=s()&&s()<e().length&&d((()=>e()[s()]))})),l((()=>{const t=u().P.get(n.F);null!=t&&i(t)})),o=t.children?.(f,s,e).build()??[];const h=a(n.Z),_=r.indexOf(h);_>=0&&r.splice(_+1,0,...o),o.forEach((t=>h.parentNode?.insertBefore(t,h.nextSibling)))}));i.set(n.F,{G:o,D:s})}else if("m"==n.V){const{G:t=[]}=i.get(n.F)??{},e=r.indexOf(t[0]);e>=0&&r.splice(e,t.length);const o=a(n.q),s=r.indexOf(o);s>=0&&r.splice(s+1,0,...t),t.forEach((t=>o.parentNode?.insertBefore(t,o.nextSibling)))}}),[u]),r})),q=t=>(_().S=[],B({condition:t.condition,children:t.children})),B=t=>{const n=_(),e=n.S,o=u((()=>e.every((t=>!t()))&&d.get(t.condition)));return n.S=[...e,o],p({S:[]},(()=>O((()=>{const e=n.M((()=>document.createComment(""))),s=[e],r=u((()=>o()?I({children:t.children}):null));let c=[];return l((()=>{c.forEach((t=>t.parentNode?.removeChild(t))),s.length=1;const[,t]=f((()=>{c=r()?.build()??[],e.after(...c),s.push(...c)}));return t}),[r]),s}))))},F=({children:t})=>B({condition:!0,children:t}),G=({mount:t,children:n})=>O((()=>p({k:void 0},(()=>{const e=I({children:n}).build();return l((()=>(e.forEach((n=>t.appendChild(n))),()=>{e.forEach((t=>t.parentNode?.removeChild(t)))}))),[]})))),J=Symbol(),K=new Map,Q=t=>{const n=t.children;if("function"==typeof n){const e=z("style",{},D({text:n,marker:!1}));return t.light?G({mount:document.head,children:e}):e}if(n){const o=_(),s=t.light?document:o.H?.shadowRoot??document,r=((t,n,e)=>{if(!K.has(n)){const t=new CSSStyleSheet;t.replaceSync(n),K.set(n,{J:t,K:0})}const o=K.get(n);o.K++,t.has(n)||t.set(n,{J:o.J,K:0});const s=t.get(n);return s.K++,l((()=>()=>{--s.K||(t.delete(n),e()),--o.K||K.delete(n)})),s.J})((e=s,e[J]??=new Map),n,(()=>{s.adoptedStyleSheets=s.adoptedStyleSheets.filter((t=>t!=r))}));s.adoptedStyleSheets.push(r)}var e;return I({})},R=(t,...n)=>{const e=()=>t.reduce(((t,e,o)=>t+e+(d.get(n[o])??"")),"");return n.some((t=>"function"==typeof t))?e:e()},U=(t,n,e)=>(n&&null!=e&&(n.key=e),z(t,n));export{N as Component,F as Else,B as ElseIf,Z as For,I as Fragment,q as If,d as MaybeSignal,G as Portal,Q as Style,b as createContext,z as createElement,R as css,H as defineComponents,M as event,P as h,j as isComponent,U as jsx,U as jsxDEV,U as jsxs,S as prop,i as useBatch,x as useContext,E as useEffect,u as useMemo,a as useRef,c as useSignal,f as useSubscope};
1
+ const t=t=>({t:t,o:[],i:[],l:{...t?.l},u(t){const n=o;o=this;try{return t()}finally{o=n}},h(){for(let t=this.i.length-1;t>=0;t--)this.i[t].h();this.i=[];for(let t=this.o.length-1;t>=0;t--){const n=this.o[t];n._?.(),n.u=()=>{},n.p.forEach((t=>t.o.delete(n))),n.p.clear()}this.o=[]}});let n,e,o=t(),s=!1;const r=()=>o,c=(t,o)=>{const r=()=>(!s&&n&&(n.p.add(r),r.o.add(n)),r.peek());r.o=new Set,r.peek=()=>t;const c=(n,s)=>{if(s={...o,...s},e){const o="function"==typeof n?n(r.peek()):n;(s?.force||o!==r.peek())&&(s?.force&&(t=o),e.m.push([r,()=>t=o,s?.silent]))}else i((()=>c(n,s)))};return[r,c]},i=t=>{const n=!e;n&&(e={m:[],o:new Set});const o=t();return n&&(l(),e=void 0),o};function l(){const t=new Set;for(;e&&(e.m.length>0||e.o.size>0);){const n=e.m.length,o=e.o;e.o=new Set;for(const[t,,n]of e.m)n||t.o.forEach((t=>{t._?.(),o.add(t)}));for(const[n,o]of e.m)o(),t.add(n);e.m=[];for(const s of o)!n||[...s.p].every((n=>t.has(n)))?s.u():e.o.add(s)}}const u=(t,e)=>{const r=!!e,c={v:o,p:new Set,u(){const o=n,c=s;n=this;try{this.p.forEach((t=>t.o.delete(this))),this.p.clear(),e&&(s=!1,e.forEach((t=>t()))),s=r,this._?.();const n=this.v.u((()=>i(t)));this._=n?()=>{this.v.u((()=>i(n))),this._=null}:null}finally{n=o,s=c}}};o.o.push(c),c.u(),c.p.size||c._||o.o.pop()},f=(t,n)=>{const[e,o]=c();let s=!0;return u((()=>{o(t,s?{...n,force:!0}:n),s=!1})),e},a=(n,e)=>{const s=o,r=t(s);Object.assign(r.l,e?.details),s.i.push(r);return[r.u(n),()=>{const t=s.i.indexOf(r);t>=0&&s.i.splice(t,1),r.h()}]},d=(t,n)=>{const[e,o]=c(t,n);return e.set=o,e},h={upgrade:t=>()=>h.get(t),get:t=>"function"==typeof t?t():t,peek(t){const n=s;s=!0;try{return this.get(t)}finally{s=n}}},_=(t={})=>({S:[],M(t){return this.k?.next().value??t()},...t}),p=()=>{const t=r();return t.l.C??=_()},m=(t,n)=>{const e=p(),o=_({...e,...t}),[s,r]=a(n,{details:{C:o}});return u((()=>r)),s},y=t=>(t[0]??"").toLowerCase()+t.slice(1).replace(/[A-Z]/g,(t=>"-"+t.toLowerCase())),w=t=>t.startsWith("on:")?t.slice(3):y(t.slice(2)),b=Symbol(),g=(t,n)=>({[b]:Math.random().toString(36).slice(2),N:t,j:n}),v=t=>!!t?.[b],S=(t,n,e)=>{n.addEventListener(t[b],(t=>{const n=h.get(e);void 0!==n&&(t.stopPropagation(),t.detail(n))}))},x=t=>{const n=p();return f((()=>{let e=t.N;return n.H?.dispatchEvent(new CustomEvent(t[b],{detail:t=>e=t,bubbles:!0,composed:!0})),e}))},M=(t,n)=>({L:"p",T:t,...n}),k=(t=CustomEvent)=>({L:"e",A:t}),C=Symbol();let E;const N=(t,n)=>{E?E.push([t,n]):u(t,n)},j=(t,n={},e={})=>{const o=[],s=new Map;for(const t in n){const e=n[t];if("p"==e.L&&e.attribute){"function"==typeof e.attribute&&(e.attribute={transform:e.attribute});const n=e.attribute={name:y(t),static:!1,transform:t=>t,...e.attribute};s.set(n.name,{name:t,meta:e}),n.static||o.push(n.name)}}e.shadow??={mode:"open"};class i extends HTMLElement{static[C]={O:t};static observedAttributes=o;props={};events={};[C]={};constructor(){super();for(const t in n){const e=n[t];if("p"==e.L){const n=v(e.T)?e.T:null,[o,s]=c(n?void 0:e.T);this.props[t]=o,n&&S(n,this,o),Object.defineProperty(this,t,{get:o.peek,set:t=>s((()=>t),{force:!0})})}else if("e"==e.L&&t.startsWith("on")){const n=w(t);this.events[t]=t=>this.dispatchEvent(new e.A(n,t))}}}connectedCallback(){const t=(n=this,e.shadow?n.shadowRoot??n.attachShadow(e.shadow):n);var n;this[C].D=a((()=>m({I:!1,H:this,k:t.childNodes.values()},(()=>{this[C].v=r();const n=E;E=[];try{t?.append(...this.render().build()),E.forEach((([t,n])=>u(t,n)))}finally{E=n}}))))[1]}disconnectedCallback(){this[C].D?.()}attributeChangedCallback(t,n,e){const o=s.get(t);o&&(this[o.name]=null!=e?o.meta.attribute.transform.call(this,e):v(o.meta.T)?void 0:o.meta.T)}}return i},H=t=>!!t?.[C],L=(...t)=>{const[n,e]="string"==typeof t[0]?[t[0],t.slice(1)]:["",t];for(const t of e)customElements.define(n+t[C].O,t)},T=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,A=(t,n,e)=>{"-"==n[0]?t.style.setProperty(n,""+e):t.style[n]=null==e?"":"number"!=typeof e||T.test(n)?""+e:e+"px"},O=(t,n,e,o)=>{const s=null==e||!1===e&&!n.includes("-");if(n.startsWith("prop:"))t[n.slice(5)]=e;else if(n.startsWith("attr:"))n=n.slice(5),s?t.removeAttribute(n):t.setAttribute(n,e);else if(!["innerHTML","outerHTML"].includes(n)){if(!["tabIndex","role",...o?["width","height","href","list","form","download","rowSpan","colSpan"]:[]].includes(n)&&n in t)try{return void(t[n]=e)}catch(t){}"function"==typeof e||(s?t.removeAttribute(n):t.setAttribute(n,e))}},D=t=>({build(){const n=t();return n.build?.()??n}}),I=({text:t,marker:n})=>D((()=>{const e=p(),o=n&&e.M((()=>document.createComment(""))),s=e.M((()=>document.createTextNode("")));return u((()=>{const n=""+(h.get(t)??"");s.textContent!=n&&(s.textContent=n)})),o?[o,s]:[s]})),$=({children:t})=>D((()=>Array.isArray(t)?t.flatMap((t=>$({children:t}).build())):null==t?[]:"object"==typeof t?t:I({text:t}))),z=(t,n,e,o)=>{const{ref:s,style:c,children:l,dangerouslySetInnerHTML:f,...a}=e;for(const n in c??{}){const e=c[n];u((()=>{A(t,n,h.get(e))}))}for(const n in a){const e=a[n];if(n.startsWith("on")){const o=r(),s=t=>{o.u((()=>i((()=>e(t)))))},c=w(n);u((()=>(t.addEventListener(c,s),()=>t.removeEventListener(c,s))))}else u((()=>{O(t,n,h.get(e),o)}))}return f&&u((()=>{const n=h.get(f).__html;t.innerHTML!=n&&(t.innerHTML=n)})),s&&u((()=>(s.set(t),()=>s.set(void 0)))),null!=e.children&&t.append(...m({I:n,k:t.childNodes.values()},(()=>$({children:e.children}).build()))),t},P=(t,n={},e)=>(null!=e&&(n.children=e),H(t)?((t,n)=>D((()=>{const e=p().M((()=>new t));return customElements.upgrade(e),z(e,!1,n),[e]})))(t,n):"function"==typeof t?D((()=>t(n))):((t,n={})=>D((()=>{const e=p(),o="svg"==t||!!e.I;return[z(e.M((()=>o?document.createElementNS("http://www.w3.org/2000/svg",t):document.createElement(t))),o,n,!0)]})))(t,n)),V=new Proxy(P,{get:(t,n)=>(e,o)=>t(n,e,o)}),Z=(t,n)=>{const[e,o]=c({$:[],P:new Map});let s=new Map;return u((()=>{const e=[],r=s,c=((t,n)=>{const e=new Map;for(let o=0;o<t.length;o++){const s=n(t[o],o);if(e.has(s))throw Error(`Duplicate key '${s}'`);e.set(s,o)}return e})(t(),n),i=(t=NaN)=>e.map((t=>"r"==t.V?n=>n<t.Z?n:n==t.Z?NaN:n-1:"a"==t.V?n=>n<t.Z?n:n+1:"m"==t.V?n=>t.q<=n&&n<t.B?n+1:n==t.B?t.q:n:t=>t)).reduce(((t,n)=>n(t)),t);for(const t of r.keys()){const n=i(r.get(t));c.has(t)||e.push({V:"r",F:t,Z:n})}for(let o=0;o<t().length;o++){const s=n(t()[o],o),c=i(r.get(s));isNaN(c)?e.push({V:"a",F:s,Z:o}):c!=o&&e.push({V:"m",F:s,B:c,q:o})}e.length>0&&o({$:e,P:c}),s=c})),e},q=t=>D((()=>{const n=p(),e=h.upgrade(t.each??[]),o=n.M((()=>document.createComment(""))),s=t.key??((t,n)=>n),r=[o],i=new Map,l=Z(e,s),f=t=>{for(let n=t-1;n>=0;n--){const n=s(e()[t-1],t-1),o=i.get(n)?.G??[];if(o.length>0)return o[o.length-1]}return o};return u((()=>{for(const n of l().$)if("r"==n.V){const{G:t=[],D:e}=i.get(n.F)??{};e?.();const o=r.indexOf(t[0]);o>0&&r.splice(o,t.length),t.forEach((t=>t.parentNode?.removeChild(t))),i.delete(n.F)}else if("a"==n.V){let o=[];const[,s]=a((()=>{const[s,i]=c(n.Z),[a,d]=c(e()[n.Z]);u((()=>{0<=s()&&s()<e().length&&d((()=>e()[s()]))})),u((()=>{const t=l().P.get(n.F);null!=t&&i(t)})),o=t.children?.(a,s,e).build()??[];const h=f(n.Z),_=r.indexOf(h);_>=0&&r.splice(_+1,0,...o),o.forEach((t=>h.parentNode?.insertBefore(t,h.nextSibling)))}));i.set(n.F,{G:o,D:s})}else if("m"==n.V){const{G:t=[]}=i.get(n.F)??{},e=r.indexOf(t[0]);e>=0&&r.splice(e,t.length);const o=f(n.q),s=r.indexOf(o);s>=0&&r.splice(s+1,0,...t),t.forEach((t=>o.parentNode?.insertBefore(t,o.nextSibling)))}}),[l]),r})),B=t=>(p().S=[],F({condition:t.condition,children:t.children})),F=t=>{const n=p(),e=n.S,o=f((()=>e.every((t=>!t()))&&h.get(t.condition)));return n.S=[...e,o],m({S:[]},(()=>D((()=>{const e=n.M((()=>document.createComment(""))),s=[e],r=f((()=>o()?$({children:t.children}):null));let c=[];return u((()=>{c.forEach((t=>t.parentNode?.removeChild(t))),s.length=1;const[,t]=a((()=>{c=r()?.build()??[],e.after(...c),s.push(...c)}));return t}),[r]),s}))))},G=({children:t})=>F({condition:!0,children:t}),J=({mount:t,children:n})=>D((()=>m({k:void 0},(()=>{const e=$({children:n}).build();return u((()=>(e.forEach((n=>t.appendChild(n))),()=>{e.forEach((t=>t.parentNode?.removeChild(t)))}))),[]})))),K=Symbol(),Q=new Map,R=t=>{const n=t.children;if("function"==typeof n){const e=P("style",{},I({text:n,marker:!1}));return t.light?J({mount:document.head,children:e}):e}if(n){const o=p(),s=t.light?document:o.H?.shadowRoot??document,r=((t,n,e)=>{if(!Q.has(n)){const t=new CSSStyleSheet;t.replaceSync(n),Q.set(n,{J:t,K:0})}const o=Q.get(n);o.K++,t.has(n)||t.set(n,{J:o.J,K:0});const s=t.get(n);return s.K++,u((()=>()=>{--s.K||(t.delete(n),e()),--o.K||Q.delete(n)})),s.J})((e=s,e[K]??=new Map),n,(()=>{s.adoptedStyleSheets=s.adoptedStyleSheets.filter((t=>t!=r))}));s.adoptedStyleSheets.push(r)}var e;return $({})},U=(t,...n)=>{const e=()=>t.reduce(((t,e,o)=>t+e+(h.get(n[o])??"")),"");return n.some((t=>"function"==typeof t))?e:e()},W=(t,n,e)=>(n&&null!=e&&(n.key=e),P(t,n));export{j as Component,G as Else,F as ElseIf,q as For,$ as Fragment,B as If,h as MaybeSignal,J as Portal,R as Style,g as createContext,P as createElement,U as css,L as defineComponents,k as event,l as flushBatch,V as h,H as isComponent,W as jsx,W as jsxDEV,W as jsxs,M as prop,i as useBatch,x as useContext,N as useEffect,f as useMemo,d as useRef,c as useSignal,a as useSubscope};
package/dist/dom.js CHANGED
@@ -24,7 +24,6 @@
24
24
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
25
  * SOFTWARE.
26
26
  */
27
- import { isComponent } from "./component.js";
28
27
  const IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
29
28
  export const setStyle = (node, key, value) => {
30
29
  if (key[0] == "-") {
@@ -74,12 +73,7 @@ export const setAttr = (node, name, value, heuristic) => {
74
73
  ].includes(name) &&
75
74
  name in node) {
76
75
  try {
77
- if (isComponent(node)) {
78
- node[name] = value;
79
- }
80
- else {
81
- node[name] = value == null ? "" : value;
82
- }
76
+ node[name] = value;
83
77
  return;
84
78
  }
85
79
  catch (e) { }
package/dist/dom.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,MAAM,kBAAkB,GACtB,mEAAmE,CAAC;AAEtE,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAA2B,EAC3B,GAAQ,EACR,KAAyC,EACnC,EAAE;IACR,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YACb,KAAK,IAAI,IAAI;gBACX,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,OAAO,KAAK,IAAI,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;oBACxD,CAAC,CAAC,GAAG,KAAK,EAAE;oBACZ,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;IACvB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,IAAS,EACT,IAAY,EACZ,KAAc,EACd,SAAmB,EACb,EAAE;IACR,MAAM,eAAe,GACnB,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5D,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC9B,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,IACE,CAAC;YACC,2DAA2D;YAC3D,sBAAsB;YACtB,UAAU;YACV,MAAM;YACN,GAAG,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,OAAO;oBACP,QAAQ;oBACR,MAAM;oBACN,MAAM;oBACN,MAAM;oBACN,UAAU;oBACV,SAAS;oBACT,SAAS;iBACV;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChB,IAAI,IAAI,IAAI,EACZ,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBACnB,OAAO;YACT,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QAChB,CAAC;QAED,6DAA6D;QAC7D,4DAA4D;QAC5D,uDAAuD;QACvD,wDAAwD;QACxD,4DAA4D;QAC5D,qDAAqD;QAErD,IAAI,OAAO,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,gDAAgD;QAClD,CAAC;aAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
package/dist/mod.d.ts CHANGED
@@ -3,6 +3,6 @@ export { type Context, createContext, useContext } from "./context.js";
3
3
  export { createElement, h } from "./create_element.js";
4
4
  export { DangerousHtml, Styles } from "./dom.js";
5
5
  export { type Template } from "./template.js";
6
- export { type Cleanup, MaybeSignal, type SetSignalOptions, type Signal, type SignalLike, type SignalSetter, type SubscopeOptions, type RefSignal, type RefSignalSetter, useBatch, useMemo, useSignal, useRef, useSubscope, } from "./scope.js";
6
+ export { type Cleanup, MaybeSignal, type SetSignalOptions, type Signal, type SignalLike, type SignalSetter, type SubscopeOptions, type RefSignal, type RefSignalSetter, useSubscope, useMemo, useSignal, useRef, useBatch, flushBatch, } from "./scope.js";
7
7
  export * from "./intrinsic/mod.js";
8
8
  export * from "./jsx-runtime/mod.js";
package/dist/mod.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { Component, defineComponents, event, isComponent, prop, useMountEffect as useEffect, } from "./component.js";
2
2
  export { createContext, useContext } from "./context.js";
3
3
  export { createElement, h } from "./create_element.js";
4
- export { MaybeSignal, useBatch, useMemo, useSignal, useRef, useSubscope, } from "./scope.js";
4
+ export { MaybeSignal, useSubscope, useMemo, useSignal, useRef, useBatch, flushBatch, } from "./scope.js";
5
5
  export * from "./intrinsic/mod.js";
6
6
  export * from "./jsx-runtime/mod.js";
7
7
  //# sourceMappingURL=mod.js.map
package/dist/mod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAGT,gBAAgB,EAChB,KAAK,EAGL,WAAW,EAEX,IAAI,EAEJ,cAAc,IAAI,SAAS,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAgB,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAEL,WAAW,EAQX,QAAQ,EACR,OAAO,EACP,SAAS,EACT,MAAM,EACN,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAGT,gBAAgB,EAChB,KAAK,EAGL,WAAW,EAEX,IAAI,EAEJ,cAAc,IAAI,SAAS,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAgB,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAEL,WAAW,EAQX,WAAW,EACX,OAAO,EACP,SAAS,EACT,MAAM,EACN,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
package/dist/scope.d.ts CHANGED
@@ -71,6 +71,7 @@ export declare const useSignal: (<T>(value: T, opts?: SetSignalOptions) => reado
71
71
  * and updated at the same time.
72
72
  */
73
73
  export declare const useBatch: <T>(fn: () => T) => T;
74
+ export declare function flushBatch(): void;
74
75
  /**
75
76
  * Creates an effect which will rerun when any accessed signal changes.
76
77
  *
package/dist/scope.js CHANGED
@@ -61,12 +61,11 @@ export const useSignal = (value, opts) => {
61
61
  if (innerOpts?.force) {
62
62
  value = newValue;
63
63
  }
64
- else {
65
- currBatch._setters.push(() => (value = newValue));
66
- }
67
- if (!innerOpts?.silent) {
68
- signal._effects.forEach((effect) => currBatch._effects.add(effect));
69
- }
64
+ currBatch._setters.push([
65
+ signal,
66
+ () => (value = newValue),
67
+ innerOpts?.silent,
68
+ ]);
70
69
  }
71
70
  }
72
71
  else {
@@ -82,27 +81,50 @@ export const useSignal = (value, opts) => {
82
81
  * and updated at the same time.
83
82
  */
84
83
  export const useBatch = (fn) => {
85
- const prevBatch = currBatch;
86
- currBatch = { _setters: [], _effects: new Set() };
87
- try {
88
- const result = fn();
89
- while (currBatch._setters.length > 0 || currBatch._effects.size > 0) {
90
- // Clean effect subscope
91
- const effects = currBatch._effects;
92
- currBatch._effects = new Set();
93
- effects.forEach((effect) => effect._clean?.());
94
- // Run signal updates
95
- currBatch._setters.forEach((setter) => setter());
96
- currBatch._setters = [];
97
- // Run effects
98
- effects.forEach((effect) => effect._run());
99
- }
100
- return result;
101
- }
102
- finally {
103
- currBatch = prevBatch;
84
+ const createBatch = !currBatch;
85
+ if (createBatch)
86
+ currBatch = { _setters: [], _effects: new Set() };
87
+ const result = fn();
88
+ if (createBatch) {
89
+ flushBatch();
90
+ currBatch = undefined;
104
91
  }
92
+ return result;
105
93
  };
94
+ export function flushBatch() {
95
+ const mutatedSignals = new Set();
96
+ while (currBatch &&
97
+ (currBatch._setters.length > 0 || currBatch._effects.size > 0)) {
98
+ const settersCount = currBatch._setters.length;
99
+ const effects = currBatch._effects;
100
+ currBatch._effects = new Set();
101
+ // Collect and clean effects
102
+ for (const [signal, , silent] of currBatch._setters) {
103
+ if (!silent) {
104
+ signal._effects.forEach((effect) => {
105
+ effect._clean?.();
106
+ effects.add(effect);
107
+ });
108
+ }
109
+ }
110
+ // Run signal updates
111
+ for (const [signal, setter] of currBatch._setters) {
112
+ setter();
113
+ mutatedSignals.add(signal);
114
+ }
115
+ currBatch._setters = [];
116
+ // Run effects
117
+ for (const effect of effects) {
118
+ if (!settersCount ||
119
+ [...effect._deps].every((dep) => mutatedSignals.has(dep))) {
120
+ effect._run();
121
+ }
122
+ else {
123
+ currBatch._effects.add(effect);
124
+ }
125
+ }
126
+ }
127
+ }
106
128
  /**
107
129
  * Creates an effect which will rerun when any accessed signal changes.
108
130
  *
package/dist/scope.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAsEA,MAAM,WAAW,GAAG,CAAC,MAAc,EAAS,EAAE;IAC5C,OAAO;QACL,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE;QAEjC,IAAI,CAAI,EAAW;YACjB,MAAM,SAAS,GAAG,SAAS,CAAC;YAC5B,SAAS,GAAG,IAAI,CAAC;YAEjB,IAAI,CAAC;gBACH,OAAO,EAAE,EAAE,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,SAAS,GAAG,SAAS,CAAC;YACxB,CAAC;QACH,CAAC;QAED,QAAQ;YACN,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAChC,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YAErB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;gBAEvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YAED,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI,SAAS,GAAU,WAAW,EAAE,CAAC;AACrC,IAAI,SAAS,GAAU,SAAS,CAAC;AACjC,IAAI,aAAa,GAAY,KAAK,CAAC;AACnC,IAAI,UAA8B,CAAC;AACnC,IAAI,SASS,CAAC;AAEd,cAAc;AACd,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAqB,EAAE,CAAC,SAAqB,CAAC;AAEtE;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAOkD,CACtE,KAAQ,EACR,IAAuB,EACgB,EAAE;IACzC,MAAM,MAAM,GAAc,GAAG,EAAE;QAC7B,IAAI,CAAC,aAAa,IAAI,UAAU,EAAE,CAAC;YACjC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAC5B,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;IAE1B,MAAM,MAAM,GAAG,CAAC,GAA0B,EAAE,SAA4B,EAAE,EAAE;QAC1E,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;QAEtC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GACZ,OAAO,GAAG,IAAI,UAAU;gBACtB,CAAC,CAAE,GAAuB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACzC,CAAC,CAAC,GAAG,CAAC;YAEV,IAAI,SAAS,EAAE,KAAK,IAAI,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnD,IAAI,SAAS,EAAE,KAAK,EAAE,CAAC;oBACrB,KAAK,GAAG,QAAQ,CAAC;gBACnB,CAAC;gBAED,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACtB,MAAM;oBACN,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC;oBACxB,SAAS,EAAE,MAAM;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,MAAM,EAAE,MAAa,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,EAAW,EAAK,EAAE;IAC5C,MAAM,WAAW,GAAG,CAAC,SAAS,CAAC;IAC/B,IAAI,WAAW;QAAE,SAAS,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAEnE,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC;IAEpB,IAAI,WAAW,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC;QACb,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAmB,CAAC;IAElD,OACE,SAAS;QACT,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAC9D,CAAC;QACD,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC;QACnC,SAAS,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAE/B,4BAA4B;QAE5B,KAAK,MAAM,CAAC,MAAM,EAAE,AAAD,EAAG,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;oBACjC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,qBAAqB;QAErB,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YAClD,MAAM,EAAE,CAAC;YACT,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QAED,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC;QAExB,cAAc;QAEd,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IACE,CAAC,YAAY;gBACb,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACzD,CAAC;gBACD,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,EAAiB,EACjB,IAA4B,EACtB,EAAE;IACR,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC;IAEzB,MAAM,MAAM,GAAW;QACrB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,IAAI,GAAG,EAAE;QAEhB,IAAI;YACF,MAAM,UAAU,GAAG,UAAU,CAAC;YAC9B,MAAM,aAAa,GAAG,aAAa,CAAC;YAEpC,UAAU,GAAG,IAAI,CAAC;YAElB,IAAI,CAAC;gBACH,sCAAsC;gBAEtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAEnB,IAAI,IAAI,EAAE,CAAC;oBACT,+BAA+B;oBAE/B,aAAa,GAAG,KAAK,CAAC;oBACtB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC/B,CAAC;gBAED,aAAa;gBAEb,aAAa,GAAG,SAAS,CAAC;gBAE1B,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAEhB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;gBAErD,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO;oBACpB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,GAAG,EAAE;wBACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;wBAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;oBACrB,CAAC,CAAC;YACR,CAAC;oBAAS,CAAC;gBACT,sBAAsB;gBAEtB,UAAU,GAAG,UAAU,CAAC;gBACxB,aAAa,GAAG,aAAa,CAAC;YAChC,CAAC;QACH,CAAC;KACF,CAAC;IAEF,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,EAAE,CAAC;IAEd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzC,wEAAwE;QACxE,wBAAwB;QAExB,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,EAAW,EAAE,IAAuB,EAAa,EAAE;IAC5E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,SAAS,EAAK,CAAC;IAEvC,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEzD,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,OAAO,IAAiB,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,EAAW,EACX,IAAsB,EACL,EAAE;IACnB,MAAM,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE7C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE9B,OAAO;QACL,MAAM;QACN,GAAG,EAAE;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAsBF;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GACuD,CACxE,KAAS,EACT,IAAuB,EACkB,EAAE;IAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAmC,CAAC,GAAG,GAAG,MAAM,CAAC;IAClD,OAAO,MAAiD,CAAC;AAC3D,CAAC,CAAC;AASF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB;;OAEG;IACH,OAAO,EACL,CAAI,MAAsB,EAAiB,EAAE,CAC7C,GAAG,EAAE,CACH,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;IAE3B;;OAEG;IACH,GAAG,EAAE,CAAI,MAAsB,EAAK,EAAE,CACpC,OAAO,MAAM,IAAI,UAAU,CAAC,CAAC,CAAE,MAAwB,EAAE,CAAC,CAAC,CAAC,MAAM;IAEpE;;OAEG;IACH,IAAI,CAAI,MAAsB;QAC5B,MAAM,aAAa,GAAG,aAAa,CAAC;QACpC,aAAa,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,aAAa,GAAG,aAAa,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sinho",
3
- "version": "0.1.4",
3
+ "version": "0.2.1",
4
4
  "description": "A lightweight signal-based library for building web components with a React-like API.",
5
5
  "keywords": [
6
6
  "ui",
package/src/dom.ts CHANGED
@@ -93,11 +93,7 @@ export const setAttr = (
93
93
  name in node
94
94
  ) {
95
95
  try {
96
- if (isComponent(node)) {
97
- (node as any)[name] = value;
98
- } else {
99
- node[name] = value == null ? "" : value;
100
- }
96
+ node[name] = value;
101
97
  return;
102
98
  } catch (e) {}
103
99
  }
package/src/mod.ts CHANGED
@@ -27,11 +27,12 @@ export {
27
27
  type SubscopeOptions,
28
28
  type RefSignal,
29
29
  type RefSignalSetter,
30
- useBatch,
30
+ useSubscope,
31
31
  useMemo,
32
32
  useSignal,
33
33
  useRef,
34
- useSubscope,
34
+ useBatch,
35
+ flushBatch,
35
36
  } from "./scope.js";
36
37
 
37
38
  export * from "./intrinsic/mod.js";
package/src/scope.ts CHANGED
@@ -96,7 +96,7 @@ const createScope = (parent?: Scope): Scope => {
96
96
  for (let i = this._effects.length - 1; i >= 0; i--) {
97
97
  const effect = this._effects[i];
98
98
  effect._clean?.();
99
- effect._run = () => {}
99
+ effect._run = () => {};
100
100
 
101
101
  effect._deps.forEach((signal) => signal._effects.delete(effect));
102
102
  effect._deps.clear();
@@ -113,7 +113,11 @@ let currUntracked: boolean = false;
113
113
  let currEffect: Effect | undefined;
114
114
  let currBatch:
115
115
  | {
116
- _setters: (() => void)[];
116
+ _setters: [
117
+ signal: Signal<unknown>,
118
+ setter: () => void,
119
+ silent?: boolean,
120
+ ][];
117
121
  _effects: Set<Effect>;
118
122
  }
119
123
  | undefined;
@@ -160,13 +164,13 @@ export const useSignal: (<T>(
160
164
  if (innerOpts?.force || newValue !== signal.peek()) {
161
165
  if (innerOpts?.force) {
162
166
  value = newValue;
163
- } else {
164
- currBatch._setters.push(() => (value = newValue));
165
167
  }
166
168
 
167
- if (!innerOpts?.silent) {
168
- signal._effects.forEach((effect) => currBatch!._effects.add(effect));
169
- }
169
+ currBatch._setters.push([
170
+ signal,
171
+ () => (value = newValue),
172
+ innerOpts?.silent,
173
+ ]);
170
174
  }
171
175
  } else {
172
176
  useBatch(() => setter(arg, innerOpts));
@@ -183,35 +187,64 @@ export const useSignal: (<T>(
183
187
  * and updated at the same time.
184
188
  */
185
189
  export const useBatch = <T>(fn: () => T): T => {
186
- const prevBatch = currBatch;
187
- currBatch = { _setters: [], _effects: new Set() };
190
+ const createBatch = !currBatch;
191
+ if (createBatch) currBatch = { _setters: [], _effects: new Set() };
188
192
 
189
- try {
190
- const result = fn();
193
+ const result = fn();
191
194
 
192
- while (currBatch._setters.length > 0 || currBatch._effects.size > 0) {
193
- // Clean effect subscope
195
+ if (createBatch) {
196
+ flushBatch();
197
+ currBatch = undefined;
198
+ }
194
199
 
195
- const effects = currBatch._effects;
196
- currBatch._effects = new Set();
200
+ return result;
201
+ };
197
202
 
198
- effects.forEach((effect) => effect._clean?.());
203
+ export function flushBatch(): void {
204
+ const mutatedSignals = new Set<Signal<unknown>>();
205
+
206
+ while (
207
+ currBatch &&
208
+ (currBatch._setters.length > 0 || currBatch._effects.size > 0)
209
+ ) {
210
+ const settersCount = currBatch._setters.length;
211
+ const effects = currBatch._effects;
212
+ currBatch._effects = new Set();
213
+
214
+ // Collect and clean effects
215
+
216
+ for (const [signal, , silent] of currBatch._setters) {
217
+ if (!silent) {
218
+ signal._effects.forEach((effect) => {
219
+ effect._clean?.();
220
+ effects.add(effect);
221
+ });
222
+ }
223
+ }
199
224
 
200
- // Run signal updates
225
+ // Run signal updates
201
226
 
202
- currBatch._setters.forEach((setter) => setter());
203
- currBatch._setters = [];
227
+ for (const [signal, setter] of currBatch._setters) {
228
+ setter();
229
+ mutatedSignals.add(signal);
230
+ }
204
231
 
205
- // Run effects
232
+ currBatch._setters = [];
206
233
 
207
- effects.forEach((effect) => effect._run());
208
- }
234
+ // Run effects
209
235
 
210
- return result;
211
- } finally {
212
- currBatch = prevBatch;
236
+ for (const effect of effects) {
237
+ if (
238
+ !settersCount ||
239
+ [...effect._deps].every((dep) => mutatedSignals.has(dep))
240
+ ) {
241
+ effect._run();
242
+ } else {
243
+ currBatch._effects.add(effect);
244
+ }
245
+ }
213
246
  }
214
- };
247
+ }
215
248
 
216
249
  /**
217
250
  * Creates an effect which will rerun when any accessed signal changes.
@@ -1,33 +0,0 @@
1
- import { FunctionalComponent } from "../component.js";
2
- import { MaybeSignal } from "../scope.js";
3
- import { Template } from "../template.js";
4
- /**
5
- * `Dynamic` is a component that can be used to render conditionally.
6
- *
7
- * On every change, it will replace all previously rendered nodes with new ones.
8
- *
9
- * @example
10
- * ```tsx
11
- * const App = () => (
12
- * const [count, setCount] = useSignal(100);
13
- *
14
- * <Dynamic
15
- * render={() =>
16
- * count() === 1 ? (
17
- * <>
18
- * <h3>Details</h3>
19
- * { … }
20
- * </>
21
- * ) : count() > 1 ? (
22
- * <p>Multiple items selected</p>
23
- * ) : (
24
- * <p>No items</p>
25
- * )
26
- * }
27
- * />
28
- * );
29
- * ```
30
- */
31
- export declare const Dynamic: FunctionalComponent<{
32
- render?: MaybeSignal<Template | undefined | void | null>;
33
- }>;
@@ -1,53 +0,0 @@
1
- import { MaybeSignal, useEffect, useMemo, useSubscope } from "../scope.js";
2
- import { useRenderer } from "../renderer.js";
3
- import { createTemplate } from "../template.js";
4
- /**
5
- * `Dynamic` is a component that can be used to render conditionally.
6
- *
7
- * On every change, it will replace all previously rendered nodes with new ones.
8
- *
9
- * @example
10
- * ```tsx
11
- * const App = () => (
12
- * const [count, setCount] = useSignal(100);
13
- *
14
- * <Dynamic
15
- * render={() =>
16
- * count() === 1 ? (
17
- * <>
18
- * <h3>Details</h3>
19
- * { … }
20
- * </>
21
- * ) : count() > 1 ? (
22
- * <p>Multiple items selected</p>
23
- * ) : (
24
- * <p>No items</p>
25
- * )
26
- * }
27
- * />
28
- * );
29
- * ```
30
- */
31
- export const Dynamic = (props) => createTemplate(() => {
32
- const renderer = useRenderer();
33
- const anchor = renderer._node(() => document.createComment(""));
34
- const nodes = [anchor];
35
- const template = useMemo(() => MaybeSignal.get(props.render));
36
- useEffect(() => {
37
- const [subnodes, destroy] = useSubscope(() => {
38
- const subnodes = template()?.build() ?? [];
39
- anchor.after(...subnodes);
40
- nodes.push(...subnodes);
41
- return subnodes;
42
- });
43
- return () => {
44
- destroy();
45
- for (const node of subnodes ?? []) {
46
- node.parentNode?.removeChild(node);
47
- }
48
- nodes.length = 1;
49
- };
50
- }, [template]);
51
- return nodes;
52
- });
53
- //# sourceMappingURL=Dynamic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dynamic.js","sourceRoot":"","sources":["../../src/intrinsic/Dynamic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAY,MAAM,gBAAgB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,OAAO,GAEf,CAAC,KAAK,EAAE,EAAE,CACb,cAAc,CAAC,GAAG,EAAE;IAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,EAAE,CAAC;YAEV,KAAK,MAAM,IAAI,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAED,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC"}
@@ -1,14 +0,0 @@
1
- import { FunctionalComponent } from "../component.js";
2
- import { Children } from "./Fragment.js";
3
- /**
4
- * `ErrorBoundary` is a component that can be used to catch errors in the
5
- * component tree.
6
- */
7
- export declare const ErrorBoundary: FunctionalComponent<{
8
- fallback?: FunctionalComponent<{
9
- error: unknown;
10
- reset: () => void;
11
- }>;
12
- children?: Children;
13
- }>;
14
- export declare const useErrorBoundary: () => readonly [show: (err: unknown) => void, reset: () => void];