closures 0.7.10 → 0.7.11

Sign up to get free protection for your applications and to get access to all the features.
package/dist/closures.cjs CHANGED
@@ -105,8 +105,11 @@ let setDomAttribute = (el, attr, value, isSVG) => {
105
105
  let mountAttributes = (el, props, env) => {
106
106
  for (let key in props) {
107
107
  if (key === 'key' || key === 'children' || key === ON_CREATE_KEY || key in env.directives) continue;
108
- else if (key.startsWith('on'))
109
- el[key.toLowerCase()] = ev => { props[key](ev); !env.manualRedraw && env.rerender(); };
108
+ else if (key.startsWith('on') && isFn(props[key]))
109
+ el[key.toLowerCase()] = ev => {
110
+ props[key](ev);
111
+ !env.manualRedraw && env.rerender();
112
+ };
110
113
  else setDomAttribute(el, key, props[key], env.isSVG);
111
114
  }
112
115
  };
@@ -158,6 +161,19 @@ let unmountDirectives = (el, props, env) => {
158
161
  env.directives[key].unmount(el, props[key]);
159
162
  };
160
163
 
164
+ let setClosure = (vnode, childVnode) => {
165
+ let id = generateClosureId(),
166
+ fnMap = CLOSURE_TO_FN.get(vnode._t) || new Map(),
167
+ onRemove = ON_REMOVES.pop() || noop;
168
+
169
+ fnMap.set(id, childVnode); // save renderFn
170
+ CLOSURE_TO_FN.set(vnode._t, fnMap); // closure -> Map(id -> renderFn)
171
+
172
+ let closure = vnode._t;
173
+ vnode._t = childVnode;
174
+ return [id, closure, onRemove];
175
+ };
176
+
161
177
  let mount = (vnode, env, closureId, closure, onRemove = noop) => {
162
178
  let baseRef = { closureId, closure, onRemove };
163
179
 
@@ -213,15 +229,7 @@ let mount = (vnode, env, closureId, closure, onRemove = noop) => {
213
229
 
214
230
  if (isFn(childVnode)) {
215
231
  // closure component
216
- let id = generateClosureId(),
217
- fnMap = CLOSURE_TO_FN.get(vnode._t) || new Map(),
218
- onRemove = ON_REMOVES.pop() || noop;
219
-
220
- fnMap.set(id, childVnode); // save renderFn
221
- CLOSURE_TO_FN.set(vnode._t, fnMap); // closure -> Map(id -> renderFn)
222
-
223
- let closure = vnode._t;
224
- vnode._t = childVnode;
232
+ let [id, closure, onRemove] = setClosure(vnode, childVnode);
225
233
  return mount(vnode, env, id, closure, onRemove);
226
234
  }
227
235
 
@@ -419,17 +427,30 @@ let patch = (parentDomNode, newVnode, oldVnode, ref, env = { ...DEFAULT_ENV }) =
419
427
  fn,
420
428
  fns = CLOSURE_TO_FN.get(closure);
421
429
 
422
- if (fns && closureId && (fn = fns.get(closureId)))
430
+ // if the newVnode is the same closure component, get the reference to the render function
431
+ // treat the remainder of this clause as if it's a regular render function
432
+ if (newVnode._t === oldVnode._t && fns && closureId && (fn = fns.get(closureId)))
423
433
  x = fn;
424
434
 
425
- let childVnode = x(newVnode.props),
426
- childRef = patch(
427
- parentDomNode,
428
- childVnode,
429
- ref.childState,
430
- ref.childRef,
431
- env
432
- );
435
+ let childVnode = x(newVnode.props);
436
+
437
+ // if the newVnode is a *new* closure component
438
+ if (isFn(childVnode)) {
439
+ // we are patching with a new closure component which should be mounted
440
+ // newVnode._t is mutated by setClosure, and set to childVnode (the closure component's render fn)
441
+ let [_id, _closure] = setClosure(newVnode, childVnode);
442
+ ref.closure = _closure;
443
+ ref.closureId = _id;
444
+ return patch(parentDomNode, newVnode, oldVnode, ref, env);
445
+ }
446
+
447
+ let childRef = patch(
448
+ parentDomNode,
449
+ childVnode,
450
+ ref.childState,
451
+ ref.childRef,
452
+ env
453
+ );
433
454
 
434
455
  // we need to return a new ref in order for parent patches to properly replace changing DOM nodes
435
456
  if (childRef !== ref.childRef)
package/dist/closures.js CHANGED
@@ -105,8 +105,11 @@ let setDomAttribute = (el, attr, value, isSVG) => {
105
105
  let mountAttributes = (el, props, env) => {
106
106
  for (let key in props) {
107
107
  if (key === 'key' || key === 'children' || key === ON_CREATE_KEY || key in env.directives) continue;
108
- else if (key.startsWith('on'))
109
- el[key.toLowerCase()] = ev => { props[key](ev); !env.manualRedraw && env.rerender(); };
108
+ else if (key.startsWith('on') && isFn(props[key]))
109
+ el[key.toLowerCase()] = ev => {
110
+ props[key](ev);
111
+ !env.manualRedraw && env.rerender();
112
+ };
110
113
  else setDomAttribute(el, key, props[key], env.isSVG);
111
114
  }
112
115
  };
@@ -158,6 +161,19 @@ let unmountDirectives = (el, props, env) => {
158
161
  env.directives[key].unmount(el, props[key]);
159
162
  };
160
163
 
164
+ let setClosure = (vnode, childVnode) => {
165
+ let id = generateClosureId(),
166
+ fnMap = CLOSURE_TO_FN.get(vnode._t) || new Map(),
167
+ onRemove = ON_REMOVES.pop() || noop;
168
+
169
+ fnMap.set(id, childVnode); // save renderFn
170
+ CLOSURE_TO_FN.set(vnode._t, fnMap); // closure -> Map(id -> renderFn)
171
+
172
+ let closure = vnode._t;
173
+ vnode._t = childVnode;
174
+ return [id, closure, onRemove];
175
+ };
176
+
161
177
  let mount = (vnode, env, closureId, closure, onRemove = noop) => {
162
178
  let baseRef = { closureId, closure, onRemove };
163
179
 
@@ -213,15 +229,7 @@ let mount = (vnode, env, closureId, closure, onRemove = noop) => {
213
229
 
214
230
  if (isFn(childVnode)) {
215
231
  // closure component
216
- let id = generateClosureId(),
217
- fnMap = CLOSURE_TO_FN.get(vnode._t) || new Map(),
218
- onRemove = ON_REMOVES.pop() || noop;
219
-
220
- fnMap.set(id, childVnode); // save renderFn
221
- CLOSURE_TO_FN.set(vnode._t, fnMap); // closure -> Map(id -> renderFn)
222
-
223
- let closure = vnode._t;
224
- vnode._t = childVnode;
232
+ let [id, closure, onRemove] = setClosure(vnode, childVnode);
225
233
  return mount(vnode, env, id, closure, onRemove);
226
234
  }
227
235
 
@@ -419,17 +427,30 @@ let patch = (parentDomNode, newVnode, oldVnode, ref, env = { ...DEFAULT_ENV }) =
419
427
  fn,
420
428
  fns = CLOSURE_TO_FN.get(closure);
421
429
 
422
- if (fns && closureId && (fn = fns.get(closureId)))
430
+ // if the newVnode is the same closure component, get the reference to the render function
431
+ // treat the remainder of this clause as if it's a regular render function
432
+ if (newVnode._t === oldVnode._t && fns && closureId && (fn = fns.get(closureId)))
423
433
  x = fn;
424
434
 
425
- let childVnode = x(newVnode.props),
426
- childRef = patch(
427
- parentDomNode,
428
- childVnode,
429
- ref.childState,
430
- ref.childRef,
431
- env
432
- );
435
+ let childVnode = x(newVnode.props);
436
+
437
+ // if the newVnode is a *new* closure component
438
+ if (isFn(childVnode)) {
439
+ // we are patching with a new closure component which should be mounted
440
+ // newVnode._t is mutated by setClosure, and set to childVnode (the closure component's render fn)
441
+ let [_id, _closure] = setClosure(newVnode, childVnode);
442
+ ref.closure = _closure;
443
+ ref.closureId = _id;
444
+ return patch(parentDomNode, newVnode, oldVnode, ref, env);
445
+ }
446
+
447
+ let childRef = patch(
448
+ parentDomNode,
449
+ childVnode,
450
+ ref.childState,
451
+ ref.childRef,
452
+ env
453
+ );
433
454
 
434
455
  // we need to return a new ref in order for parent patches to properly replace changing DOM nodes
435
456
  if (childRef !== ref.childRef)
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.closures={})}(this,(function(e){let t=void 0,r=e=>{},n=e=>({mount(t,r=""){t[e]=r},patch(t,r="",n){r!==n&&(t[e]=r)},unmount(r){r[e]=t}}),i={isSVG:!1,redraw:r,directives:{selected:n("selected"),checked:n("checked"),value:n("value"),innerHTML:n("innerHTML")}},o=[],l=[],d=new WeakMap,c=1,s={},f="http://www.w3.org/1999/xlink",h={show:f,actuate:f,href:f},u=e=>null!=e,a=e=>e&&u(e.key),p=(e,r)=>(u(e)?e.key:t)===(u(r)?r.key:t),y=e=>"function"==typeof e,v=e=>"string"==typeof e,w=e=>null!==e&&"object"==typeof e,m=e=>Array.isArray(e),g=e=>JSON.stringify(e),k=e=>!u(e)||!1===e||m(e)&&0===e.length||e&&"="===e._t,R=e=>m(e)&&e.length>0,_=e=>v(e)||"number"==typeof e,S=e=>e&&1===e.vtype,N=e=>e&&2===e.vtype,E=e=>{let t=e.type;if(1===t)return e.node;if(8===t)return E(e.childRef);if(4===t)return E(e.children[0]);throw Error("Unknown ref type "+g(e))},x=e=>{let t=e.type;if(1===t)return e.node.nextSibling;if(8===t)return x(e.childRef);if(4===t)return x(e.children[e.children.length-1]);throw Error("Unknown ref type "+g(e))},V=(e,t,r)=>{let n=t.type;if(1===n)e.insertBefore(t.node,r);else if(8===n)V(e,t.childRef,r);else{if(4!==n)throw Error("Unknown ref type "+g(t));for(let n=0;n<t.children.length;n++)V(e,t.children[n],r)}},b=(e,t)=>{let r=t.type;if(1===r)e.removeChild(t.node);else if(8===r)b(e,t.childRef);else{if(4!==r)throw Error("Unknown ref type "+g(t));for(let r=0;r<t.children.length;r++)b(e,t.children[r])}},A=(e,t,r,n)=>{u(r)||(r=""),!0===r?e.setAttribute(t,""):!1===r?e.removeAttribute(t):n&&h[t]?e.setAttributeNS(h[t],t,r):e.setAttribute(t,r)},G=(e,n,i,o,s=r)=>{let f={closureId:i,closure:o,onRemove:s};if(k(e))return{...f,type:1,node:document.createTextNode("")};if(_(e))return{...f,type:1,node:document.createTextNode(e)};if(S(e)){let r,{_t:i,props:o}=e;"svg"!==i||n.isSVG||(n={...n,isSVG:!0}),r=n.isSVG?document.createElementNS("http://www.w3.org/2000/svg",i):document.createElement(i),y(o.oncreate)&&o.oncreate(r),((e,t,r)=>{for(let n in t)"key"===n||"children"===n||"oncreate"===n||n in r.directives||(n.startsWith("on")?e[n.toLowerCase()]=e=>{t[n](e),!r.manualRedraw&&r.rerender()}:A(e,n,t[n],r.isSVG))})(r,o,n);let l=o.children===t?o.children:G(o.children,n);return l!==t&&V(r,l),((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].mount(e,t[n])})(r,o,n),{...f,type:1,node:r,children:l}}if(R(e)){let t=0,r=[];for(;t<e.length;t++)r.push(G(e[t],n));return{...f,type:4,children:r}}if(N(e)){let t=e._t(e.props);if(y(t)){let i=c++,o=d.get(e._t)||new Map,s=l.pop()||r;o.set(i,t),d.set(e._t,o);let f=e._t;return e._t=t,G(e,n,i,f,s)}return{...f,type:8,childRef:G(t,n),childState:t}}if(e instanceof Node)return{...f,type:1,node:e};if(e===t)throw Error("mount: vnode is undefined");throw Error("mount: Invalid vnode")},C=(e,r,n)=>{if(S(e))((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].unmount(e,t[n])})(r.node,e.props,n),e.props.children!==t&&C(e.props.children,r.children,n);else if(R(e))for(let t=0;t<e.length;t++)C(e[t],r.children[t],n);else if(N(e)){let e=r.closure,t=r.closureId,i=r.onRemove,o=d.get(e);o&&t&&o.get(t)&&(o.delete(t),!o.size&&d.delete(e),i()),C(r.childState,r.childRef,n)}},I=(e,t,r,n,i)=>{let o=L(e,t,r,n,i);return o!==n&&(((e,t,r)=>{V(e,t,E(r)),b(e,r)})(e,o,n),C(r,n,i)),o},L=(e,r,n,o,l={...i})=>{if(r&&"="===r._t)return o;let c,s;if(w(o)&&(c=o.closure,s=o.closureId),N(r)&&N(n)&&(r._t===n._t||c&&s)){let t,n=r._t,i=d.get(c);i&&s&&(t=i.get(s))&&(n=t);let f=n(r.props),h=L(e,f,o.childState,o.childRef,l);return h!==o.childRef?{type:8,childRef:h,childState:f}:(o.childState=f,o)}if(n===r||k(r)&&k(n))return o;if(_(r)&&_(n))return o.node.nodeValue=r,o;if(S(r)&&S(n)&&r._t===n._t){"svg"!==r._t||l.isSVG||(l={...l,isSVG:!0}),((e,r,n,i)=>{let o;for(o in r){if("key"===o||"children"===o||"oncreate"===o||o in i.directives)continue;let t=n[o],l=r[o];t!==l&&(o.startsWith("on")?e[o.toLowerCase()]=e=>{l(e),!i.manualRedraw&&i.rerender()}:A(e,o,l,i.isSVG))}for(o in n)"key"===o||"children"===o||o in r||o in i.directives||(o.startsWith("on")?e[o.toLowerCase()]=t:e.removeAttribute(o))})(o.node,r.props,n.props,l);let e=n.props.children,i=r.props.children;return e===t?i!==t&&(o.children=G(i,l),V(o.node,o.children)):i===t?(o.node.textContent="",C(e,o.children,l),o.children=t):o.children=I(o.node,i,e,o.children,l),((e,t,r,n)=>{let i;for(i in t)i in n.directives&&n.directives[i].patch(e,t[i],r[i]);for(i in r)i in n.directives&&!(i in t)&&n.directives[i].unmount(e,r[i])})(o.node,r.props,n.props,l),o}return R(r)&&R(n)?(((e,r,n,i,o)=>{let l,d,c,s,f,h=x(i),u=Array(r.length),y=i.children,v=0,w=0,m=r.length-1,g=n.length-1;for(;v<=m&&w<=g;){if(y[w]===t){w++;continue}if(y[g]===t){g--;continue}if(l=n[w],d=r[v],p(d,l)){c=y[w],s=u[v]=I(e,d,l,c,o),v++,w++;continue}if(l=n[g],d=r[m],p(d,l)){c=y[g],s=u[m]=I(e,d,l,c,o),m--,g--;continue}if(!f){f={};for(let e=w;e<=g;e++)l=n[e],a(l)&&(f[l.key]=e)}d=r[v];let i=a(d)?f[d.key]:t;i!==t?(l=n[i],c=y[i],s=u[v]=L(e,d,l,c,o),V(e,s,E(y[w])),s!==c&&(b(e,c),C(l,c,o)),y[i]=t):(s=u[v]=G(d,o),V(e,s,E(y[w]))),v++}let k=m<r.length-1?E(u[m+1]):h;for(;v<=m;){let t=G(r[v],o);u[v]=t,V(e,t,k),v++}for(;w<=g;)c=y[w],c!==t&&(b(e,c),C(n[w],c,o)),w++;i.children=u})(e,r,n,o,l),o):r instanceof Node&&n instanceof Node?(o.node=r,o):G(r,l)};function M(e,...r){let n,i=r[0];if(!i||!w(i)||m(i)||i._t||i.props?i=s:r.shift(),i=r.length>1?{...i,children:r}:1===r.length?{...i,children:r[0]}:i,v(e)){if(i.className&&!i.class&&(i.class=i.className,delete i.className),w(i.class)){let e,t="";for(e in i.class)i.class[e]&&(t&&(t+=" "),t+=e);i.class=t}if(~(n=e.indexOf("."))){let t=e.slice(n+1).replace(/\./g," ")+(i.class?" "+i.class:"");t&&(i.class=t),e=e.slice(0,n)}}if(i.key!=i.key)throw new Error("Invalid NaN key");let o=v(e)?1:y(e)?2:t;if(o===t)throw new Error("Invalid VNode type");return{vtype:o,_t:e,key:i.key,props:i}}M.retain=e=>M("=");const T=M;e.Fragment=e=>e.children,e.app=function(e,r,n={}){let l,d={...i,manualRedraw:n.manualRedraw},c=r.$_REF;if(d.directives={...d.directives,...n.directives||{}},c!==t)throw Error("App already mounted on this node");return l=G(e,d),c=r.$_REF={ref:l,vnode:e},r.textContent="",V(r,l,t),o.push(d.rerender=(t=e)=>{c.ref=I(r,t,c.vnode,c.ref,d),c.vnode=t})&&d.rerender},e.h=M,e.m=T,e.onRemove=e=>l.push(e),e.redraw=e=>{for(let e=0;e<o.length;e++)o[e]()}}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.closures={})}(this,(function(e){let t=void 0,r=e=>{},n=e=>({mount(t,r=""){t[e]=r},patch(t,r="",n){r!==n&&(t[e]=r)},unmount(r){r[e]=t}}),i={isSVG:!1,redraw:r,directives:{selected:n("selected"),checked:n("checked"),value:n("value"),innerHTML:n("innerHTML")}},o=[],l=[],d=new WeakMap,c=1,s={},f="http://www.w3.org/1999/xlink",h={show:f,actuate:f,href:f},u=e=>null!=e,a=e=>e&&u(e.key),p=(e,r)=>(u(e)?e.key:t)===(u(r)?r.key:t),y=e=>"function"==typeof e,v=e=>"string"==typeof e,w=e=>null!==e&&"object"==typeof e,m=e=>Array.isArray(e),g=e=>JSON.stringify(e),k=e=>!u(e)||!1===e||m(e)&&0===e.length||e&&"="===e._t,_=e=>m(e)&&e.length>0,R=e=>v(e)||"number"==typeof e,S=e=>e&&1===e.vtype,N=e=>e&&2===e.vtype,E=e=>{let t=e.type;if(1===t)return e.node;if(8===t)return E(e.childRef);if(4===t)return E(e.children[0]);throw Error("Unknown ref type "+g(e))},x=e=>{let t=e.type;if(1===t)return e.node.nextSibling;if(8===t)return x(e.childRef);if(4===t)return x(e.children[e.children.length-1]);throw Error("Unknown ref type "+g(e))},V=(e,t,r)=>{let n=t.type;if(1===n)e.insertBefore(t.node,r);else if(8===n)V(e,t.childRef,r);else{if(4!==n)throw Error("Unknown ref type "+g(t));for(let n=0;n<t.children.length;n++)V(e,t.children[n],r)}},b=(e,t)=>{let r=t.type;if(1===r)e.removeChild(t.node);else if(8===r)b(e,t.childRef);else{if(4!==r)throw Error("Unknown ref type "+g(t));for(let r=0;r<t.children.length;r++)b(e,t.children[r])}},A=(e,t,r,n)=>{u(r)||(r=""),!0===r?e.setAttribute(t,""):!1===r?e.removeAttribute(t):n&&h[t]?e.setAttributeNS(h[t],t,r):e.setAttribute(t,r)},G=(e,t)=>{let n=c++,i=d.get(e._t)||new Map,o=l.pop()||r;i.set(n,t),d.set(e._t,i);let s=e._t;return e._t=t,[n,s,o]},I=(e,n,i,o,l=r)=>{let d={closureId:i,closure:o,onRemove:l};if(k(e))return{...d,type:1,node:document.createTextNode("")};if(R(e))return{...d,type:1,node:document.createTextNode(e)};if(S(e)){let r,{_t:i,props:o}=e;"svg"!==i||n.isSVG||(n={...n,isSVG:!0}),r=n.isSVG?document.createElementNS("http://www.w3.org/2000/svg",i):document.createElement(i),y(o.oncreate)&&o.oncreate(r),((e,t,r)=>{for(let n in t)"key"===n||"children"===n||"oncreate"===n||n in r.directives||(n.startsWith("on")&&y(t[n])?e[n.toLowerCase()]=e=>{t[n](e),!r.manualRedraw&&r.rerender()}:A(e,n,t[n],r.isSVG))})(r,o,n);let l=o.children===t?o.children:I(o.children,n);return l!==t&&V(r,l),((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].mount(e,t[n])})(r,o,n),{...d,type:1,node:r,children:l}}if(_(e)){let t=0,r=[];for(;t<e.length;t++)r.push(I(e[t],n));return{...d,type:4,children:r}}if(N(e)){let t=e._t(e.props);if(y(t)){let[r,i,o]=G(e,t);return I(e,n,r,i,o)}return{...d,type:8,childRef:I(t,n),childState:t}}if(e instanceof Node)return{...d,type:1,node:e};if(e===t)throw Error("mount: vnode is undefined");throw Error("mount: Invalid vnode")},C=(e,r,n)=>{if(S(e))((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].unmount(e,t[n])})(r.node,e.props,n),e.props.children!==t&&C(e.props.children,r.children,n);else if(_(e))for(let t=0;t<e.length;t++)C(e[t],r.children[t],n);else if(N(e)){let e=r.closure,t=r.closureId,i=r.onRemove,o=d.get(e);o&&t&&o.get(t)&&(o.delete(t),!o.size&&d.delete(e),i()),C(r.childState,r.childRef,n)}},L=(e,t,r,n,i)=>{let o=M(e,t,r,n,i);return o!==n&&(((e,t,r)=>{V(e,t,E(r)),b(e,r)})(e,o,n),C(r,n,i)),o},M=(e,r,n,o,l={...i})=>{if(r&&"="===r._t)return o;let c,s;if(w(o)&&(c=o.closure,s=o.closureId),N(r)&&N(n)&&(r._t===n._t||c&&s)){let t,i=r._t,f=d.get(c);r._t===n._t&&f&&s&&(t=f.get(s))&&(i=t);let h=i(r.props);if(y(h)){let[t,i]=G(r,h);return o.closure=i,o.closureId=t,M(e,r,n,o,l)}let u=M(e,h,o.childState,o.childRef,l);return u!==o.childRef?{type:8,childRef:u,childState:h}:(o.childState=h,o)}if(n===r||k(r)&&k(n))return o;if(R(r)&&R(n))return o.node.nodeValue=r,o;if(S(r)&&S(n)&&r._t===n._t){"svg"!==r._t||l.isSVG||(l={...l,isSVG:!0}),((e,r,n,i)=>{let o;for(o in r){if("key"===o||"children"===o||"oncreate"===o||o in i.directives)continue;let t=n[o],l=r[o];t!==l&&(o.startsWith("on")?e[o.toLowerCase()]=e=>{l(e),!i.manualRedraw&&i.rerender()}:A(e,o,l,i.isSVG))}for(o in n)"key"===o||"children"===o||o in r||o in i.directives||(o.startsWith("on")?e[o.toLowerCase()]=t:e.removeAttribute(o))})(o.node,r.props,n.props,l);let e=n.props.children,i=r.props.children;return e===t?i!==t&&(o.children=I(i,l),V(o.node,o.children)):i===t?(o.node.textContent="",C(e,o.children,l),o.children=t):o.children=L(o.node,i,e,o.children,l),((e,t,r,n)=>{let i;for(i in t)i in n.directives&&n.directives[i].patch(e,t[i],r[i]);for(i in r)i in n.directives&&!(i in t)&&n.directives[i].unmount(e,r[i])})(o.node,r.props,n.props,l),o}return _(r)&&_(n)?(((e,r,n,i,o)=>{let l,d,c,s,f,h=x(i),u=Array(r.length),y=i.children,v=0,w=0,m=r.length-1,g=n.length-1;for(;v<=m&&w<=g;){if(y[w]===t){w++;continue}if(y[g]===t){g--;continue}if(l=n[w],d=r[v],p(d,l)){c=y[w],s=u[v]=L(e,d,l,c,o),v++,w++;continue}if(l=n[g],d=r[m],p(d,l)){c=y[g],s=u[m]=L(e,d,l,c,o),m--,g--;continue}if(!f){f={};for(let e=w;e<=g;e++)l=n[e],a(l)&&(f[l.key]=e)}d=r[v];let i=a(d)?f[d.key]:t;i!==t?(l=n[i],c=y[i],s=u[v]=M(e,d,l,c,o),V(e,s,E(y[w])),s!==c&&(b(e,c),C(l,c,o)),y[i]=t):(s=u[v]=I(d,o),V(e,s,E(y[w]))),v++}let k=m<r.length-1?E(u[m+1]):h;for(;v<=m;){let t=I(r[v],o);u[v]=t,V(e,t,k),v++}for(;w<=g;)c=y[w],c!==t&&(b(e,c),C(n[w],c,o)),w++;i.children=u})(e,r,n,o,l),o):r instanceof Node&&n instanceof Node?(o.node=r,o):I(r,l)};function T(e,...r){let n,i=r[0];if(!i||!w(i)||m(i)||i._t||i.props?i=s:r.shift(),i=r.length>1?{...i,children:r}:1===r.length?{...i,children:r[0]}:i,v(e)){if(i.className&&!i.class&&(i.class=i.className,delete i.className),w(i.class)){let e,t="";for(e in i.class)i.class[e]&&(t&&(t+=" "),t+=e);i.class=t}if(~(n=e.indexOf("."))){let t=e.slice(n+1).replace(/\./g," ")+(i.class?" "+i.class:"");t&&(i.class=t),e=e.slice(0,n)}}if(i.key!=i.key)throw new Error("Invalid NaN key");let o=v(e)?1:y(e)?2:t;if(o===t)throw new Error("Invalid VNode type");return{vtype:o,_t:e,key:i.key,props:i}}T.retain=e=>T("=");const U=T;e.Fragment=e=>e.children,e.app=function(e,r,n={}){let l,d={...i,manualRedraw:n.manualRedraw},c=r.$_REF;if(d.directives={...d.directives,...n.directives||{}},c!==t)throw Error("App already mounted on this node");return l=I(e,d),c=r.$_REF={ref:l,vnode:e},r.textContent="",V(r,l,t),o.push(d.rerender=(t=e)=>{c.ref=L(r,t,c.vnode,c.ref,d),c.vnode=t})&&d.rerender},e.h=T,e.m=U,e.onRemove=e=>l.push(e),e.redraw=e=>{for(let e=0;e<o.length;e++)o[e]()}}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "closures",
3
- "version": "0.7.10",
3
+ "version": "0.7.11",
4
4
  "description": "Minimalist virtual dom library",
5
5
  "type": "module",
6
6
  "main": "dist/closures.cjs",