-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from Matt-Esch/correct-vdom-thunk
correct thunk handling logic
- Loading branch information
Showing
5 changed files
with
212 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
var isVNode = require('./is-vnode') | ||
var isVText = require('./is-vtext') | ||
var isWidget = require('./is-widget') | ||
var isThunk = require('./is-thunk') | ||
|
||
module.exports = handleThunk | ||
|
||
function handleThunk(a, b) { | ||
var renderedA = a | ||
var renderedB = b | ||
|
||
if (isThunk(b)) { | ||
renderedB = renderThunk(b, a) | ||
} | ||
|
||
if (isThunk(a)) { | ||
renderedA = renderThunk(a, null) | ||
} | ||
|
||
return { | ||
a: renderedA, | ||
b: renderedB | ||
} | ||
} | ||
|
||
function renderThunk(thunk, previous) { | ||
var renderedThunk = thunk.vnode | ||
|
||
if (!renderedThunk) { | ||
renderedThunk = thunk.vnode = thunk.render(previous) | ||
} | ||
|
||
if (!(isVNode(renderedThunk) || | ||
isVText(renderedThunk) || | ||
isWidget(renderedThunk))) { | ||
throw new Error("thunk did not return a valid node"); | ||
} | ||
|
||
return renderedThunk | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
{ | ||
"name": "vtree", | ||
"version": "0.0.5", | ||
"version": "0.0.13", | ||
"description": "a realtime tree diffing algorithm", | ||
"keywords": [], | ||
"author": "Matt Esch <[email protected]>", | ||
|
@@ -21,7 +21,7 @@ | |
"is-object": "^0.1.2" | ||
}, | ||
"devDependencies": { | ||
"tape": "^2.13.1", | ||
"tape": "^2.13.3", | ||
"virtual-dom": "0.0.10" | ||
}, | ||
"licenses": [ | ||
|
@@ -31,7 +31,9 @@ | |
} | ||
], | ||
"scripts": { | ||
"test": "node ./test/index.js" | ||
"test": "node ./test/index.js", | ||
"cover": "istanbul cover --report none --print detail ./test/index.js", | ||
"view-cover": "istanbul report html && open ./coverage/index.html" | ||
}, | ||
"testling": { | ||
"files": "test/index.js", | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
var test = require("tape") | ||
|
||
var handleThunk = require("../handle-thunk") | ||
var VNode = require("../vnode") | ||
var VText = require("../vtext") | ||
|
||
test("render a new thunk to vnode", function (assert) { | ||
var aNode = { | ||
render: function (previous) { | ||
assert.error("Render should not be called for cached thunk") | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
aNode.vnode = new VNode("div") | ||
|
||
var renderedBNode = new VNode("div") | ||
|
||
var bNode = { | ||
render: function (previous) { | ||
assert.equal(previous, aNode) | ||
return renderedBNode | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
var result = handleThunk(aNode, bNode) | ||
|
||
assert.equal(result.a, aNode.vnode) | ||
assert.equal(result.b, renderedBNode) | ||
assert.equal(bNode.vnode, renderedBNode) | ||
assert.end() | ||
}) | ||
|
||
test("render a new thunk to vtext", function (assert) { | ||
var aNode = { | ||
render: function (previous) { | ||
assert.error("Render should not be called for cached thunk") | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
aNode.vnode = new VNode("div") | ||
|
||
var renderedBNode = new VText("text") | ||
|
||
var bNode = { | ||
render: function (previous) { | ||
assert.equal(previous, aNode) | ||
return renderedBNode | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
var result = handleThunk(aNode, bNode) | ||
|
||
assert.equal(result.a, aNode.vnode) | ||
assert.equal(result.b, renderedBNode) | ||
assert.equal(bNode.vnode, renderedBNode) | ||
assert.end() | ||
}) | ||
|
||
test("render a new thunk to a widget", function (assert) { | ||
var aNode = { | ||
render: function (previous) { | ||
assert.error("Render should not be called for cached thunk") | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
aNode.vnode = new VNode("div") | ||
|
||
var renderedBNode = { type: "Widget" } | ||
|
||
var bNode = { | ||
render: function (previous) { | ||
assert.equal(previous, aNode) | ||
return renderedBNode | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
var result = handleThunk(aNode, bNode) | ||
|
||
assert.equal(result.a, aNode.vnode) | ||
assert.equal(result.b, renderedBNode) | ||
assert.equal(bNode.vnode, renderedBNode) | ||
assert.end() | ||
}) | ||
|
||
test("render current thunk to a thunk throws exception", function (assert) { | ||
var aNode = { | ||
render: function (previous) { | ||
assert.error("Render should not be called for cached thunk") | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
aNode.vnode = new VNode("div") | ||
|
||
var bNode = { | ||
render: function (previous) { | ||
assert.equal(previous, aNode) | ||
return { type: "Thunk" } | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
var result | ||
|
||
try { | ||
handleThunk(aNode, bNode) | ||
} catch (e) { | ||
result = e | ||
} | ||
|
||
assert.equal(result.message, "thunk did not return a valid node") | ||
assert.end() | ||
}) | ||
|
||
test("render previous thunk to a thunk throws exception", function (assert) { | ||
var aNode = { | ||
render: function (previous) { | ||
assert.equal(previous, null) | ||
return { type: "Thunk" } | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
var renderedBNode = new VNode("div") | ||
|
||
var bNode = { | ||
render: function (previous) { | ||
assert.equal(previous, aNode) | ||
return renderedBNode | ||
}, | ||
type: "Thunk" | ||
} | ||
|
||
var result | ||
|
||
try { | ||
handleThunk(aNode, bNode) | ||
} catch (e) { | ||
result = e | ||
} | ||
|
||
assert.equal(result.message, "thunk did not return a valid node") | ||
assert.end() | ||
}) | ||
|
||
test("normal nodes are returned", function (assert) { | ||
var aNode = new VNode('div') | ||
var bNode = new VNode('div') | ||
|
||
var result = handleThunk(aNode, bNode) | ||
|
||
assert.equal(result.a, aNode) | ||
assert.equal(result.b, bNode) | ||
assert.end() | ||
}) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
require("virtual-dom/test") | ||
require('./handle-thunk.js') |