closures 0.7.10 → 0.7.11
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/closures.cjs +41 -20
- package/dist/closures.js +41 -20
- package/dist/closures.min.js +1 -1
- package/package.json +1 -1
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 => {
|
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 =
|
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
|
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
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
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 => {
|
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 =
|
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
|
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
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
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.min.js
CHANGED
@@ -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,
|
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]()}}));
|