Comparing version 0.2.1 to 0.2.2
{ | ||
"name": "snabbdom", | ||
"version": "0.2.1", | ||
"version": "0.2.2", | ||
"description": "A virtual DOM library with focus on simplicity, modularity, powerful features and performance.", | ||
@@ -5,0 +5,0 @@ "main": "snabbdom.js", |
# Snabbdom | ||
[![Join the chat at https://gitter.im/paldepind/snabbdom](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/paldepind/snabbdom?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||
A virtual DOM library with focus on simplicity, modularity, powerful features | ||
@@ -10,2 +9,4 @@ and performance. | ||
[![Join the chat at https://gitter.im/paldepind/snabbdom](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/paldepind/snabbdom?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||
## Table of contents | ||
@@ -67,3 +68,3 @@ | ||
var h = require('snabbdom/h'); // helper function for creating VNodes | ||
var vnode = h('div#id.two.classes', {on: {click: someFn}}, [ | ||
var vnode = h('div#container.two.classes', {on: {click: someFn}}, [ | ||
h('span', {style: {fontWeight: 'bold'}}, 'This is bold'), | ||
@@ -104,4 +105,14 @@ ' and this is just normal text', | ||
element or a vnode representing the current view. The second is a vnode | ||
representing the new view. | ||
representing the new updated view. | ||
If a DOM element with a parent is passed `newVnode` will be turned into a DOM | ||
node and the passed element will be replaced by the created DOM node. If an old | ||
vnode is passed Snabbdom will effeciently modify to match the description in | ||
the new vnode. | ||
Any old vnode passed must be the resulting vnode from a previous call to | ||
`patch`. This is necessary since Snabbdom stores information in the vnode. | ||
This makes it possible to implement a simpler and more performant architecture. | ||
This also avoids the creation of a new old vnode tree. | ||
```javascript | ||
@@ -192,3 +203,3 @@ patch(oldVnode, newVnode); | ||
You can specify properties as being delayed. Whenver these properties change | ||
You can specify properties as being delayed. Whenever these properties change | ||
the change is not applied until after the next frame. | ||
@@ -195,0 +206,0 @@ |
@@ -9,2 +9,3 @@ // jshint newcap: false | ||
function isUndef(s) { return s === undefined; } | ||
function isDef(s) { return s !== undefined; } | ||
@@ -27,3 +28,3 @@ function emptyNodeAt(elm) { | ||
key = children[i].key; | ||
if (!isUndef(key)) map[key] = i; | ||
if (isDef(key)) map[key] = i; | ||
} | ||
@@ -52,8 +53,8 @@ return map; | ||
var i, data = vnode.data; | ||
if (!isUndef(data)) { | ||
if (!isUndef(i = data.hook) && !isUndef(i = i.init)) i(vnode); | ||
if (!isUndef(i = data.vnode)) vnode = i; | ||
if (isDef(data)) { | ||
if (isDef(i = data.hook) && isDef(i = i.init)) i(vnode); | ||
if (isDef(i = data.vnode)) vnode = i; | ||
} | ||
var elm, children = vnode.children, sel = vnode.sel; | ||
if (!isUndef(sel)) { | ||
if (isDef(sel)) { | ||
// Parse selector | ||
@@ -65,4 +66,4 @@ var hashIdx = sel.indexOf('#'); | ||
var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel; | ||
elm = vnode.elm = !isUndef(data) && !isUndef(i = data.ns) ? document.createElementNS(i, tag) | ||
: document.createElement(tag); | ||
elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? document.createElementNS(i, tag) | ||
: document.createElement(tag); | ||
if (hash < dot) elm.id = sel.slice(hash + 1, dot); | ||
@@ -79,3 +80,3 @@ if (dotIdx > 0) elm.className = sel.slice(dot+1).replace(/\./g, ' '); | ||
i = vnode.data.hook; // Reuse variable | ||
if (!isUndef(i)) { | ||
if (isDef(i)) { | ||
if (i.create) i.create(emptyNode, vnode); | ||
@@ -98,6 +99,6 @@ if (i.insert) insertedVnodeQueue.push(vnode); | ||
var i = vnode.data, j; | ||
if (!isUndef(i)) { | ||
if (!isUndef(i = i.hook) && !isUndef(i = i.destroy)) i(vnode); | ||
if (isDef(i)) { | ||
if (isDef(i = i.hook) && isDef(i = i.destroy)) i(vnode); | ||
for (i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode); | ||
if (!isUndef(i = vnode.children)) { | ||
if (isDef(i = vnode.children)) { | ||
for (j = 0; j < vnode.children.length; ++j) { | ||
@@ -113,11 +114,15 @@ invokeDestroyHook(vnode.children[j]); | ||
var i, listeners, rm, ch = vnodes[startIdx]; | ||
if (!isUndef(ch)) { | ||
invokeDestroyHook(ch); | ||
listeners = cbs.remove.length + 1; | ||
rm = createRmCb(parentElm, ch.elm, listeners); | ||
for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm); | ||
if (!isUndef(i = ch.data) && !isUndef(i = i.hook) && !isUndef(i = i.remove)) { | ||
i(ch, rm); | ||
} else { | ||
rm(); | ||
if (isDef(ch)) { | ||
if (isDef(ch.sel)) { | ||
invokeDestroyHook(ch); | ||
listeners = cbs.remove.length + 1; | ||
rm = createRmCb(parentElm, ch.elm, listeners); | ||
for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm); | ||
if (isDef(i = ch.data) && isDef(i = i.hook) && isDef(i = i.remove)) { | ||
i(ch, rm); | ||
} else { | ||
rm(); | ||
} | ||
} else { // Text node | ||
parentElm.removeChild(ch.elm); | ||
} | ||
@@ -186,20 +191,20 @@ } | ||
var i, hook; | ||
if (!isUndef(i = vnode.data) && !isUndef(hook = i.hook) && !isUndef(i = hook.prepatch)) { | ||
if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) { | ||
i(oldVnode, vnode); | ||
} | ||
if (!isUndef(i = oldVnode.data) && !isUndef(i = i.vnode)) oldVnode = i; | ||
if (!isUndef(i = vnode.data) && !isUndef(i = i.vnode)) vnode = i; | ||
if (isDef(i = oldVnode.data) && isDef(i = i.vnode)) oldVnode = i; | ||
if (isDef(i = vnode.data) && isDef(i = i.vnode)) vnode = i; | ||
var elm = vnode.elm = oldVnode.elm, oldCh = oldVnode.children, ch = vnode.children; | ||
if (oldVnode === vnode) return; | ||
if (!isUndef(vnode.data)) { | ||
if (isDef(vnode.data)) { | ||
for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode); | ||
i = vnode.data.hook; | ||
if (!isUndef(i) && !isUndef(i = i.update)) i(oldVnode, vnode); | ||
if (isDef(i) && isDef(i = i.update)) i(oldVnode, vnode); | ||
} | ||
if (isUndef(vnode.text)) { | ||
if (!isUndef(oldCh) && !isUndef(ch)) { | ||
if (isDef(oldCh) && isDef(ch)) { | ||
if (oldCh !== ch) updateChildren(elm, oldCh, ch); | ||
} else if (!isUndef(ch)) { | ||
} else if (isDef(ch)) { | ||
addVnodes(elm, null, ch, 0, ch.length - 1); | ||
} else if (!isUndef(oldCh)) { | ||
} else if (isDef(oldCh)) { | ||
removeVnodes(elm, oldCh, 0, oldCh.length - 1); | ||
@@ -210,3 +215,3 @@ } | ||
} | ||
if (!isUndef(hook) && !isUndef(i = hook.postpatch)) { | ||
if (isDef(hook) && isDef(i = hook.postpatch)) { | ||
i(oldVnode, vnode); | ||
@@ -213,0 +218,0 @@ } |
@@ -695,2 +695,19 @@ var assert = require('assert'); | ||
}); | ||
it('does not invoke `create` and `remove` module hook for text nodes', function() { | ||
var created = 0; | ||
var removed = 0; | ||
var patch = snabbdom.init([ | ||
{create: function() { created++; }}, | ||
{remove: function() { removed++; }}, | ||
]); | ||
var vnode1 = h('div', [ | ||
h('span', 'First child'), | ||
'', | ||
h('span', 'Third child'), | ||
]); | ||
patch(vnode0, vnode1); | ||
patch(vnode1, vnode0); | ||
assert.equal(created, 2); | ||
assert.equal(removed, 2); | ||
}); | ||
it('does not invoke `destroy` module hook for text nodes', function() { | ||
@@ -697,0 +714,0 @@ var created = 0; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
266
8
256950
30
6815