From aaa321be29b7a65d187c571971df25c4792a8cf7 Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Thu, 1 Dec 2016 12:14:52 +1100 Subject: [PATCH 01/14] refactor: Remove out of sync version file. Remove unnecessary gulp file. --- gulpfile.js | 1 - src/index.js | 4 +--- src/version.js | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 gulpfile.js delete mode 100644 src/version.js diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 1855af6..0000000 --- a/gulpfile.js +++ /dev/null @@ -1 +0,0 @@ -require('skatejs-build'); diff --git a/src/index.js b/src/index.js index 4dee665..873a00f 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,6 @@ import patch from './patch'; import render from './render'; import * as types from './types'; import vdom from './vdom'; -import version from './version'; export default { diff, @@ -12,6 +11,5 @@ export default { patch, render, types, - vdom, - version + vdom }; diff --git a/src/version.js b/src/version.js deleted file mode 100644 index 71feb90..0000000 --- a/src/version.js +++ /dev/null @@ -1 +0,0 @@ -export default '0.3.1'; From 3e36a5ee686f951a465c4fdf458cabaca78d5ced Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Thu, 1 Dec 2016 15:23:27 +1100 Subject: [PATCH 02/14] feat: Add experimental web worker support. Implements #113 --- package.json | 3 +- src/diff-main.js | 75 +++++++++++++++ src/diff-worker.js | 6 ++ src/diff.js | 81 +++------------- src/util/real-node-map.js | 13 ++- src/util/real-node.js | 5 +- src/vdom/dom.js | 2 +- src/vdom/element.js | 2 + test/unit.js | 19 ++++ yarn.lock | 192 ++++++++++++++++++++++++++++++++------ 10 files changed, 291 insertions(+), 107 deletions(-) create mode 100644 src/diff-main.js create mode 100644 src/diff-worker.js diff --git a/package.json b/package.json index 9ffe7ce..35b047a 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "custom-event-polyfill": "^0.2.1", "cz-conventional-changelog": "^1.2.0", "semantic-release": "^6.3.2", - "skatejs-build": "^12.1.0" + "skatejs-build": "^12.1.0", + "worker-loader": "^0.7.1" }, "scripts": { "build": "sk-build", diff --git a/src/diff-main.js b/src/diff-main.js new file mode 100644 index 0000000..1176f60 --- /dev/null +++ b/src/diff-main.js @@ -0,0 +1,75 @@ +import * as types from './types'; +import compareNode from './compare/node'; +import realNode from './util/real-node'; +import realNodeMap from './util/real-node-map'; + +function diffNode (source, destination) { + let nodeInstructions = compareNode(source, destination); + + // If there are instructions (even an empty array) it means the node can be + // diffed and doesn't have to be replaced. If the instructions are falsy + // it means that the nodes are not similar (cannot be changed) and must be + // replaced instead. + if (nodeInstructions) { + return nodeInstructions.concat(diff({ source, destination })); + } + + return [{ + destination, + source, + type: types.REPLACE_CHILD + }]; +} + +export default function diff (opts) { + const src = opts.source; + const dst = opts.destination; + + if (!src || !dst) { + return []; + } + + let instructions = opts.root ? diffNode(src, dst) : []; + + const srcChs = src.childNodes; + const dstChs = dst.childNodes; + const srcChsLen = srcChs ? srcChs.length : 0; + const dstChsLen = dstChs ? dstChs.length : 0; + + for (let a = 0; a < dstChsLen; a++) { + const curSrc = srcChs[a]; + const curDst = dstChs[a]; + + // If there is no matching destination node it means we need to remove the + // current source node from the source. + if (!curSrc) { + instructions.push({ + destination: dstChs[a], + source: src, + type: types.APPEND_CHILD + }); + continue; + } else { + // Ensure the real node is carried over even if the destination isn't used. + // This is used in the render() function to keep track of the real node + // that corresponds to a virtual node if a virtual tree is being used. + if (typeof curDst.__id === 'undefined') { + realNodeMap.set(curDst.__id, realNode(curSrc)); + } + } + + instructions = instructions.concat(diffNode(curSrc, curDst)); + } + + if (dstChsLen < srcChsLen) { + for (let a = dstChsLen; a < srcChsLen; a++) { + instructions.push({ + destination: srcChs[a], + source: src, + type: types.REMOVE_CHILD + }); + } + } + + return instructions; +} diff --git a/src/diff-worker.js b/src/diff-worker.js new file mode 100644 index 0000000..8338c61 --- /dev/null +++ b/src/diff-worker.js @@ -0,0 +1,6 @@ +import diff from './diff-main'; + +self.addEventListener('message', e => { + const instructions = diff(e.data); + self.postMessage(instructions); +}); diff --git a/src/diff.js b/src/diff.js index c234e37..3283907 100644 --- a/src/diff.js +++ b/src/diff.js @@ -1,77 +1,18 @@ -import * as types from './types'; -import compareNode from './compare/node'; -import realNode from './util/real-node'; -import realNodeMap from './util/real-node-map'; +import diffMain from './diff-main'; +import DiffWorker from 'worker-loader!./diff-worker'; const { Node } = window; -function diffNode (source, destination) { - let nodeInstructions = compareNode(source, destination); - - // If there are instructions (even an empty array) it means the node can be - // diffed and doesn't have to be replaced. If the instructions are falsy - // it means that the nodes are not similar (cannot be changed) and must be - // replaced instead. - if (nodeInstructions) { - return nodeInstructions.concat(diff({ source, destination })); - } - - return [{ - destination, - source, - type: types.REPLACE_CHILD - }]; +function diffWorker (opts) { + const worker = new DiffWorker(); + const { done } = opts; + worker.addEventListener('message', e => done(e.data)); + delete opts.done; + worker.postMessage(opts); } export default function diff (opts = {}) { - const src = opts.source; - const dst = opts.destination; - - if (!src || !dst) { - return []; - } - - let instructions = opts.root ? diffNode(src, dst) : []; - - const srcChs = src.childNodes; - const dstChs = dst.childNodes; - const srcChsLen = srcChs ? srcChs.length : 0; - const dstChsLen = dstChs ? dstChs.length : 0; - - for (let a = 0; a < dstChsLen; a++) { - const curSrc = srcChs[a]; - const curDst = dstChs[a]; - - // If there is no matching destination node it means we need to remove the - // current source node from the source. - if (!curSrc) { - instructions.push({ - destination: dstChs[a], - source: src, - type: types.APPEND_CHILD - }); - continue; - } else { - // Ensure the real node is carried over even if the destination isn't used. - // This is used in the render() function to keep track of the real node - // that corresponds to a virtual node if a virtual tree is being used. - if (!(curDst instanceof Node)) { - realNodeMap.set(curDst, realNode(curSrc)); - } - } - - instructions = instructions.concat(diffNode(curSrc, curDst)); - } - - if (dstChsLen < srcChsLen) { - for (let a = dstChsLen; a < srcChsLen; a++) { - instructions.push({ - destination: srcChs[a], - source: src, - type: types.REMOVE_CHILD - }); - } - } - - return instructions; + const { source, destination, done } = opts; + const canDiffInWorker = done && !(source instanceof Node && destination instanceof Node); + return canDiffInWorker ? diffWorker(opts) : diffMain(opts); } diff --git a/src/util/real-node-map.js b/src/util/real-node-map.js index 306e641..fc2e800 100644 --- a/src/util/real-node-map.js +++ b/src/util/real-node-map.js @@ -1,2 +1,11 @@ -import WeakMap from './weak-map'; -export default new WeakMap(); +// import WeakMap from './weak-map'; +// export default new WeakMap(); +const map = []; +export default { + get (id) { + return map[id]; + }, + set (id, node) { + map[id] = node; + } +}; diff --git a/src/util/real-node.js b/src/util/real-node.js index 1786077..c583978 100644 --- a/src/util/real-node.js +++ b/src/util/real-node.js @@ -1,7 +1,8 @@ import realNodeMap from './real-node-map'; -const { Node } = window; +const isWindow = typeof window !== 'undefined'; +const { Node } = isWindow ? window : self; export default function (node) { - return node instanceof Node ? node : realNodeMap.get(node); + return isWindow && node instanceof Node ? node : realNodeMap.get(node.__id); } diff --git a/src/vdom/dom.js b/src/vdom/dom.js index cc74923..cc6a8b4 100644 --- a/src/vdom/dom.js +++ b/src/vdom/dom.js @@ -56,6 +56,6 @@ export default function render (el) { return frag; } const realNode = el.tagName ? createElement(el) : createText(el); - realNodeMap.set(el, realNode); + realNodeMap.set(el.__id, realNode); return realNode; } diff --git a/src/vdom/element.js b/src/vdom/element.js index 5dcb1a2..90c6df5 100644 --- a/src/vdom/element.js +++ b/src/vdom/element.js @@ -66,10 +66,12 @@ function translateFromReact (item) { return item; } +let count = 0; export default function element (name, attrs = {}, ...chren) { const isAttrsNode = isChildren(attrs); const data = separateData(isAttrsNode ? {} : attrs); const node = data.node; + node.__id = ++count; node.nodeType = 1; node.tagName = ensureTagName(name); node.attributes = data.attrs; diff --git a/test/unit.js b/test/unit.js index b27f5a9..9e25b18 100644 --- a/test/unit.js +++ b/test/unit.js @@ -465,3 +465,22 @@ describe('render', function () { }); }); }); + +describe('diff worker', function () { + it('should do work in a worker if opts.done is specified', done => { + const source = sd.vdom.element('div', null, 'text 1'); + const destination = sd.vdom.element('div', null, 'text 2'); + const realDom = sd.vdom.dom(source); + + sd.diff({ + destination, + source, + done (instructions) { + assert.ok(Array.isArray(instructions)); + sd.patch(instructions); + assert.ok(realDom.textContent === 'text 2'); + done(); + } + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index bee8969..87a9e70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,5 +1,9 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 +"@bahmutov/parse-github-repo-url@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@bahmutov/parse-github-repo-url/-/parse-github-repo-url-0.1.2.tgz#6311dfbe7fe00ac464b9069d0e2684a739aeb69b" + "@semantic-release/commit-analyzer@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-2.0.0.tgz#924d1e2c30167c6a472bed9f66ee8f8e077489b2" @@ -13,6 +17,14 @@ "@semantic-release/error" "^1.0.0" semver "^5.0.3" +"@semantic-release/condition-travis@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@semantic-release/condition-travis/-/condition-travis-5.0.2.tgz#f4bb777a6c6db5565d70754a9b629233bd4a6597" + dependencies: + "@semantic-release/error" "^1.0.0" + semver "^5.0.3" + travis-deploy-once "1.0.0-node-0.10-support" + "@semantic-release/error@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-1.0.0.tgz#bb8f8eeedd5c7f8c46f96b37ef39e1b8c376c1cc" @@ -118,14 +130,14 @@ ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" -ansi-regex@*, ansi-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" - ansi-regex@^1.0.0, ansi-regex@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + ansi-styles@^2.0.1, ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -317,6 +329,12 @@ async@^2.0.0: dependencies: lodash "^4.14.0" +async@^2.0.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + dependencies: + lodash "^4.14.0" + async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -775,6 +793,14 @@ babel-plugin-transform-strict-mode@^6.18.0: babel-runtime "^6.0.0" babel-types "^6.18.0" +babel-polyfill@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" + dependencies: + babel-runtime "^6.9.1" + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + babel-preset-es2015-rollup@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/babel-preset-es2015-rollup/-/babel-preset-es2015-rollup-1.2.0.tgz#feedf80346e01fa22d4de15e72cde1cefc59bf67" @@ -995,7 +1021,7 @@ bluebird@^2.10.2, bluebird@^2.9.30: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" -bluebird@^3.0.5, bluebird@^3.3.0: +bluebird@^3.0.5, bluebird@^3.3.0, bluebird@^3.4.1, bluebird@^3.4.6: version "3.4.6" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" @@ -1609,7 +1635,7 @@ custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" -cz-conventional-changelog@1.2.0: +cz-conventional-changelog@^1.2.0, cz-conventional-changelog@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-1.2.0.tgz#2bca04964c8919b23f3fd6a89ef5e6008b31b3f8" dependencies: @@ -1663,7 +1689,7 @@ debug@~2.2.0, debug@2.2.0: dependencies: ms "0.7.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -2473,6 +2499,14 @@ form-data@~0.2.0: combined-stream "~0.0.4" mime-types "~2.0.3" +form-data@~1.0.0-rc4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" + dependencies: + async "^2.0.1" + combined-stream "^1.0.5" + mime-types "^2.1.11" + form-data@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" @@ -2668,6 +2702,10 @@ github@^0.2.4: dependencies: mime "^1.2.11" +github@~0.1.10: + version "0.1.16" + resolved "https://registry.yarnpkg.com/github/-/github-0.1.16.tgz#895d2a85b0feb7980d89ac0ce4f44dcaa03f17b5" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -2941,7 +2979,7 @@ image-size@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.0.tgz#be7aed1c37b5ac3d9ba1d66a24b4c47ff8397651" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3513,7 +3551,7 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-utils@^0.2.11, loader-utils@^0.2.5, loader-utils@^0.2.7, loader-utils@~0.2.2: +loader-utils@^0.2.11, loader-utils@^0.2.5, loader-utils@^0.2.7, loader-utils@~0.2.2, loader-utils@0.2.x: version "0.2.16" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" dependencies: @@ -3541,10 +3579,6 @@ lodash._basecreate@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -3552,14 +3586,10 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*, lodash._bindcallback@^3.0.0: +lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - lodash._createassigner@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" @@ -3568,12 +3598,6 @@ lodash._createassigner@^3.0.0: lodash._isiterateecall "^3.0.0" lodash.restparam "^3.0.0" -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" - lodash._createcompounder@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz#5dd2cb55372d6e70e0e2392fb2304d6631091075" @@ -3585,7 +3609,7 @@ lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" -lodash._getnative@*, lodash._getnative@^3.0.0: +lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" @@ -3669,7 +3693,7 @@ lodash.pickby@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" -lodash.restparam@*, lodash.restparam@^3.0.0: +lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -3695,10 +3719,14 @@ lodash@^3.3.1, lodash@^3.6.0, lodash@^3.8.0, lodash@^3.9.3, lodash@3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.16.2, lodash@^4.16.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.2, lodash@^4.16.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" +lodash@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.3.1.tgz#a4663b53686b895ff074e2ba504dfb76a8e2b770" + lodash@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.2.0.tgz#4bf50a3243f9aeb0bac41a55d3d5990675a462fb" @@ -5036,7 +5064,7 @@ readable-stream@~2.1.4, readable-stream@~2.1.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: @@ -5156,7 +5184,21 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.64.0, request@^2.74.0, request@^2.75.0, request@2: +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.1.1.tgz#26021e4f6f56fd4c309f6bf1ebd8c97a95ac1fb5" + dependencies: + bluebird "^3.4.1" + request-promise-core "1.1.1" + stealthy-require "^1.0.0" + +request@^2.64.0, request@^2.74.0, request@^2.75.0, request@^2.78.0, request@2: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -5204,6 +5246,32 @@ request@~2.55.0: tough-cookie ">=0.12.0" tunnel-agent "~0.4.0" +request@~2.74.0: + version "2.74.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc4" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + request@~2.75.0, request@2.75.0: version "2.75.0" resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" @@ -5403,11 +5471,17 @@ run-auto@^1.1.2: dependencies: dezalgo "^1.0.1" +run-auto@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/run-auto/-/run-auto-2.0.0.tgz#5f4353f58adbd6b74926489b4f259e1dad6a78d6" + dependencies: + dezalgo "^1.0.1" + run-parallel@^1.1.2: version "1.1.6" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" -run-series@^1.1.2: +run-series@^1.1.2, run-series@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.4.tgz#89a73ddc5e75c9ef8ab6320c0a1600d6a41179b9" @@ -5492,6 +5566,29 @@ semantic-release@^4.3.5: run-series "^1.1.2" semver "^5.0.1" +semantic-release@^6.3.2: + version "6.3.4" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-6.3.4.tgz#3de1032406f4bf30794ae87beadb3c53cc2e3cb2" + dependencies: + "@bahmutov/parse-github-repo-url" "^0.1.0" + "@semantic-release/commit-analyzer" "^2.0.0" + "@semantic-release/condition-travis" "^5.0.2" + "@semantic-release/error" "^1.0.0" + "@semantic-release/last-release-npm" "^1.2.1" + "@semantic-release/release-notes-generator" "^2.0.0" + git-head "^1.2.1" + github "^0.2.4" + lodash "^4.0.0" + nerf-dart "^1.0.0" + nopt "^3.0.3" + normalize-package-data "^2.3.4" + npmconf "^2.1.2" + npmlog "^4.0.0" + require-relative "^0.8.7" + run-auto "^2.0.0" + run-series "^1.1.3" + semver "^5.0.3" + semi@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/semi/-/semi-4.0.5.tgz#4b995c0c16639238f6ae298c840582a8bf0511ee" @@ -5887,6 +5984,10 @@ stdin@*, stdin@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/stdin/-/stdin-0.0.1.tgz#d3041981aaec3dfdbc77a1b38d6372e38f5fb71e" +stealthy-require@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.0.0.tgz#1a8ed8fc19a8b56268f76f5a1a3e3832b0c26200" + stream-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-1.0.0.tgz#bf9b4abfb42b274d751479e44e0ff2656b6f1193" @@ -6109,6 +6210,25 @@ tough-cookie@>=0.12.0, tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" +travis-ci@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/travis-ci/-/travis-ci-2.1.1.tgz#98696265af827ae3576f31aa06d876e74b4b082e" + dependencies: + github "~0.1.10" + lodash "~1.3.1" + request "~2.74.0" + underscore.string "~2.2.0rc" + +travis-deploy-once@1.0.0-node-0.10-support: + version "1.0.0-node-0.10-support" + resolved "https://registry.yarnpkg.com/travis-deploy-once/-/travis-deploy-once-1.0.0-node-0.10-support.tgz#98ecce7d95b2f4ba5dcdeeebf54b9df87713d5e6" + dependencies: + babel-polyfill "^6.16.0" + bluebird "^3.4.6" + request "^2.78.0" + request-promise "^4.1.1" + travis-ci "^2.1.1" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -6183,6 +6303,10 @@ umask@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" +underscore.string@~2.2.0rc: + version "2.2.1" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.2.1.tgz#d7c0fa2af5d5a1a67f4253daee98132e733f0f19" + underscore.string@~3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.0.3.tgz#4617b8c1a250cf6e5064fbbb363d0fa96cf14552" @@ -6291,7 +6415,7 @@ uuid@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" -validate-npm-package-license@*, validate-npm-package-license@^3.0.1: +validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" dependencies: @@ -6480,6 +6604,12 @@ wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +worker-loader: + version "0.7.1" + resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-0.7.1.tgz#91ffd2e2fbf76921a43e8ca3766d12e9537f5d70" + dependencies: + loader-utils "0.2.x" + wrappy@~1.0.2, wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From 5e88c1e52d80f7b4c5976343b25469785bba14ed Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Thu, 1 Dec 2016 15:30:50 +1100 Subject: [PATCH 03/14] refactor: Fix bad equality check. --- src/diff-main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diff-main.js b/src/diff-main.js index 1176f60..8562f52 100644 --- a/src/diff-main.js +++ b/src/diff-main.js @@ -53,7 +53,7 @@ export default function diff (opts) { // Ensure the real node is carried over even if the destination isn't used. // This is used in the render() function to keep track of the real node // that corresponds to a virtual node if a virtual tree is being used. - if (typeof curDst.__id === 'undefined') { + if (typeof curDst.__id !== 'undefined') { realNodeMap.set(curDst.__id, realNode(curSrc)); } } From d46282fd811d6c15b14f68373294dbc2695349f7 Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Thu, 1 Dec 2016 15:34:06 +1100 Subject: [PATCH 04/14] refactor: let -> const --- src/compare/attributes.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compare/attributes.js b/src/compare/attributes.js index 394dae6..fd11811 100644 --- a/src/compare/attributes.js +++ b/src/compare/attributes.js @@ -2,11 +2,11 @@ import * as types from '../types'; import { getAccessor } from '../util/accessor'; export default function (src, dst) { - let srcAttrs = src.attributes; - let dstAttrs = dst.attributes; - let srcAttrsLen = (srcAttrs || 0) && srcAttrs.length; - let dstAttrsLen = (dstAttrs || 0) && dstAttrs.length; - let instructions = []; + const srcAttrs = src.attributes; + const dstAttrs = dst.attributes; + const srcAttrsLen = (srcAttrs || 0) && srcAttrs.length; + const dstAttrsLen = (dstAttrs || 0) && dstAttrs.length; + const instructions = []; // Bail early if possible. if (!srcAttrsLen && !dstAttrsLen) { From ff5dba06928558ea03d678fc68ef2aa0abc8fc1f Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Thu, 1 Dec 2016 16:40:32 +1100 Subject: [PATCH 05/14] refactor: Update merge() and render() to accept a done callback. --- src/merge.js | 19 +++++++++++++++---- src/render.js | 8 ++++++-- test/unit.js | 40 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/merge.js b/src/merge.js index ae837fb..05e4b02 100644 --- a/src/merge.js +++ b/src/merge.js @@ -1,8 +1,19 @@ import diff from './diff'; import patch from './patch'; -export default function (opts) { - var inst = diff(opts); - patch(inst); - return inst; +export default function (opts = {}) { + const { source, destination, done } = opts; + if (done) { + return diff({ + source, + destination, + done (instructions) { + patch(instructions); + done(instructions); + } + }); + } + const instructions = diff(opts); + patch(instructions); + return instructions; } diff --git a/src/render.js b/src/render.js index dccf523..2d3ffcf 100644 --- a/src/render.js +++ b/src/render.js @@ -7,7 +7,7 @@ const { Node } = window; const oldTreeMap = new WeakMap(); export default function (render) { - return function (elem) { + return function (elem, done) { elem = elem instanceof Node ? elem : this; if (!(elem instanceof Node)) { @@ -21,10 +21,14 @@ export default function (render) { if (oldTree) { merge({ destination: newTree, - source: oldTree + source: oldTree, + done }); } else { mount(elem, newTree.childNodes); + if (typeof done === 'function') { + done(); + } } oldTreeMap.set(elem, newTree); diff --git a/test/unit.js b/test/unit.js index 9e25b18..0d2d6b6 100644 --- a/test/unit.js +++ b/test/unit.js @@ -466,8 +466,8 @@ describe('render', function () { }); }); -describe('diff worker', function () { - it('should do work in a worker if opts.done is specified', done => { +describe('worker', function () { + it('diff', done => { const source = sd.vdom.element('div', null, 'text 1'); const destination = sd.vdom.element('div', null, 'text 2'); const realDom = sd.vdom.dom(source); @@ -483,4 +483,40 @@ describe('diff worker', function () { } }); }); + + it('merge', done => { + const source = sd.vdom.element('div', null, 'test 1'); + const destination = sd.vdom.element('div', null, 'test 2'); + const realDom = sd.vdom.dom(source); + + sd.merge({ + destination, + source, + done () { + assert.ok(realDom.textContent === 'test 2'); + done(); + } + }); + }); + + it('render', done => { + const root = document.createElement('div'); + const render = sd.render(function (root) { + return sd.vdom.element('div', null, root.test); + }); + let wasSyncRendered = false; + + root.test = 'test 1'; + render(root, () => { + assert.ok(root.textContent === 'test 1', 'not updated to test 1'); + wasSyncRendered = true; + }); + + root.test = 'test 2'; + render(root, () => { + assert.ok(wasSyncRendered, 'initial sync render callback'); + assert.ok(root.textContent === 'test 2', 'not updated to test 2'); + done(); + }); + }); }); From d80c6aa523e8d57229ea70bde6a79ffa55f15846 Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Thu, 1 Dec 2016 16:50:08 +1100 Subject: [PATCH 06/14] refactor(test): Refactor assertion for async renders. --- test/unit.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/test/unit.js b/test/unit.js index 0d2d6b6..371f908 100644 --- a/test/unit.js +++ b/test/unit.js @@ -504,19 +504,15 @@ describe('worker', function () { const render = sd.render(function (root) { return sd.vdom.element('div', null, root.test); }); - let wasSyncRendered = false; root.test = 'test 1'; render(root, () => { assert.ok(root.textContent === 'test 1', 'not updated to test 1'); - wasSyncRendered = true; - }); - - root.test = 'test 2'; - render(root, () => { - assert.ok(wasSyncRendered, 'initial sync render callback'); - assert.ok(root.textContent === 'test 2', 'not updated to test 2'); - done(); + root.test = 'test 2'; + render(root, () => { + assert.ok(root.textContent === 'test 2', 'not updated to test 2'); + done(); + }); }); }); }); From 166fe0b84da0c47b8987b1d8caff84d67f0b630d Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Thu, 1 Dec 2016 17:02:25 +1100 Subject: [PATCH 07/14] docs: Update docs for web workers. --- README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/README.md b/README.md index 7dfa773..d2d374b 100644 --- a/README.md +++ b/README.md @@ -239,3 +239,48 @@ When diffing and patching, the behaviour is much the same. If you're diffing rea When patching event listeners, the previous one will be completely unbound and the new one will be bound. This prevents handlers from stacking. When patching properties, they're simply just set if the source and destination values aren't the same. + +### Web workers + +You can tell the differ to do its work in a web worker simply by passing a `done` callback option to any of the three major entry functions (`diff()`, `merge()`, `render()`). + +#### `diff()` + +In the case of `diff()`, it's called once the diffing algorithm has finished in the worker and passed the `instructions`. The patch `instructions` are the only argument passed into the callback. + +```js +function done (instructions) { + patch(instructions); +} +diff({ source, destination, done }); +``` + +#### `merge()` + +For `done()`, it's passed in the same exact way. The only difference is that it's called after the patch is performed but it's still passed the instructions that were performed by the patch algorithm. + +```js +function done (instructions) { + // The DOM has been updated, do what you want here. +} +merge({ source, destination, done }); +``` + +#### `render()` + +And for `render()`, it is the same as the `merge()` function. So once the vDOM is rendered and DOM is patched, `done()` is called with the instructions that were performed. + +```js +function done (instructions) { + // Renering and patching is done... +} +const root = document.createElement('div'); +const doRender = render(function (root) { + return sd.vdom.element('div', null, root.test); +}); + +div.test = 'initial text'; +doRender(div, done); +div.test = 'updated text'; +doRender(div, done); +``` From b95cc2e27cd09c3958015018015d14b9f267ce31 Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Fri, 2 Dec 2016 08:38:11 +1100 Subject: [PATCH 08/14] build: Fix some build issues. Still need a index.min.js. --- dist/index-with-deps.js | 318 +++-- dist/index-with-deps.js.map | 2 +- dist/index-with-deps.min.js | 2 +- dist/index-with-deps.min.js.map | 2 +- dist/index.js | 2256 +++++++++++++++++++------------ dist/index.js.map | 2 +- dist/index.min.js | 2 - dist/index.min.js.map | 1 - rollup.config.js | 1 - src/diff.js | 2 +- webpack.config.js | 3 +- 11 files changed, 1570 insertions(+), 1021 deletions(-) delete mode 100644 dist/index.min.js delete mode 100644 dist/index.min.js.map delete mode 100644 rollup.config.js diff --git a/dist/index-with-deps.js b/dist/index-with-deps.js index bd545d0..b1ce730 100644 --- a/dist/index-with-deps.js +++ b/dist/index-with-deps.js @@ -64,30 +64,26 @@ return /******/ (function(modules) { // webpackBootstrap var _diff2 = _interopRequireDefault(_diff); - var _merge = __webpack_require__(14); + var _merge = __webpack_require__(16); var _merge2 = _interopRequireDefault(_merge); - var _patch = __webpack_require__(15); + var _patch = __webpack_require__(17); var _patch2 = _interopRequireDefault(_patch); - var _render = __webpack_require__(24); + var _render = __webpack_require__(26); var _render2 = _interopRequireDefault(_render); - var _types = __webpack_require__(2); + var _types = __webpack_require__(3); var types = _interopRequireWildcard(_types); - var _vdom = __webpack_require__(28); + var _vdom = __webpack_require__(30); var _vdom2 = _interopRequireDefault(_vdom); - var _version = __webpack_require__(29); - - var _version2 = _interopRequireDefault(_version); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -98,8 +94,7 @@ return /******/ (function(modules) { // webpackBootstrap patch: _patch2.default, render: _render2.default, types: types, - vdom: _vdom2.default, - version: _version2.default + vdom: _vdom2.default }; /***/ }, @@ -113,19 +108,65 @@ return /******/ (function(modules) { // webpackBootstrap }); exports.default = diff; - var _types = __webpack_require__(2); + var _diffMain = __webpack_require__(2); + + var _diffMain2 = _interopRequireDefault(_diffMain); + + var _diffWorker = __webpack_require__(15); + + var _diffWorker2 = _interopRequireDefault(_diffWorker); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var _window = window, + Node = _window.Node; + + + function diffWorker(opts) { + var worker = new _diffWorker2.default(); + var done = opts.done; + + worker.addEventListener('message', function (e) { + return done(e.data); + }); + delete opts.done; + worker.postMessage(opts); + } + + function diff() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var source = opts.source, + destination = opts.destination, + done = opts.done; + + var canDiffInWorker = done && !(source instanceof Node && destination instanceof Node); + return canDiffInWorker ? diffWorker(opts) : (0, _diffMain2.default)(opts); + } + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = diff; + + var _types = __webpack_require__(3); var types = _interopRequireWildcard(_types); - var _node = __webpack_require__(3); + var _node = __webpack_require__(4); var _node2 = _interopRequireDefault(_node); - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); - var _realNodeMap = __webpack_require__(13); + var _realNodeMap = __webpack_require__(14); var _realNodeMap2 = _interopRequireDefault(_realNodeMap); @@ -133,10 +174,6 @@ return /******/ (function(modules) { // webpackBootstrap function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - var _window = window, - Node = _window.Node; - - function diffNode(source, destination) { var nodeInstructions = (0, _node2.default)(source, destination); @@ -155,9 +192,7 @@ return /******/ (function(modules) { // webpackBootstrap }]; } - function diff() { - var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - + function diff(opts) { var src = opts.source; var dst = opts.destination; @@ -189,8 +224,8 @@ return /******/ (function(modules) { // webpackBootstrap // Ensure the real node is carried over even if the destination isn't used. // This is used in the render() function to keep track of the real node // that corresponds to a virtual node if a virtual tree is being used. - if (!(curDst instanceof Node)) { - _realNodeMap2.default.set(curDst, (0, _realNode2.default)(curSrc)); + if (typeof curDst.__id !== 'undefined') { + _realNodeMap2.default.set(curDst.__id, (0, _realNode2.default)(curSrc)); } } @@ -211,7 +246,7 @@ return /******/ (function(modules) { // webpackBootstrap } /***/ }, -/* 2 */ +/* 3 */ /***/ function(module, exports) { "use strict"; @@ -229,7 +264,7 @@ return /******/ (function(modules) { // webpackBootstrap var TEXT_CONTENT = exports.TEXT_CONTENT = 8; /***/ }, -/* 3 */ +/* 4 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -260,15 +295,15 @@ return /******/ (function(modules) { // webpackBootstrap } }; - var _element = __webpack_require__(4); + var _element = __webpack_require__(5); var _element2 = _interopRequireDefault(_element); - var _text = __webpack_require__(10); + var _text = __webpack_require__(11); var _text2 = _interopRequireDefault(_text); - var _comment = __webpack_require__(11); + var _comment = __webpack_require__(12); var _comment2 = _interopRequireDefault(_comment); @@ -279,7 +314,7 @@ return /******/ (function(modules) { // webpackBootstrap var NODE_TEXT = 3; /***/ }, -/* 4 */ +/* 5 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -294,18 +329,18 @@ return /******/ (function(modules) { // webpackBootstrap } }; - var _attributes = __webpack_require__(5); + var _attributes = __webpack_require__(6); var _attributes2 = _interopRequireDefault(_attributes); - var _events = __webpack_require__(7); + var _events = __webpack_require__(8); var _events2 = _interopRequireDefault(_events); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 5 */ +/* 6 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -372,16 +407,16 @@ return /******/ (function(modules) { // webpackBootstrap return instructions; }; - var _types = __webpack_require__(2); + var _types = __webpack_require__(3); var types = _interopRequireWildcard(_types); - var _accessor = __webpack_require__(6); + var _accessor = __webpack_require__(7); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /***/ }, -/* 6 */ +/* 7 */ /***/ function(module, exports) { 'use strict'; @@ -480,7 +515,7 @@ return /******/ (function(modules) { // webpackBootstrap } /***/ }, -/* 7 */ +/* 8 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -529,11 +564,11 @@ return /******/ (function(modules) { // webpackBootstrap return instructions; }; - var _types = __webpack_require__(2); + var _types = __webpack_require__(3); var types = _interopRequireWildcard(_types); - var _eventMap = __webpack_require__(8); + var _eventMap = __webpack_require__(9); var _eventMap2 = _interopRequireDefault(_eventMap); @@ -542,7 +577,7 @@ return /******/ (function(modules) { // webpackBootstrap function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /***/ }, -/* 8 */ +/* 9 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -557,7 +592,7 @@ return /******/ (function(modules) { // webpackBootstrap return events; }; - var _weakMap = __webpack_require__(9); + var _weakMap = __webpack_require__(10); var _weakMap2 = _interopRequireDefault(_weakMap); @@ -566,7 +601,7 @@ return /******/ (function(modules) { // webpackBootstrap var map = new _weakMap2.default(); /***/ }, -/* 9 */ +/* 10 */ /***/ function(module, exports) { 'use strict'; @@ -603,7 +638,7 @@ return /******/ (function(modules) { // webpackBootstrap }(); /***/ }, -/* 10 */ +/* 11 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -624,14 +659,14 @@ return /******/ (function(modules) { // webpackBootstrap }]; }; - var _types = __webpack_require__(2); + var _types = __webpack_require__(3); var types = _interopRequireWildcard(_types); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /***/ }, -/* 11 */ +/* 12 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -640,7 +675,7 @@ return /******/ (function(modules) { // webpackBootstrap value: true }); - var _text = __webpack_require__(10); + var _text = __webpack_require__(11); var _text2 = _interopRequireDefault(_text); @@ -649,7 +684,7 @@ return /******/ (function(modules) { // webpackBootstrap exports.default = _text2.default; /***/ }, -/* 12 */ +/* 13 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -659,38 +694,51 @@ return /******/ (function(modules) { // webpackBootstrap }); exports.default = function (node) { - return node instanceof Node ? node : _realNodeMap2.default.get(node); + return isWindow && node instanceof Node ? node : _realNodeMap2.default.get(node.__id); }; - var _realNodeMap = __webpack_require__(13); + var _realNodeMap = __webpack_require__(14); var _realNodeMap2 = _interopRequireDefault(_realNodeMap); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - var _window = window, - Node = _window.Node; + var isWindow = typeof window !== 'undefined'; + + var _ref = isWindow ? window : self, + Node = _ref.Node; /***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { +/* 14 */ +/***/ function(module, exports) { - 'use strict'; + "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - - var _weakMap = __webpack_require__(9); - - var _weakMap2 = _interopRequireDefault(_weakMap); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - exports.default = new _weakMap2.default(); + // import WeakMap from './weak-map'; + // export default new WeakMap(); + var map = []; + exports.default = { + get: function get(id) { + return map[id]; + }, + set: function set(id, node) { + map[id] = node; + } + }; /***/ }, -/* 14 */ +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = function() { + return new Worker(__webpack_require__.p + "./dist/e375e330bcafe442dfca.js"); + }; + +/***/ }, +/* 16 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -699,24 +747,39 @@ return /******/ (function(modules) { // webpackBootstrap value: true }); - exports.default = function (opts) { - var inst = (0, _diff2.default)(opts); - (0, _patch2.default)(inst); - return inst; + exports.default = function () { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var source = opts.source, + destination = opts.destination, + _done = opts.done; + + if (_done) { + return (0, _diff2.default)({ + source: source, + destination: destination, + done: function done(instructions) { + (0, _patch2.default)(instructions); + _done(instructions); + } + }); + } + var instructions = (0, _diff2.default)(opts); + (0, _patch2.default)(instructions); + return instructions; }; var _diff = __webpack_require__(1); var _diff2 = _interopRequireDefault(_diff); - var _patch = __webpack_require__(15); + var _patch = __webpack_require__(17); var _patch2 = _interopRequireDefault(_patch); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 15 */ +/* 17 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -729,35 +792,35 @@ return /******/ (function(modules) { // webpackBootstrap instructions.forEach(patch); }; - var _types = __webpack_require__(2); + var _types = __webpack_require__(3); var types = _interopRequireWildcard(_types); - var _appendChild = __webpack_require__(16); + var _appendChild = __webpack_require__(18); var _appendChild2 = _interopRequireDefault(_appendChild); - var _removeAttribute = __webpack_require__(18); + var _removeAttribute = __webpack_require__(20); var _removeAttribute2 = _interopRequireDefault(_removeAttribute); - var _removeChild = __webpack_require__(19); + var _removeChild = __webpack_require__(21); var _removeChild2 = _interopRequireDefault(_removeChild); - var _replaceChild = __webpack_require__(20); + var _replaceChild = __webpack_require__(22); var _replaceChild2 = _interopRequireDefault(_replaceChild); - var _setAttribute = __webpack_require__(21); + var _setAttribute = __webpack_require__(23); var _setAttribute2 = _interopRequireDefault(_setAttribute); - var _setEvent = __webpack_require__(22); + var _setEvent = __webpack_require__(24); var _setEvent2 = _interopRequireDefault(_setEvent); - var _textContent = __webpack_require__(23); + var _textContent = __webpack_require__(25); var _textContent2 = _interopRequireDefault(_textContent); @@ -779,7 +842,7 @@ return /******/ (function(modules) { // webpackBootstrap } /***/ }, -/* 16 */ +/* 18 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -792,18 +855,18 @@ return /******/ (function(modules) { // webpackBootstrap (0, _realNode2.default)(src).appendChild((0, _dom2.default)(dst)); }; - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); - var _dom = __webpack_require__(17); + var _dom = __webpack_require__(19); var _dom2 = _interopRequireDefault(_dom); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 17 */ +/* 19 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -816,13 +879,13 @@ return /******/ (function(modules) { // webpackBootstrap exports.default = render; - var _accessor = __webpack_require__(6); + var _accessor = __webpack_require__(7); - var _eventMap = __webpack_require__(8); + var _eventMap = __webpack_require__(9); var _eventMap2 = _interopRequireDefault(_eventMap); - var _realNodeMap = __webpack_require__(13); + var _realNodeMap = __webpack_require__(14); var _realNodeMap2 = _interopRequireDefault(_realNodeMap); @@ -892,12 +955,12 @@ return /******/ (function(modules) { // webpackBootstrap if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } var realNode = el.tagName ? createElement(el) : createText(el); - _realNodeMap2.default.set(el, realNode); + _realNodeMap2.default.set(el.__id, realNode); return realNode; } /***/ }, -/* 18 */ +/* 20 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -910,16 +973,16 @@ return /******/ (function(modules) { // webpackBootstrap (0, _accessor.removeAccessor)((0, _realNode2.default)(src), data.name); }; - var _accessor = __webpack_require__(6); + var _accessor = __webpack_require__(7); - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 19 */ +/* 21 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -937,14 +1000,14 @@ return /******/ (function(modules) { // webpackBootstrap realSrc.removeChild(realDst); }; - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 20 */ +/* 22 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -958,18 +1021,18 @@ return /******/ (function(modules) { // webpackBootstrap realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild((0, _dom2.default)(dst), realSrc); }; - var _dom = __webpack_require__(17); + var _dom = __webpack_require__(19); var _dom2 = _interopRequireDefault(_dom); - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 21 */ +/* 23 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -982,16 +1045,16 @@ return /******/ (function(modules) { // webpackBootstrap (0, _accessor.setAccessor)((0, _realNode2.default)(src), data.name, data.value); }; - var _accessor = __webpack_require__(6); + var _accessor = __webpack_require__(7); - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 22 */ +/* 24 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1018,18 +1081,18 @@ return /******/ (function(modules) { // webpackBootstrap } }; - var _eventMap = __webpack_require__(8); + var _eventMap = __webpack_require__(9); var _eventMap2 = _interopRequireDefault(_eventMap); - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 23 */ +/* 25 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1042,14 +1105,14 @@ return /******/ (function(modules) { // webpackBootstrap (0, _realNode2.default)(src).textContent = dst.textContent; }; - var _realNode = __webpack_require__(12); + var _realNode = __webpack_require__(13); var _realNode2 = _interopRequireDefault(_realNode); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }, -/* 24 */ +/* 26 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1059,7 +1122,7 @@ return /******/ (function(modules) { // webpackBootstrap }); exports.default = function (render) { - return function (elem) { + return function (elem, done) { elem = elem instanceof Node ? elem : this; if (!(elem instanceof Node)) { @@ -1073,29 +1136,33 @@ return /******/ (function(modules) { // webpackBootstrap if (oldTree) { (0, _merge2.default)({ destination: newTree, - source: oldTree + source: oldTree, + done: done }); } else { (0, _mount2.default)(elem, newTree.childNodes); + if (typeof done === 'function') { + done(); + } } oldTreeMap.set(elem, newTree); }; }; - var _weakMap = __webpack_require__(9); + var _weakMap = __webpack_require__(10); var _weakMap2 = _interopRequireDefault(_weakMap); - var _element = __webpack_require__(25); + var _element = __webpack_require__(27); var _element2 = _interopRequireDefault(_element); - var _merge = __webpack_require__(14); + var _merge = __webpack_require__(16); var _merge2 = _interopRequireDefault(_merge); - var _mount = __webpack_require__(27); + var _mount = __webpack_require__(29); var _mount2 = _interopRequireDefault(_mount); @@ -1107,7 +1174,7 @@ return /******/ (function(modules) { // webpackBootstrap var oldTreeMap = new _weakMap2.default(); /***/ }, -/* 25 */ +/* 27 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1120,9 +1187,9 @@ return /******/ (function(modules) { // webpackBootstrap exports.default = element; - var _accessor = __webpack_require__(6); + var _accessor = __webpack_require__(7); - var _text = __webpack_require__(26); + var _text = __webpack_require__(28); var _text2 = _interopRequireDefault(_text); @@ -1193,12 +1260,14 @@ return /******/ (function(modules) { // webpackBootstrap return item; } + var count = 0; function element(name) { var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var isAttrsNode = isChildren(attrs); var data = separateData(isAttrsNode ? {} : attrs); var node = data.node; + node.__id = ++count; node.nodeType = 1; node.tagName = ensureTagName(name); node.attributes = data.attrs; @@ -1221,7 +1290,7 @@ return /******/ (function(modules) { // webpackBootstrap }); /***/ }, -/* 26 */ +/* 28 */ /***/ function(module, exports) { "use strict"; @@ -1238,7 +1307,7 @@ return /******/ (function(modules) { // webpackBootstrap } /***/ }, -/* 27 */ +/* 29 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1252,7 +1321,7 @@ return /******/ (function(modules) { // webpackBootstrap elem.appendChild((0, _dom2.default)(tree)); }; - var _dom = __webpack_require__(17); + var _dom = __webpack_require__(19); var _dom2 = _interopRequireDefault(_dom); @@ -1266,7 +1335,7 @@ return /******/ (function(modules) { // webpackBootstrap } /***/ }, -/* 28 */ +/* 30 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1275,19 +1344,19 @@ return /******/ (function(modules) { // webpackBootstrap value: true }); - var _dom = __webpack_require__(17); + var _dom = __webpack_require__(19); var _dom2 = _interopRequireDefault(_dom); - var _element = __webpack_require__(25); + var _element = __webpack_require__(27); var _element2 = _interopRequireDefault(_element); - var _mount = __webpack_require__(27); + var _mount = __webpack_require__(29); var _mount2 = _interopRequireDefault(_mount); - var _text = __webpack_require__(26); + var _text = __webpack_require__(28); var _text2 = _interopRequireDefault(_text); @@ -1300,17 +1369,6 @@ return /******/ (function(modules) { // webpackBootstrap text: _text2.default }; -/***/ }, -/* 29 */ -/***/ function(module, exports) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.default = '0.3.1'; - /***/ } /******/ ]) }); diff --git a/dist/index-with-deps.js.map b/dist/index-with-deps.js.map index 50de2f0..b212e64 100644 --- a/dist/index-with-deps.js.map +++ b/dist/index-with-deps.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 6cd9c7bc46b0e4ca004f","webpack:///./src/index.js","webpack:///./src/diff.js","webpack:///./src/types.js","webpack:///./src/compare/node.js","webpack:///./src/compare/element.js","webpack:///./src/compare/attributes.js","webpack:///./src/util/accessor.js","webpack:///./src/compare/events.js","webpack:///./src/util/event-map.js","webpack:///./src/util/weak-map.js","webpack:///./src/compare/text.js","webpack:///./src/compare/comment.js","webpack:///./src/util/real-node.js","webpack:///./src/util/real-node-map.js","webpack:///./src/merge.js","webpack:///./src/patch.js","webpack:///./src/patch/append-child.js","webpack:///./src/vdom/dom.js","webpack:///./src/patch/remove-attribute.js","webpack:///./src/patch/remove-child.js","webpack:///./src/patch/replace-child.js","webpack:///./src/patch/set-attribute.js","webpack:///./src/patch/set-event.js","webpack:///./src/patch/text-content.js","webpack:///./src/render.js","webpack:///./src/vdom/element.js","webpack:///./src/vdom/text.js","webpack:///./src/vdom/mount.js","webpack:///./src/vdom/index.js","webpack:///./src/version.js"],"names":["types","diff","merge","patch","render","vdom","version","window","Node","diffNode","source","destination","nodeInstructions","concat","type","REPLACE_CHILD","opts","src","dst","instructions","root","srcChs","childNodes","dstChs","srcChsLen","length","dstChsLen","a","curSrc","curDst","push","APPEND_CHILD","set","REMOVE_CHILD","REMOVE_ATTRIBUTE","SET_ATTRIBUTE","SET_EVENT","SET_PROPERTY","TEXT_CONTENT","dstType","srcType","nodeType","NODE_ELEMENT","NODE_TEXT","NODE_COMMENT","tagName","srcAttrs","attributes","dstAttrs","srcAttrsLen","dstAttrsLen","srcAttr","srcAttrName","name","srcAttrValue","dstAttr","dstAttrValue","data","value","dstAttrName","getAccessor","mapAccessor","removeAccessor","setAccessor","classToString","obj","Array","isArray","join","Object","keys","filter","key","styleToString","map","node","className","style","cssText","getAttribute","removeAttribute","setAttribute","dstEvents","events","srcEvents","undefined","elem","get","index","prefix","WeakMap","Polyfill","prototype","val","textContent","inst","forEach","patchers","instruction","appendChild","createElement","el","realNode","document","eventHandlers","children","attributesLen","attr","addEventListener","docfrag","createDocumentFragment","childrenLen","ch","createText","createTextNode","frag","item","realDst","realSrc","removeChild","parentNode","replaceChild","prevHandler","nextHandler","removeEventListener","Error","newTree","oldTree","oldTreeMap","element","separateData","attrs","attrIdx","indexOf","substring","ensureNodes","arr","out","Boolean","translateFromReact","ensureTagName","id","toUpperCase","isChildren","arg","isReactNode","props","chren","isAttrsNode","array","tag","bind","tree","removeChildNodes","firstChild","first","dom","mount","text"],"mappings":"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","file":"dist/index-with-deps.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"skatejsDomDiff\"] = factory();\n\telse\n\t\troot[\"skatejsDomDiff\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6cd9c7bc46b0e4ca004f","import diff from './diff';\nimport merge from './merge';\nimport patch from './patch';\nimport render from './render';\nimport * as types from './types';\nimport vdom from './vdom';\nimport version from './version';\n\nexport default {\n diff,\n merge,\n patch,\n render,\n types,\n vdom,\n version\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","import * as types from './types';\nimport compareNode from './compare/node';\nimport realNode from './util/real-node';\nimport realNodeMap from './util/real-node-map';\n\nconst { Node } = window;\n\nfunction diffNode (source, destination) {\n let nodeInstructions = compareNode(source, destination);\n\n // If there are instructions (even an empty array) it means the node can be\n // diffed and doesn't have to be replaced. If the instructions are falsy\n // it means that the nodes are not similar (cannot be changed) and must be\n // replaced instead.\n if (nodeInstructions) {\n return nodeInstructions.concat(diff({ source, destination }));\n }\n\n return [{\n destination,\n source,\n type: types.REPLACE_CHILD\n }];\n}\n\nexport default function diff (opts = {}) {\n const src = opts.source;\n const dst = opts.destination;\n\n if (!src || !dst) {\n return [];\n }\n\n let instructions = opts.root ? diffNode(src, dst) : [];\n\n const srcChs = src.childNodes;\n const dstChs = dst.childNodes;\n const srcChsLen = srcChs ? srcChs.length : 0;\n const dstChsLen = dstChs ? dstChs.length : 0;\n\n for (let a = 0; a < dstChsLen; a++) {\n const curSrc = srcChs[a];\n const curDst = dstChs[a];\n\n // If there is no matching destination node it means we need to remove the\n // current source node from the source.\n if (!curSrc) {\n instructions.push({\n destination: dstChs[a],\n source: src,\n type: types.APPEND_CHILD\n });\n continue;\n } else {\n // Ensure the real node is carried over even if the destination isn't used.\n // This is used in the render() function to keep track of the real node\n // that corresponds to a virtual node if a virtual tree is being used.\n if (!(curDst instanceof Node)) {\n realNodeMap.set(curDst, realNode(curSrc));\n }\n }\n\n instructions = instructions.concat(diffNode(curSrc, curDst));\n }\n\n if (dstChsLen < srcChsLen) {\n for (let a = dstChsLen; a < srcChsLen; a++) {\n instructions.push({\n destination: srcChs[a],\n source: src,\n type: types.REMOVE_CHILD\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff.js","export const APPEND_CHILD = 1;\nexport const REMOVE_CHILD = 2;\nexport const REMOVE_ATTRIBUTE = 3;\nexport const REPLACE_CHILD = 4;\nexport const SET_ATTRIBUTE = 5;\nexport const SET_EVENT = 6;\nexport const SET_PROPERTY = 7;\nexport const TEXT_CONTENT = 8;\n\n\n\n// WEBPACK FOOTER //\n// ./src/types.js","import compareElement from './element';\nimport compareText from './text';\nimport compareComment from './comment';\n\nconst NODE_COMMENT = 8;\nconst NODE_ELEMENT = 1;\nconst NODE_TEXT = 3;\n\nexport default function (src, dst) {\n let dstType, srcType;\n\n if (!dst || !src) {\n return;\n }\n\n dstType = dst.nodeType;\n srcType = src.nodeType;\n\n if (dstType !== srcType) {\n return;\n } else if (dstType === NODE_ELEMENT) {\n return compareElement(src, dst);\n } else if (dstType === NODE_TEXT) {\n return compareText(src, dst);\n } else if (dstType === NODE_COMMENT) {\n return compareComment(src, dst);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/node.js","import compareAttributes from './attributes';\nimport compareEvents from './events';\n\nexport default function (src, dst) {\n if (src.tagName === dst.tagName) {\n return compareAttributes(src, dst).concat(compareEvents(src, dst));\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/element.js","import * as types from '../types';\nimport { getAccessor } from '../util/accessor';\n\nexport default function (src, dst) {\n let srcAttrs = src.attributes;\n let dstAttrs = dst.attributes;\n let srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n let dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n let instructions = [];\n\n // Bail early if possible.\n if (!srcAttrsLen && !dstAttrsLen) {\n return instructions;\n }\n\n // Merge attributes that exist in source with destination's.\n for (let a = 0; a < srcAttrsLen; a++) {\n const srcAttr = srcAttrs[a];\n const srcAttrName = srcAttr.name;\n const srcAttrValue = getAccessor(src, srcAttrName);\n const dstAttr = dstAttrs[srcAttrName];\n const dstAttrValue = getAccessor(dst, srcAttrName);\n\n if (!dstAttr) {\n instructions.push({\n data: { name: srcAttrName },\n destination: dst,\n source: src,\n type: types.REMOVE_ATTRIBUTE\n });\n } else if (srcAttrValue !== dstAttrValue) {\n instructions.push({\n data: { name: srcAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n // We only need to worry about setting attributes that don't already exist\n // in the source.\n for (let a = 0; a < dstAttrsLen; a++) {\n const dstAttr = dstAttrs[a];\n const dstAttrName = dstAttr.name;\n const dstAttrValue = getAccessor(dst, dstAttrName);\n const srcAttr = srcAttrs[dstAttrName];\n\n if (!srcAttr) {\n instructions.push({\n data: { name: dstAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/attributes.js","function classToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.join(' ');\n }\n\n return Object.keys(obj).filter(function (key) {\n return obj[key] ? key : false;\n }).join(' ');\n}\n\nfunction styleToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n return Object.keys(obj).map(function (key) {\n return `${key}: ${obj[key]};`;\n }).join(' ');\n}\n\nexport function getAccessor (node, name) {\n if (name === 'class') {\n return node.className;\n } else if (name === 'style') {\n return node.style.cssText;\n // most things\n } else if (name !== 'type' && name in node) {\n return node[name];\n // real DOM elements\n } else if (node.getAttribute) {\n return node.getAttribute(name);\n // vDOM nodes\n } else if (node.attributes && node.attributes[name]) {\n return node.attributes[name].value;\n }\n}\n\nexport function mapAccessor (node, name, value) {\n if (name === 'class') {\n node.className = classToString(value);\n } else if (name === 'style') {\n node.style = { cssText: styleToString(value) };\n }\n}\n\nexport function removeAccessor (node, name) {\n if (name === 'class') {\n node.className = '';\n } else if (name === 'style') {\n node.style.cssText = '';\n // most things\n } else if (name !== 'type' && name in node) {\n node[name] = '';\n // real DOM elements\n } else if (node.removeAttribute) {\n node.removeAttribute(name);\n // vDOM nodes\n } else if (node.attributes) {\n delete node.attributes[name];\n }\n}\n\nexport function setAccessor (node, name, value) {\n if (name === 'class') {\n node.className = value;\n } else if (name === 'style') {\n node.style.cssText = value;\n // most things\n } else if (name !== 'type' && name in node || typeof value !== 'string') {\n // We check if it's undefined or null because IE throws \"invalid argument\"\n // errors for some types of properties. Essentially this is the same as\n // removing the accessor.\n node[name] = value == null ? '' : value;\n // real DOM elements\n } else if (node.setAttribute) {\n node.setAttribute(name, value);\n // vDOM nodes\n } else if (node.attributes) {\n node.attributes[node.attributes.length] = node.attributes[name] = { name, value };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/accessor.js","import * as types from '../types';\nimport eventMap from '../util/event-map';\n\nexport default function (src, dst) {\n const dstEvents = dst.events;\n const srcEvents = eventMap(src);\n const instructions = [];\n\n // Remove any source events that aren't in the destination before seeing if\n // we need to add any from the destination.\n if (srcEvents) {\n for (let name in srcEvents) {\n if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n instructions.push({\n data: { name, value: undefined },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n // After instructing to remove any old events, we then can instruct to add\n // new events. This prevents the new events from being removed from earlier\n // instructions.\n if (dstEvents) {\n for (let name in dstEvents) {\n const value = dstEvents[name];\n if (srcEvents[name] !== value) {\n instructions.push({\n data: { name, value },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/events.js","import WeakMap from './weak-map';\n\nconst map = new WeakMap();\n\nexport default function (elem) {\n let events = map.get(elem);\n events || map.set(elem, events = {});\n return events;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/event-map.js","// Because weak map polyfills either are too big or don't use native if\n// available properly.\n\nlet index = 0;\nconst prefix = '__WEAK_MAP_POLYFILL_';\n\nexport default (function () {\n if (typeof WeakMap !== 'undefined') {\n return WeakMap;\n }\n\n function Polyfill () {\n this.key = prefix + index;\n ++index;\n }\n\n Polyfill.prototype = {\n get (obj) {\n return obj[this.key];\n },\n set (obj, val) {\n obj[this.key] = val;\n }\n };\n\n return Polyfill;\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/weak-map.js","import * as types from '../types';\n\nexport default function (src, dst) {\n if (src.textContent === dst.textContent) {\n return [];\n }\n\n return [{\n destination: dst,\n source: src,\n type: types.TEXT_CONTENT\n }];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/text.js","import text from './text';\nexport default text;\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/comment.js","import realNodeMap from './real-node-map';\n\nconst { Node } = window;\n\nexport default function (node) {\n return node instanceof Node ? node : realNodeMap.get(node);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node.js","import WeakMap from './weak-map';\nexport default new WeakMap();\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node-map.js","import diff from './diff';\nimport patch from './patch';\n\nexport default function (opts) {\n var inst = diff(opts);\n patch(inst);\n return inst;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/merge.js","import * as types from './types';\nimport appendChild from './patch/append-child';\nimport removeAttribute from './patch/remove-attribute';\nimport removeChild from './patch/remove-child';\nimport replaceChild from './patch/replace-child';\nimport setAttribute from './patch/set-attribute';\nimport setEvent from './patch/set-event';\nimport textContent from './patch/text-content';\n\nconst patchers = {};\npatchers[types.APPEND_CHILD] = appendChild;\npatchers[types.REMOVE_ATTRIBUTE] = removeAttribute;\npatchers[types.REMOVE_CHILD] = removeChild;\npatchers[types.REPLACE_CHILD] = replaceChild;\npatchers[types.SET_ATTRIBUTE] = setAttribute;\npatchers[types.SET_EVENT] = setEvent;\npatchers[types.TEXT_CONTENT] = textContent;\n\nfunction patch (instruction) {\n patchers[instruction.type](\n instruction.source,\n instruction.destination,\n instruction.data\n );\n}\n\nexport default function (instructions) {\n instructions.forEach(patch);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch.js","import realNode from '../util/real-node';\nimport dom from '../vdom/dom';\n\nexport default function (src, dst) {\n realNode(src).appendChild(dom(dst));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/append-child.js","import { setAccessor } from '../util/accessor';\nimport eventMap from '../util/event-map';\nimport realNodeMap from '../util/real-node-map';\n\nconst { Node } = window;\n\nfunction createElement (el) {\n const realNode = document.createElement(el.tagName);\n const attributes = el.attributes;\n const events = el.events;\n const eventHandlers = eventMap(realNode);\n const children = el.childNodes;\n\n if (attributes) {\n const attributesLen = attributes.length;\n for (let a = 0; a < attributesLen; a++) {\n const attr = attributes[a];\n setAccessor(realNode, attr.name, attr.value);\n }\n }\n\n if (events) {\n for (let name in events) {\n realNode.addEventListener(name, eventHandlers[name] = events[name]);\n }\n }\n\n if (children) {\n const docfrag = document.createDocumentFragment();\n const childrenLen = children.length;\n\n for (let a = 0; a < childrenLen; a++) {\n const ch = children[a];\n ch && docfrag.appendChild(render(ch));\n }\n\n if (realNode.appendChild) {\n realNode.appendChild(docfrag);\n }\n }\n\n return realNode;\n}\n\nfunction createText (el) {\n return document.createTextNode(el.textContent);\n}\n\nexport default function render (el) {\n if (el instanceof Node) {\n return el;\n }\n if (Array.isArray(el)) {\n const frag = document.createDocumentFragment();\n el.forEach(item => frag.appendChild(render(item)));\n return frag;\n }\n const realNode = el.tagName ? createElement(el) : createText(el);\n realNodeMap.set(el, realNode);\n return realNode;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/dom.js","import { removeAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n removeAccessor(realNode(src), data.name);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-attribute.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realDst = realNode(dst);\n const realSrc = realNode(src);\n\n // We don't do parentNode.removeChild because parentNode may report\n // incorrectly in some prollyfills since it's impossible (?) to spoof.\n realSrc.removeChild(realDst);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-child.js","import dom from '../vdom/dom';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realSrc = realNode(src);\n realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/replace-child.js","import { setAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n setAccessor(realNode(src), data.name, data.value);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-attribute.js","import eventMap from '../util/event-map';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n const realSrc = realNode(src);\n const eventHandlers = eventMap(realSrc);\n const name = data.name;\n const prevHandler = eventHandlers[name];\n const nextHandler = data.value;\n\n if (typeof prevHandler === 'function') {\n delete eventHandlers[name];\n realSrc.removeEventListener(name, prevHandler);\n }\n\n if (typeof nextHandler === 'function') {\n eventHandlers[name] = nextHandler;\n realSrc.addEventListener(name, nextHandler);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-event.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n realNode(src).textContent = dst.textContent;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/text-content.js","import WeakMap from './util/weak-map';\nimport createElement from './vdom/element';\nimport merge from './merge';\nimport mount from './vdom/mount';\n\nconst { Node } = window;\nconst oldTreeMap = new WeakMap();\n\nexport default function (render) {\n return function (elem) {\n elem = elem instanceof Node ? elem : this;\n\n if (!(elem instanceof Node)) {\n throw new Error('No node provided to diff renderer as either the first argument or the context.');\n }\n\n // Create a new element to house the new tree since we diff / mount fragments.\n const newTree = createElement('div', null, render(elem));\n const oldTree = oldTreeMap.get(elem);\n\n if (oldTree) {\n merge({\n destination: newTree,\n source: oldTree\n });\n } else {\n mount(elem, newTree.childNodes);\n }\n\n oldTreeMap.set(elem, newTree);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/render.js","import { mapAccessor } from '../util/accessor';\nimport createTextNode from './text';\n\nfunction separateData (obj) {\n const attrs = {};\n const events = {};\n const node = {};\n let attrIdx = 0;\n\n for (let name in obj) {\n let value = obj[name];\n\n if (name.indexOf('on') === 0) {\n events[name.substring(2)] = value;\n } else {\n attrs[attrIdx++] = attrs[name] = { name, value };\n mapAccessor(node, name, value);\n }\n }\n\n attrs.length = attrIdx;\n return { attrs, events, node };\n}\n\nfunction ensureNodes (arr) {\n let out = [];\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n arr.filter(Boolean).forEach(function (item) {\n if (Array.isArray(item)) {\n out = out.concat(ensureNodes(item));\n } else if (typeof item === 'object') {\n out.push(translateFromReact(item));\n } else {\n out.push(createTextNode(item));\n }\n });\n return out;\n}\n\nfunction ensureTagName (name) {\n return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n}\n\nfunction isChildren (arg) {\n return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n}\n\nfunction isReactNode (item) {\n return item && item.type && item.props;\n}\n\nfunction translateFromReact (item) {\n if (isReactNode(item)) {\n const props = item.props;\n const chren = ensureNodes(props.children);\n delete props.children;\n return {\n nodeType: 1,\n tagName: item.type,\n attributes: props,\n childNodes: chren\n };\n }\n return item;\n}\n\nexport default function element (name, attrs = {}, ...chren) {\n const isAttrsNode = isChildren(attrs);\n const data = separateData(isAttrsNode ? {} : attrs);\n const node = data.node;\n node.nodeType = 1;\n node.tagName = ensureTagName(name);\n node.attributes = data.attrs;\n node.events = data.events;\n node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n return node;\n}\n\n// Add an array factory that returns an array of virtual nodes.\nelement.array = ensureNodes;\n\n// Generate built-in factories.\n[\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n].forEach(function (tag) {\n element[tag] = element.bind(null, tag);\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/element.js","export default function createTextNode (item) {\n return {\n nodeType: 3,\n textContent: item\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/text.js","import dom from './dom';\n\nfunction removeChildNodes (elem) {\n while (elem.firstChild) {\n const first = elem.firstChild;\n first.parentNode.removeChild(first);\n }\n}\n\nexport default function (elem, tree) {\n removeChildNodes(elem);\n elem.appendChild(dom(tree));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/mount.js","import dom from './dom';\nimport element from './element';\nimport mount from './mount';\nimport text from './text';\n\nexport default {\n dom,\n element,\n mount,\n text\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/index.js","export default '0.3.1';\n\n\n\n// WEBPACK FOOTER //\n// ./src/version.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap bef7b4dc7aa6ac50b1d3","webpack:///./src/index.js","webpack:///./src/diff.js","webpack:///./src/diff-main.js","webpack:///./src/types.js","webpack:///./src/compare/node.js","webpack:///./src/compare/element.js","webpack:///./src/compare/attributes.js","webpack:///./src/util/accessor.js","webpack:///./src/compare/events.js","webpack:///./src/util/event-map.js","webpack:///./src/util/weak-map.js","webpack:///./src/compare/text.js","webpack:///./src/compare/comment.js","webpack:///./src/util/real-node.js","webpack:///./src/util/real-node-map.js","webpack:///./src/diff-worker.js","webpack:///./src/merge.js","webpack:///./src/patch.js","webpack:///./src/patch/append-child.js","webpack:///./src/vdom/dom.js","webpack:///./src/patch/remove-attribute.js","webpack:///./src/patch/remove-child.js","webpack:///./src/patch/replace-child.js","webpack:///./src/patch/set-attribute.js","webpack:///./src/patch/set-event.js","webpack:///./src/patch/text-content.js","webpack:///./src/render.js","webpack:///./src/vdom/element.js","webpack:///./src/vdom/text.js","webpack:///./src/vdom/mount.js","webpack:///./src/vdom/index.js"],"names":["types","diff","merge","patch","render","vdom","window","Node","diffWorker","opts","worker","done","addEventListener","e","data","postMessage","source","destination","canDiffInWorker","diffNode","nodeInstructions","concat","type","REPLACE_CHILD","src","dst","instructions","root","srcChs","childNodes","dstChs","srcChsLen","length","dstChsLen","a","curSrc","curDst","push","APPEND_CHILD","__id","set","REMOVE_CHILD","REMOVE_ATTRIBUTE","SET_ATTRIBUTE","SET_EVENT","SET_PROPERTY","TEXT_CONTENT","dstType","srcType","nodeType","NODE_ELEMENT","NODE_TEXT","NODE_COMMENT","tagName","srcAttrs","attributes","dstAttrs","srcAttrsLen","dstAttrsLen","srcAttr","srcAttrName","name","srcAttrValue","dstAttr","dstAttrValue","value","dstAttrName","getAccessor","mapAccessor","removeAccessor","setAccessor","classToString","obj","Array","isArray","join","Object","keys","filter","key","styleToString","map","node","className","style","cssText","getAttribute","removeAttribute","setAttribute","dstEvents","events","srcEvents","undefined","elem","get","index","prefix","WeakMap","Polyfill","prototype","val","textContent","isWindow","self","id","forEach","patchers","instruction","appendChild","createElement","el","realNode","document","eventHandlers","children","attributesLen","attr","docfrag","createDocumentFragment","childrenLen","ch","createText","createTextNode","frag","item","realDst","realSrc","removeChild","parentNode","replaceChild","prevHandler","nextHandler","removeEventListener","Error","newTree","oldTree","oldTreeMap","element","separateData","attrs","attrIdx","indexOf","substring","ensureNodes","arr","out","Boolean","translateFromReact","ensureTagName","toUpperCase","isChildren","arg","isReactNode","props","chren","count","isAttrsNode","array","tag","bind","tree","removeChildNodes","firstChild","first","dom","mount","text"],"mappings":"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","file":"dist/index-with-deps.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"skatejsDomDiff\"] = factory();\n\telse\n\t\troot[\"skatejsDomDiff\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bef7b4dc7aa6ac50b1d3","import diff from './diff';\nimport merge from './merge';\nimport patch from './patch';\nimport render from './render';\nimport * as types from './types';\nimport vdom from './vdom';\n\nexport default {\n diff,\n merge,\n patch,\n render,\n types,\n vdom\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","import diffMain from './diff-main';\nimport DiffWorker from 'worker-loader?name=./dist/[hash].[ext]!./diff-worker';\n\nconst { Node } = window;\n\nfunction diffWorker (opts) {\n const worker = new DiffWorker();\n const { done } = opts;\n worker.addEventListener('message', e => done(e.data));\n delete opts.done;\n worker.postMessage(opts);\n}\n\nexport default function diff (opts = {}) {\n const { source, destination, done } = opts;\n const canDiffInWorker = done && !(source instanceof Node && destination instanceof Node);\n return canDiffInWorker ? diffWorker(opts) : diffMain(opts);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff.js","import * as types from './types';\nimport compareNode from './compare/node';\nimport realNode from './util/real-node';\nimport realNodeMap from './util/real-node-map';\n\nfunction diffNode (source, destination) {\n let nodeInstructions = compareNode(source, destination);\n\n // If there are instructions (even an empty array) it means the node can be\n // diffed and doesn't have to be replaced. If the instructions are falsy\n // it means that the nodes are not similar (cannot be changed) and must be\n // replaced instead.\n if (nodeInstructions) {\n return nodeInstructions.concat(diff({ source, destination }));\n }\n\n return [{\n destination,\n source,\n type: types.REPLACE_CHILD\n }];\n}\n\nexport default function diff (opts) {\n const src = opts.source;\n const dst = opts.destination;\n\n if (!src || !dst) {\n return [];\n }\n\n let instructions = opts.root ? diffNode(src, dst) : [];\n\n const srcChs = src.childNodes;\n const dstChs = dst.childNodes;\n const srcChsLen = srcChs ? srcChs.length : 0;\n const dstChsLen = dstChs ? dstChs.length : 0;\n\n for (let a = 0; a < dstChsLen; a++) {\n const curSrc = srcChs[a];\n const curDst = dstChs[a];\n\n // If there is no matching destination node it means we need to remove the\n // current source node from the source.\n if (!curSrc) {\n instructions.push({\n destination: dstChs[a],\n source: src,\n type: types.APPEND_CHILD\n });\n continue;\n } else {\n // Ensure the real node is carried over even if the destination isn't used.\n // This is used in the render() function to keep track of the real node\n // that corresponds to a virtual node if a virtual tree is being used.\n if (typeof curDst.__id !== 'undefined') {\n realNodeMap.set(curDst.__id, realNode(curSrc));\n }\n }\n\n instructions = instructions.concat(diffNode(curSrc, curDst));\n }\n\n if (dstChsLen < srcChsLen) {\n for (let a = dstChsLen; a < srcChsLen; a++) {\n instructions.push({\n destination: srcChs[a],\n source: src,\n type: types.REMOVE_CHILD\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff-main.js","export const APPEND_CHILD = 1;\nexport const REMOVE_CHILD = 2;\nexport const REMOVE_ATTRIBUTE = 3;\nexport const REPLACE_CHILD = 4;\nexport const SET_ATTRIBUTE = 5;\nexport const SET_EVENT = 6;\nexport const SET_PROPERTY = 7;\nexport const TEXT_CONTENT = 8;\n\n\n\n// WEBPACK FOOTER //\n// ./src/types.js","import compareElement from './element';\nimport compareText from './text';\nimport compareComment from './comment';\n\nconst NODE_COMMENT = 8;\nconst NODE_ELEMENT = 1;\nconst NODE_TEXT = 3;\n\nexport default function (src, dst) {\n let dstType, srcType;\n\n if (!dst || !src) {\n return;\n }\n\n dstType = dst.nodeType;\n srcType = src.nodeType;\n\n if (dstType !== srcType) {\n return;\n } else if (dstType === NODE_ELEMENT) {\n return compareElement(src, dst);\n } else if (dstType === NODE_TEXT) {\n return compareText(src, dst);\n } else if (dstType === NODE_COMMENT) {\n return compareComment(src, dst);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/node.js","import compareAttributes from './attributes';\nimport compareEvents from './events';\n\nexport default function (src, dst) {\n if (src.tagName === dst.tagName) {\n return compareAttributes(src, dst).concat(compareEvents(src, dst));\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/element.js","import * as types from '../types';\nimport { getAccessor } from '../util/accessor';\n\nexport default function (src, dst) {\n const srcAttrs = src.attributes;\n const dstAttrs = dst.attributes;\n const srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n const dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n const instructions = [];\n\n // Bail early if possible.\n if (!srcAttrsLen && !dstAttrsLen) {\n return instructions;\n }\n\n // Merge attributes that exist in source with destination's.\n for (let a = 0; a < srcAttrsLen; a++) {\n const srcAttr = srcAttrs[a];\n const srcAttrName = srcAttr.name;\n const srcAttrValue = getAccessor(src, srcAttrName);\n const dstAttr = dstAttrs[srcAttrName];\n const dstAttrValue = getAccessor(dst, srcAttrName);\n\n if (!dstAttr) {\n instructions.push({\n data: { name: srcAttrName },\n destination: dst,\n source: src,\n type: types.REMOVE_ATTRIBUTE\n });\n } else if (srcAttrValue !== dstAttrValue) {\n instructions.push({\n data: { name: srcAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n // We only need to worry about setting attributes that don't already exist\n // in the source.\n for (let a = 0; a < dstAttrsLen; a++) {\n const dstAttr = dstAttrs[a];\n const dstAttrName = dstAttr.name;\n const dstAttrValue = getAccessor(dst, dstAttrName);\n const srcAttr = srcAttrs[dstAttrName];\n\n if (!srcAttr) {\n instructions.push({\n data: { name: dstAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/attributes.js","function classToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.join(' ');\n }\n\n return Object.keys(obj).filter(function (key) {\n return obj[key] ? key : false;\n }).join(' ');\n}\n\nfunction styleToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n return Object.keys(obj).map(function (key) {\n return `${key}: ${obj[key]};`;\n }).join(' ');\n}\n\nexport function getAccessor (node, name) {\n if (name === 'class') {\n return node.className;\n } else if (name === 'style') {\n return node.style.cssText;\n // most things\n } else if (name !== 'type' && name in node) {\n return node[name];\n // real DOM elements\n } else if (node.getAttribute) {\n return node.getAttribute(name);\n // vDOM nodes\n } else if (node.attributes && node.attributes[name]) {\n return node.attributes[name].value;\n }\n}\n\nexport function mapAccessor (node, name, value) {\n if (name === 'class') {\n node.className = classToString(value);\n } else if (name === 'style') {\n node.style = { cssText: styleToString(value) };\n }\n}\n\nexport function removeAccessor (node, name) {\n if (name === 'class') {\n node.className = '';\n } else if (name === 'style') {\n node.style.cssText = '';\n // most things\n } else if (name !== 'type' && name in node) {\n node[name] = '';\n // real DOM elements\n } else if (node.removeAttribute) {\n node.removeAttribute(name);\n // vDOM nodes\n } else if (node.attributes) {\n delete node.attributes[name];\n }\n}\n\nexport function setAccessor (node, name, value) {\n if (name === 'class') {\n node.className = value;\n } else if (name === 'style') {\n node.style.cssText = value;\n // most things\n } else if (name !== 'type' && name in node || typeof value !== 'string') {\n // We check if it's undefined or null because IE throws \"invalid argument\"\n // errors for some types of properties. Essentially this is the same as\n // removing the accessor.\n node[name] = value == null ? '' : value;\n // real DOM elements\n } else if (node.setAttribute) {\n node.setAttribute(name, value);\n // vDOM nodes\n } else if (node.attributes) {\n node.attributes[node.attributes.length] = node.attributes[name] = { name, value };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/accessor.js","import * as types from '../types';\nimport eventMap from '../util/event-map';\n\nexport default function (src, dst) {\n const dstEvents = dst.events;\n const srcEvents = eventMap(src);\n const instructions = [];\n\n // Remove any source events that aren't in the destination before seeing if\n // we need to add any from the destination.\n if (srcEvents) {\n for (let name in srcEvents) {\n if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n instructions.push({\n data: { name, value: undefined },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n // After instructing to remove any old events, we then can instruct to add\n // new events. This prevents the new events from being removed from earlier\n // instructions.\n if (dstEvents) {\n for (let name in dstEvents) {\n const value = dstEvents[name];\n if (srcEvents[name] !== value) {\n instructions.push({\n data: { name, value },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/events.js","import WeakMap from './weak-map';\n\nconst map = new WeakMap();\n\nexport default function (elem) {\n let events = map.get(elem);\n events || map.set(elem, events = {});\n return events;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/event-map.js","// Because weak map polyfills either are too big or don't use native if\n// available properly.\n\nlet index = 0;\nconst prefix = '__WEAK_MAP_POLYFILL_';\n\nexport default (function () {\n if (typeof WeakMap !== 'undefined') {\n return WeakMap;\n }\n\n function Polyfill () {\n this.key = prefix + index;\n ++index;\n }\n\n Polyfill.prototype = {\n get (obj) {\n return obj[this.key];\n },\n set (obj, val) {\n obj[this.key] = val;\n }\n };\n\n return Polyfill;\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/weak-map.js","import * as types from '../types';\n\nexport default function (src, dst) {\n if (src.textContent === dst.textContent) {\n return [];\n }\n\n return [{\n destination: dst,\n source: src,\n type: types.TEXT_CONTENT\n }];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/text.js","import text from './text';\nexport default text;\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/comment.js","import realNodeMap from './real-node-map';\n\nconst isWindow = typeof window !== 'undefined';\nconst { Node } = isWindow ? window : self;\n\nexport default function (node) {\n return isWindow && node instanceof Node ? node : realNodeMap.get(node.__id);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node.js","// import WeakMap from './weak-map';\n// export default new WeakMap();\nconst map = [];\nexport default {\n get (id) {\n return map[id];\n },\n set (id, node) {\n map[id] = node;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node-map.js","module.exports = function() {\n\treturn new Worker(__webpack_public_path__ + \"./dist/e375e330bcafe442dfca.js\");\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/worker-loader?name=./dist/[hash].[ext]!./src/diff-worker.js\n// module id = 15\n// module chunks = 0 1 2","import diff from './diff';\nimport patch from './patch';\n\nexport default function (opts = {}) {\n const { source, destination, done } = opts;\n if (done) {\n return diff({\n source,\n destination,\n done (instructions) {\n patch(instructions);\n done(instructions);\n }\n });\n }\n const instructions = diff(opts);\n patch(instructions);\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/merge.js","import * as types from './types';\nimport appendChild from './patch/append-child';\nimport removeAttribute from './patch/remove-attribute';\nimport removeChild from './patch/remove-child';\nimport replaceChild from './patch/replace-child';\nimport setAttribute from './patch/set-attribute';\nimport setEvent from './patch/set-event';\nimport textContent from './patch/text-content';\n\nconst patchers = {};\npatchers[types.APPEND_CHILD] = appendChild;\npatchers[types.REMOVE_ATTRIBUTE] = removeAttribute;\npatchers[types.REMOVE_CHILD] = removeChild;\npatchers[types.REPLACE_CHILD] = replaceChild;\npatchers[types.SET_ATTRIBUTE] = setAttribute;\npatchers[types.SET_EVENT] = setEvent;\npatchers[types.TEXT_CONTENT] = textContent;\n\nfunction patch (instruction) {\n patchers[instruction.type](\n instruction.source,\n instruction.destination,\n instruction.data\n );\n}\n\nexport default function (instructions) {\n instructions.forEach(patch);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch.js","import realNode from '../util/real-node';\nimport dom from '../vdom/dom';\n\nexport default function (src, dst) {\n realNode(src).appendChild(dom(dst));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/append-child.js","import { setAccessor } from '../util/accessor';\nimport eventMap from '../util/event-map';\nimport realNodeMap from '../util/real-node-map';\n\nconst { Node } = window;\n\nfunction createElement (el) {\n const realNode = document.createElement(el.tagName);\n const attributes = el.attributes;\n const events = el.events;\n const eventHandlers = eventMap(realNode);\n const children = el.childNodes;\n\n if (attributes) {\n const attributesLen = attributes.length;\n for (let a = 0; a < attributesLen; a++) {\n const attr = attributes[a];\n setAccessor(realNode, attr.name, attr.value);\n }\n }\n\n if (events) {\n for (let name in events) {\n realNode.addEventListener(name, eventHandlers[name] = events[name]);\n }\n }\n\n if (children) {\n const docfrag = document.createDocumentFragment();\n const childrenLen = children.length;\n\n for (let a = 0; a < childrenLen; a++) {\n const ch = children[a];\n ch && docfrag.appendChild(render(ch));\n }\n\n if (realNode.appendChild) {\n realNode.appendChild(docfrag);\n }\n }\n\n return realNode;\n}\n\nfunction createText (el) {\n return document.createTextNode(el.textContent);\n}\n\nexport default function render (el) {\n if (el instanceof Node) {\n return el;\n }\n if (Array.isArray(el)) {\n const frag = document.createDocumentFragment();\n el.forEach(item => frag.appendChild(render(item)));\n return frag;\n }\n const realNode = el.tagName ? createElement(el) : createText(el);\n realNodeMap.set(el.__id, realNode);\n return realNode;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/dom.js","import { removeAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n removeAccessor(realNode(src), data.name);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-attribute.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realDst = realNode(dst);\n const realSrc = realNode(src);\n\n // We don't do parentNode.removeChild because parentNode may report\n // incorrectly in some prollyfills since it's impossible (?) to spoof.\n realSrc.removeChild(realDst);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-child.js","import dom from '../vdom/dom';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realSrc = realNode(src);\n realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/replace-child.js","import { setAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n setAccessor(realNode(src), data.name, data.value);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-attribute.js","import eventMap from '../util/event-map';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n const realSrc = realNode(src);\n const eventHandlers = eventMap(realSrc);\n const name = data.name;\n const prevHandler = eventHandlers[name];\n const nextHandler = data.value;\n\n if (typeof prevHandler === 'function') {\n delete eventHandlers[name];\n realSrc.removeEventListener(name, prevHandler);\n }\n\n if (typeof nextHandler === 'function') {\n eventHandlers[name] = nextHandler;\n realSrc.addEventListener(name, nextHandler);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-event.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n realNode(src).textContent = dst.textContent;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/text-content.js","import WeakMap from './util/weak-map';\nimport createElement from './vdom/element';\nimport merge from './merge';\nimport mount from './vdom/mount';\n\nconst { Node } = window;\nconst oldTreeMap = new WeakMap();\n\nexport default function (render) {\n return function (elem, done) {\n elem = elem instanceof Node ? elem : this;\n\n if (!(elem instanceof Node)) {\n throw new Error('No node provided to diff renderer as either the first argument or the context.');\n }\n\n // Create a new element to house the new tree since we diff / mount fragments.\n const newTree = createElement('div', null, render(elem));\n const oldTree = oldTreeMap.get(elem);\n\n if (oldTree) {\n merge({\n destination: newTree,\n source: oldTree,\n done\n });\n } else {\n mount(elem, newTree.childNodes);\n if (typeof done === 'function') {\n done();\n }\n }\n\n oldTreeMap.set(elem, newTree);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/render.js","import { mapAccessor } from '../util/accessor';\nimport createTextNode from './text';\n\nfunction separateData (obj) {\n const attrs = {};\n const events = {};\n const node = {};\n let attrIdx = 0;\n\n for (let name in obj) {\n let value = obj[name];\n\n if (name.indexOf('on') === 0) {\n events[name.substring(2)] = value;\n } else {\n attrs[attrIdx++] = attrs[name] = { name, value };\n mapAccessor(node, name, value);\n }\n }\n\n attrs.length = attrIdx;\n return { attrs, events, node };\n}\n\nfunction ensureNodes (arr) {\n let out = [];\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n arr.filter(Boolean).forEach(function (item) {\n if (Array.isArray(item)) {\n out = out.concat(ensureNodes(item));\n } else if (typeof item === 'object') {\n out.push(translateFromReact(item));\n } else {\n out.push(createTextNode(item));\n }\n });\n return out;\n}\n\nfunction ensureTagName (name) {\n return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n}\n\nfunction isChildren (arg) {\n return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n}\n\nfunction isReactNode (item) {\n return item && item.type && item.props;\n}\n\nfunction translateFromReact (item) {\n if (isReactNode(item)) {\n const props = item.props;\n const chren = ensureNodes(props.children);\n delete props.children;\n return {\n nodeType: 1,\n tagName: item.type,\n attributes: props,\n childNodes: chren\n };\n }\n return item;\n}\n\nlet count = 0;\nexport default function element (name, attrs = {}, ...chren) {\n const isAttrsNode = isChildren(attrs);\n const data = separateData(isAttrsNode ? {} : attrs);\n const node = data.node;\n node.__id = ++count;\n node.nodeType = 1;\n node.tagName = ensureTagName(name);\n node.attributes = data.attrs;\n node.events = data.events;\n node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n return node;\n}\n\n// Add an array factory that returns an array of virtual nodes.\nelement.array = ensureNodes;\n\n// Generate built-in factories.\n[\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n].forEach(function (tag) {\n element[tag] = element.bind(null, tag);\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/element.js","export default function createTextNode (item) {\n return {\n nodeType: 3,\n textContent: item\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/text.js","import dom from './dom';\n\nfunction removeChildNodes (elem) {\n while (elem.firstChild) {\n const first = elem.firstChild;\n first.parentNode.removeChild(first);\n }\n}\n\nexport default function (elem, tree) {\n removeChildNodes(elem);\n elem.appendChild(dom(tree));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/mount.js","import dom from './dom';\nimport element from './element';\nimport mount from './mount';\nimport text from './text';\n\nexport default {\n dom,\n element,\n mount,\n text\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index-with-deps.min.js b/dist/index-with-deps.min.js index af7efff..c068e30 100644 --- a/dist/index-with-deps.min.js +++ b/dist/index-with-deps.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.skatejsDomDiff=t():e.skatejsDomDiff=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var u=n[r]={exports:{},id:r,loaded:!1};return e[r].call(u.exports,u,u.exports,t),u.loaded=!0,u.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function u(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(1),a=u(o),i=n(14),f=u(i),d=n(15),l=u(d),s=n(24),c=u(s),p=n(2),v=r(p),_=n(28),y=u(_),b=n(29),m=u(b);t.default={diff:a.default,merge:f.default,patch:l.default,render:c.default,types:v,vdom:y.default,version:m.default}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function o(e,t){var n=(0,l.default)(e,t);return n?n.concat(a({source:e,destination:t})):[{destination:t,source:e,type:f.REPLACE_CHILD}]}function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.source,n=e.destination;if(!t||!n)return[];for(var r=e.root?o(t,n):[],u=t.childNodes,a=n.childNodes,i=u?u.length:0,d=a?a.length:0,l=0;l1&&void 0!==arguments[1]?arguments[1]:{},n=i(t),r=u(n?{}:t),f=r.node;f.nodeType=1,f.tagName=a(e),f.attributes=r.attrs,f.events=r.events;for(var d=arguments.length,l=Array(d>2?d-2:0),s=2;s0&&void 0!==arguments[0]?arguments[0]:{},t=e.source,n=e.destination,r=e.done,o=r&&!(t instanceof l&&n instanceof l);return o?u(e):(0,i.default)(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o;var a=n(2),i=r(a),f=n(15),d=r(f),s=window,l=s.Node},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function o(e,t){var n=(0,s.default)(e,t);return n?n.concat(a({source:e,destination:t})):[{destination:t,source:e,type:f.REPLACE_CHILD}]}function a(e){var t=e.source,n=e.destination;if(!t||!n)return[];for(var r=e.root?o(t,n):[],u=t.childNodes,a=n.childNodes,i=u?u.length:0,d=a?a.length:0,s=0;s0&&void 0!==arguments[0]?arguments[0]:{},t=e.source,n=e.destination,r=e.done;if(r)return(0,o.default)({source:t,destination:n,done:function(e){(0,i.default)(e),r(e)}});var u=(0,o.default)(e);return(0,i.default)(u),u};var u=n(1),o=r(u),a=n(17),i=r(a)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function o(e){T[e.type](e.source,e.destination,e.data)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){e.forEach(o)};var a=n(3),i=u(a),f=n(18),d=r(f),s=n(20),l=r(s),c=n(21),p=r(c),v=n(22),_=r(v),y=n(23),b=r(y),m=n(24),h=r(m),M=n(25),E=r(M),T={};T[i.APPEND_CHILD]=d.default,T[i.REMOVE_ATTRIBUTE]=l.default,T[i.REMOVE_CHILD]=p.default,T[i.REPLACE_CHILD]=_.default,T[i.SET_ATTRIBUTE]=b.default,T[i.SET_EVENT]=h.default,T[i.TEXT_CONTENT]=E.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){(0,o.default)(e).appendChild((0,i.default)(t))};var u=n(13),o=r(u),a=n(19),i=r(a)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function u(e){var t=document.createElement(e.tagName),n=e.attributes,r=e.events,u=(0,s.default)(t),o=e.childNodes;if(n)for(var i=n.length,d=0;d1&&void 0!==arguments[1]?arguments[1]:{},n=i(t),r=u(n?{}:t),f=r.node;f.__id=++_,f.nodeType=1,f.tagName=a(e),f.attributes=r.attrs,f.events=r.events;for(var d=arguments.length,s=Array(d>2?d-2:0),l=2;l 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t\n\t var src = opts.source;\n\t var dst = opts.destination;\n\t\n\t if (!src || !dst) {\n\t return [];\n\t }\n\t\n\t var instructions = opts.root ? diffNode(src, dst) : [];\n\t\n\t var srcChs = src.childNodes;\n\t var dstChs = dst.childNodes;\n\t var srcChsLen = srcChs ? srcChs.length : 0;\n\t var dstChsLen = dstChs ? dstChs.length : 0;\n\t\n\t for (var a = 0; a < dstChsLen; a++) {\n\t var curSrc = srcChs[a];\n\t var curDst = dstChs[a];\n\t\n\t // If there is no matching destination node it means we need to remove the\n\t // current source node from the source.\n\t if (!curSrc) {\n\t instructions.push({\n\t destination: dstChs[a],\n\t source: src,\n\t type: types.APPEND_CHILD\n\t });\n\t continue;\n\t } else {\n\t // Ensure the real node is carried over even if the destination isn't used.\n\t // This is used in the render() function to keep track of the real node\n\t // that corresponds to a virtual node if a virtual tree is being used.\n\t if (!(curDst instanceof Node)) {\n\t _realNodeMap2.default.set(curDst, (0, _realNode2.default)(curSrc));\n\t }\n\t }\n\t\n\t instructions = instructions.concat(diffNode(curSrc, curDst));\n\t }\n\t\n\t if (dstChsLen < srcChsLen) {\n\t for (var _a = dstChsLen; _a < srcChsLen; _a++) {\n\t instructions.push({\n\t destination: srcChs[_a],\n\t source: src,\n\t type: types.REMOVE_CHILD\n\t });\n\t }\n\t }\n\t\n\t return instructions;\n\t}\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar APPEND_CHILD = exports.APPEND_CHILD = 1;\n\tvar REMOVE_CHILD = exports.REMOVE_CHILD = 2;\n\tvar REMOVE_ATTRIBUTE = exports.REMOVE_ATTRIBUTE = 3;\n\tvar REPLACE_CHILD = exports.REPLACE_CHILD = 4;\n\tvar SET_ATTRIBUTE = exports.SET_ATTRIBUTE = 5;\n\tvar SET_EVENT = exports.SET_EVENT = 6;\n\tvar SET_PROPERTY = exports.SET_PROPERTY = 7;\n\tvar TEXT_CONTENT = exports.TEXT_CONTENT = 8;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var dstType = void 0,\n\t srcType = void 0;\n\t\n\t if (!dst || !src) {\n\t return;\n\t }\n\t\n\t dstType = dst.nodeType;\n\t srcType = src.nodeType;\n\t\n\t if (dstType !== srcType) {\n\t return;\n\t } else if (dstType === NODE_ELEMENT) {\n\t return (0, _element2.default)(src, dst);\n\t } else if (dstType === NODE_TEXT) {\n\t return (0, _text2.default)(src, dst);\n\t } else if (dstType === NODE_COMMENT) {\n\t return (0, _comment2.default)(src, dst);\n\t }\n\t};\n\t\n\tvar _element = __webpack_require__(4);\n\t\n\tvar _element2 = _interopRequireDefault(_element);\n\t\n\tvar _text = __webpack_require__(10);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\t\n\tvar _comment = __webpack_require__(11);\n\t\n\tvar _comment2 = _interopRequireDefault(_comment);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar NODE_COMMENT = 8;\n\tvar NODE_ELEMENT = 1;\n\tvar NODE_TEXT = 3;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t if (src.tagName === dst.tagName) {\n\t return (0, _attributes2.default)(src, dst).concat((0, _events2.default)(src, dst));\n\t }\n\t};\n\t\n\tvar _attributes = __webpack_require__(5);\n\t\n\tvar _attributes2 = _interopRequireDefault(_attributes);\n\t\n\tvar _events = __webpack_require__(7);\n\t\n\tvar _events2 = _interopRequireDefault(_events);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var srcAttrs = src.attributes;\n\t var dstAttrs = dst.attributes;\n\t var srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n\t var dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n\t var instructions = [];\n\t\n\t // Bail early if possible.\n\t if (!srcAttrsLen && !dstAttrsLen) {\n\t return instructions;\n\t }\n\t\n\t // Merge attributes that exist in source with destination's.\n\t for (var a = 0; a < srcAttrsLen; a++) {\n\t var srcAttr = srcAttrs[a];\n\t var srcAttrName = srcAttr.name;\n\t var srcAttrValue = (0, _accessor.getAccessor)(src, srcAttrName);\n\t var dstAttr = dstAttrs[srcAttrName];\n\t var dstAttrValue = (0, _accessor.getAccessor)(dst, srcAttrName);\n\t\n\t if (!dstAttr) {\n\t instructions.push({\n\t data: { name: srcAttrName },\n\t destination: dst,\n\t source: src,\n\t type: types.REMOVE_ATTRIBUTE\n\t });\n\t } else if (srcAttrValue !== dstAttrValue) {\n\t instructions.push({\n\t data: { name: srcAttrName, value: dstAttrValue },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_ATTRIBUTE\n\t });\n\t }\n\t }\n\t\n\t // We only need to worry about setting attributes that don't already exist\n\t // in the source.\n\t for (var _a = 0; _a < dstAttrsLen; _a++) {\n\t var _dstAttr = dstAttrs[_a];\n\t var dstAttrName = _dstAttr.name;\n\t var _dstAttrValue = (0, _accessor.getAccessor)(dst, dstAttrName);\n\t var _srcAttr = srcAttrs[dstAttrName];\n\t\n\t if (!_srcAttr) {\n\t instructions.push({\n\t data: { name: dstAttrName, value: _dstAttrValue },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_ATTRIBUTE\n\t });\n\t }\n\t }\n\t\n\t return instructions;\n\t};\n\t\n\tvar _types = __webpack_require__(2);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _accessor = __webpack_require__(6);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.getAccessor = getAccessor;\n\texports.mapAccessor = mapAccessor;\n\texports.removeAccessor = removeAccessor;\n\texports.setAccessor = setAccessor;\n\tfunction classToString(obj) {\n\t if (typeof obj === 'string') {\n\t return obj;\n\t }\n\t\n\t if (Array.isArray(obj)) {\n\t return obj.join(' ');\n\t }\n\t\n\t return Object.keys(obj).filter(function (key) {\n\t return obj[key] ? key : false;\n\t }).join(' ');\n\t}\n\t\n\tfunction styleToString(obj) {\n\t if (typeof obj === 'string') {\n\t return obj;\n\t }\n\t\n\t return Object.keys(obj).map(function (key) {\n\t return key + ': ' + obj[key] + ';';\n\t }).join(' ');\n\t}\n\t\n\tfunction getAccessor(node, name) {\n\t if (name === 'class') {\n\t return node.className;\n\t } else if (name === 'style') {\n\t return node.style.cssText;\n\t // most things\n\t } else if (name !== 'type' && name in node) {\n\t return node[name];\n\t // real DOM elements\n\t } else if (node.getAttribute) {\n\t return node.getAttribute(name);\n\t // vDOM nodes\n\t } else if (node.attributes && node.attributes[name]) {\n\t return node.attributes[name].value;\n\t }\n\t}\n\t\n\tfunction mapAccessor(node, name, value) {\n\t if (name === 'class') {\n\t node.className = classToString(value);\n\t } else if (name === 'style') {\n\t node.style = { cssText: styleToString(value) };\n\t }\n\t}\n\t\n\tfunction removeAccessor(node, name) {\n\t if (name === 'class') {\n\t node.className = '';\n\t } else if (name === 'style') {\n\t node.style.cssText = '';\n\t // most things\n\t } else if (name !== 'type' && name in node) {\n\t node[name] = '';\n\t // real DOM elements\n\t } else if (node.removeAttribute) {\n\t node.removeAttribute(name);\n\t // vDOM nodes\n\t } else if (node.attributes) {\n\t delete node.attributes[name];\n\t }\n\t}\n\t\n\tfunction setAccessor(node, name, value) {\n\t if (name === 'class') {\n\t node.className = value;\n\t } else if (name === 'style') {\n\t node.style.cssText = value;\n\t // most things\n\t } else if (name !== 'type' && name in node || typeof value !== 'string') {\n\t // We check if it's undefined or null because IE throws \"invalid argument\"\n\t // errors for some types of properties. Essentially this is the same as\n\t // removing the accessor.\n\t node[name] = value == null ? '' : value;\n\t // real DOM elements\n\t } else if (node.setAttribute) {\n\t node.setAttribute(name, value);\n\t // vDOM nodes\n\t } else if (node.attributes) {\n\t node.attributes[node.attributes.length] = node.attributes[name] = { name: name, value: value };\n\t }\n\t}\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var dstEvents = dst.events;\n\t var srcEvents = (0, _eventMap2.default)(src);\n\t var instructions = [];\n\t\n\t // Remove any source events that aren't in the destination before seeing if\n\t // we need to add any from the destination.\n\t if (srcEvents) {\n\t for (var name in srcEvents) {\n\t if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n\t instructions.push({\n\t data: { name: name, value: undefined },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_EVENT\n\t });\n\t }\n\t }\n\t }\n\t\n\t // After instructing to remove any old events, we then can instruct to add\n\t // new events. This prevents the new events from being removed from earlier\n\t // instructions.\n\t if (dstEvents) {\n\t for (var _name in dstEvents) {\n\t var value = dstEvents[_name];\n\t if (srcEvents[_name] !== value) {\n\t instructions.push({\n\t data: { name: _name, value: value },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_EVENT\n\t });\n\t }\n\t }\n\t }\n\t\n\t return instructions;\n\t};\n\t\n\tvar _types = __webpack_require__(2);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _eventMap = __webpack_require__(8);\n\t\n\tvar _eventMap2 = _interopRequireDefault(_eventMap);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (elem) {\n\t var events = map.get(elem);\n\t events || map.set(elem, events = {});\n\t return events;\n\t};\n\t\n\tvar _weakMap = __webpack_require__(9);\n\t\n\tvar _weakMap2 = _interopRequireDefault(_weakMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar map = new _weakMap2.default();\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t// Because weak map polyfills either are too big or don't use native if\n\t// available properly.\n\t\n\tvar index = 0;\n\tvar prefix = '__WEAK_MAP_POLYFILL_';\n\t\n\texports.default = function () {\n\t if (typeof WeakMap !== 'undefined') {\n\t return WeakMap;\n\t }\n\t\n\t function Polyfill() {\n\t this.key = prefix + index;\n\t ++index;\n\t }\n\t\n\t Polyfill.prototype = {\n\t get: function get(obj) {\n\t return obj[this.key];\n\t },\n\t set: function set(obj, val) {\n\t obj[this.key] = val;\n\t }\n\t };\n\t\n\t return Polyfill;\n\t}();\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t if (src.textContent === dst.textContent) {\n\t return [];\n\t }\n\t\n\t return [{\n\t destination: dst,\n\t source: src,\n\t type: types.TEXT_CONTENT\n\t }];\n\t};\n\t\n\tvar _types = __webpack_require__(2);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _text = __webpack_require__(10);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\texports.default = _text2.default;\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (node) {\n\t return node instanceof Node ? node : _realNodeMap2.default.get(node);\n\t};\n\t\n\tvar _realNodeMap = __webpack_require__(13);\n\t\n\tvar _realNodeMap2 = _interopRequireDefault(_realNodeMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _window = window,\n\t Node = _window.Node;\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _weakMap = __webpack_require__(9);\n\t\n\tvar _weakMap2 = _interopRequireDefault(_weakMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = new _weakMap2.default();\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (opts) {\n\t var inst = (0, _diff2.default)(opts);\n\t (0, _patch2.default)(inst);\n\t return inst;\n\t};\n\t\n\tvar _diff = __webpack_require__(1);\n\t\n\tvar _diff2 = _interopRequireDefault(_diff);\n\t\n\tvar _patch = __webpack_require__(15);\n\t\n\tvar _patch2 = _interopRequireDefault(_patch);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (instructions) {\n\t instructions.forEach(patch);\n\t};\n\t\n\tvar _types = __webpack_require__(2);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _appendChild = __webpack_require__(16);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _removeAttribute = __webpack_require__(18);\n\t\n\tvar _removeAttribute2 = _interopRequireDefault(_removeAttribute);\n\t\n\tvar _removeChild = __webpack_require__(19);\n\t\n\tvar _removeChild2 = _interopRequireDefault(_removeChild);\n\t\n\tvar _replaceChild = __webpack_require__(20);\n\t\n\tvar _replaceChild2 = _interopRequireDefault(_replaceChild);\n\t\n\tvar _setAttribute = __webpack_require__(21);\n\t\n\tvar _setAttribute2 = _interopRequireDefault(_setAttribute);\n\t\n\tvar _setEvent = __webpack_require__(22);\n\t\n\tvar _setEvent2 = _interopRequireDefault(_setEvent);\n\t\n\tvar _textContent = __webpack_require__(23);\n\t\n\tvar _textContent2 = _interopRequireDefault(_textContent);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tvar patchers = {};\n\tpatchers[types.APPEND_CHILD] = _appendChild2.default;\n\tpatchers[types.REMOVE_ATTRIBUTE] = _removeAttribute2.default;\n\tpatchers[types.REMOVE_CHILD] = _removeChild2.default;\n\tpatchers[types.REPLACE_CHILD] = _replaceChild2.default;\n\tpatchers[types.SET_ATTRIBUTE] = _setAttribute2.default;\n\tpatchers[types.SET_EVENT] = _setEvent2.default;\n\tpatchers[types.TEXT_CONTENT] = _textContent2.default;\n\t\n\tfunction patch(instruction) {\n\t patchers[instruction.type](instruction.source, instruction.destination, instruction.data);\n\t}\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t (0, _realNode2.default)(src).appendChild((0, _dom2.default)(dst));\n\t};\n\t\n\tvar _realNode = __webpack_require__(12);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\t\n\tvar _dom = __webpack_require__(17);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\texports.default = render;\n\t\n\tvar _accessor = __webpack_require__(6);\n\t\n\tvar _eventMap = __webpack_require__(8);\n\t\n\tvar _eventMap2 = _interopRequireDefault(_eventMap);\n\t\n\tvar _realNodeMap = __webpack_require__(13);\n\t\n\tvar _realNodeMap2 = _interopRequireDefault(_realNodeMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _window = window,\n\t Node = _window.Node;\n\t\n\t\n\tfunction createElement(el) {\n\t var realNode = document.createElement(el.tagName);\n\t var attributes = el.attributes;\n\t var events = el.events;\n\t var eventHandlers = (0, _eventMap2.default)(realNode);\n\t var children = el.childNodes;\n\t\n\t if (attributes) {\n\t var attributesLen = attributes.length;\n\t for (var a = 0; a < attributesLen; a++) {\n\t var attr = attributes[a];\n\t (0, _accessor.setAccessor)(realNode, attr.name, attr.value);\n\t }\n\t }\n\t\n\t if (events) {\n\t for (var name in events) {\n\t realNode.addEventListener(name, eventHandlers[name] = events[name]);\n\t }\n\t }\n\t\n\t if (children) {\n\t var docfrag = document.createDocumentFragment();\n\t var childrenLen = children.length;\n\t\n\t for (var _a = 0; _a < childrenLen; _a++) {\n\t var ch = children[_a];\n\t ch && docfrag.appendChild(render(ch));\n\t }\n\t\n\t if (realNode.appendChild) {\n\t realNode.appendChild(docfrag);\n\t }\n\t }\n\t\n\t return realNode;\n\t}\n\t\n\tfunction createText(el) {\n\t return document.createTextNode(el.textContent);\n\t}\n\t\n\tfunction render(el) {\n\t if (el instanceof Node) {\n\t return el;\n\t }\n\t if (Array.isArray(el)) {\n\t var _ret = function () {\n\t var frag = document.createDocumentFragment();\n\t el.forEach(function (item) {\n\t return frag.appendChild(render(item));\n\t });\n\t return {\n\t v: frag\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t var realNode = el.tagName ? createElement(el) : createText(el);\n\t _realNodeMap2.default.set(el, realNode);\n\t return realNode;\n\t}\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst, data) {\n\t (0, _accessor.removeAccessor)((0, _realNode2.default)(src), data.name);\n\t};\n\t\n\tvar _accessor = __webpack_require__(6);\n\t\n\tvar _realNode = __webpack_require__(12);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var realDst = (0, _realNode2.default)(dst);\n\t var realSrc = (0, _realNode2.default)(src);\n\t\n\t // We don't do parentNode.removeChild because parentNode may report\n\t // incorrectly in some prollyfills since it's impossible (?) to spoof.\n\t realSrc.removeChild(realDst);\n\t};\n\t\n\tvar _realNode = __webpack_require__(12);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var realSrc = (0, _realNode2.default)(src);\n\t realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild((0, _dom2.default)(dst), realSrc);\n\t};\n\t\n\tvar _dom = __webpack_require__(17);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _realNode = __webpack_require__(12);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst, data) {\n\t (0, _accessor.setAccessor)((0, _realNode2.default)(src), data.name, data.value);\n\t};\n\t\n\tvar _accessor = __webpack_require__(6);\n\t\n\tvar _realNode = __webpack_require__(12);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst, data) {\n\t var realSrc = (0, _realNode2.default)(src);\n\t var eventHandlers = (0, _eventMap2.default)(realSrc);\n\t var name = data.name;\n\t var prevHandler = eventHandlers[name];\n\t var nextHandler = data.value;\n\t\n\t if (typeof prevHandler === 'function') {\n\t delete eventHandlers[name];\n\t realSrc.removeEventListener(name, prevHandler);\n\t }\n\t\n\t if (typeof nextHandler === 'function') {\n\t eventHandlers[name] = nextHandler;\n\t realSrc.addEventListener(name, nextHandler);\n\t }\n\t};\n\t\n\tvar _eventMap = __webpack_require__(8);\n\t\n\tvar _eventMap2 = _interopRequireDefault(_eventMap);\n\t\n\tvar _realNode = __webpack_require__(12);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t (0, _realNode2.default)(src).textContent = dst.textContent;\n\t};\n\t\n\tvar _realNode = __webpack_require__(12);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (render) {\n\t return function (elem) {\n\t elem = elem instanceof Node ? elem : this;\n\t\n\t if (!(elem instanceof Node)) {\n\t throw new Error('No node provided to diff renderer as either the first argument or the context.');\n\t }\n\t\n\t // Create a new element to house the new tree since we diff / mount fragments.\n\t var newTree = (0, _element2.default)('div', null, render(elem));\n\t var oldTree = oldTreeMap.get(elem);\n\t\n\t if (oldTree) {\n\t (0, _merge2.default)({\n\t destination: newTree,\n\t source: oldTree\n\t });\n\t } else {\n\t (0, _mount2.default)(elem, newTree.childNodes);\n\t }\n\t\n\t oldTreeMap.set(elem, newTree);\n\t };\n\t};\n\t\n\tvar _weakMap = __webpack_require__(9);\n\t\n\tvar _weakMap2 = _interopRequireDefault(_weakMap);\n\t\n\tvar _element = __webpack_require__(25);\n\t\n\tvar _element2 = _interopRequireDefault(_element);\n\t\n\tvar _merge = __webpack_require__(14);\n\t\n\tvar _merge2 = _interopRequireDefault(_merge);\n\t\n\tvar _mount = __webpack_require__(27);\n\t\n\tvar _mount2 = _interopRequireDefault(_mount);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _window = window,\n\t Node = _window.Node;\n\t\n\tvar oldTreeMap = new _weakMap2.default();\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\texports.default = element;\n\t\n\tvar _accessor = __webpack_require__(6);\n\t\n\tvar _text = __webpack_require__(26);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction separateData(obj) {\n\t var attrs = {};\n\t var events = {};\n\t var node = {};\n\t var attrIdx = 0;\n\t\n\t for (var name in obj) {\n\t var value = obj[name];\n\t\n\t if (name.indexOf('on') === 0) {\n\t events[name.substring(2)] = value;\n\t } else {\n\t attrs[attrIdx++] = attrs[name] = { name: name, value: value };\n\t (0, _accessor.mapAccessor)(node, name, value);\n\t }\n\t }\n\t\n\t attrs.length = attrIdx;\n\t return { attrs: attrs, events: events, node: node };\n\t}\n\t\n\tfunction ensureNodes(arr) {\n\t var out = [];\n\t if (!Array.isArray(arr)) {\n\t arr = [arr];\n\t }\n\t arr.filter(Boolean).forEach(function (item) {\n\t if (Array.isArray(item)) {\n\t out = out.concat(ensureNodes(item));\n\t } else if ((typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object') {\n\t out.push(translateFromReact(item));\n\t } else {\n\t out.push((0, _text2.default)(item));\n\t }\n\t });\n\t return out;\n\t}\n\t\n\tfunction ensureTagName(name) {\n\t return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n\t}\n\t\n\tfunction isChildren(arg) {\n\t return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n\t}\n\t\n\tfunction isReactNode(item) {\n\t return item && item.type && item.props;\n\t}\n\t\n\tfunction translateFromReact(item) {\n\t if (isReactNode(item)) {\n\t var props = item.props;\n\t var chren = ensureNodes(props.children);\n\t delete props.children;\n\t return {\n\t nodeType: 1,\n\t tagName: item.type,\n\t attributes: props,\n\t childNodes: chren\n\t };\n\t }\n\t return item;\n\t}\n\t\n\tfunction element(name) {\n\t var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\n\t var isAttrsNode = isChildren(attrs);\n\t var data = separateData(isAttrsNode ? {} : attrs);\n\t var node = data.node;\n\t node.nodeType = 1;\n\t node.tagName = ensureTagName(name);\n\t node.attributes = data.attrs;\n\t node.events = data.events;\n\t\n\t for (var _len = arguments.length, chren = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t chren[_key - 2] = arguments[_key];\n\t }\n\t\n\t node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n\t return node;\n\t}\n\t\n\t// Add an array factory that returns an array of virtual nodes.\n\telement.array = ensureNodes;\n\t\n\t// Generate built-in factories.\n\t['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'bgsound', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'command', 'content', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'element', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'image', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'multicol', 'nav', 'nobr', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'rtc', 'ruby', 's', 'samp', 'script', 'section', 'select', 'shadow', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr'].forEach(function (tag) {\n\t element[tag] = element.bind(null, tag);\n\t});\n\n/***/ },\n/* 26 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = createTextNode;\n\tfunction createTextNode(item) {\n\t return {\n\t nodeType: 3,\n\t textContent: item\n\t };\n\t}\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (elem, tree) {\n\t removeChildNodes(elem);\n\t elem.appendChild((0, _dom2.default)(tree));\n\t};\n\t\n\tvar _dom = __webpack_require__(17);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction removeChildNodes(elem) {\n\t while (elem.firstChild) {\n\t var first = elem.firstChild;\n\t first.parentNode.removeChild(first);\n\t }\n\t}\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _dom = __webpack_require__(17);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _element = __webpack_require__(25);\n\t\n\tvar _element2 = _interopRequireDefault(_element);\n\t\n\tvar _mount = __webpack_require__(27);\n\t\n\tvar _mount2 = _interopRequireDefault(_mount);\n\t\n\tvar _text = __webpack_require__(26);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t dom: _dom2.default,\n\t element: _element2.default,\n\t mount: _mount2.default,\n\t text: _text2.default\n\t};\n\n/***/ },\n/* 29 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = '0.3.1';\n\n/***/ }\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// dist/index-with-deps.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6cd9c7bc46b0e4ca004f","import diff from './diff';\nimport merge from './merge';\nimport patch from './patch';\nimport render from './render';\nimport * as types from './types';\nimport vdom from './vdom';\nimport version from './version';\n\nexport default {\n diff,\n merge,\n patch,\n render,\n types,\n vdom,\n version\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","import * as types from './types';\nimport compareNode from './compare/node';\nimport realNode from './util/real-node';\nimport realNodeMap from './util/real-node-map';\n\nconst { Node } = window;\n\nfunction diffNode (source, destination) {\n let nodeInstructions = compareNode(source, destination);\n\n // If there are instructions (even an empty array) it means the node can be\n // diffed and doesn't have to be replaced. If the instructions are falsy\n // it means that the nodes are not similar (cannot be changed) and must be\n // replaced instead.\n if (nodeInstructions) {\n return nodeInstructions.concat(diff({ source, destination }));\n }\n\n return [{\n destination,\n source,\n type: types.REPLACE_CHILD\n }];\n}\n\nexport default function diff (opts = {}) {\n const src = opts.source;\n const dst = opts.destination;\n\n if (!src || !dst) {\n return [];\n }\n\n let instructions = opts.root ? diffNode(src, dst) : [];\n\n const srcChs = src.childNodes;\n const dstChs = dst.childNodes;\n const srcChsLen = srcChs ? srcChs.length : 0;\n const dstChsLen = dstChs ? dstChs.length : 0;\n\n for (let a = 0; a < dstChsLen; a++) {\n const curSrc = srcChs[a];\n const curDst = dstChs[a];\n\n // If there is no matching destination node it means we need to remove the\n // current source node from the source.\n if (!curSrc) {\n instructions.push({\n destination: dstChs[a],\n source: src,\n type: types.APPEND_CHILD\n });\n continue;\n } else {\n // Ensure the real node is carried over even if the destination isn't used.\n // This is used in the render() function to keep track of the real node\n // that corresponds to a virtual node if a virtual tree is being used.\n if (!(curDst instanceof Node)) {\n realNodeMap.set(curDst, realNode(curSrc));\n }\n }\n\n instructions = instructions.concat(diffNode(curSrc, curDst));\n }\n\n if (dstChsLen < srcChsLen) {\n for (let a = dstChsLen; a < srcChsLen; a++) {\n instructions.push({\n destination: srcChs[a],\n source: src,\n type: types.REMOVE_CHILD\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff.js","export const APPEND_CHILD = 1;\nexport const REMOVE_CHILD = 2;\nexport const REMOVE_ATTRIBUTE = 3;\nexport const REPLACE_CHILD = 4;\nexport const SET_ATTRIBUTE = 5;\nexport const SET_EVENT = 6;\nexport const SET_PROPERTY = 7;\nexport const TEXT_CONTENT = 8;\n\n\n\n// WEBPACK FOOTER //\n// ./src/types.js","import compareElement from './element';\nimport compareText from './text';\nimport compareComment from './comment';\n\nconst NODE_COMMENT = 8;\nconst NODE_ELEMENT = 1;\nconst NODE_TEXT = 3;\n\nexport default function (src, dst) {\n let dstType, srcType;\n\n if (!dst || !src) {\n return;\n }\n\n dstType = dst.nodeType;\n srcType = src.nodeType;\n\n if (dstType !== srcType) {\n return;\n } else if (dstType === NODE_ELEMENT) {\n return compareElement(src, dst);\n } else if (dstType === NODE_TEXT) {\n return compareText(src, dst);\n } else if (dstType === NODE_COMMENT) {\n return compareComment(src, dst);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/node.js","import compareAttributes from './attributes';\nimport compareEvents from './events';\n\nexport default function (src, dst) {\n if (src.tagName === dst.tagName) {\n return compareAttributes(src, dst).concat(compareEvents(src, dst));\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/element.js","import * as types from '../types';\nimport { getAccessor } from '../util/accessor';\n\nexport default function (src, dst) {\n let srcAttrs = src.attributes;\n let dstAttrs = dst.attributes;\n let srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n let dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n let instructions = [];\n\n // Bail early if possible.\n if (!srcAttrsLen && !dstAttrsLen) {\n return instructions;\n }\n\n // Merge attributes that exist in source with destination's.\n for (let a = 0; a < srcAttrsLen; a++) {\n const srcAttr = srcAttrs[a];\n const srcAttrName = srcAttr.name;\n const srcAttrValue = getAccessor(src, srcAttrName);\n const dstAttr = dstAttrs[srcAttrName];\n const dstAttrValue = getAccessor(dst, srcAttrName);\n\n if (!dstAttr) {\n instructions.push({\n data: { name: srcAttrName },\n destination: dst,\n source: src,\n type: types.REMOVE_ATTRIBUTE\n });\n } else if (srcAttrValue !== dstAttrValue) {\n instructions.push({\n data: { name: srcAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n // We only need to worry about setting attributes that don't already exist\n // in the source.\n for (let a = 0; a < dstAttrsLen; a++) {\n const dstAttr = dstAttrs[a];\n const dstAttrName = dstAttr.name;\n const dstAttrValue = getAccessor(dst, dstAttrName);\n const srcAttr = srcAttrs[dstAttrName];\n\n if (!srcAttr) {\n instructions.push({\n data: { name: dstAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/attributes.js","function classToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.join(' ');\n }\n\n return Object.keys(obj).filter(function (key) {\n return obj[key] ? key : false;\n }).join(' ');\n}\n\nfunction styleToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n return Object.keys(obj).map(function (key) {\n return `${key}: ${obj[key]};`;\n }).join(' ');\n}\n\nexport function getAccessor (node, name) {\n if (name === 'class') {\n return node.className;\n } else if (name === 'style') {\n return node.style.cssText;\n // most things\n } else if (name !== 'type' && name in node) {\n return node[name];\n // real DOM elements\n } else if (node.getAttribute) {\n return node.getAttribute(name);\n // vDOM nodes\n } else if (node.attributes && node.attributes[name]) {\n return node.attributes[name].value;\n }\n}\n\nexport function mapAccessor (node, name, value) {\n if (name === 'class') {\n node.className = classToString(value);\n } else if (name === 'style') {\n node.style = { cssText: styleToString(value) };\n }\n}\n\nexport function removeAccessor (node, name) {\n if (name === 'class') {\n node.className = '';\n } else if (name === 'style') {\n node.style.cssText = '';\n // most things\n } else if (name !== 'type' && name in node) {\n node[name] = '';\n // real DOM elements\n } else if (node.removeAttribute) {\n node.removeAttribute(name);\n // vDOM nodes\n } else if (node.attributes) {\n delete node.attributes[name];\n }\n}\n\nexport function setAccessor (node, name, value) {\n if (name === 'class') {\n node.className = value;\n } else if (name === 'style') {\n node.style.cssText = value;\n // most things\n } else if (name !== 'type' && name in node || typeof value !== 'string') {\n // We check if it's undefined or null because IE throws \"invalid argument\"\n // errors for some types of properties. Essentially this is the same as\n // removing the accessor.\n node[name] = value == null ? '' : value;\n // real DOM elements\n } else if (node.setAttribute) {\n node.setAttribute(name, value);\n // vDOM nodes\n } else if (node.attributes) {\n node.attributes[node.attributes.length] = node.attributes[name] = { name, value };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/accessor.js","import * as types from '../types';\nimport eventMap from '../util/event-map';\n\nexport default function (src, dst) {\n const dstEvents = dst.events;\n const srcEvents = eventMap(src);\n const instructions = [];\n\n // Remove any source events that aren't in the destination before seeing if\n // we need to add any from the destination.\n if (srcEvents) {\n for (let name in srcEvents) {\n if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n instructions.push({\n data: { name, value: undefined },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n // After instructing to remove any old events, we then can instruct to add\n // new events. This prevents the new events from being removed from earlier\n // instructions.\n if (dstEvents) {\n for (let name in dstEvents) {\n const value = dstEvents[name];\n if (srcEvents[name] !== value) {\n instructions.push({\n data: { name, value },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/events.js","import WeakMap from './weak-map';\n\nconst map = new WeakMap();\n\nexport default function (elem) {\n let events = map.get(elem);\n events || map.set(elem, events = {});\n return events;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/event-map.js","// Because weak map polyfills either are too big or don't use native if\n// available properly.\n\nlet index = 0;\nconst prefix = '__WEAK_MAP_POLYFILL_';\n\nexport default (function () {\n if (typeof WeakMap !== 'undefined') {\n return WeakMap;\n }\n\n function Polyfill () {\n this.key = prefix + index;\n ++index;\n }\n\n Polyfill.prototype = {\n get (obj) {\n return obj[this.key];\n },\n set (obj, val) {\n obj[this.key] = val;\n }\n };\n\n return Polyfill;\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/weak-map.js","import * as types from '../types';\n\nexport default function (src, dst) {\n if (src.textContent === dst.textContent) {\n return [];\n }\n\n return [{\n destination: dst,\n source: src,\n type: types.TEXT_CONTENT\n }];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/text.js","import text from './text';\nexport default text;\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/comment.js","import realNodeMap from './real-node-map';\n\nconst { Node } = window;\n\nexport default function (node) {\n return node instanceof Node ? node : realNodeMap.get(node);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node.js","import WeakMap from './weak-map';\nexport default new WeakMap();\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node-map.js","import diff from './diff';\nimport patch from './patch';\n\nexport default function (opts) {\n var inst = diff(opts);\n patch(inst);\n return inst;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/merge.js","import * as types from './types';\nimport appendChild from './patch/append-child';\nimport removeAttribute from './patch/remove-attribute';\nimport removeChild from './patch/remove-child';\nimport replaceChild from './patch/replace-child';\nimport setAttribute from './patch/set-attribute';\nimport setEvent from './patch/set-event';\nimport textContent from './patch/text-content';\n\nconst patchers = {};\npatchers[types.APPEND_CHILD] = appendChild;\npatchers[types.REMOVE_ATTRIBUTE] = removeAttribute;\npatchers[types.REMOVE_CHILD] = removeChild;\npatchers[types.REPLACE_CHILD] = replaceChild;\npatchers[types.SET_ATTRIBUTE] = setAttribute;\npatchers[types.SET_EVENT] = setEvent;\npatchers[types.TEXT_CONTENT] = textContent;\n\nfunction patch (instruction) {\n patchers[instruction.type](\n instruction.source,\n instruction.destination,\n instruction.data\n );\n}\n\nexport default function (instructions) {\n instructions.forEach(patch);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch.js","import realNode from '../util/real-node';\nimport dom from '../vdom/dom';\n\nexport default function (src, dst) {\n realNode(src).appendChild(dom(dst));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/append-child.js","import { setAccessor } from '../util/accessor';\nimport eventMap from '../util/event-map';\nimport realNodeMap from '../util/real-node-map';\n\nconst { Node } = window;\n\nfunction createElement (el) {\n const realNode = document.createElement(el.tagName);\n const attributes = el.attributes;\n const events = el.events;\n const eventHandlers = eventMap(realNode);\n const children = el.childNodes;\n\n if (attributes) {\n const attributesLen = attributes.length;\n for (let a = 0; a < attributesLen; a++) {\n const attr = attributes[a];\n setAccessor(realNode, attr.name, attr.value);\n }\n }\n\n if (events) {\n for (let name in events) {\n realNode.addEventListener(name, eventHandlers[name] = events[name]);\n }\n }\n\n if (children) {\n const docfrag = document.createDocumentFragment();\n const childrenLen = children.length;\n\n for (let a = 0; a < childrenLen; a++) {\n const ch = children[a];\n ch && docfrag.appendChild(render(ch));\n }\n\n if (realNode.appendChild) {\n realNode.appendChild(docfrag);\n }\n }\n\n return realNode;\n}\n\nfunction createText (el) {\n return document.createTextNode(el.textContent);\n}\n\nexport default function render (el) {\n if (el instanceof Node) {\n return el;\n }\n if (Array.isArray(el)) {\n const frag = document.createDocumentFragment();\n el.forEach(item => frag.appendChild(render(item)));\n return frag;\n }\n const realNode = el.tagName ? createElement(el) : createText(el);\n realNodeMap.set(el, realNode);\n return realNode;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/dom.js","import { removeAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n removeAccessor(realNode(src), data.name);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-attribute.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realDst = realNode(dst);\n const realSrc = realNode(src);\n\n // We don't do parentNode.removeChild because parentNode may report\n // incorrectly in some prollyfills since it's impossible (?) to spoof.\n realSrc.removeChild(realDst);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-child.js","import dom from '../vdom/dom';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realSrc = realNode(src);\n realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/replace-child.js","import { setAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n setAccessor(realNode(src), data.name, data.value);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-attribute.js","import eventMap from '../util/event-map';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n const realSrc = realNode(src);\n const eventHandlers = eventMap(realSrc);\n const name = data.name;\n const prevHandler = eventHandlers[name];\n const nextHandler = data.value;\n\n if (typeof prevHandler === 'function') {\n delete eventHandlers[name];\n realSrc.removeEventListener(name, prevHandler);\n }\n\n if (typeof nextHandler === 'function') {\n eventHandlers[name] = nextHandler;\n realSrc.addEventListener(name, nextHandler);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-event.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n realNode(src).textContent = dst.textContent;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/text-content.js","import WeakMap from './util/weak-map';\nimport createElement from './vdom/element';\nimport merge from './merge';\nimport mount from './vdom/mount';\n\nconst { Node } = window;\nconst oldTreeMap = new WeakMap();\n\nexport default function (render) {\n return function (elem) {\n elem = elem instanceof Node ? elem : this;\n\n if (!(elem instanceof Node)) {\n throw new Error('No node provided to diff renderer as either the first argument or the context.');\n }\n\n // Create a new element to house the new tree since we diff / mount fragments.\n const newTree = createElement('div', null, render(elem));\n const oldTree = oldTreeMap.get(elem);\n\n if (oldTree) {\n merge({\n destination: newTree,\n source: oldTree\n });\n } else {\n mount(elem, newTree.childNodes);\n }\n\n oldTreeMap.set(elem, newTree);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/render.js","import { mapAccessor } from '../util/accessor';\nimport createTextNode from './text';\n\nfunction separateData (obj) {\n const attrs = {};\n const events = {};\n const node = {};\n let attrIdx = 0;\n\n for (let name in obj) {\n let value = obj[name];\n\n if (name.indexOf('on') === 0) {\n events[name.substring(2)] = value;\n } else {\n attrs[attrIdx++] = attrs[name] = { name, value };\n mapAccessor(node, name, value);\n }\n }\n\n attrs.length = attrIdx;\n return { attrs, events, node };\n}\n\nfunction ensureNodes (arr) {\n let out = [];\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n arr.filter(Boolean).forEach(function (item) {\n if (Array.isArray(item)) {\n out = out.concat(ensureNodes(item));\n } else if (typeof item === 'object') {\n out.push(translateFromReact(item));\n } else {\n out.push(createTextNode(item));\n }\n });\n return out;\n}\n\nfunction ensureTagName (name) {\n return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n}\n\nfunction isChildren (arg) {\n return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n}\n\nfunction isReactNode (item) {\n return item && item.type && item.props;\n}\n\nfunction translateFromReact (item) {\n if (isReactNode(item)) {\n const props = item.props;\n const chren = ensureNodes(props.children);\n delete props.children;\n return {\n nodeType: 1,\n tagName: item.type,\n attributes: props,\n childNodes: chren\n };\n }\n return item;\n}\n\nexport default function element (name, attrs = {}, ...chren) {\n const isAttrsNode = isChildren(attrs);\n const data = separateData(isAttrsNode ? {} : attrs);\n const node = data.node;\n node.nodeType = 1;\n node.tagName = ensureTagName(name);\n node.attributes = data.attrs;\n node.events = data.events;\n node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n return node;\n}\n\n// Add an array factory that returns an array of virtual nodes.\nelement.array = ensureNodes;\n\n// Generate built-in factories.\n[\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n].forEach(function (tag) {\n element[tag] = element.bind(null, tag);\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/element.js","export default function createTextNode (item) {\n return {\n nodeType: 3,\n textContent: item\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/text.js","import dom from './dom';\n\nfunction removeChildNodes (elem) {\n while (elem.firstChild) {\n const first = elem.firstChild;\n first.parentNode.removeChild(first);\n }\n}\n\nexport default function (elem, tree) {\n removeChildNodes(elem);\n elem.appendChild(dom(tree));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/mount.js","import dom from './dom';\nimport element from './element';\nimport mount from './mount';\nimport text from './text';\n\nexport default {\n dom,\n element,\n mount,\n text\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/index.js","export default '0.3.1';\n\n\n\n// WEBPACK FOOTER //\n// ./src/version.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition?5ca6","webpack:///dist/index-with-deps.min.js","webpack:///webpack/bootstrap bef7b4dc7aa6ac50b1d3?db22","webpack:///./src/index.js?9552","webpack:///./src/diff.js?4612","webpack:///./src/diff-main.js?16b3","webpack:///./src/types.js?89a8","webpack:///./src/compare/node.js?0f2c","webpack:///./src/compare/element.js?63c7","webpack:///./src/compare/attributes.js?e06f","webpack:///./src/util/accessor.js?6f18","webpack:///./src/compare/events.js?9be8","webpack:///./src/util/event-map.js?394d","webpack:///./src/util/weak-map.js?af0a","webpack:///./src/compare/text.js?133f","webpack:///./src/compare/comment.js?fd99","webpack:///./src/util/real-node.js?d2ef","webpack:///./src/util/real-node-map.js?b512","webpack:///./src/diff-worker.js?7b56","webpack:///./src/merge.js?bc4e","webpack:///./src/patch.js?2cda","webpack:///./src/patch/append-child.js?377e","webpack:///./src/vdom/dom.js?c020","webpack:///./src/patch/remove-attribute.js?a79b","webpack:///./src/patch/remove-child.js?2db5","webpack:///./src/patch/replace-child.js?1a46","webpack:///./src/patch/set-attribute.js?7dea","webpack:///./src/patch/set-event.js?5a95","webpack:///./src/patch/text-content.js?ee21","webpack:///./src/render.js?4858","webpack:///./src/vdom/element.js?56d5","webpack:///./src/vdom/text.js?6b59","webpack:///./src/vdom/mount.js?daf2","webpack:///./src/vdom/index.js?d93d"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireWildcard","obj","__esModule","newObj","key","Object","prototype","hasOwnProperty","default","_interopRequireDefault","defineProperty","value","_diff","_diff2","_merge","_merge2","_patch","_patch2","_render","_render2","_types","types","_vdom","_vdom2","diff","merge","patch","render","vdom","diffWorker","opts","worker","_diffWorker2","done","addEventListener","e","data","postMessage","arguments","length","undefined","source","destination","canDiffInWorker","Node","_diffMain2","_diffMain","_diffWorker","_window","window","diffNode","nodeInstructions","_node2","concat","type","REPLACE_CHILD","src","dst","instructions","srcChs","childNodes","dstChs","srcChsLen","dstChsLen","a","curSrc","curDst","__id","_realNodeMap2","set","_realNode2","push","APPEND_CHILD","REMOVE_CHILD","_node","_realNode","_realNodeMap","REMOVE_ATTRIBUTE","SET_ATTRIBUTE","SET_EVENT","SET_PROPERTY","TEXT_CONTENT","dstType","srcType","nodeType","NODE_ELEMENT","_element2","NODE_TEXT","_text2","NODE_COMMENT","_comment2","_element","_text","_comment","tagName","_attributes2","_events2","_attributes","_events","srcAttrs","attributes","dstAttrs","srcAttrsLen","dstAttrsLen","srcAttr","srcAttrName","name","srcAttrValue","_accessor","getAccessor","dstAttr","dstAttrValue","dstAttrName","classToString","Array","isArray","join","keys","filter","styleToString","map","node","className","style","cssText","getAttribute","mapAccessor","removeAccessor","removeAttribute","setAccessor","setAttribute","dstEvents","events","srcEvents","_eventMap2","_eventMap","elem","get","_weakMap","_weakMap2","index","prefix","Polyfill","WeakMap","val","textContent","isWindow","_ref","self","Worker","instruction","patchers","forEach","_appendChild","_appendChild2","_removeAttribute","_removeAttribute2","_removeChild","_removeChild2","_replaceChild","_replaceChild2","_setAttribute","_setAttribute2","_setEvent","_setEvent2","_textContent","_textContent2","appendChild","_dom2","_dom","createElement","el","realNode","document","eventHandlers","children","attributesLen","attr","docfrag","createDocumentFragment","childrenLen","ch","createText","createTextNode","_ret","frag","item","v","_typeof","Symbol","iterator","constructor","realDst","realSrc","removeChild","parentNode","replaceChild","prevHandler","nextHandler","removeEventListener","Error","newTree","oldTree","oldTreeMap","_mount2","_mount","separateData","attrs","attrIdx","indexOf","substring","ensureNodes","arr","out","Boolean","translateFromReact","ensureTagName","toUpperCase","isChildren","arg","isReactNode","props","chren","element","isAttrsNode","count","_len","_key","array","tag","bind","removeChildNodes","firstChild","first","tree","dom","mount","text"],"mappings":"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ACvCtF,EAAOrF,EAAKqF,IAClBA,GAAKtD,OAAS8J,EACdxG,EAAKrC,SAAW,EAChBqC,EAAK3B,QAAU0H,EAAc9G,GAC7Be,EAAKrB,WAAahE,EAAK2K,MACvBtF,EAAKW,OAAShG,EAAKgG,MARwC,QAAA8F,GAAA5L,UAAAC,OAAPuL,EAAO5G,MAAAgH,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAPL,EAAOK,EAAA,GAAA7L,UAAA6L,EAU3D,OADA1G,GAAK7D,WAAauJ,EAAYa,GAAejB,GAAO1J,OAAOyK,GAASA,GAC7DrG,E7B8kCRpH,OAAOK,eAAezB,EAAS,cAC7B0B,OAAO,GAGT,IAAIiL,GAA4B,kBAAXC,SAAoD,gBAApBA,QAAOC,SAAwB,SAAU7L,GAAO,aAAcA,IAAS,SAAUA,GAAO,MAAOA,IAAyB,kBAAX4L,SAAyB5L,EAAI8L,cAAgBF,QAAU5L,IAAQ4L,OAAOvL,UAAY,eAAkBL,GAEtQhB,GAAQuB,Q6B9lCeuN,CArExB,IAAAnH,GAAArH,EAAA,GACAqG,EAAArG,EAAA,I7BwqCKiG,EAAS/E,EAAuBmF,G6BrmCjCqI,EAAQ,CAeZF,GAAQK,MAAQjB,GAId,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,UACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,UACA,UACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,UACA,KACA,QACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,QACA,MACA,QACA,MACA,MACA,SACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,UACA,OACA,WACA,OACA,QACA,WACA,MACA,OACA,UACA,WACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,UACA,SACA,SACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OACA3D,QAAQ,SAAU6E,GAClBN,EAAQM,GAAON,EAAQO,KAAK,KAAMD,M7BujC9B,SAASnP,EAAQD,GAEtB,Y8B/wCc,SAASsM,GAAgBG,GACtC,OACEtG,SAAU,EACV6D,YAAayC,G9B8wChBrL,OAAOK,eAAezB,EAAS,cAC7B0B,OAAO,IAET1B,EAAQuB,Q8BpxCe+K,G9B8xClB,SAASrM,EAAQD,EAASM,GAE/B,YAeA,SAASkB,GAAuBR,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQO,QAASP,G+B7yCxF,QAASsO,GAAkB/F,GACzB,KAAOA,EAAKgG,YAAY,CACtB,GAAMC,GAAQjG,EAAKgG,UACnBC,GAAMtC,WAAWD,YAAYuC,I/B6xChCpO,OAAOK,eAAezB,EAAS,cAC7B0B,OAAO,IAGT1B,EAAQuB,Q+B7xCM,SAAUgI,EAAMkG,GAC7BH,EAAiB/F,GACjBA,EAAK+B,aAAY,EAAAC,EAAAhK,SAAIkO,IAXvB,IAAAjE,GAAAlL,EAAA,I/B6yCKiL,EAAQ/J,EAAuBgK,IAa9B,SAASvL,EAAQD,EAASM,GAE/B,YAsBA,SAASkB,GAAuBR,GAAO,MAAOA,IAAOA,EAAIC,WAAaD,GAAQO,QAASP,GApBvFI,OAAOK,eAAezB,EAAS,cAC7B0B,OAAO,GgC/zCV,IAAA8J,GAAAlL,EAAA,IhCo0CKiL,EAAQ/J,EAAuBgK,GgCn0CpC9E,EAAApG,EAAA,IhCu0CK+F,EAAY7E,EAAuBkF,GgCt0CxCkH,EAAAtN,EAAA,IhC00CKqN,EAAUnM,EAAuBoM,GgCz0CtCjH,EAAArG,EAAA,IhC60CKiG,EAAS/E,EAAuBmF,EAIpC3G,GAAQuB,SgC90CPmO,cACAZ,kBACAa,gBACAC","file":"dist/index-with-deps.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"skatejsDomDiff\"] = factory();\n\telse\n\t\troot[\"skatejsDomDiff\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"skatejsDomDiff\"] = factory();\n\telse\n\t\troot[\"skatejsDomDiff\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _diff = __webpack_require__(1);\n\t\n\tvar _diff2 = _interopRequireDefault(_diff);\n\t\n\tvar _merge = __webpack_require__(16);\n\t\n\tvar _merge2 = _interopRequireDefault(_merge);\n\t\n\tvar _patch = __webpack_require__(17);\n\t\n\tvar _patch2 = _interopRequireDefault(_patch);\n\t\n\tvar _render = __webpack_require__(26);\n\t\n\tvar _render2 = _interopRequireDefault(_render);\n\t\n\tvar _types = __webpack_require__(3);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _vdom = __webpack_require__(30);\n\t\n\tvar _vdom2 = _interopRequireDefault(_vdom);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t diff: _diff2.default,\n\t merge: _merge2.default,\n\t patch: _patch2.default,\n\t render: _render2.default,\n\t types: types,\n\t vdom: _vdom2.default\n\t};\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = diff;\n\t\n\tvar _diffMain = __webpack_require__(2);\n\t\n\tvar _diffMain2 = _interopRequireDefault(_diffMain);\n\t\n\tvar _diffWorker = __webpack_require__(15);\n\t\n\tvar _diffWorker2 = _interopRequireDefault(_diffWorker);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _window = window,\n\t Node = _window.Node;\n\t\n\t\n\tfunction diffWorker(opts) {\n\t var worker = new _diffWorker2.default();\n\t var done = opts.done;\n\t\n\t worker.addEventListener('message', function (e) {\n\t return done(e.data);\n\t });\n\t delete opts.done;\n\t worker.postMessage(opts);\n\t}\n\t\n\tfunction diff() {\n\t var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var source = opts.source,\n\t destination = opts.destination,\n\t done = opts.done;\n\t\n\t var canDiffInWorker = done && !(source instanceof Node && destination instanceof Node);\n\t return canDiffInWorker ? diffWorker(opts) : (0, _diffMain2.default)(opts);\n\t}\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = diff;\n\t\n\tvar _types = __webpack_require__(3);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _node = __webpack_require__(4);\n\t\n\tvar _node2 = _interopRequireDefault(_node);\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\t\n\tvar _realNodeMap = __webpack_require__(14);\n\t\n\tvar _realNodeMap2 = _interopRequireDefault(_realNodeMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction diffNode(source, destination) {\n\t var nodeInstructions = (0, _node2.default)(source, destination);\n\t\n\t // If there are instructions (even an empty array) it means the node can be\n\t // diffed and doesn't have to be replaced. If the instructions are falsy\n\t // it means that the nodes are not similar (cannot be changed) and must be\n\t // replaced instead.\n\t if (nodeInstructions) {\n\t return nodeInstructions.concat(diff({ source: source, destination: destination }));\n\t }\n\t\n\t return [{\n\t destination: destination,\n\t source: source,\n\t type: types.REPLACE_CHILD\n\t }];\n\t}\n\t\n\tfunction diff(opts) {\n\t var src = opts.source;\n\t var dst = opts.destination;\n\t\n\t if (!src || !dst) {\n\t return [];\n\t }\n\t\n\t var instructions = opts.root ? diffNode(src, dst) : [];\n\t\n\t var srcChs = src.childNodes;\n\t var dstChs = dst.childNodes;\n\t var srcChsLen = srcChs ? srcChs.length : 0;\n\t var dstChsLen = dstChs ? dstChs.length : 0;\n\t\n\t for (var a = 0; a < dstChsLen; a++) {\n\t var curSrc = srcChs[a];\n\t var curDst = dstChs[a];\n\t\n\t // If there is no matching destination node it means we need to remove the\n\t // current source node from the source.\n\t if (!curSrc) {\n\t instructions.push({\n\t destination: dstChs[a],\n\t source: src,\n\t type: types.APPEND_CHILD\n\t });\n\t continue;\n\t } else {\n\t // Ensure the real node is carried over even if the destination isn't used.\n\t // This is used in the render() function to keep track of the real node\n\t // that corresponds to a virtual node if a virtual tree is being used.\n\t if (typeof curDst.__id !== 'undefined') {\n\t _realNodeMap2.default.set(curDst.__id, (0, _realNode2.default)(curSrc));\n\t }\n\t }\n\t\n\t instructions = instructions.concat(diffNode(curSrc, curDst));\n\t }\n\t\n\t if (dstChsLen < srcChsLen) {\n\t for (var _a = dstChsLen; _a < srcChsLen; _a++) {\n\t instructions.push({\n\t destination: srcChs[_a],\n\t source: src,\n\t type: types.REMOVE_CHILD\n\t });\n\t }\n\t }\n\t\n\t return instructions;\n\t}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar APPEND_CHILD = exports.APPEND_CHILD = 1;\n\tvar REMOVE_CHILD = exports.REMOVE_CHILD = 2;\n\tvar REMOVE_ATTRIBUTE = exports.REMOVE_ATTRIBUTE = 3;\n\tvar REPLACE_CHILD = exports.REPLACE_CHILD = 4;\n\tvar SET_ATTRIBUTE = exports.SET_ATTRIBUTE = 5;\n\tvar SET_EVENT = exports.SET_EVENT = 6;\n\tvar SET_PROPERTY = exports.SET_PROPERTY = 7;\n\tvar TEXT_CONTENT = exports.TEXT_CONTENT = 8;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var dstType = void 0,\n\t srcType = void 0;\n\t\n\t if (!dst || !src) {\n\t return;\n\t }\n\t\n\t dstType = dst.nodeType;\n\t srcType = src.nodeType;\n\t\n\t if (dstType !== srcType) {\n\t return;\n\t } else if (dstType === NODE_ELEMENT) {\n\t return (0, _element2.default)(src, dst);\n\t } else if (dstType === NODE_TEXT) {\n\t return (0, _text2.default)(src, dst);\n\t } else if (dstType === NODE_COMMENT) {\n\t return (0, _comment2.default)(src, dst);\n\t }\n\t};\n\t\n\tvar _element = __webpack_require__(5);\n\t\n\tvar _element2 = _interopRequireDefault(_element);\n\t\n\tvar _text = __webpack_require__(11);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\t\n\tvar _comment = __webpack_require__(12);\n\t\n\tvar _comment2 = _interopRequireDefault(_comment);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar NODE_COMMENT = 8;\n\tvar NODE_ELEMENT = 1;\n\tvar NODE_TEXT = 3;\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t if (src.tagName === dst.tagName) {\n\t return (0, _attributes2.default)(src, dst).concat((0, _events2.default)(src, dst));\n\t }\n\t};\n\t\n\tvar _attributes = __webpack_require__(6);\n\t\n\tvar _attributes2 = _interopRequireDefault(_attributes);\n\t\n\tvar _events = __webpack_require__(8);\n\t\n\tvar _events2 = _interopRequireDefault(_events);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var srcAttrs = src.attributes;\n\t var dstAttrs = dst.attributes;\n\t var srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n\t var dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n\t var instructions = [];\n\t\n\t // Bail early if possible.\n\t if (!srcAttrsLen && !dstAttrsLen) {\n\t return instructions;\n\t }\n\t\n\t // Merge attributes that exist in source with destination's.\n\t for (var a = 0; a < srcAttrsLen; a++) {\n\t var srcAttr = srcAttrs[a];\n\t var srcAttrName = srcAttr.name;\n\t var srcAttrValue = (0, _accessor.getAccessor)(src, srcAttrName);\n\t var dstAttr = dstAttrs[srcAttrName];\n\t var dstAttrValue = (0, _accessor.getAccessor)(dst, srcAttrName);\n\t\n\t if (!dstAttr) {\n\t instructions.push({\n\t data: { name: srcAttrName },\n\t destination: dst,\n\t source: src,\n\t type: types.REMOVE_ATTRIBUTE\n\t });\n\t } else if (srcAttrValue !== dstAttrValue) {\n\t instructions.push({\n\t data: { name: srcAttrName, value: dstAttrValue },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_ATTRIBUTE\n\t });\n\t }\n\t }\n\t\n\t // We only need to worry about setting attributes that don't already exist\n\t // in the source.\n\t for (var _a = 0; _a < dstAttrsLen; _a++) {\n\t var _dstAttr = dstAttrs[_a];\n\t var dstAttrName = _dstAttr.name;\n\t var _dstAttrValue = (0, _accessor.getAccessor)(dst, dstAttrName);\n\t var _srcAttr = srcAttrs[dstAttrName];\n\t\n\t if (!_srcAttr) {\n\t instructions.push({\n\t data: { name: dstAttrName, value: _dstAttrValue },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_ATTRIBUTE\n\t });\n\t }\n\t }\n\t\n\t return instructions;\n\t};\n\t\n\tvar _types = __webpack_require__(3);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _accessor = __webpack_require__(7);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.getAccessor = getAccessor;\n\texports.mapAccessor = mapAccessor;\n\texports.removeAccessor = removeAccessor;\n\texports.setAccessor = setAccessor;\n\tfunction classToString(obj) {\n\t if (typeof obj === 'string') {\n\t return obj;\n\t }\n\t\n\t if (Array.isArray(obj)) {\n\t return obj.join(' ');\n\t }\n\t\n\t return Object.keys(obj).filter(function (key) {\n\t return obj[key] ? key : false;\n\t }).join(' ');\n\t}\n\t\n\tfunction styleToString(obj) {\n\t if (typeof obj === 'string') {\n\t return obj;\n\t }\n\t\n\t return Object.keys(obj).map(function (key) {\n\t return key + ': ' + obj[key] + ';';\n\t }).join(' ');\n\t}\n\t\n\tfunction getAccessor(node, name) {\n\t if (name === 'class') {\n\t return node.className;\n\t } else if (name === 'style') {\n\t return node.style.cssText;\n\t // most things\n\t } else if (name !== 'type' && name in node) {\n\t return node[name];\n\t // real DOM elements\n\t } else if (node.getAttribute) {\n\t return node.getAttribute(name);\n\t // vDOM nodes\n\t } else if (node.attributes && node.attributes[name]) {\n\t return node.attributes[name].value;\n\t }\n\t}\n\t\n\tfunction mapAccessor(node, name, value) {\n\t if (name === 'class') {\n\t node.className = classToString(value);\n\t } else if (name === 'style') {\n\t node.style = { cssText: styleToString(value) };\n\t }\n\t}\n\t\n\tfunction removeAccessor(node, name) {\n\t if (name === 'class') {\n\t node.className = '';\n\t } else if (name === 'style') {\n\t node.style.cssText = '';\n\t // most things\n\t } else if (name !== 'type' && name in node) {\n\t node[name] = '';\n\t // real DOM elements\n\t } else if (node.removeAttribute) {\n\t node.removeAttribute(name);\n\t // vDOM nodes\n\t } else if (node.attributes) {\n\t delete node.attributes[name];\n\t }\n\t}\n\t\n\tfunction setAccessor(node, name, value) {\n\t if (name === 'class') {\n\t node.className = value;\n\t } else if (name === 'style') {\n\t node.style.cssText = value;\n\t // most things\n\t } else if (name !== 'type' && name in node || typeof value !== 'string') {\n\t // We check if it's undefined or null because IE throws \"invalid argument\"\n\t // errors for some types of properties. Essentially this is the same as\n\t // removing the accessor.\n\t node[name] = value == null ? '' : value;\n\t // real DOM elements\n\t } else if (node.setAttribute) {\n\t node.setAttribute(name, value);\n\t // vDOM nodes\n\t } else if (node.attributes) {\n\t node.attributes[node.attributes.length] = node.attributes[name] = { name: name, value: value };\n\t }\n\t}\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var dstEvents = dst.events;\n\t var srcEvents = (0, _eventMap2.default)(src);\n\t var instructions = [];\n\t\n\t // Remove any source events that aren't in the destination before seeing if\n\t // we need to add any from the destination.\n\t if (srcEvents) {\n\t for (var name in srcEvents) {\n\t if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n\t instructions.push({\n\t data: { name: name, value: undefined },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_EVENT\n\t });\n\t }\n\t }\n\t }\n\t\n\t // After instructing to remove any old events, we then can instruct to add\n\t // new events. This prevents the new events from being removed from earlier\n\t // instructions.\n\t if (dstEvents) {\n\t for (var _name in dstEvents) {\n\t var value = dstEvents[_name];\n\t if (srcEvents[_name] !== value) {\n\t instructions.push({\n\t data: { name: _name, value: value },\n\t destination: dst,\n\t source: src,\n\t type: types.SET_EVENT\n\t });\n\t }\n\t }\n\t }\n\t\n\t return instructions;\n\t};\n\t\n\tvar _types = __webpack_require__(3);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _eventMap = __webpack_require__(9);\n\t\n\tvar _eventMap2 = _interopRequireDefault(_eventMap);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (elem) {\n\t var events = map.get(elem);\n\t events || map.set(elem, events = {});\n\t return events;\n\t};\n\t\n\tvar _weakMap = __webpack_require__(10);\n\t\n\tvar _weakMap2 = _interopRequireDefault(_weakMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar map = new _weakMap2.default();\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t// Because weak map polyfills either are too big or don't use native if\n\t// available properly.\n\t\n\tvar index = 0;\n\tvar prefix = '__WEAK_MAP_POLYFILL_';\n\t\n\texports.default = function () {\n\t if (typeof WeakMap !== 'undefined') {\n\t return WeakMap;\n\t }\n\t\n\t function Polyfill() {\n\t this.key = prefix + index;\n\t ++index;\n\t }\n\t\n\t Polyfill.prototype = {\n\t get: function get(obj) {\n\t return obj[this.key];\n\t },\n\t set: function set(obj, val) {\n\t obj[this.key] = val;\n\t }\n\t };\n\t\n\t return Polyfill;\n\t}();\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t if (src.textContent === dst.textContent) {\n\t return [];\n\t }\n\t\n\t return [{\n\t destination: dst,\n\t source: src,\n\t type: types.TEXT_CONTENT\n\t }];\n\t};\n\t\n\tvar _types = __webpack_require__(3);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _text = __webpack_require__(11);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\texports.default = _text2.default;\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (node) {\n\t return isWindow && node instanceof Node ? node : _realNodeMap2.default.get(node.__id);\n\t};\n\t\n\tvar _realNodeMap = __webpack_require__(14);\n\t\n\tvar _realNodeMap2 = _interopRequireDefault(_realNodeMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar isWindow = typeof window !== 'undefined';\n\t\n\tvar _ref = isWindow ? window : self,\n\t Node = _ref.Node;\n\n/***/ },\n/* 14 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t// import WeakMap from './weak-map';\n\t// export default new WeakMap();\n\tvar map = [];\n\texports.default = {\n\t get: function get(id) {\n\t return map[id];\n\t },\n\t set: function set(id, node) {\n\t map[id] = node;\n\t }\n\t};\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = function() {\n\t\treturn new Worker(__webpack_require__.p + \"./dist/e375e330bcafe442dfca.js\");\n\t};\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function () {\n\t var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var source = opts.source,\n\t destination = opts.destination,\n\t _done = opts.done;\n\t\n\t if (_done) {\n\t return (0, _diff2.default)({\n\t source: source,\n\t destination: destination,\n\t done: function done(instructions) {\n\t (0, _patch2.default)(instructions);\n\t _done(instructions);\n\t }\n\t });\n\t }\n\t var instructions = (0, _diff2.default)(opts);\n\t (0, _patch2.default)(instructions);\n\t return instructions;\n\t};\n\t\n\tvar _diff = __webpack_require__(1);\n\t\n\tvar _diff2 = _interopRequireDefault(_diff);\n\t\n\tvar _patch = __webpack_require__(17);\n\t\n\tvar _patch2 = _interopRequireDefault(_patch);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (instructions) {\n\t instructions.forEach(patch);\n\t};\n\t\n\tvar _types = __webpack_require__(3);\n\t\n\tvar types = _interopRequireWildcard(_types);\n\t\n\tvar _appendChild = __webpack_require__(18);\n\t\n\tvar _appendChild2 = _interopRequireDefault(_appendChild);\n\t\n\tvar _removeAttribute = __webpack_require__(20);\n\t\n\tvar _removeAttribute2 = _interopRequireDefault(_removeAttribute);\n\t\n\tvar _removeChild = __webpack_require__(21);\n\t\n\tvar _removeChild2 = _interopRequireDefault(_removeChild);\n\t\n\tvar _replaceChild = __webpack_require__(22);\n\t\n\tvar _replaceChild2 = _interopRequireDefault(_replaceChild);\n\t\n\tvar _setAttribute = __webpack_require__(23);\n\t\n\tvar _setAttribute2 = _interopRequireDefault(_setAttribute);\n\t\n\tvar _setEvent = __webpack_require__(24);\n\t\n\tvar _setEvent2 = _interopRequireDefault(_setEvent);\n\t\n\tvar _textContent = __webpack_require__(25);\n\t\n\tvar _textContent2 = _interopRequireDefault(_textContent);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tvar patchers = {};\n\tpatchers[types.APPEND_CHILD] = _appendChild2.default;\n\tpatchers[types.REMOVE_ATTRIBUTE] = _removeAttribute2.default;\n\tpatchers[types.REMOVE_CHILD] = _removeChild2.default;\n\tpatchers[types.REPLACE_CHILD] = _replaceChild2.default;\n\tpatchers[types.SET_ATTRIBUTE] = _setAttribute2.default;\n\tpatchers[types.SET_EVENT] = _setEvent2.default;\n\tpatchers[types.TEXT_CONTENT] = _textContent2.default;\n\t\n\tfunction patch(instruction) {\n\t patchers[instruction.type](instruction.source, instruction.destination, instruction.data);\n\t}\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t (0, _realNode2.default)(src).appendChild((0, _dom2.default)(dst));\n\t};\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\t\n\tvar _dom = __webpack_require__(19);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\texports.default = render;\n\t\n\tvar _accessor = __webpack_require__(7);\n\t\n\tvar _eventMap = __webpack_require__(9);\n\t\n\tvar _eventMap2 = _interopRequireDefault(_eventMap);\n\t\n\tvar _realNodeMap = __webpack_require__(14);\n\t\n\tvar _realNodeMap2 = _interopRequireDefault(_realNodeMap);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _window = window,\n\t Node = _window.Node;\n\t\n\t\n\tfunction createElement(el) {\n\t var realNode = document.createElement(el.tagName);\n\t var attributes = el.attributes;\n\t var events = el.events;\n\t var eventHandlers = (0, _eventMap2.default)(realNode);\n\t var children = el.childNodes;\n\t\n\t if (attributes) {\n\t var attributesLen = attributes.length;\n\t for (var a = 0; a < attributesLen; a++) {\n\t var attr = attributes[a];\n\t (0, _accessor.setAccessor)(realNode, attr.name, attr.value);\n\t }\n\t }\n\t\n\t if (events) {\n\t for (var name in events) {\n\t realNode.addEventListener(name, eventHandlers[name] = events[name]);\n\t }\n\t }\n\t\n\t if (children) {\n\t var docfrag = document.createDocumentFragment();\n\t var childrenLen = children.length;\n\t\n\t for (var _a = 0; _a < childrenLen; _a++) {\n\t var ch = children[_a];\n\t ch && docfrag.appendChild(render(ch));\n\t }\n\t\n\t if (realNode.appendChild) {\n\t realNode.appendChild(docfrag);\n\t }\n\t }\n\t\n\t return realNode;\n\t}\n\t\n\tfunction createText(el) {\n\t return document.createTextNode(el.textContent);\n\t}\n\t\n\tfunction render(el) {\n\t if (el instanceof Node) {\n\t return el;\n\t }\n\t if (Array.isArray(el)) {\n\t var _ret = function () {\n\t var frag = document.createDocumentFragment();\n\t el.forEach(function (item) {\n\t return frag.appendChild(render(item));\n\t });\n\t return {\n\t v: frag\n\t };\n\t }();\n\t\n\t if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n\t }\n\t var realNode = el.tagName ? createElement(el) : createText(el);\n\t _realNodeMap2.default.set(el.__id, realNode);\n\t return realNode;\n\t}\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst, data) {\n\t (0, _accessor.removeAccessor)((0, _realNode2.default)(src), data.name);\n\t};\n\t\n\tvar _accessor = __webpack_require__(7);\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var realDst = (0, _realNode2.default)(dst);\n\t var realSrc = (0, _realNode2.default)(src);\n\t\n\t // We don't do parentNode.removeChild because parentNode may report\n\t // incorrectly in some prollyfills since it's impossible (?) to spoof.\n\t realSrc.removeChild(realDst);\n\t};\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t var realSrc = (0, _realNode2.default)(src);\n\t realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild((0, _dom2.default)(dst), realSrc);\n\t};\n\t\n\tvar _dom = __webpack_require__(19);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst, data) {\n\t (0, _accessor.setAccessor)((0, _realNode2.default)(src), data.name, data.value);\n\t};\n\t\n\tvar _accessor = __webpack_require__(7);\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst, data) {\n\t var realSrc = (0, _realNode2.default)(src);\n\t var eventHandlers = (0, _eventMap2.default)(realSrc);\n\t var name = data.name;\n\t var prevHandler = eventHandlers[name];\n\t var nextHandler = data.value;\n\t\n\t if (typeof prevHandler === 'function') {\n\t delete eventHandlers[name];\n\t realSrc.removeEventListener(name, prevHandler);\n\t }\n\t\n\t if (typeof nextHandler === 'function') {\n\t eventHandlers[name] = nextHandler;\n\t realSrc.addEventListener(name, nextHandler);\n\t }\n\t};\n\t\n\tvar _eventMap = __webpack_require__(9);\n\t\n\tvar _eventMap2 = _interopRequireDefault(_eventMap);\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (src, dst) {\n\t (0, _realNode2.default)(src).textContent = dst.textContent;\n\t};\n\t\n\tvar _realNode = __webpack_require__(13);\n\t\n\tvar _realNode2 = _interopRequireDefault(_realNode);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (render) {\n\t return function (elem, done) {\n\t elem = elem instanceof Node ? elem : this;\n\t\n\t if (!(elem instanceof Node)) {\n\t throw new Error('No node provided to diff renderer as either the first argument or the context.');\n\t }\n\t\n\t // Create a new element to house the new tree since we diff / mount fragments.\n\t var newTree = (0, _element2.default)('div', null, render(elem));\n\t var oldTree = oldTreeMap.get(elem);\n\t\n\t if (oldTree) {\n\t (0, _merge2.default)({\n\t destination: newTree,\n\t source: oldTree,\n\t done: done\n\t });\n\t } else {\n\t (0, _mount2.default)(elem, newTree.childNodes);\n\t if (typeof done === 'function') {\n\t done();\n\t }\n\t }\n\t\n\t oldTreeMap.set(elem, newTree);\n\t };\n\t};\n\t\n\tvar _weakMap = __webpack_require__(10);\n\t\n\tvar _weakMap2 = _interopRequireDefault(_weakMap);\n\t\n\tvar _element = __webpack_require__(27);\n\t\n\tvar _element2 = _interopRequireDefault(_element);\n\t\n\tvar _merge = __webpack_require__(16);\n\t\n\tvar _merge2 = _interopRequireDefault(_merge);\n\t\n\tvar _mount = __webpack_require__(29);\n\t\n\tvar _mount2 = _interopRequireDefault(_mount);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar _window = window,\n\t Node = _window.Node;\n\t\n\tvar oldTreeMap = new _weakMap2.default();\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\texports.default = element;\n\t\n\tvar _accessor = __webpack_require__(7);\n\t\n\tvar _text = __webpack_require__(28);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction separateData(obj) {\n\t var attrs = {};\n\t var events = {};\n\t var node = {};\n\t var attrIdx = 0;\n\t\n\t for (var name in obj) {\n\t var value = obj[name];\n\t\n\t if (name.indexOf('on') === 0) {\n\t events[name.substring(2)] = value;\n\t } else {\n\t attrs[attrIdx++] = attrs[name] = { name: name, value: value };\n\t (0, _accessor.mapAccessor)(node, name, value);\n\t }\n\t }\n\t\n\t attrs.length = attrIdx;\n\t return { attrs: attrs, events: events, node: node };\n\t}\n\t\n\tfunction ensureNodes(arr) {\n\t var out = [];\n\t if (!Array.isArray(arr)) {\n\t arr = [arr];\n\t }\n\t arr.filter(Boolean).forEach(function (item) {\n\t if (Array.isArray(item)) {\n\t out = out.concat(ensureNodes(item));\n\t } else if ((typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object') {\n\t out.push(translateFromReact(item));\n\t } else {\n\t out.push((0, _text2.default)(item));\n\t }\n\t });\n\t return out;\n\t}\n\t\n\tfunction ensureTagName(name) {\n\t return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n\t}\n\t\n\tfunction isChildren(arg) {\n\t return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n\t}\n\t\n\tfunction isReactNode(item) {\n\t return item && item.type && item.props;\n\t}\n\t\n\tfunction translateFromReact(item) {\n\t if (isReactNode(item)) {\n\t var props = item.props;\n\t var chren = ensureNodes(props.children);\n\t delete props.children;\n\t return {\n\t nodeType: 1,\n\t tagName: item.type,\n\t attributes: props,\n\t childNodes: chren\n\t };\n\t }\n\t return item;\n\t}\n\t\n\tvar count = 0;\n\tfunction element(name) {\n\t var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\n\t var isAttrsNode = isChildren(attrs);\n\t var data = separateData(isAttrsNode ? {} : attrs);\n\t var node = data.node;\n\t node.__id = ++count;\n\t node.nodeType = 1;\n\t node.tagName = ensureTagName(name);\n\t node.attributes = data.attrs;\n\t node.events = data.events;\n\t\n\t for (var _len = arguments.length, chren = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t chren[_key - 2] = arguments[_key];\n\t }\n\t\n\t node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n\t return node;\n\t}\n\t\n\t// Add an array factory that returns an array of virtual nodes.\n\telement.array = ensureNodes;\n\t\n\t// Generate built-in factories.\n\t['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'bgsound', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'command', 'content', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'element', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'image', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'multicol', 'nav', 'nobr', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'rtc', 'ruby', 's', 'samp', 'script', 'section', 'select', 'shadow', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr'].forEach(function (tag) {\n\t element[tag] = element.bind(null, tag);\n\t});\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = createTextNode;\n\tfunction createTextNode(item) {\n\t return {\n\t nodeType: 3,\n\t textContent: item\n\t };\n\t}\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\texports.default = function (elem, tree) {\n\t removeChildNodes(elem);\n\t elem.appendChild((0, _dom2.default)(tree));\n\t};\n\t\n\tvar _dom = __webpack_require__(19);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction removeChildNodes(elem) {\n\t while (elem.firstChild) {\n\t var first = elem.firstChild;\n\t first.parentNode.removeChild(first);\n\t }\n\t}\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _dom = __webpack_require__(19);\n\t\n\tvar _dom2 = _interopRequireDefault(_dom);\n\t\n\tvar _element = __webpack_require__(27);\n\t\n\tvar _element2 = _interopRequireDefault(_element);\n\t\n\tvar _mount = __webpack_require__(29);\n\t\n\tvar _mount2 = _interopRequireDefault(_mount);\n\t\n\tvar _text = __webpack_require__(28);\n\t\n\tvar _text2 = _interopRequireDefault(_text);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t dom: _dom2.default,\n\t element: _element2.default,\n\t mount: _mount2.default,\n\t text: _text2.default\n\t};\n\n/***/ }\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// dist/index-with-deps.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bef7b4dc7aa6ac50b1d3","import diff from './diff';\nimport merge from './merge';\nimport patch from './patch';\nimport render from './render';\nimport * as types from './types';\nimport vdom from './vdom';\n\nexport default {\n diff,\n merge,\n patch,\n render,\n types,\n vdom\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","import diffMain from './diff-main';\nimport DiffWorker from 'worker-loader?name=./dist/[hash].[ext]!./diff-worker';\n\nconst { Node } = window;\n\nfunction diffWorker (opts) {\n const worker = new DiffWorker();\n const { done } = opts;\n worker.addEventListener('message', e => done(e.data));\n delete opts.done;\n worker.postMessage(opts);\n}\n\nexport default function diff (opts = {}) {\n const { source, destination, done } = opts;\n const canDiffInWorker = done && !(source instanceof Node && destination instanceof Node);\n return canDiffInWorker ? diffWorker(opts) : diffMain(opts);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff.js","import * as types from './types';\nimport compareNode from './compare/node';\nimport realNode from './util/real-node';\nimport realNodeMap from './util/real-node-map';\n\nfunction diffNode (source, destination) {\n let nodeInstructions = compareNode(source, destination);\n\n // If there are instructions (even an empty array) it means the node can be\n // diffed and doesn't have to be replaced. If the instructions are falsy\n // it means that the nodes are not similar (cannot be changed) and must be\n // replaced instead.\n if (nodeInstructions) {\n return nodeInstructions.concat(diff({ source, destination }));\n }\n\n return [{\n destination,\n source,\n type: types.REPLACE_CHILD\n }];\n}\n\nexport default function diff (opts) {\n const src = opts.source;\n const dst = opts.destination;\n\n if (!src || !dst) {\n return [];\n }\n\n let instructions = opts.root ? diffNode(src, dst) : [];\n\n const srcChs = src.childNodes;\n const dstChs = dst.childNodes;\n const srcChsLen = srcChs ? srcChs.length : 0;\n const dstChsLen = dstChs ? dstChs.length : 0;\n\n for (let a = 0; a < dstChsLen; a++) {\n const curSrc = srcChs[a];\n const curDst = dstChs[a];\n\n // If there is no matching destination node it means we need to remove the\n // current source node from the source.\n if (!curSrc) {\n instructions.push({\n destination: dstChs[a],\n source: src,\n type: types.APPEND_CHILD\n });\n continue;\n } else {\n // Ensure the real node is carried over even if the destination isn't used.\n // This is used in the render() function to keep track of the real node\n // that corresponds to a virtual node if a virtual tree is being used.\n if (typeof curDst.__id !== 'undefined') {\n realNodeMap.set(curDst.__id, realNode(curSrc));\n }\n }\n\n instructions = instructions.concat(diffNode(curSrc, curDst));\n }\n\n if (dstChsLen < srcChsLen) {\n for (let a = dstChsLen; a < srcChsLen; a++) {\n instructions.push({\n destination: srcChs[a],\n source: src,\n type: types.REMOVE_CHILD\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff-main.js","export const APPEND_CHILD = 1;\nexport const REMOVE_CHILD = 2;\nexport const REMOVE_ATTRIBUTE = 3;\nexport const REPLACE_CHILD = 4;\nexport const SET_ATTRIBUTE = 5;\nexport const SET_EVENT = 6;\nexport const SET_PROPERTY = 7;\nexport const TEXT_CONTENT = 8;\n\n\n\n// WEBPACK FOOTER //\n// ./src/types.js","import compareElement from './element';\nimport compareText from './text';\nimport compareComment from './comment';\n\nconst NODE_COMMENT = 8;\nconst NODE_ELEMENT = 1;\nconst NODE_TEXT = 3;\n\nexport default function (src, dst) {\n let dstType, srcType;\n\n if (!dst || !src) {\n return;\n }\n\n dstType = dst.nodeType;\n srcType = src.nodeType;\n\n if (dstType !== srcType) {\n return;\n } else if (dstType === NODE_ELEMENT) {\n return compareElement(src, dst);\n } else if (dstType === NODE_TEXT) {\n return compareText(src, dst);\n } else if (dstType === NODE_COMMENT) {\n return compareComment(src, dst);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/node.js","import compareAttributes from './attributes';\nimport compareEvents from './events';\n\nexport default function (src, dst) {\n if (src.tagName === dst.tagName) {\n return compareAttributes(src, dst).concat(compareEvents(src, dst));\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/element.js","import * as types from '../types';\nimport { getAccessor } from '../util/accessor';\n\nexport default function (src, dst) {\n const srcAttrs = src.attributes;\n const dstAttrs = dst.attributes;\n const srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n const dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n const instructions = [];\n\n // Bail early if possible.\n if (!srcAttrsLen && !dstAttrsLen) {\n return instructions;\n }\n\n // Merge attributes that exist in source with destination's.\n for (let a = 0; a < srcAttrsLen; a++) {\n const srcAttr = srcAttrs[a];\n const srcAttrName = srcAttr.name;\n const srcAttrValue = getAccessor(src, srcAttrName);\n const dstAttr = dstAttrs[srcAttrName];\n const dstAttrValue = getAccessor(dst, srcAttrName);\n\n if (!dstAttr) {\n instructions.push({\n data: { name: srcAttrName },\n destination: dst,\n source: src,\n type: types.REMOVE_ATTRIBUTE\n });\n } else if (srcAttrValue !== dstAttrValue) {\n instructions.push({\n data: { name: srcAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n // We only need to worry about setting attributes that don't already exist\n // in the source.\n for (let a = 0; a < dstAttrsLen; a++) {\n const dstAttr = dstAttrs[a];\n const dstAttrName = dstAttr.name;\n const dstAttrValue = getAccessor(dst, dstAttrName);\n const srcAttr = srcAttrs[dstAttrName];\n\n if (!srcAttr) {\n instructions.push({\n data: { name: dstAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/attributes.js","function classToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.join(' ');\n }\n\n return Object.keys(obj).filter(function (key) {\n return obj[key] ? key : false;\n }).join(' ');\n}\n\nfunction styleToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n return Object.keys(obj).map(function (key) {\n return `${key}: ${obj[key]};`;\n }).join(' ');\n}\n\nexport function getAccessor (node, name) {\n if (name === 'class') {\n return node.className;\n } else if (name === 'style') {\n return node.style.cssText;\n // most things\n } else if (name !== 'type' && name in node) {\n return node[name];\n // real DOM elements\n } else if (node.getAttribute) {\n return node.getAttribute(name);\n // vDOM nodes\n } else if (node.attributes && node.attributes[name]) {\n return node.attributes[name].value;\n }\n}\n\nexport function mapAccessor (node, name, value) {\n if (name === 'class') {\n node.className = classToString(value);\n } else if (name === 'style') {\n node.style = { cssText: styleToString(value) };\n }\n}\n\nexport function removeAccessor (node, name) {\n if (name === 'class') {\n node.className = '';\n } else if (name === 'style') {\n node.style.cssText = '';\n // most things\n } else if (name !== 'type' && name in node) {\n node[name] = '';\n // real DOM elements\n } else if (node.removeAttribute) {\n node.removeAttribute(name);\n // vDOM nodes\n } else if (node.attributes) {\n delete node.attributes[name];\n }\n}\n\nexport function setAccessor (node, name, value) {\n if (name === 'class') {\n node.className = value;\n } else if (name === 'style') {\n node.style.cssText = value;\n // most things\n } else if (name !== 'type' && name in node || typeof value !== 'string') {\n // We check if it's undefined or null because IE throws \"invalid argument\"\n // errors for some types of properties. Essentially this is the same as\n // removing the accessor.\n node[name] = value == null ? '' : value;\n // real DOM elements\n } else if (node.setAttribute) {\n node.setAttribute(name, value);\n // vDOM nodes\n } else if (node.attributes) {\n node.attributes[node.attributes.length] = node.attributes[name] = { name, value };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/accessor.js","import * as types from '../types';\nimport eventMap from '../util/event-map';\n\nexport default function (src, dst) {\n const dstEvents = dst.events;\n const srcEvents = eventMap(src);\n const instructions = [];\n\n // Remove any source events that aren't in the destination before seeing if\n // we need to add any from the destination.\n if (srcEvents) {\n for (let name in srcEvents) {\n if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n instructions.push({\n data: { name, value: undefined },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n // After instructing to remove any old events, we then can instruct to add\n // new events. This prevents the new events from being removed from earlier\n // instructions.\n if (dstEvents) {\n for (let name in dstEvents) {\n const value = dstEvents[name];\n if (srcEvents[name] !== value) {\n instructions.push({\n data: { name, value },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/events.js","import WeakMap from './weak-map';\n\nconst map = new WeakMap();\n\nexport default function (elem) {\n let events = map.get(elem);\n events || map.set(elem, events = {});\n return events;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/event-map.js","// Because weak map polyfills either are too big or don't use native if\n// available properly.\n\nlet index = 0;\nconst prefix = '__WEAK_MAP_POLYFILL_';\n\nexport default (function () {\n if (typeof WeakMap !== 'undefined') {\n return WeakMap;\n }\n\n function Polyfill () {\n this.key = prefix + index;\n ++index;\n }\n\n Polyfill.prototype = {\n get (obj) {\n return obj[this.key];\n },\n set (obj, val) {\n obj[this.key] = val;\n }\n };\n\n return Polyfill;\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/weak-map.js","import * as types from '../types';\n\nexport default function (src, dst) {\n if (src.textContent === dst.textContent) {\n return [];\n }\n\n return [{\n destination: dst,\n source: src,\n type: types.TEXT_CONTENT\n }];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/text.js","import text from './text';\nexport default text;\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/comment.js","import realNodeMap from './real-node-map';\n\nconst isWindow = typeof window !== 'undefined';\nconst { Node } = isWindow ? window : self;\n\nexport default function (node) {\n return isWindow && node instanceof Node ? node : realNodeMap.get(node.__id);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node.js","// import WeakMap from './weak-map';\n// export default new WeakMap();\nconst map = [];\nexport default {\n get (id) {\n return map[id];\n },\n set (id, node) {\n map[id] = node;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node-map.js","module.exports = function() {\n\treturn new Worker(__webpack_public_path__ + \"./dist/e375e330bcafe442dfca.js\");\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/worker-loader?name=./dist/[hash].[ext]!./src/diff-worker.js\n// module id = 15\n// module chunks = 0 1 2","import diff from './diff';\nimport patch from './patch';\n\nexport default function (opts = {}) {\n const { source, destination, done } = opts;\n if (done) {\n return diff({\n source,\n destination,\n done (instructions) {\n patch(instructions);\n done(instructions);\n }\n });\n }\n const instructions = diff(opts);\n patch(instructions);\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/merge.js","import * as types from './types';\nimport appendChild from './patch/append-child';\nimport removeAttribute from './patch/remove-attribute';\nimport removeChild from './patch/remove-child';\nimport replaceChild from './patch/replace-child';\nimport setAttribute from './patch/set-attribute';\nimport setEvent from './patch/set-event';\nimport textContent from './patch/text-content';\n\nconst patchers = {};\npatchers[types.APPEND_CHILD] = appendChild;\npatchers[types.REMOVE_ATTRIBUTE] = removeAttribute;\npatchers[types.REMOVE_CHILD] = removeChild;\npatchers[types.REPLACE_CHILD] = replaceChild;\npatchers[types.SET_ATTRIBUTE] = setAttribute;\npatchers[types.SET_EVENT] = setEvent;\npatchers[types.TEXT_CONTENT] = textContent;\n\nfunction patch (instruction) {\n patchers[instruction.type](\n instruction.source,\n instruction.destination,\n instruction.data\n );\n}\n\nexport default function (instructions) {\n instructions.forEach(patch);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch.js","import realNode from '../util/real-node';\nimport dom from '../vdom/dom';\n\nexport default function (src, dst) {\n realNode(src).appendChild(dom(dst));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/append-child.js","import { setAccessor } from '../util/accessor';\nimport eventMap from '../util/event-map';\nimport realNodeMap from '../util/real-node-map';\n\nconst { Node } = window;\n\nfunction createElement (el) {\n const realNode = document.createElement(el.tagName);\n const attributes = el.attributes;\n const events = el.events;\n const eventHandlers = eventMap(realNode);\n const children = el.childNodes;\n\n if (attributes) {\n const attributesLen = attributes.length;\n for (let a = 0; a < attributesLen; a++) {\n const attr = attributes[a];\n setAccessor(realNode, attr.name, attr.value);\n }\n }\n\n if (events) {\n for (let name in events) {\n realNode.addEventListener(name, eventHandlers[name] = events[name]);\n }\n }\n\n if (children) {\n const docfrag = document.createDocumentFragment();\n const childrenLen = children.length;\n\n for (let a = 0; a < childrenLen; a++) {\n const ch = children[a];\n ch && docfrag.appendChild(render(ch));\n }\n\n if (realNode.appendChild) {\n realNode.appendChild(docfrag);\n }\n }\n\n return realNode;\n}\n\nfunction createText (el) {\n return document.createTextNode(el.textContent);\n}\n\nexport default function render (el) {\n if (el instanceof Node) {\n return el;\n }\n if (Array.isArray(el)) {\n const frag = document.createDocumentFragment();\n el.forEach(item => frag.appendChild(render(item)));\n return frag;\n }\n const realNode = el.tagName ? createElement(el) : createText(el);\n realNodeMap.set(el.__id, realNode);\n return realNode;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/dom.js","import { removeAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n removeAccessor(realNode(src), data.name);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-attribute.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realDst = realNode(dst);\n const realSrc = realNode(src);\n\n // We don't do parentNode.removeChild because parentNode may report\n // incorrectly in some prollyfills since it's impossible (?) to spoof.\n realSrc.removeChild(realDst);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-child.js","import dom from '../vdom/dom';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realSrc = realNode(src);\n realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/replace-child.js","import { setAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n setAccessor(realNode(src), data.name, data.value);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-attribute.js","import eventMap from '../util/event-map';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n const realSrc = realNode(src);\n const eventHandlers = eventMap(realSrc);\n const name = data.name;\n const prevHandler = eventHandlers[name];\n const nextHandler = data.value;\n\n if (typeof prevHandler === 'function') {\n delete eventHandlers[name];\n realSrc.removeEventListener(name, prevHandler);\n }\n\n if (typeof nextHandler === 'function') {\n eventHandlers[name] = nextHandler;\n realSrc.addEventListener(name, nextHandler);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-event.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n realNode(src).textContent = dst.textContent;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/text-content.js","import WeakMap from './util/weak-map';\nimport createElement from './vdom/element';\nimport merge from './merge';\nimport mount from './vdom/mount';\n\nconst { Node } = window;\nconst oldTreeMap = new WeakMap();\n\nexport default function (render) {\n return function (elem, done) {\n elem = elem instanceof Node ? elem : this;\n\n if (!(elem instanceof Node)) {\n throw new Error('No node provided to diff renderer as either the first argument or the context.');\n }\n\n // Create a new element to house the new tree since we diff / mount fragments.\n const newTree = createElement('div', null, render(elem));\n const oldTree = oldTreeMap.get(elem);\n\n if (oldTree) {\n merge({\n destination: newTree,\n source: oldTree,\n done\n });\n } else {\n mount(elem, newTree.childNodes);\n if (typeof done === 'function') {\n done();\n }\n }\n\n oldTreeMap.set(elem, newTree);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/render.js","import { mapAccessor } from '../util/accessor';\nimport createTextNode from './text';\n\nfunction separateData (obj) {\n const attrs = {};\n const events = {};\n const node = {};\n let attrIdx = 0;\n\n for (let name in obj) {\n let value = obj[name];\n\n if (name.indexOf('on') === 0) {\n events[name.substring(2)] = value;\n } else {\n attrs[attrIdx++] = attrs[name] = { name, value };\n mapAccessor(node, name, value);\n }\n }\n\n attrs.length = attrIdx;\n return { attrs, events, node };\n}\n\nfunction ensureNodes (arr) {\n let out = [];\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n arr.filter(Boolean).forEach(function (item) {\n if (Array.isArray(item)) {\n out = out.concat(ensureNodes(item));\n } else if (typeof item === 'object') {\n out.push(translateFromReact(item));\n } else {\n out.push(createTextNode(item));\n }\n });\n return out;\n}\n\nfunction ensureTagName (name) {\n return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n}\n\nfunction isChildren (arg) {\n return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n}\n\nfunction isReactNode (item) {\n return item && item.type && item.props;\n}\n\nfunction translateFromReact (item) {\n if (isReactNode(item)) {\n const props = item.props;\n const chren = ensureNodes(props.children);\n delete props.children;\n return {\n nodeType: 1,\n tagName: item.type,\n attributes: props,\n childNodes: chren\n };\n }\n return item;\n}\n\nlet count = 0;\nexport default function element (name, attrs = {}, ...chren) {\n const isAttrsNode = isChildren(attrs);\n const data = separateData(isAttrsNode ? {} : attrs);\n const node = data.node;\n node.__id = ++count;\n node.nodeType = 1;\n node.tagName = ensureTagName(name);\n node.attributes = data.attrs;\n node.events = data.events;\n node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n return node;\n}\n\n// Add an array factory that returns an array of virtual nodes.\nelement.array = ensureNodes;\n\n// Generate built-in factories.\n[\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n].forEach(function (tag) {\n element[tag] = element.bind(null, tag);\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/element.js","export default function createTextNode (item) {\n return {\n nodeType: 3,\n textContent: item\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/text.js","import dom from './dom';\n\nfunction removeChildNodes (elem) {\n while (elem.firstChild) {\n const first = elem.firstChild;\n first.parentNode.removeChild(first);\n }\n}\n\nexport default function (elem, tree) {\n removeChildNodes(elem);\n elem.appendChild(dom(tree));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/mount.js","import dom from './dom';\nimport element from './element';\nimport mount from './mount';\nimport text from './text';\n\nexport default {\n dom,\n element,\n mount,\n text\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index bddc2fb..36faa97 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,882 +1,1376 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.skatejsDomDiff = global.skatejsDomDiff || {}))); -}(this, (function (exports) { - -var APPEND_CHILD = 1; -var REMOVE_CHILD = 2; -var REMOVE_ATTRIBUTE = 3; -var REPLACE_CHILD = 4; -var SET_ATTRIBUTE = 5; -var SET_EVENT = 6; -var SET_PROPERTY = 7; -var TEXT_CONTENT = 8; - -var types = Object.freeze({ - APPEND_CHILD: APPEND_CHILD, - REMOVE_CHILD: REMOVE_CHILD, - REMOVE_ATTRIBUTE: REMOVE_ATTRIBUTE, - REPLACE_CHILD: REPLACE_CHILD, - SET_ATTRIBUTE: SET_ATTRIBUTE, - SET_EVENT: SET_EVENT, - SET_PROPERTY: SET_PROPERTY, - TEXT_CONTENT: TEXT_CONTENT +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["skatejsDomDiff"] = factory(); + else + root["skatejsDomDiff"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _diff = __webpack_require__(1); + + var _diff2 = _interopRequireDefault(_diff); + + var _merge = __webpack_require__(16); + + var _merge2 = _interopRequireDefault(_merge); + + var _patch = __webpack_require__(17); + + var _patch2 = _interopRequireDefault(_patch); + + var _render = __webpack_require__(26); + + var _render2 = _interopRequireDefault(_render); + + var _types = __webpack_require__(3); + + var types = _interopRequireWildcard(_types); + + var _vdom = __webpack_require__(30); + + var _vdom2 = _interopRequireDefault(_vdom); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + exports.default = { + diff: _diff2.default, + merge: _merge2.default, + patch: _patch2.default, + render: _render2.default, + types: types, + vdom: _vdom2.default + }; + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = diff; + + var _diffMain = __webpack_require__(2); + + var _diffMain2 = _interopRequireDefault(_diffMain); + + var _diffWorker = __webpack_require__(15); + + var _diffWorker2 = _interopRequireDefault(_diffWorker); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var _window = window, + Node = _window.Node; + + + function diffWorker(opts) { + var worker = new _diffWorker2.default(); + var done = opts.done; + + worker.addEventListener('message', function (e) { + return done(e.data); + }); + delete opts.done; + worker.postMessage(opts); + } + + function diff() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var source = opts.source, + destination = opts.destination, + done = opts.done; + + var canDiffInWorker = done && !(source instanceof Node && destination instanceof Node); + return canDiffInWorker ? diffWorker(opts) : (0, _diffMain2.default)(opts); + } + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = diff; + + var _types = __webpack_require__(3); + + var types = _interopRequireWildcard(_types); + + var _node = __webpack_require__(4); + + var _node2 = _interopRequireDefault(_node); + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + var _realNodeMap = __webpack_require__(14); + + var _realNodeMap2 = _interopRequireDefault(_realNodeMap); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function diffNode(source, destination) { + var nodeInstructions = (0, _node2.default)(source, destination); + + // If there are instructions (even an empty array) it means the node can be + // diffed and doesn't have to be replaced. If the instructions are falsy + // it means that the nodes are not similar (cannot be changed) and must be + // replaced instead. + if (nodeInstructions) { + return nodeInstructions.concat(diff({ source: source, destination: destination })); + } + + return [{ + destination: destination, + source: source, + type: types.REPLACE_CHILD + }]; + } + + function diff(opts) { + var src = opts.source; + var dst = opts.destination; + + if (!src || !dst) { + return []; + } + + var instructions = opts.root ? diffNode(src, dst) : []; + + var srcChs = src.childNodes; + var dstChs = dst.childNodes; + var srcChsLen = srcChs ? srcChs.length : 0; + var dstChsLen = dstChs ? dstChs.length : 0; + + for (var a = 0; a < dstChsLen; a++) { + var curSrc = srcChs[a]; + var curDst = dstChs[a]; + + // If there is no matching destination node it means we need to remove the + // current source node from the source. + if (!curSrc) { + instructions.push({ + destination: dstChs[a], + source: src, + type: types.APPEND_CHILD + }); + continue; + } else { + // Ensure the real node is carried over even if the destination isn't used. + // This is used in the render() function to keep track of the real node + // that corresponds to a virtual node if a virtual tree is being used. + if (typeof curDst.__id !== 'undefined') { + _realNodeMap2.default.set(curDst.__id, (0, _realNode2.default)(curSrc)); + } + } + + instructions = instructions.concat(diffNode(curSrc, curDst)); + } + + if (dstChsLen < srcChsLen) { + for (var _a = dstChsLen; _a < srcChsLen; _a++) { + instructions.push({ + destination: srcChs[_a], + source: src, + type: types.REMOVE_CHILD + }); + } + } + + return instructions; + } + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + var APPEND_CHILD = exports.APPEND_CHILD = 1; + var REMOVE_CHILD = exports.REMOVE_CHILD = 2; + var REMOVE_ATTRIBUTE = exports.REMOVE_ATTRIBUTE = 3; + var REPLACE_CHILD = exports.REPLACE_CHILD = 4; + var SET_ATTRIBUTE = exports.SET_ATTRIBUTE = 5; + var SET_EVENT = exports.SET_EVENT = 6; + var SET_PROPERTY = exports.SET_PROPERTY = 7; + var TEXT_CONTENT = exports.TEXT_CONTENT = 8; + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + var dstType = void 0, + srcType = void 0; + + if (!dst || !src) { + return; + } + + dstType = dst.nodeType; + srcType = src.nodeType; + + if (dstType !== srcType) { + return; + } else if (dstType === NODE_ELEMENT) { + return (0, _element2.default)(src, dst); + } else if (dstType === NODE_TEXT) { + return (0, _text2.default)(src, dst); + } else if (dstType === NODE_COMMENT) { + return (0, _comment2.default)(src, dst); + } + }; + + var _element = __webpack_require__(5); + + var _element2 = _interopRequireDefault(_element); + + var _text = __webpack_require__(11); + + var _text2 = _interopRequireDefault(_text); + + var _comment = __webpack_require__(12); + + var _comment2 = _interopRequireDefault(_comment); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var NODE_COMMENT = 8; + var NODE_ELEMENT = 1; + var NODE_TEXT = 3; + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + if (src.tagName === dst.tagName) { + return (0, _attributes2.default)(src, dst).concat((0, _events2.default)(src, dst)); + } + }; + + var _attributes = __webpack_require__(6); + + var _attributes2 = _interopRequireDefault(_attributes); + + var _events = __webpack_require__(8); + + var _events2 = _interopRequireDefault(_events); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + var srcAttrs = src.attributes; + var dstAttrs = dst.attributes; + var srcAttrsLen = (srcAttrs || 0) && srcAttrs.length; + var dstAttrsLen = (dstAttrs || 0) && dstAttrs.length; + var instructions = []; + + // Bail early if possible. + if (!srcAttrsLen && !dstAttrsLen) { + return instructions; + } + + // Merge attributes that exist in source with destination's. + for (var a = 0; a < srcAttrsLen; a++) { + var srcAttr = srcAttrs[a]; + var srcAttrName = srcAttr.name; + var srcAttrValue = (0, _accessor.getAccessor)(src, srcAttrName); + var dstAttr = dstAttrs[srcAttrName]; + var dstAttrValue = (0, _accessor.getAccessor)(dst, srcAttrName); + + if (!dstAttr) { + instructions.push({ + data: { name: srcAttrName }, + destination: dst, + source: src, + type: types.REMOVE_ATTRIBUTE + }); + } else if (srcAttrValue !== dstAttrValue) { + instructions.push({ + data: { name: srcAttrName, value: dstAttrValue }, + destination: dst, + source: src, + type: types.SET_ATTRIBUTE + }); + } + } + + // We only need to worry about setting attributes that don't already exist + // in the source. + for (var _a = 0; _a < dstAttrsLen; _a++) { + var _dstAttr = dstAttrs[_a]; + var dstAttrName = _dstAttr.name; + var _dstAttrValue = (0, _accessor.getAccessor)(dst, dstAttrName); + var _srcAttr = srcAttrs[dstAttrName]; + + if (!_srcAttr) { + instructions.push({ + data: { name: dstAttrName, value: _dstAttrValue }, + destination: dst, + source: src, + type: types.SET_ATTRIBUTE + }); + } + } + + return instructions; + }; + + var _types = __webpack_require__(3); + + var types = _interopRequireWildcard(_types); + + var _accessor = __webpack_require__(7); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.getAccessor = getAccessor; + exports.mapAccessor = mapAccessor; + exports.removeAccessor = removeAccessor; + exports.setAccessor = setAccessor; + function classToString(obj) { + if (typeof obj === 'string') { + return obj; + } + + if (Array.isArray(obj)) { + return obj.join(' '); + } + + return Object.keys(obj).filter(function (key) { + return obj[key] ? key : false; + }).join(' '); + } + + function styleToString(obj) { + if (typeof obj === 'string') { + return obj; + } + + return Object.keys(obj).map(function (key) { + return key + ': ' + obj[key] + ';'; + }).join(' '); + } + + function getAccessor(node, name) { + if (name === 'class') { + return node.className; + } else if (name === 'style') { + return node.style.cssText; + // most things + } else if (name !== 'type' && name in node) { + return node[name]; + // real DOM elements + } else if (node.getAttribute) { + return node.getAttribute(name); + // vDOM nodes + } else if (node.attributes && node.attributes[name]) { + return node.attributes[name].value; + } + } + + function mapAccessor(node, name, value) { + if (name === 'class') { + node.className = classToString(value); + } else if (name === 'style') { + node.style = { cssText: styleToString(value) }; + } + } + + function removeAccessor(node, name) { + if (name === 'class') { + node.className = ''; + } else if (name === 'style') { + node.style.cssText = ''; + // most things + } else if (name !== 'type' && name in node) { + node[name] = ''; + // real DOM elements + } else if (node.removeAttribute) { + node.removeAttribute(name); + // vDOM nodes + } else if (node.attributes) { + delete node.attributes[name]; + } + } + + function setAccessor(node, name, value) { + if (name === 'class') { + node.className = value; + } else if (name === 'style') { + node.style.cssText = value; + // most things + } else if (name !== 'type' && name in node || typeof value !== 'string') { + // We check if it's undefined or null because IE throws "invalid argument" + // errors for some types of properties. Essentially this is the same as + // removing the accessor. + node[name] = value == null ? '' : value; + // real DOM elements + } else if (node.setAttribute) { + node.setAttribute(name, value); + // vDOM nodes + } else if (node.attributes) { + node.attributes[node.attributes.length] = node.attributes[name] = { name: name, value: value }; + } + } + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + var dstEvents = dst.events; + var srcEvents = (0, _eventMap2.default)(src); + var instructions = []; + + // Remove any source events that aren't in the destination before seeing if + // we need to add any from the destination. + if (srcEvents) { + for (var name in srcEvents) { + if (dstEvents && dstEvents[name] !== srcEvents[name]) { + instructions.push({ + data: { name: name, value: undefined }, + destination: dst, + source: src, + type: types.SET_EVENT + }); + } + } + } + + // After instructing to remove any old events, we then can instruct to add + // new events. This prevents the new events from being removed from earlier + // instructions. + if (dstEvents) { + for (var _name in dstEvents) { + var value = dstEvents[_name]; + if (srcEvents[_name] !== value) { + instructions.push({ + data: { name: _name, value: value }, + destination: dst, + source: src, + type: types.SET_EVENT + }); + } + } + } + + return instructions; + }; + + var _types = __webpack_require__(3); + + var types = _interopRequireWildcard(_types); + + var _eventMap = __webpack_require__(9); + + var _eventMap2 = _interopRequireDefault(_eventMap); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (elem) { + var events = map.get(elem); + events || map.set(elem, events = {}); + return events; + }; + + var _weakMap = __webpack_require__(10); + + var _weakMap2 = _interopRequireDefault(_weakMap); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var map = new _weakMap2.default(); + +/***/ }, +/* 10 */ +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + // Because weak map polyfills either are too big or don't use native if + // available properly. + + var index = 0; + var prefix = '__WEAK_MAP_POLYFILL_'; + + exports.default = function () { + if (typeof WeakMap !== 'undefined') { + return WeakMap; + } + + function Polyfill() { + this.key = prefix + index; + ++index; + } + + Polyfill.prototype = { + get: function get(obj) { + return obj[this.key]; + }, + set: function set(obj, val) { + obj[this.key] = val; + } + }; + + return Polyfill; + }(); + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + if (src.textContent === dst.textContent) { + return []; + } + + return [{ + destination: dst, + source: src, + type: types.TEXT_CONTENT + }]; + }; + + var _types = __webpack_require__(3); + + var types = _interopRequireWildcard(_types); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _text = __webpack_require__(11); + + var _text2 = _interopRequireDefault(_text); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + exports.default = _text2.default; + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (node) { + return isWindow && node instanceof Node ? node : _realNodeMap2.default.get(node.__id); + }; + + var _realNodeMap = __webpack_require__(14); + + var _realNodeMap2 = _interopRequireDefault(_realNodeMap); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var isWindow = typeof window !== 'undefined'; + + var _ref = isWindow ? window : self, + Node = _ref.Node; + +/***/ }, +/* 14 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + // import WeakMap from './weak-map'; + // export default new WeakMap(); + var map = []; + exports.default = { + get: function get(id) { + return map[id]; + }, + set: function set(id, node) { + map[id] = node; + } + }; + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = function() { + return new Worker(__webpack_require__.p + "./dist/e375e330bcafe442dfca.js"); + }; + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function () { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var source = opts.source, + destination = opts.destination, + _done = opts.done; + + if (_done) { + return (0, _diff2.default)({ + source: source, + destination: destination, + done: function done(instructions) { + (0, _patch2.default)(instructions); + _done(instructions); + } + }); + } + var instructions = (0, _diff2.default)(opts); + (0, _patch2.default)(instructions); + return instructions; + }; + + var _diff = __webpack_require__(1); + + var _diff2 = _interopRequireDefault(_diff); + + var _patch = __webpack_require__(17); + + var _patch2 = _interopRequireDefault(_patch); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (instructions) { + instructions.forEach(patch); + }; + + var _types = __webpack_require__(3); + + var types = _interopRequireWildcard(_types); + + var _appendChild = __webpack_require__(18); + + var _appendChild2 = _interopRequireDefault(_appendChild); + + var _removeAttribute = __webpack_require__(20); + + var _removeAttribute2 = _interopRequireDefault(_removeAttribute); + + var _removeChild = __webpack_require__(21); + + var _removeChild2 = _interopRequireDefault(_removeChild); + + var _replaceChild = __webpack_require__(22); + + var _replaceChild2 = _interopRequireDefault(_replaceChild); + + var _setAttribute = __webpack_require__(23); + + var _setAttribute2 = _interopRequireDefault(_setAttribute); + + var _setEvent = __webpack_require__(24); + + var _setEvent2 = _interopRequireDefault(_setEvent); + + var _textContent = __webpack_require__(25); + + var _textContent2 = _interopRequireDefault(_textContent); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + var patchers = {}; + patchers[types.APPEND_CHILD] = _appendChild2.default; + patchers[types.REMOVE_ATTRIBUTE] = _removeAttribute2.default; + patchers[types.REMOVE_CHILD] = _removeChild2.default; + patchers[types.REPLACE_CHILD] = _replaceChild2.default; + patchers[types.SET_ATTRIBUTE] = _setAttribute2.default; + patchers[types.SET_EVENT] = _setEvent2.default; + patchers[types.TEXT_CONTENT] = _textContent2.default; + + function patch(instruction) { + patchers[instruction.type](instruction.source, instruction.destination, instruction.data); + } + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + (0, _realNode2.default)(src).appendChild((0, _dom2.default)(dst)); + }; + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + var _dom = __webpack_require__(19); + + var _dom2 = _interopRequireDefault(_dom); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + + exports.default = render; + + var _accessor = __webpack_require__(7); + + var _eventMap = __webpack_require__(9); + + var _eventMap2 = _interopRequireDefault(_eventMap); + + var _realNodeMap = __webpack_require__(14); + + var _realNodeMap2 = _interopRequireDefault(_realNodeMap); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var _window = window, + Node = _window.Node; + + + function createElement(el) { + var realNode = document.createElement(el.tagName); + var attributes = el.attributes; + var events = el.events; + var eventHandlers = (0, _eventMap2.default)(realNode); + var children = el.childNodes; + + if (attributes) { + var attributesLen = attributes.length; + for (var a = 0; a < attributesLen; a++) { + var attr = attributes[a]; + (0, _accessor.setAccessor)(realNode, attr.name, attr.value); + } + } + + if (events) { + for (var name in events) { + realNode.addEventListener(name, eventHandlers[name] = events[name]); + } + } + + if (children) { + var docfrag = document.createDocumentFragment(); + var childrenLen = children.length; + + for (var _a = 0; _a < childrenLen; _a++) { + var ch = children[_a]; + ch && docfrag.appendChild(render(ch)); + } + + if (realNode.appendChild) { + realNode.appendChild(docfrag); + } + } + + return realNode; + } + + function createText(el) { + return document.createTextNode(el.textContent); + } + + function render(el) { + if (el instanceof Node) { + return el; + } + if (Array.isArray(el)) { + var _ret = function () { + var frag = document.createDocumentFragment(); + el.forEach(function (item) { + return frag.appendChild(render(item)); + }); + return { + v: frag + }; + }(); + + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; + } + var realNode = el.tagName ? createElement(el) : createText(el); + _realNodeMap2.default.set(el.__id, realNode); + return realNode; + } + +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst, data) { + (0, _accessor.removeAccessor)((0, _realNode2.default)(src), data.name); + }; + + var _accessor = __webpack_require__(7); + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + var realDst = (0, _realNode2.default)(dst); + var realSrc = (0, _realNode2.default)(src); + + // We don't do parentNode.removeChild because parentNode may report + // incorrectly in some prollyfills since it's impossible (?) to spoof. + realSrc.removeChild(realDst); + }; + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + var realSrc = (0, _realNode2.default)(src); + realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild((0, _dom2.default)(dst), realSrc); + }; + + var _dom = __webpack_require__(19); + + var _dom2 = _interopRequireDefault(_dom); + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 23 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst, data) { + (0, _accessor.setAccessor)((0, _realNode2.default)(src), data.name, data.value); + }; + + var _accessor = __webpack_require__(7); + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst, data) { + var realSrc = (0, _realNode2.default)(src); + var eventHandlers = (0, _eventMap2.default)(realSrc); + var name = data.name; + var prevHandler = eventHandlers[name]; + var nextHandler = data.value; + + if (typeof prevHandler === 'function') { + delete eventHandlers[name]; + realSrc.removeEventListener(name, prevHandler); + } + + if (typeof nextHandler === 'function') { + eventHandlers[name] = nextHandler; + realSrc.addEventListener(name, nextHandler); + } + }; + + var _eventMap = __webpack_require__(9); + + var _eventMap2 = _interopRequireDefault(_eventMap); + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (src, dst) { + (0, _realNode2.default)(src).textContent = dst.textContent; + }; + + var _realNode = __webpack_require__(13); + + var _realNode2 = _interopRequireDefault(_realNode); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (render) { + return function (elem, done) { + elem = elem instanceof Node ? elem : this; + + if (!(elem instanceof Node)) { + throw new Error('No node provided to diff renderer as either the first argument or the context.'); + } + + // Create a new element to house the new tree since we diff / mount fragments. + var newTree = (0, _element2.default)('div', null, render(elem)); + var oldTree = oldTreeMap.get(elem); + + if (oldTree) { + (0, _merge2.default)({ + destination: newTree, + source: oldTree, + done: done + }); + } else { + (0, _mount2.default)(elem, newTree.childNodes); + if (typeof done === 'function') { + done(); + } + } + + oldTreeMap.set(elem, newTree); + }; + }; + + var _weakMap = __webpack_require__(10); + + var _weakMap2 = _interopRequireDefault(_weakMap); + + var _element = __webpack_require__(27); + + var _element2 = _interopRequireDefault(_element); + + var _merge = __webpack_require__(16); + + var _merge2 = _interopRequireDefault(_merge); + + var _mount = __webpack_require__(29); + + var _mount2 = _interopRequireDefault(_mount); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var _window = window, + Node = _window.Node; + + var oldTreeMap = new _weakMap2.default(); + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + + exports.default = element; + + var _accessor = __webpack_require__(7); + + var _text = __webpack_require__(28); + + var _text2 = _interopRequireDefault(_text); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function separateData(obj) { + var attrs = {}; + var events = {}; + var node = {}; + var attrIdx = 0; + + for (var name in obj) { + var value = obj[name]; + + if (name.indexOf('on') === 0) { + events[name.substring(2)] = value; + } else { + attrs[attrIdx++] = attrs[name] = { name: name, value: value }; + (0, _accessor.mapAccessor)(node, name, value); + } + } + + attrs.length = attrIdx; + return { attrs: attrs, events: events, node: node }; + } + + function ensureNodes(arr) { + var out = []; + if (!Array.isArray(arr)) { + arr = [arr]; + } + arr.filter(Boolean).forEach(function (item) { + if (Array.isArray(item)) { + out = out.concat(ensureNodes(item)); + } else if ((typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object') { + out.push(translateFromReact(item)); + } else { + out.push((0, _text2.default)(item)); + } + }); + return out; + } + + function ensureTagName(name) { + return (typeof name === 'function' ? name.id || name.name : name).toUpperCase(); + } + + function isChildren(arg) { + return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg)); + } + + function isReactNode(item) { + return item && item.type && item.props; + } + + function translateFromReact(item) { + if (isReactNode(item)) { + var props = item.props; + var chren = ensureNodes(props.children); + delete props.children; + return { + nodeType: 1, + tagName: item.type, + attributes: props, + childNodes: chren + }; + } + return item; + } + + var count = 0; + function element(name) { + var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var isAttrsNode = isChildren(attrs); + var data = separateData(isAttrsNode ? {} : attrs); + var node = data.node; + node.__id = ++count; + node.nodeType = 1; + node.tagName = ensureTagName(name); + node.attributes = data.attrs; + node.events = data.events; + + for (var _len = arguments.length, chren = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + chren[_key - 2] = arguments[_key]; + } + + node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren); + return node; + } + + // Add an array factory that returns an array of virtual nodes. + element.array = ensureNodes; + + // Generate built-in factories. + ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'bgsound', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'command', 'content', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'element', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'image', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'multicol', 'nav', 'nobr', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'rtc', 'ruby', 's', 'samp', 'script', 'section', 'select', 'shadow', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr'].forEach(function (tag) { + element[tag] = element.bind(null, tag); + }); + +/***/ }, +/* 28 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = createTextNode; + function createTextNode(item) { + return { + nodeType: 3, + textContent: item + }; + } + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + exports.default = function (elem, tree) { + removeChildNodes(elem); + elem.appendChild((0, _dom2.default)(tree)); + }; + + var _dom = __webpack_require__(19); + + var _dom2 = _interopRequireDefault(_dom); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function removeChildNodes(elem) { + while (elem.firstChild) { + var first = elem.firstChild; + first.parentNode.removeChild(first); + } + } + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _dom = __webpack_require__(19); + + var _dom2 = _interopRequireDefault(_dom); + + var _element = __webpack_require__(27); + + var _element2 = _interopRequireDefault(_element); + + var _mount = __webpack_require__(29); + + var _mount2 = _interopRequireDefault(_mount); + + var _text = __webpack_require__(28); + + var _text2 = _interopRequireDefault(_text); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + exports.default = { + dom: _dom2.default, + element: _element2.default, + mount: _mount2.default, + text: _text2.default + }; + +/***/ } +/******/ ]) }); - -function classToString(obj) { - if (typeof obj === 'string') { - return obj; - } - - if (Array.isArray(obj)) { - return obj.join(' '); - } - - return Object.keys(obj).filter(function (key) { - return obj[key] ? key : false; - }).join(' '); -} - -function styleToString(obj) { - if (typeof obj === 'string') { - return obj; - } - - return Object.keys(obj).map(function (key) { - return key + ': ' + obj[key] + ';'; - }).join(' '); -} - -function getAccessor(node, name) { - if (name === 'class') { - return node.className; - } else if (name === 'style') { - return node.style.cssText; - // most things - } else if (name !== 'type' && name in node) { - return node[name]; - // real DOM elements - } else if (node.getAttribute) { - return node.getAttribute(name); - // vDOM nodes - } else if (node.attributes && node.attributes[name]) { - return node.attributes[name].value; - } -} - -function mapAccessor(node, name, value) { - if (name === 'class') { - node.className = classToString(value); - } else if (name === 'style') { - node.style = { cssText: styleToString(value) }; - } -} - -function removeAccessor(node, name) { - if (name === 'class') { - node.className = ''; - } else if (name === 'style') { - node.style.cssText = ''; - // most things - } else if (name !== 'type' && name in node) { - node[name] = ''; - // real DOM elements - } else if (node.removeAttribute) { - node.removeAttribute(name); - // vDOM nodes - } else if (node.attributes) { - delete node.attributes[name]; - } -} - -function setAccessor(node, name, value) { - if (name === 'class') { - node.className = value; - } else if (name === 'style') { - node.style.cssText = value; - // most things - } else if (name !== 'type' && name in node || typeof value !== 'string') { - // We check if it's undefined or null because IE throws "invalid argument" - // errors for some types of properties. Essentially this is the same as - // removing the accessor. - node[name] = value == null ? '' : value; - // real DOM elements - } else if (node.setAttribute) { - node.setAttribute(name, value); - // vDOM nodes - } else if (node.attributes) { - node.attributes[node.attributes.length] = node.attributes[name] = { name: name, value: value }; - } -} - -var compareAttributes = function (src, dst) { - var srcAttrs = src.attributes; - var dstAttrs = dst.attributes; - var srcAttrsLen = (srcAttrs || 0) && srcAttrs.length; - var dstAttrsLen = (dstAttrs || 0) && dstAttrs.length; - var instructions = []; - - // Bail early if possible. - if (!srcAttrsLen && !dstAttrsLen) { - return instructions; - } - - // Merge attributes that exist in source with destination's. - for (var a = 0; a < srcAttrsLen; a++) { - var srcAttr = srcAttrs[a]; - var srcAttrName = srcAttr.name; - var srcAttrValue = getAccessor(src, srcAttrName); - var dstAttr = dstAttrs[srcAttrName]; - var dstAttrValue = getAccessor(dst, srcAttrName); - - if (!dstAttr) { - instructions.push({ - data: { name: srcAttrName }, - destination: dst, - source: src, - type: REMOVE_ATTRIBUTE - }); - } else if (srcAttrValue !== dstAttrValue) { - instructions.push({ - data: { name: srcAttrName, value: dstAttrValue }, - destination: dst, - source: src, - type: SET_ATTRIBUTE - }); - } - } - - // We only need to worry about setting attributes that don't already exist - // in the source. - for (var _a = 0; _a < dstAttrsLen; _a++) { - var _dstAttr = dstAttrs[_a]; - var dstAttrName = _dstAttr.name; - var _dstAttrValue = getAccessor(dst, dstAttrName); - var _srcAttr = srcAttrs[dstAttrName]; - - if (!_srcAttr) { - instructions.push({ - data: { name: dstAttrName, value: _dstAttrValue }, - destination: dst, - source: src, - type: SET_ATTRIBUTE - }); - } - } - - return instructions; -}; - -// Because weak map polyfills either are too big or don't use native if -// available properly. - -var index$1 = 0; -var prefix = '__WEAK_MAP_POLYFILL_'; - -var WeakMap$1 = (function () { - if (typeof WeakMap !== 'undefined') { - return WeakMap; - } - - function Polyfill() { - this.key = prefix + index$1; - ++index$1; - } - - Polyfill.prototype = { - get: function get(obj) { - return obj[this.key]; - }, - set: function set(obj, val) { - obj[this.key] = val; - } - }; - - return Polyfill; -})(); - -var map = new WeakMap$1(); - -var eventMap = function (elem) { - var events = map.get(elem); - events || map.set(elem, events = {}); - return events; -}; - -var compareEvents = function (src, dst) { - var dstEvents = dst.events; - var srcEvents = eventMap(src); - var instructions = []; - - // Remove any source events that aren't in the destination before seeing if - // we need to add any from the destination. - if (srcEvents) { - for (var name in srcEvents) { - if (dstEvents && dstEvents[name] !== srcEvents[name]) { - instructions.push({ - data: { name: name, value: undefined }, - destination: dst, - source: src, - type: SET_EVENT - }); - } - } - } - - // After instructing to remove any old events, we then can instruct to add - // new events. This prevents the new events from being removed from earlier - // instructions. - if (dstEvents) { - for (var _name in dstEvents) { - var value = dstEvents[_name]; - if (srcEvents[_name] !== value) { - instructions.push({ - data: { name: _name, value: value }, - destination: dst, - source: src, - type: SET_EVENT - }); - } - } - } - - return instructions; -}; - -var compareElement = function (src, dst) { - if (src.tagName === dst.tagName) { - return compareAttributes(src, dst).concat(compareEvents(src, dst)); - } -}; - -var text = function (src, dst) { - if (src.textContent === dst.textContent) { - return []; - } - - return [{ - destination: dst, - source: src, - type: TEXT_CONTENT - }]; -}; - -var NODE_COMMENT = 8; -var NODE_ELEMENT = 1; -var NODE_TEXT = 3; - -var compareNode = function (src, dst) { - var dstType = void 0, - srcType = void 0; - - if (!dst || !src) { - return; - } - - dstType = dst.nodeType; - srcType = src.nodeType; - - if (dstType !== srcType) { - return; - } else if (dstType === NODE_ELEMENT) { - return compareElement(src, dst); - } else if (dstType === NODE_TEXT) { - return text(src, dst); - } else if (dstType === NODE_COMMENT) { - return text(src, dst); - } -}; - -var realNodeMap = new WeakMap$1(); - -var _window$1 = window; -var Node$1 = _window$1.Node; - - -var realNode = function (node) { - return node instanceof Node$1 ? node : realNodeMap.get(node); -}; - -var _window = window; -var Node = _window.Node; - - -function diffNode(source, destination) { - var nodeInstructions = compareNode(source, destination); - - // If there are instructions (even an empty array) it means the node can be - // diffed and doesn't have to be replaced. If the instructions are falsy - // it means that the nodes are not similar (cannot be changed) and must be - // replaced instead. - if (nodeInstructions) { - return nodeInstructions.concat(diff({ source: source, destination: destination })); - } - - return [{ - destination: destination, - source: source, - type: REPLACE_CHILD - }]; -} - -function diff() { - var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - var src = opts.source; - var dst = opts.destination; - - if (!src || !dst) { - return []; - } - - var instructions = opts.root ? diffNode(src, dst) : []; - - var srcChs = src.childNodes; - var dstChs = dst.childNodes; - var srcChsLen = srcChs ? srcChs.length : 0; - var dstChsLen = dstChs ? dstChs.length : 0; - - for (var a = 0; a < dstChsLen; a++) { - var curSrc = srcChs[a]; - var curDst = dstChs[a]; - - // If there is no matching destination node it means we need to remove the - // current source node from the source. - if (!curSrc) { - instructions.push({ - destination: dstChs[a], - source: src, - type: APPEND_CHILD - }); - continue; - } else { - // Ensure the real node is carried over even if the destination isn't used. - // This is used in the render() function to keep track of the real node - // that corresponds to a virtual node if a virtual tree is being used. - if (!(curDst instanceof Node)) { - realNodeMap.set(curDst, realNode(curSrc)); - } - } - - instructions = instructions.concat(diffNode(curSrc, curDst)); - } - - if (dstChsLen < srcChsLen) { - for (var _a = dstChsLen; _a < srcChsLen; _a++) { - instructions.push({ - destination: srcChs[_a], - source: src, - type: REMOVE_CHILD - }); - } - } - - return instructions; -} - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - -var asyncGenerator = function () { - function AwaitValue(value) { - this.value = value; - } - - function AsyncGenerator(gen) { - var front, back; - - function send(key, arg) { - return new Promise(function (resolve, reject) { - var request = { - key: key, - arg: arg, - resolve: resolve, - reject: reject, - next: null - }; - - if (back) { - back = back.next = request; - } else { - front = back = request; - resume(key, arg); - } - }); - } - - function resume(key, arg) { - try { - var result = gen[key](arg); - var value = result.value; - - if (value instanceof AwaitValue) { - Promise.resolve(value.value).then(function (arg) { - resume("next", arg); - }, function (arg) { - resume("throw", arg); - }); - } else { - settle(result.done ? "return" : "normal", result.value); - } - } catch (err) { - settle("throw", err); - } - } - - function settle(type, value) { - switch (type) { - case "return": - front.resolve({ - value: value, - done: true - }); - break; - - case "throw": - front.reject(value); - break; - - default: - front.resolve({ - value: value, - done: false - }); - break; - } - - front = front.next; - - if (front) { - resume(front.key, front.arg); - } else { - back = null; - } - } - - this._invoke = send; - - if (typeof gen.return !== "function") { - this.return = undefined; - } - } - - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { - return this; - }; - } - - AsyncGenerator.prototype.next = function (arg) { - return this._invoke("next", arg); - }; - - AsyncGenerator.prototype.throw = function (arg) { - return this._invoke("throw", arg); - }; - - AsyncGenerator.prototype.return = function (arg) { - return this._invoke("return", arg); - }; - - return { - wrap: function (fn) { - return function () { - return new AsyncGenerator(fn.apply(this, arguments)); - }; - }, - await: function (value) { - return new AwaitValue(value); - } - }; -}(); - - - - - - - - - - - - - - - -var get$1 = function get$1(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get$1(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - - - - - - - - - - - - - - - - - -var set$1 = function set$1(object, property, value, receiver) { - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent !== null) { - set$1(parent, property, value, receiver); - } - } else if ("value" in desc && desc.writable) { - desc.value = value; - } else { - var setter = desc.set; - - if (setter !== undefined) { - setter.call(receiver, value); - } - } - - return value; -}; - -var _window$2 = window; -var Node$2 = _window$2.Node; - - -function createElement(el) { - var realNode = document.createElement(el.tagName); - var attributes = el.attributes; - var events = el.events; - var eventHandlers = eventMap(realNode); - var children = el.childNodes; - - if (attributes) { - var attributesLen = attributes.length; - for (var a = 0; a < attributesLen; a++) { - var attr = attributes[a]; - setAccessor(realNode, attr.name, attr.value); - } - } - - if (events) { - for (var name in events) { - realNode.addEventListener(name, eventHandlers[name] = events[name]); - } - } - - if (children) { - var docfrag = document.createDocumentFragment(); - var childrenLen = children.length; - - for (var _a = 0; _a < childrenLen; _a++) { - var ch = children[_a]; - ch && docfrag.appendChild(render(ch)); - } - - if (realNode.appendChild) { - realNode.appendChild(docfrag); - } - } - - return realNode; -} - -function createText(el) { - return document.createTextNode(el.textContent); -} - -function render(el) { - if (el instanceof Node$2) { - return el; - } - if (Array.isArray(el)) { - var _ret = function () { - var frag = document.createDocumentFragment(); - el.forEach(function (item) { - return frag.appendChild(render(item)); - }); - return { - v: frag - }; - }(); - - if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; - } - var realNode = el.tagName ? createElement(el) : createText(el); - realNodeMap.set(el, realNode); - return realNode; -} - -var appendChild = function (src, dst) { - realNode(src).appendChild(render(dst)); -}; - -var removeAttribute = function (src, dst, data) { - removeAccessor(realNode(src), data.name); -}; - -var removeChild = function (src, dst) { - var realDst = realNode(dst); - var realSrc = realNode(src); - - // We don't do parentNode.removeChild because parentNode may report - // incorrectly in some prollyfills since it's impossible (?) to spoof. - realSrc.removeChild(realDst); -}; - -var replaceChild = function (src, dst) { - var realSrc = realNode(src); - realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(render(dst), realSrc); -}; - -var setAttribute = function (src, dst, data) { - setAccessor(realNode(src), data.name, data.value); -}; - -var setEvent = function (src, dst, data) { - var realSrc = realNode(src); - var eventHandlers = eventMap(realSrc); - var name = data.name; - var prevHandler = eventHandlers[name]; - var nextHandler = data.value; - - if (typeof prevHandler === 'function') { - delete eventHandlers[name]; - realSrc.removeEventListener(name, prevHandler); - } - - if (typeof nextHandler === 'function') { - eventHandlers[name] = nextHandler; - realSrc.addEventListener(name, nextHandler); - } -}; - -var textContent = function (src, dst) { - realNode(src).textContent = dst.textContent; -}; - -var patchers = {}; -patchers[APPEND_CHILD] = appendChild; -patchers[REMOVE_ATTRIBUTE] = removeAttribute; -patchers[REMOVE_CHILD] = removeChild; -patchers[REPLACE_CHILD] = replaceChild; -patchers[SET_ATTRIBUTE] = setAttribute; -patchers[SET_EVENT] = setEvent; -patchers[TEXT_CONTENT] = textContent; - -function patch(instruction) { - patchers[instruction.type](instruction.source, instruction.destination, instruction.data); -} - -var patch$1 = function (instructions) { - instructions.forEach(patch); -}; - -var merge = function (opts) { - var inst = diff(opts); - patch$1(inst); - return inst; -}; - -function createTextNode(item) { - return { - nodeType: 3, - textContent: item - }; -} - -function separateData(obj) { - var attrs = {}; - var events = {}; - var node = {}; - var attrIdx = 0; - - for (var name in obj) { - var value = obj[name]; - - if (name.indexOf('on') === 0) { - events[name.substring(2)] = value; - } else { - attrs[attrIdx++] = attrs[name] = { name: name, value: value }; - mapAccessor(node, name, value); - } - } - - attrs.length = attrIdx; - return { attrs: attrs, events: events, node: node }; -} - -function ensureNodes(arr) { - var out = []; - if (!Array.isArray(arr)) { - arr = [arr]; - } - arr.filter(Boolean).forEach(function (item) { - if (Array.isArray(item)) { - out = out.concat(ensureNodes(item)); - } else if ((typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object') { - out.push(translateFromReact(item)); - } else { - out.push(createTextNode(item)); - } - }); - return out; -} - -function ensureTagName(name) { - return (typeof name === 'function' ? name.id || name.name : name).toUpperCase(); -} - -function isChildren(arg) { - return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg)); -} - -function isReactNode(item) { - return item && item.type && item.props; -} - -function translateFromReact(item) { - if (isReactNode(item)) { - var props = item.props; - var chren = ensureNodes(props.children); - delete props.children; - return { - nodeType: 1, - tagName: item.type, - attributes: props, - childNodes: chren - }; - } - return item; -} - -function element(name) { - var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - var isAttrsNode = isChildren(attrs); - var data = separateData(isAttrsNode ? {} : attrs); - var node = data.node; - node.nodeType = 1; - node.tagName = ensureTagName(name); - node.attributes = data.attrs; - node.events = data.events; - - for (var _len = arguments.length, chren = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - chren[_key - 2] = arguments[_key]; - } - - node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren); - return node; -} - -// Add an array factory that returns an array of virtual nodes. -element.array = ensureNodes; - -// Generate built-in factories. -['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'bgsound', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'command', 'content', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'element', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'image', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'multicol', 'nav', 'nobr', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'rtc', 'ruby', 's', 'samp', 'script', 'section', 'select', 'shadow', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr'].forEach(function (tag) { - element[tag] = element.bind(null, tag); -}); - -function removeChildNodes(elem) { - while (elem.firstChild) { - var first = elem.firstChild; - first.parentNode.removeChild(first); - } -} - -var mount = function (elem, tree) { - removeChildNodes(elem); - elem.appendChild(render(tree)); -}; - -var _window$3 = window; -var Node$3 = _window$3.Node; - -var oldTreeMap = new WeakMap$1(); - -var render$1 = function (render) { - return function (elem) { - elem = elem instanceof Node$3 ? elem : this; - - if (!(elem instanceof Node$3)) { - throw new Error('No node provided to diff renderer as either the first argument or the context.'); - } - - // Create a new element to house the new tree since we diff / mount fragments. - var newTree = element('div', null, render(elem)); - var oldTree = oldTreeMap.get(elem); - - if (oldTree) { - merge({ - destination: newTree, - source: oldTree - }); - } else { - mount(elem, newTree.childNodes); - } - - oldTreeMap.set(elem, newTree); - }; -}; - -var vdom = { - dom: render, - element: element, - mount: mount, - text: createTextNode -}; - -var version = '0.3.1'; - -var index = { - diff: diff, - merge: merge, - patch: patch$1, - render: render$1, - types: types, - vdom: vdom, - version: version -}; - -exports['default'] = index; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -//# sourceMappingURL=index.js.map +; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 014e9b8..fc1d7ef 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":null,"sources":["../src/types.js","../src/util/accessor.js","../src/compare/attributes.js","../src/util/weak-map.js","../src/util/event-map.js","../src/compare/events.js","../src/compare/element.js","../src/compare/text.js","../src/compare/node.js","../src/util/real-node-map.js","../src/util/real-node.js","../src/diff.js","../src/vdom/dom.js","../src/patch/append-child.js","../src/patch/remove-attribute.js","../src/patch/remove-child.js","../src/patch/replace-child.js","../src/patch/set-attribute.js","../src/patch/set-event.js","../src/patch/text-content.js","../src/patch.js","../src/merge.js","../src/vdom/text.js","../src/vdom/element.js","../src/vdom/mount.js","../src/render.js","../src/vdom/index.js","../src/version.js","../src/index.js"],"sourcesContent":["export const APPEND_CHILD = 1;\nexport const REMOVE_CHILD = 2;\nexport const REMOVE_ATTRIBUTE = 3;\nexport const REPLACE_CHILD = 4;\nexport const SET_ATTRIBUTE = 5;\nexport const SET_EVENT = 6;\nexport const SET_PROPERTY = 7;\nexport const TEXT_CONTENT = 8;\n","function classToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.join(' ');\n }\n\n return Object.keys(obj).filter(function (key) {\n return obj[key] ? key : false;\n }).join(' ');\n}\n\nfunction styleToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n return Object.keys(obj).map(function (key) {\n return `${key}: ${obj[key]};`;\n }).join(' ');\n}\n\nexport function getAccessor (node, name) {\n if (name === 'class') {\n return node.className;\n } else if (name === 'style') {\n return node.style.cssText;\n // most things\n } else if (name !== 'type' && name in node) {\n return node[name];\n // real DOM elements\n } else if (node.getAttribute) {\n return node.getAttribute(name);\n // vDOM nodes\n } else if (node.attributes && node.attributes[name]) {\n return node.attributes[name].value;\n }\n}\n\nexport function mapAccessor (node, name, value) {\n if (name === 'class') {\n node.className = classToString(value);\n } else if (name === 'style') {\n node.style = { cssText: styleToString(value) };\n }\n}\n\nexport function removeAccessor (node, name) {\n if (name === 'class') {\n node.className = '';\n } else if (name === 'style') {\n node.style.cssText = '';\n // most things\n } else if (name !== 'type' && name in node) {\n node[name] = '';\n // real DOM elements\n } else if (node.removeAttribute) {\n node.removeAttribute(name);\n // vDOM nodes\n } else if (node.attributes) {\n delete node.attributes[name];\n }\n}\n\nexport function setAccessor (node, name, value) {\n if (name === 'class') {\n node.className = value;\n } else if (name === 'style') {\n node.style.cssText = value;\n // most things\n } else if (name !== 'type' && name in node || typeof value !== 'string') {\n // We check if it's undefined or null because IE throws \"invalid argument\"\n // errors for some types of properties. Essentially this is the same as\n // removing the accessor.\n node[name] = value == null ? '' : value;\n // real DOM elements\n } else if (node.setAttribute) {\n node.setAttribute(name, value);\n // vDOM nodes\n } else if (node.attributes) {\n node.attributes[node.attributes.length] = node.attributes[name] = { name, value };\n }\n}\n","import * as types from '../types';\nimport { getAccessor } from '../util/accessor';\n\nexport default function (src, dst) {\n let srcAttrs = src.attributes;\n let dstAttrs = dst.attributes;\n let srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n let dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n let instructions = [];\n\n // Bail early if possible.\n if (!srcAttrsLen && !dstAttrsLen) {\n return instructions;\n }\n\n // Merge attributes that exist in source with destination's.\n for (let a = 0; a < srcAttrsLen; a++) {\n const srcAttr = srcAttrs[a];\n const srcAttrName = srcAttr.name;\n const srcAttrValue = getAccessor(src, srcAttrName);\n const dstAttr = dstAttrs[srcAttrName];\n const dstAttrValue = getAccessor(dst, srcAttrName);\n\n if (!dstAttr) {\n instructions.push({\n data: { name: srcAttrName },\n destination: dst,\n source: src,\n type: types.REMOVE_ATTRIBUTE\n });\n } else if (srcAttrValue !== dstAttrValue) {\n instructions.push({\n data: { name: srcAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n // We only need to worry about setting attributes that don't already exist\n // in the source.\n for (let a = 0; a < dstAttrsLen; a++) {\n const dstAttr = dstAttrs[a];\n const dstAttrName = dstAttr.name;\n const dstAttrValue = getAccessor(dst, dstAttrName);\n const srcAttr = srcAttrs[dstAttrName];\n\n if (!srcAttr) {\n instructions.push({\n data: { name: dstAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n return instructions;\n}\n","// Because weak map polyfills either are too big or don't use native if\n// available properly.\n\nlet index = 0;\nconst prefix = '__WEAK_MAP_POLYFILL_';\n\nexport default (function () {\n if (typeof WeakMap !== 'undefined') {\n return WeakMap;\n }\n\n function Polyfill () {\n this.key = prefix + index;\n ++index;\n }\n\n Polyfill.prototype = {\n get (obj) {\n return obj[this.key];\n },\n set (obj, val) {\n obj[this.key] = val;\n }\n };\n\n return Polyfill;\n})();\n","import WeakMap from './weak-map';\n\nconst map = new WeakMap();\n\nexport default function (elem) {\n let events = map.get(elem);\n events || map.set(elem, events = {});\n return events;\n}\n","import * as types from '../types';\nimport eventMap from '../util/event-map';\n\nexport default function (src, dst) {\n const dstEvents = dst.events;\n const srcEvents = eventMap(src);\n const instructions = [];\n\n // Remove any source events that aren't in the destination before seeing if\n // we need to add any from the destination.\n if (srcEvents) {\n for (let name in srcEvents) {\n if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n instructions.push({\n data: { name, value: undefined },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n // After instructing to remove any old events, we then can instruct to add\n // new events. This prevents the new events from being removed from earlier\n // instructions.\n if (dstEvents) {\n for (let name in dstEvents) {\n const value = dstEvents[name];\n if (srcEvents[name] !== value) {\n instructions.push({\n data: { name, value },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n return instructions;\n}\n","import compareAttributes from './attributes';\nimport compareEvents from './events';\n\nexport default function (src, dst) {\n if (src.tagName === dst.tagName) {\n return compareAttributes(src, dst).concat(compareEvents(src, dst));\n }\n}\n","import * as types from '../types';\n\nexport default function (src, dst) {\n if (src.textContent === dst.textContent) {\n return [];\n }\n\n return [{\n destination: dst,\n source: src,\n type: types.TEXT_CONTENT\n }];\n}\n","import compareElement from './element';\nimport compareText from './text';\nimport compareComment from './comment';\n\nconst NODE_COMMENT = 8;\nconst NODE_ELEMENT = 1;\nconst NODE_TEXT = 3;\n\nexport default function (src, dst) {\n let dstType, srcType;\n\n if (!dst || !src) {\n return;\n }\n\n dstType = dst.nodeType;\n srcType = src.nodeType;\n\n if (dstType !== srcType) {\n return;\n } else if (dstType === NODE_ELEMENT) {\n return compareElement(src, dst);\n } else if (dstType === NODE_TEXT) {\n return compareText(src, dst);\n } else if (dstType === NODE_COMMENT) {\n return compareComment(src, dst);\n }\n}\n","import WeakMap from './weak-map';\nexport default new WeakMap();\n","import realNodeMap from './real-node-map';\n\nconst { Node } = window;\n\nexport default function (node) {\n return node instanceof Node ? node : realNodeMap.get(node);\n}\n","import * as types from './types';\nimport compareNode from './compare/node';\nimport realNode from './util/real-node';\nimport realNodeMap from './util/real-node-map';\n\nconst { Node } = window;\n\nfunction diffNode (source, destination) {\n let nodeInstructions = compareNode(source, destination);\n\n // If there are instructions (even an empty array) it means the node can be\n // diffed and doesn't have to be replaced. If the instructions are falsy\n // it means that the nodes are not similar (cannot be changed) and must be\n // replaced instead.\n if (nodeInstructions) {\n return nodeInstructions.concat(diff({ source, destination }));\n }\n\n return [{\n destination,\n source,\n type: types.REPLACE_CHILD\n }];\n}\n\nexport default function diff (opts = {}) {\n const src = opts.source;\n const dst = opts.destination;\n\n if (!src || !dst) {\n return [];\n }\n\n let instructions = opts.root ? diffNode(src, dst) : [];\n\n const srcChs = src.childNodes;\n const dstChs = dst.childNodes;\n const srcChsLen = srcChs ? srcChs.length : 0;\n const dstChsLen = dstChs ? dstChs.length : 0;\n\n for (let a = 0; a < dstChsLen; a++) {\n const curSrc = srcChs[a];\n const curDst = dstChs[a];\n\n // If there is no matching destination node it means we need to remove the\n // current source node from the source.\n if (!curSrc) {\n instructions.push({\n destination: dstChs[a],\n source: src,\n type: types.APPEND_CHILD\n });\n continue;\n } else {\n // Ensure the real node is carried over even if the destination isn't used.\n // This is used in the render() function to keep track of the real node\n // that corresponds to a virtual node if a virtual tree is being used.\n if (!(curDst instanceof Node)) {\n realNodeMap.set(curDst, realNode(curSrc));\n }\n }\n\n instructions = instructions.concat(diffNode(curSrc, curDst));\n }\n\n if (dstChsLen < srcChsLen) {\n for (let a = dstChsLen; a < srcChsLen; a++) {\n instructions.push({\n destination: srcChs[a],\n source: src,\n type: types.REMOVE_CHILD\n });\n }\n }\n\n return instructions;\n}\n","import { setAccessor } from '../util/accessor';\nimport eventMap from '../util/event-map';\nimport realNodeMap from '../util/real-node-map';\n\nconst { Node } = window;\n\nfunction createElement (el) {\n const realNode = document.createElement(el.tagName);\n const attributes = el.attributes;\n const events = el.events;\n const eventHandlers = eventMap(realNode);\n const children = el.childNodes;\n\n if (attributes) {\n const attributesLen = attributes.length;\n for (let a = 0; a < attributesLen; a++) {\n const attr = attributes[a];\n setAccessor(realNode, attr.name, attr.value);\n }\n }\n\n if (events) {\n for (let name in events) {\n realNode.addEventListener(name, eventHandlers[name] = events[name]);\n }\n }\n\n if (children) {\n const docfrag = document.createDocumentFragment();\n const childrenLen = children.length;\n\n for (let a = 0; a < childrenLen; a++) {\n const ch = children[a];\n ch && docfrag.appendChild(render(ch));\n }\n\n if (realNode.appendChild) {\n realNode.appendChild(docfrag);\n }\n }\n\n return realNode;\n}\n\nfunction createText (el) {\n return document.createTextNode(el.textContent);\n}\n\nexport default function render (el) {\n if (el instanceof Node) {\n return el;\n }\n if (Array.isArray(el)) {\n const frag = document.createDocumentFragment();\n el.forEach(item => frag.appendChild(render(item)));\n return frag;\n }\n const realNode = el.tagName ? createElement(el) : createText(el);\n realNodeMap.set(el, realNode);\n return realNode;\n}\n","import realNode from '../util/real-node';\nimport dom from '../vdom/dom';\n\nexport default function (src, dst) {\n realNode(src).appendChild(dom(dst));\n}\n","import { removeAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n removeAccessor(realNode(src), data.name);\n}\n","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realDst = realNode(dst);\n const realSrc = realNode(src);\n\n // We don't do parentNode.removeChild because parentNode may report\n // incorrectly in some prollyfills since it's impossible (?) to spoof.\n realSrc.removeChild(realDst);\n}\n","import dom from '../vdom/dom';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realSrc = realNode(src);\n realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc);\n}\n","import { setAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n setAccessor(realNode(src), data.name, data.value);\n}\n","import eventMap from '../util/event-map';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n const realSrc = realNode(src);\n const eventHandlers = eventMap(realSrc);\n const name = data.name;\n const prevHandler = eventHandlers[name];\n const nextHandler = data.value;\n\n if (typeof prevHandler === 'function') {\n delete eventHandlers[name];\n realSrc.removeEventListener(name, prevHandler);\n }\n\n if (typeof nextHandler === 'function') {\n eventHandlers[name] = nextHandler;\n realSrc.addEventListener(name, nextHandler);\n }\n}\n","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n realNode(src).textContent = dst.textContent;\n}\n","import * as types from './types';\nimport appendChild from './patch/append-child';\nimport removeAttribute from './patch/remove-attribute';\nimport removeChild from './patch/remove-child';\nimport replaceChild from './patch/replace-child';\nimport setAttribute from './patch/set-attribute';\nimport setEvent from './patch/set-event';\nimport textContent from './patch/text-content';\n\nconst patchers = {};\npatchers[types.APPEND_CHILD] = appendChild;\npatchers[types.REMOVE_ATTRIBUTE] = removeAttribute;\npatchers[types.REMOVE_CHILD] = removeChild;\npatchers[types.REPLACE_CHILD] = replaceChild;\npatchers[types.SET_ATTRIBUTE] = setAttribute;\npatchers[types.SET_EVENT] = setEvent;\npatchers[types.TEXT_CONTENT] = textContent;\n\nfunction patch (instruction) {\n patchers[instruction.type](\n instruction.source,\n instruction.destination,\n instruction.data\n );\n}\n\nexport default function (instructions) {\n instructions.forEach(patch);\n}\n","import diff from './diff';\nimport patch from './patch';\n\nexport default function (opts) {\n var inst = diff(opts);\n patch(inst);\n return inst;\n}\n","export default function createTextNode (item) {\n return {\n nodeType: 3,\n textContent: item\n };\n}\n","import { mapAccessor } from '../util/accessor';\nimport createTextNode from './text';\n\nfunction separateData (obj) {\n const attrs = {};\n const events = {};\n const node = {};\n let attrIdx = 0;\n\n for (let name in obj) {\n let value = obj[name];\n\n if (name.indexOf('on') === 0) {\n events[name.substring(2)] = value;\n } else {\n attrs[attrIdx++] = attrs[name] = { name, value };\n mapAccessor(node, name, value);\n }\n }\n\n attrs.length = attrIdx;\n return { attrs, events, node };\n}\n\nfunction ensureNodes (arr) {\n let out = [];\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n arr.filter(Boolean).forEach(function (item) {\n if (Array.isArray(item)) {\n out = out.concat(ensureNodes(item));\n } else if (typeof item === 'object') {\n out.push(translateFromReact(item));\n } else {\n out.push(createTextNode(item));\n }\n });\n return out;\n}\n\nfunction ensureTagName (name) {\n return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n}\n\nfunction isChildren (arg) {\n return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n}\n\nfunction isReactNode (item) {\n return item && item.type && item.props;\n}\n\nfunction translateFromReact (item) {\n if (isReactNode(item)) {\n const props = item.props;\n const chren = ensureNodes(props.children);\n delete props.children;\n return {\n nodeType: 1,\n tagName: item.type,\n attributes: props,\n childNodes: chren\n };\n }\n return item;\n}\n\nexport default function element (name, attrs = {}, ...chren) {\n const isAttrsNode = isChildren(attrs);\n const data = separateData(isAttrsNode ? {} : attrs);\n const node = data.node;\n node.nodeType = 1;\n node.tagName = ensureTagName(name);\n node.attributes = data.attrs;\n node.events = data.events;\n node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n return node;\n}\n\n// Add an array factory that returns an array of virtual nodes.\nelement.array = ensureNodes;\n\n// Generate built-in factories.\n[\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n].forEach(function (tag) {\n element[tag] = element.bind(null, tag);\n});\n","import dom from './dom';\n\nfunction removeChildNodes (elem) {\n while (elem.firstChild) {\n const first = elem.firstChild;\n first.parentNode.removeChild(first);\n }\n}\n\nexport default function (elem, tree) {\n removeChildNodes(elem);\n elem.appendChild(dom(tree));\n}\n","import WeakMap from './util/weak-map';\nimport createElement from './vdom/element';\nimport merge from './merge';\nimport mount from './vdom/mount';\n\nconst { Node } = window;\nconst oldTreeMap = new WeakMap();\n\nexport default function (render) {\n return function (elem) {\n elem = elem instanceof Node ? elem : this;\n\n if (!(elem instanceof Node)) {\n throw new Error('No node provided to diff renderer as either the first argument or the context.');\n }\n\n // Create a new element to house the new tree since we diff / mount fragments.\n const newTree = createElement('div', null, render(elem));\n const oldTree = oldTreeMap.get(elem);\n\n if (oldTree) {\n merge({\n destination: newTree,\n source: oldTree\n });\n } else {\n mount(elem, newTree.childNodes);\n }\n\n oldTreeMap.set(elem, newTree);\n };\n}\n","import dom from './dom';\nimport element from './element';\nimport mount from './mount';\nimport text from './text';\n\nexport default {\n dom,\n element,\n mount,\n text\n};\n","export default '0.3.1';\n","import diff from './diff';\nimport merge from './merge';\nimport patch from './patch';\nimport render from './render';\nimport * as types from './types';\nimport vdom from './vdom';\nimport version from './version';\n\nexport default {\n diff,\n merge,\n patch,\n render,\n types,\n vdom,\n version\n};\n"],"names":["APPEND_CHILD","REMOVE_CHILD","REMOVE_ATTRIBUTE","REPLACE_CHILD","SET_ATTRIBUTE","SET_EVENT","SET_PROPERTY","TEXT_CONTENT","classToString","obj","Array","isArray","join","Object","keys","filter","key","styleToString","map","getAccessor","node","name","className","style","cssText","getAttribute","attributes","value","mapAccessor","removeAccessor","removeAttribute","setAccessor","setAttribute","length","src","dst","srcAttrs","dstAttrs","srcAttrsLen","dstAttrsLen","instructions","a","srcAttr","srcAttrName","srcAttrValue","dstAttr","dstAttrValue","push","types","dstAttrName","index","prefix","WeakMap","Polyfill","prototype","val","elem","events","get","set","dstEvents","srcEvents","eventMap","undefined","tagName","compareAttributes","concat","compareEvents","textContent","NODE_COMMENT","NODE_ELEMENT","NODE_TEXT","dstType","srcType","nodeType","compareElement","compareText","compareComment","window","Node","realNodeMap","diffNode","source","destination","nodeInstructions","compareNode","diff","opts","root","srcChs","childNodes","dstChs","srcChsLen","dstChsLen","curSrc","curDst","realNode","createElement","el","document","eventHandlers","children","attributesLen","attr","addEventListener","docfrag","createDocumentFragment","childrenLen","ch","appendChild","render","createText","createTextNode","frag","forEach","item","dom","data","realDst","realSrc","removeChild","parentNode","replaceChild","prevHandler","nextHandler","removeEventListener","patchers","setEvent","patch","instruction","type","inst","separateData","attrs","attrIdx","indexOf","substring","ensureNodes","arr","out","Boolean","translateFromReact","ensureTagName","id","toUpperCase","isChildren","arg","isReactNode","props","chren","element","isAttrsNode","array","tag","bind","removeChildNodes","firstChild","first","tree","oldTreeMap","Error","newTree","oldTree"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition?5ca6*","webpack:///webpack/bootstrap bef7b4dc7aa6ac50b1d3?db22*","webpack:///./src/index.js?9552*","webpack:///./src/diff.js?4612*","webpack:///./src/diff-main.js?16b3*","webpack:///./src/types.js?89a8*","webpack:///./src/compare/node.js?0f2c*","webpack:///./src/compare/element.js?63c7*","webpack:///./src/compare/attributes.js?e06f*","webpack:///./src/util/accessor.js?6f18*","webpack:///./src/compare/events.js?9be8*","webpack:///./src/util/event-map.js?394d*","webpack:///./src/util/weak-map.js?af0a*","webpack:///./src/compare/text.js?133f*","webpack:///./src/compare/comment.js?fd99*","webpack:///./src/util/real-node.js?d2ef*","webpack:///./src/util/real-node-map.js?b512*","webpack:///./src/diff-worker.js?7b56*","webpack:///./src/merge.js?bc4e*","webpack:///./src/patch.js?2cda*","webpack:///./src/patch/append-child.js?377e*","webpack:///./src/vdom/dom.js?c020*","webpack:///./src/patch/remove-attribute.js?a79b*","webpack:///./src/patch/remove-child.js?2db5*","webpack:///./src/patch/replace-child.js?1a46*","webpack:///./src/patch/set-attribute.js?7dea*","webpack:///./src/patch/set-event.js?5a95*","webpack:///./src/patch/text-content.js?ee21*","webpack:///./src/render.js?4858*","webpack:///./src/vdom/element.js?56d5*","webpack:///./src/vdom/text.js?6b59*","webpack:///./src/vdom/mount.js?daf2*","webpack:///./src/vdom/index.js?d93d*"],"names":["types","diff","merge","patch","render","vdom","window","Node","diffWorker","opts","worker","done","addEventListener","e","data","postMessage","source","destination","canDiffInWorker","diffNode","nodeInstructions","concat","type","REPLACE_CHILD","src","dst","instructions","root","srcChs","childNodes","dstChs","srcChsLen","length","dstChsLen","a","curSrc","curDst","push","APPEND_CHILD","__id","set","REMOVE_CHILD","REMOVE_ATTRIBUTE","SET_ATTRIBUTE","SET_EVENT","SET_PROPERTY","TEXT_CONTENT","dstType","srcType","nodeType","NODE_ELEMENT","NODE_TEXT","NODE_COMMENT","tagName","srcAttrs","attributes","dstAttrs","srcAttrsLen","dstAttrsLen","srcAttr","srcAttrName","name","srcAttrValue","dstAttr","dstAttrValue","value","dstAttrName","getAccessor","mapAccessor","removeAccessor","setAccessor","classToString","obj","Array","isArray","join","Object","keys","filter","key","styleToString","map","node","className","style","cssText","getAttribute","removeAttribute","setAttribute","dstEvents","events","srcEvents","undefined","elem","get","index","prefix","WeakMap","Polyfill","prototype","val","textContent","isWindow","self","id","forEach","patchers","instruction","appendChild","createElement","el","realNode","document","eventHandlers","children","attributesLen","attr","docfrag","createDocumentFragment","childrenLen","ch","createText","createTextNode","frag","item","realDst","realSrc","removeChild","parentNode","replaceChild","prevHandler","nextHandler","removeEventListener","Error","newTree","oldTree","oldTreeMap","element","separateData","attrs","attrIdx","indexOf","substring","ensureNodes","arr","out","Boolean","translateFromReact","ensureTagName","toUpperCase","isChildren","arg","isReactNode","props","chren","count","isAttrsNode","array","tag","bind","tree","removeChildNodes","firstChild","first","dom","mount","text"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;;;;;ACtCA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;KAAYA,K;;AACZ;;;;;;;;mBAEe;AACbC,uBADa;AAEbC,yBAFa;AAGbC,yBAHa;AAIbC,2BAJa;AAKbJ,eALa;AAMbK;AANa,E;;;;;;;;;;;mBCMSJ,I;;AAbxB;;;;AACA;;;;;;eAEiBK,M;KAATC,I,WAAAA,I;;;AAER,UAASC,UAAT,CAAqBC,IAArB,EAA2B;AACzB,OAAMC,SAAS,0BAAf;AADyB,OAEjBC,IAFiB,GAERF,IAFQ,CAEjBE,IAFiB;;AAGzBD,UAAOE,gBAAP,CAAwB,SAAxB,EAAmC;AAAA,YAAKD,KAAKE,EAAEC,IAAP,CAAL;AAAA,IAAnC;AACA,UAAOL,KAAKE,IAAZ;AACAD,UAAOK,WAAP,CAAmBN,IAAnB;AACD;;AAEc,UAASR,IAAT,GAA0B;AAAA,OAAXQ,IAAW,uEAAJ,EAAI;AAAA,OAC/BO,MAD+B,GACDP,IADC,CAC/BO,MAD+B;AAAA,OACvBC,WADuB,GACDR,IADC,CACvBQ,WADuB;AAAA,OACVN,IADU,GACDF,IADC,CACVE,IADU;;AAEvC,OAAMO,kBAAkBP,QAAQ,EAAEK,kBAAkBT,IAAlB,IAA0BU,uBAAuBV,IAAnD,CAAhC;AACA,UAAOW,kBAAkBV,WAAWC,IAAX,CAAlB,GAAqC,wBAASA,IAAT,CAA5C;AACD,E;;;;;;;;;;;mBCMuBR,I;;AAvBxB;;KAAYD,K;;AACZ;;;;AACA;;;;AACA;;;;;;;;AAEA,UAASmB,QAAT,CAAmBH,MAAnB,EAA2BC,WAA3B,EAAwC;AACtC,OAAIG,mBAAmB,oBAAYJ,MAAZ,EAAoBC,WAApB,CAAvB;;AAEA;AACA;AACA;AACA;AACA,OAAIG,gBAAJ,EAAsB;AACpB,YAAOA,iBAAiBC,MAAjB,CAAwBpB,KAAK,EAAEe,cAAF,EAAUC,wBAAV,EAAL,CAAxB,CAAP;AACD;;AAED,UAAO,CAAC;AACNA,6BADM;AAEND,mBAFM;AAGNM,WAAMtB,MAAMuB;AAHN,IAAD,CAAP;AAKD;;AAEc,UAAStB,IAAT,CAAeQ,IAAf,EAAqB;AAClC,OAAMe,MAAMf,KAAKO,MAAjB;AACA,OAAMS,MAAMhB,KAAKQ,WAAjB;;AAEA,OAAI,CAACO,GAAD,IAAQ,CAACC,GAAb,EAAkB;AAChB,YAAO,EAAP;AACD;;AAED,OAAIC,eAAejB,KAAKkB,IAAL,GAAYR,SAASK,GAAT,EAAcC,GAAd,CAAZ,GAAiC,EAApD;;AAEA,OAAMG,SAASJ,IAAIK,UAAnB;AACA,OAAMC,SAASL,IAAII,UAAnB;AACA,OAAME,YAAYH,SAASA,OAAOI,MAAhB,GAAyB,CAA3C;AACA,OAAMC,YAAYH,SAASA,OAAOE,MAAhB,GAAyB,CAA3C;;AAEA,QAAK,IAAIE,IAAI,CAAb,EAAgBA,IAAID,SAApB,EAA+BC,GAA/B,EAAoC;AAClC,SAAMC,SAASP,OAAOM,CAAP,CAAf;AACA,SAAME,SAASN,OAAOI,CAAP,CAAf;;AAEA;AACA;AACA,SAAI,CAACC,MAAL,EAAa;AACXT,oBAAaW,IAAb,CAAkB;AAChBpB,sBAAaa,OAAOI,CAAP,CADG;AAEhBlB,iBAAQQ,GAFQ;AAGhBF,eAAMtB,MAAMsC;AAHI,QAAlB;AAKA;AACD,MAPD,MAOO;AACL;AACA;AACA;AACA,WAAI,OAAOF,OAAOG,IAAd,KAAuB,WAA3B,EAAwC;AACtC,+BAAYC,GAAZ,CAAgBJ,OAAOG,IAAvB,EAA6B,wBAASJ,MAAT,CAA7B;AACD;AACF;;AAEDT,oBAAeA,aAAaL,MAAb,CAAoBF,SAASgB,MAAT,EAAiBC,MAAjB,CAApB,CAAf;AACD;;AAED,OAAIH,YAAYF,SAAhB,EAA2B;AACzB,UAAK,IAAIG,KAAID,SAAb,EAAwBC,KAAIH,SAA5B,EAAuCG,IAAvC,EAA4C;AAC1CR,oBAAaW,IAAb,CAAkB;AAChBpB,sBAAaW,OAAOM,EAAP,CADG;AAEhBlB,iBAAQQ,GAFQ;AAGhBF,eAAMtB,MAAMyC;AAHI,QAAlB;AAKD;AACF;;AAED,UAAOf,YAAP;AACD,E;;;;;;;;;;;AC1EM,KAAMY,sCAAe,CAArB;AACA,KAAMG,sCAAe,CAArB;AACA,KAAMC,8CAAmB,CAAzB;AACA,KAAMnB,wCAAgB,CAAtB;AACA,KAAMoB,wCAAgB,CAAtB;AACA,KAAMC,gCAAY,CAAlB;AACA,KAAMC,sCAAe,CAArB;AACA,KAAMC,sCAAe,CAArB,C;;;;;;;;;;;;mBCCQ,UAAUtB,GAAV,EAAeC,GAAf,EAAoB;AACjC,OAAIsB,gBAAJ;AAAA,OAAaC,gBAAb;;AAEA,OAAI,CAACvB,GAAD,IAAQ,CAACD,GAAb,EAAkB;AAChB;AACD;;AAEDuB,aAAUtB,IAAIwB,QAAd;AACAD,aAAUxB,IAAIyB,QAAd;;AAEA,OAAIF,YAAYC,OAAhB,EAAyB;AACvB;AACD,IAFD,MAEO,IAAID,YAAYG,YAAhB,EAA8B;AACnC,YAAO,uBAAe1B,GAAf,EAAoBC,GAApB,CAAP;AACD,IAFM,MAEA,IAAIsB,YAAYI,SAAhB,EAA2B;AAChC,YAAO,oBAAY3B,GAAZ,EAAiBC,GAAjB,CAAP;AACD,IAFM,MAEA,IAAIsB,YAAYK,YAAhB,EAA8B;AACnC,YAAO,uBAAe5B,GAAf,EAAoBC,GAApB,CAAP;AACD;AACF,E;;AA3BD;;;;AACA;;;;AACA;;;;;;AAEA,KAAM2B,eAAe,CAArB;AACA,KAAMF,eAAe,CAArB;AACA,KAAMC,YAAY,CAAlB,C;;;;;;;;;;;;mBCHe,UAAU3B,GAAV,EAAeC,GAAf,EAAoB;AACjC,OAAID,IAAI6B,OAAJ,KAAgB5B,IAAI4B,OAAxB,EAAiC;AAC/B,YAAO,0BAAkB7B,GAAlB,EAAuBC,GAAvB,EAA4BJ,MAA5B,CAAmC,sBAAcG,GAAd,EAAmBC,GAAnB,CAAnC,CAAP;AACD;AACF,E;;AAPD;;;;AACA;;;;;;;;;;;;;;;;mBCEe,UAAUD,GAAV,EAAeC,GAAf,EAAoB;AACjC,OAAM6B,WAAW9B,IAAI+B,UAArB;AACA,OAAMC,WAAW/B,IAAI8B,UAArB;AACA,OAAME,cAAc,CAACH,YAAY,CAAb,KAAmBA,SAAStB,MAAhD;AACA,OAAM0B,cAAc,CAACF,YAAY,CAAb,KAAmBA,SAASxB,MAAhD;AACA,OAAMN,eAAe,EAArB;;AAEA;AACA,OAAI,CAAC+B,WAAD,IAAgB,CAACC,WAArB,EAAkC;AAChC,YAAOhC,YAAP;AACD;;AAED;AACA,QAAK,IAAIQ,IAAI,CAAb,EAAgBA,IAAIuB,WAApB,EAAiCvB,GAAjC,EAAsC;AACpC,SAAMyB,UAAUL,SAASpB,CAAT,CAAhB;AACA,SAAM0B,cAAcD,QAAQE,IAA5B;AACA,SAAMC,eAAe,2BAAYtC,GAAZ,EAAiBoC,WAAjB,CAArB;AACA,SAAMG,UAAUP,SAASI,WAAT,CAAhB;AACA,SAAMI,eAAe,2BAAYvC,GAAZ,EAAiBmC,WAAjB,CAArB;;AAEA,SAAI,CAACG,OAAL,EAAc;AACZrC,oBAAaW,IAAb,CAAkB;AAChBvB,eAAM,EAAE+C,MAAMD,WAAR,EADU;AAEhB3C,sBAAaQ,GAFG;AAGhBT,iBAAQQ,GAHQ;AAIhBF,eAAMtB,MAAM0C;AAJI,QAAlB;AAMD,MAPD,MAOO,IAAIoB,iBAAiBE,YAArB,EAAmC;AACxCtC,oBAAaW,IAAb,CAAkB;AAChBvB,eAAM,EAAE+C,MAAMD,WAAR,EAAqBK,OAAOD,YAA5B,EADU;AAEhB/C,sBAAaQ,GAFG;AAGhBT,iBAAQQ,GAHQ;AAIhBF,eAAMtB,MAAM2C;AAJI,QAAlB;AAMD;AACF;;AAED;AACA;AACA,QAAK,IAAIT,KAAI,CAAb,EAAgBA,KAAIwB,WAApB,EAAiCxB,IAAjC,EAAsC;AACpC,SAAM6B,WAAUP,SAAStB,EAAT,CAAhB;AACA,SAAMgC,cAAcH,SAAQF,IAA5B;AACA,SAAMG,gBAAe,2BAAYvC,GAAZ,EAAiByC,WAAjB,CAArB;AACA,SAAMP,WAAUL,SAASY,WAAT,CAAhB;;AAEA,SAAI,CAACP,QAAL,EAAc;AACZjC,oBAAaW,IAAb,CAAkB;AAChBvB,eAAM,EAAE+C,MAAMK,WAAR,EAAqBD,OAAOD,aAA5B,EADU;AAEhB/C,sBAAaQ,GAFG;AAGhBT,iBAAQQ,GAHQ;AAIhBF,eAAMtB,MAAM2C;AAJI,QAAlB;AAMD;AACF;;AAED,UAAOjB,YAAP;AACD,E;;AA3DD;;KAAY1B,K;;AACZ;;;;;;;;;;;;;SCuBgBmE,W,GAAAA,W;SAiBAC,W,GAAAA,W;SAQAC,c,GAAAA,c;SAiBAC,W,GAAAA,W;AAlEhB,UAASC,aAAT,CAAwBC,GAAxB,EAA6B;AAC3B,OAAI,OAAOA,GAAP,KAAe,QAAnB,EAA6B;AAC3B,YAAOA,GAAP;AACD;;AAED,OAAIC,MAAMC,OAAN,CAAcF,GAAd,CAAJ,EAAwB;AACtB,YAAOA,IAAIG,IAAJ,CAAS,GAAT,CAAP;AACD;;AAED,UAAOC,OAAOC,IAAP,CAAYL,GAAZ,EAAiBM,MAAjB,CAAwB,UAAUC,GAAV,EAAe;AAC5C,YAAOP,IAAIO,GAAJ,IAAWA,GAAX,GAAiB,KAAxB;AACD,IAFM,EAEJJ,IAFI,CAEC,GAFD,CAAP;AAGD;;AAED,UAASK,aAAT,CAAwBR,GAAxB,EAA6B;AAC3B,OAAI,OAAOA,GAAP,KAAe,QAAnB,EAA6B;AAC3B,YAAOA,GAAP;AACD;;AAED,UAAOI,OAAOC,IAAP,CAAYL,GAAZ,EAAiBS,GAAjB,CAAqB,UAAUF,GAAV,EAAe;AACzC,YAAUA,GAAV,UAAkBP,IAAIO,GAAJ,CAAlB;AACD,IAFM,EAEJJ,IAFI,CAEC,GAFD,CAAP;AAGD;;AAEM,UAASR,WAAT,CAAsBe,IAAtB,EAA4BrB,IAA5B,EAAkC;AACvC,OAAIA,SAAS,OAAb,EAAsB;AACpB,YAAOqB,KAAKC,SAAZ;AACD,IAFD,MAEO,IAAItB,SAAS,OAAb,EAAsB;AAC3B,YAAOqB,KAAKE,KAAL,CAAWC,OAAlB;AACF;AACC,IAHM,MAGA,IAAIxB,SAAS,MAAT,IAAmBA,QAAQqB,IAA/B,EAAqC;AAC1C,YAAOA,KAAKrB,IAAL,CAAP;AACF;AACC,IAHM,MAGA,IAAIqB,KAAKI,YAAT,EAAuB;AAC5B,YAAOJ,KAAKI,YAAL,CAAkBzB,IAAlB,CAAP;AACF;AACC,IAHM,MAGA,IAAIqB,KAAK3B,UAAL,IAAmB2B,KAAK3B,UAAL,CAAgBM,IAAhB,CAAvB,EAA8C;AACnD,YAAOqB,KAAK3B,UAAL,CAAgBM,IAAhB,EAAsBI,KAA7B;AACD;AACF;;AAEM,UAASG,WAAT,CAAsBc,IAAtB,EAA4BrB,IAA5B,EAAkCI,KAAlC,EAAyC;AAC9C,OAAIJ,SAAS,OAAb,EAAsB;AACpBqB,UAAKC,SAAL,GAAiBZ,cAAcN,KAAd,CAAjB;AACD,IAFD,MAEO,IAAIJ,SAAS,OAAb,EAAsB;AAC3BqB,UAAKE,KAAL,GAAa,EAAEC,SAASL,cAAcf,KAAd,CAAX,EAAb;AACD;AACF;;AAEM,UAASI,cAAT,CAAyBa,IAAzB,EAA+BrB,IAA/B,EAAqC;AAC1C,OAAIA,SAAS,OAAb,EAAsB;AACpBqB,UAAKC,SAAL,GAAiB,EAAjB;AACD,IAFD,MAEO,IAAItB,SAAS,OAAb,EAAsB;AAC3BqB,UAAKE,KAAL,CAAWC,OAAX,GAAqB,EAArB;AACF;AACC,IAHM,MAGA,IAAIxB,SAAS,MAAT,IAAmBA,QAAQqB,IAA/B,EAAqC;AAC1CA,UAAKrB,IAAL,IAAa,EAAb;AACF;AACC,IAHM,MAGA,IAAIqB,KAAKK,eAAT,EAA0B;AAC/BL,UAAKK,eAAL,CAAqB1B,IAArB;AACF;AACC,IAHM,MAGA,IAAIqB,KAAK3B,UAAT,EAAqB;AAC1B,YAAO2B,KAAK3B,UAAL,CAAgBM,IAAhB,CAAP;AACD;AACF;;AAEM,UAASS,WAAT,CAAsBY,IAAtB,EAA4BrB,IAA5B,EAAkCI,KAAlC,EAAyC;AAC9C,OAAIJ,SAAS,OAAb,EAAsB;AACpBqB,UAAKC,SAAL,GAAiBlB,KAAjB;AACD,IAFD,MAEO,IAAIJ,SAAS,OAAb,EAAsB;AAC3BqB,UAAKE,KAAL,CAAWC,OAAX,GAAqBpB,KAArB;AACF;AACC,IAHM,MAGA,IAAIJ,SAAS,MAAT,IAAmBA,QAAQqB,IAA3B,IAAmC,OAAOjB,KAAP,KAAiB,QAAxD,EAAkE;AACvE;AACA;AACA;AACAiB,UAAKrB,IAAL,IAAaI,SAAS,IAAT,GAAgB,EAAhB,GAAqBA,KAAlC;AACF;AACC,IANM,MAMA,IAAIiB,KAAKM,YAAT,EAAuB;AAC5BN,UAAKM,YAAL,CAAkB3B,IAAlB,EAAwBI,KAAxB;AACF;AACC,IAHM,MAGA,IAAIiB,KAAK3B,UAAT,EAAqB;AAC1B2B,UAAK3B,UAAL,CAAgB2B,KAAK3B,UAAL,CAAgBvB,MAAhC,IAA0CkD,KAAK3B,UAAL,CAAgBM,IAAhB,IAAwB,EAAEA,UAAF,EAAQI,YAAR,EAAlE;AACD;AACF,E;;;;;;;;;;;;mBCjFc,UAAUzC,GAAV,EAAeC,GAAf,EAAoB;AACjC,OAAMgE,YAAYhE,IAAIiE,MAAtB;AACA,OAAMC,YAAY,wBAASnE,GAAT,CAAlB;AACA,OAAME,eAAe,EAArB;;AAEA;AACA;AACA,OAAIiE,SAAJ,EAAe;AACb,UAAK,IAAI9B,IAAT,IAAiB8B,SAAjB,EAA4B;AAC1B,WAAIF,aAAaA,UAAU5B,IAAV,MAAoB8B,UAAU9B,IAAV,CAArC,EAAsD;AACpDnC,sBAAaW,IAAb,CAAkB;AAChBvB,iBAAM,EAAE+C,UAAF,EAAQI,OAAO2B,SAAf,EADU;AAEhB3E,wBAAaQ,GAFG;AAGhBT,mBAAQQ,GAHQ;AAIhBF,iBAAMtB,MAAM4C;AAJI,UAAlB;AAMD;AACF;AACF;;AAED;AACA;AACA;AACA,OAAI6C,SAAJ,EAAe;AACb,UAAK,IAAI5B,KAAT,IAAiB4B,SAAjB,EAA4B;AAC1B,WAAMxB,QAAQwB,UAAU5B,KAAV,CAAd;AACA,WAAI8B,UAAU9B,KAAV,MAAoBI,KAAxB,EAA+B;AAC7BvC,sBAAaW,IAAb,CAAkB;AAChBvB,iBAAM,EAAE+C,WAAF,EAAQI,YAAR,EADU;AAEhBhD,wBAAaQ,GAFG;AAGhBT,mBAAQQ,GAHQ;AAIhBF,iBAAMtB,MAAM4C;AAJI,UAAlB;AAMD;AACF;AACF;;AAED,UAAOlB,YAAP;AACD,E;;AAzCD;;KAAY1B,K;;AACZ;;;;;;;;;;;;;;;;;;mBCGe,UAAU6F,IAAV,EAAgB;AAC7B,OAAIH,SAAST,IAAIa,GAAJ,CAAQD,IAAR,CAAb;AACAH,aAAUT,IAAIzC,GAAJ,CAAQqD,IAAR,EAAcH,SAAS,EAAvB,CAAV;AACA,UAAOA,MAAP;AACD,E;;AARD;;;;;;AAEA,KAAMT,MAAM,uBAAZ,C;;;;;;;;;;;ACFA;AACA;;AAEA,KAAIc,QAAQ,CAAZ;AACA,KAAMC,SAAS,sBAAf;;mBAEgB,YAAY;AAC1B,OAAI,OAAOC,OAAP,KAAmB,WAAvB,EAAoC;AAClC,YAAOA,OAAP;AACD;;AAED,YAASC,QAAT,GAAqB;AACnB,UAAKnB,GAAL,GAAWiB,SAASD,KAApB;AACA,OAAEA,KAAF;AACD;;AAEDG,YAASC,SAAT,GAAqB;AACnBL,QADmB,eACdtB,GADc,EACT;AACR,cAAOA,IAAI,KAAKO,GAAT,CAAP;AACD,MAHkB;AAInBvC,QAJmB,eAIdgC,GAJc,EAIT4B,GAJS,EAIJ;AACb5B,WAAI,KAAKO,GAAT,IAAgBqB,GAAhB;AACD;AANkB,IAArB;;AASA,UAAOF,QAAP;AACD,EApBc,E;;;;;;;;;;;;mBCJA,UAAU1E,GAAV,EAAeC,GAAf,EAAoB;AACjC,OAAID,IAAI6E,WAAJ,KAAoB5E,IAAI4E,WAA5B,EAAyC;AACvC,YAAO,EAAP;AACD;;AAED,UAAO,CAAC;AACNpF,kBAAaQ,GADP;AAENT,aAAQQ,GAFF;AAGNF,WAAMtB,MAAM8C;AAHN,IAAD,CAAP;AAKD,E;;AAZD;;KAAY9C,K;;;;;;;;;;;;;;ACAZ;;;;;;;;;;;;;;;;;;mBCKe,UAAUkF,IAAV,EAAgB;AAC7B,UAAOoB,YAAYpB,gBAAgB3E,IAA5B,GAAmC2E,IAAnC,GAA0C,sBAAYY,GAAZ,CAAgBZ,KAAK3C,IAArB,CAAjD;AACD,E;;AAPD;;;;;;AAEA,KAAM+D,WAAW,OAAOhG,MAAP,KAAkB,WAAnC;;YACiBgG,WAAWhG,MAAX,GAAoBiG,I;KAA7BhG,I,QAAAA,I;;;;;;;;;;;ACHR;AACA;AACA,KAAM0E,MAAM,EAAZ;mBACe;AACba,MADa,eACRU,EADQ,EACJ;AACP,YAAOvB,IAAIuB,EAAJ,CAAP;AACD,IAHY;AAIbhE,MAJa,eAIRgE,EAJQ,EAIJtB,IAJI,EAIE;AACbD,SAAIuB,EAAJ,IAAUtB,IAAV;AACD;AANY,E;;;;;;ACHf;AACA;AACA,G;;;;;;;;;;;;mBCCe,YAAqB;AAAA,OAAXzE,IAAW,uEAAJ,EAAI;AAAA,OAC1BO,MAD0B,GACIP,IADJ,CAC1BO,MAD0B;AAAA,OAClBC,WADkB,GACIR,IADJ,CAClBQ,WADkB;AAAA,OACLN,KADK,GACIF,IADJ,CACLE,IADK;;AAElC,OAAIA,KAAJ,EAAU;AACR,YAAO,oBAAK;AACVK,qBADU;AAEVC,+BAFU;AAGVN,WAHU,gBAGJe,YAHI,EAGU;AAClB,8BAAMA,YAAN;AACAf,eAAKe,YAAL;AACD;AANS,MAAL,CAAP;AAQD;AACD,OAAMA,eAAe,oBAAKjB,IAAL,CAArB;AACA,wBAAMiB,YAAN;AACA,UAAOA,YAAP;AACD,E;;AAlBD;;;;AACA;;;;;;;;;;;;;;;;mBCyBe,UAAUA,YAAV,EAAwB;AACrCA,gBAAa+E,OAAb,CAAqBtG,KAArB;AACD,E;;AA5BD;;KAAYH,K;;AACZ;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;AAEA,KAAM0G,WAAW,EAAjB;AACAA,UAAS1G,MAAMsC,YAAf;AACAoE,UAAS1G,MAAM0C,gBAAf;AACAgE,UAAS1G,MAAMyC,YAAf;AACAiE,UAAS1G,MAAMuB,aAAf;AACAmF,UAAS1G,MAAM2C,aAAf;AACA+D,UAAS1G,MAAM4C,SAAf;AACA8D,UAAS1G,MAAM8C,YAAf;;AAEA,UAAS3C,KAAT,CAAgBwG,WAAhB,EAA6B;AAC3BD,YAASC,YAAYrF,IAArB,EACEqF,YAAY3F,MADd,EAEE2F,YAAY1F,WAFd,EAGE0F,YAAY7F,IAHd;AAKD,E;;;;;;;;;;;;mBCrBc,UAAUU,GAAV,EAAeC,GAAf,EAAoB;AACjC,2BAASD,GAAT,EAAcoF,WAAd,CAA0B,mBAAInF,GAAJ,CAA1B;AACD,E;;AALD;;;;AACA;;;;;;;;;;;;;;;;;;mBC+CwBrB,M;;AAhDxB;;AACA;;;;AACA;;;;;;eAEiBE,M;KAATC,I,WAAAA,I;;;AAER,UAASsG,aAAT,CAAwBC,EAAxB,EAA4B;AAC1B,OAAMC,WAAWC,SAASH,aAAT,CAAuBC,GAAGzD,OAA1B,CAAjB;AACA,OAAME,aAAauD,GAAGvD,UAAtB;AACA,OAAMmC,SAASoB,GAAGpB,MAAlB;AACA,OAAMuB,gBAAgB,wBAASF,QAAT,CAAtB;AACA,OAAMG,WAAWJ,GAAGjF,UAApB;;AAEA,OAAI0B,UAAJ,EAAgB;AACd,SAAM4D,gBAAgB5D,WAAWvB,MAAjC;AACA,UAAK,IAAIE,IAAI,CAAb,EAAgBA,IAAIiF,aAApB,EAAmCjF,GAAnC,EAAwC;AACtC,WAAMkF,OAAO7D,WAAWrB,CAAX,CAAb;AACA,kCAAY6E,QAAZ,EAAsBK,KAAKvD,IAA3B,EAAiCuD,KAAKnD,KAAtC;AACD;AACF;;AAED,OAAIyB,MAAJ,EAAY;AACV,UAAK,IAAI7B,IAAT,IAAiB6B,MAAjB,EAAyB;AACvBqB,gBAASnG,gBAAT,CAA0BiD,IAA1B,EAAgCoD,cAAcpD,IAAd,IAAsB6B,OAAO7B,IAAP,CAAtD;AACD;AACF;;AAED,OAAIqD,QAAJ,EAAc;AACZ,SAAMG,UAAUL,SAASM,sBAAT,EAAhB;AACA,SAAMC,cAAcL,SAASlF,MAA7B;;AAEA,UAAK,IAAIE,KAAI,CAAb,EAAgBA,KAAIqF,WAApB,EAAiCrF,IAAjC,EAAsC;AACpC,WAAMsF,KAAKN,SAAShF,EAAT,CAAX;AACAsF,aAAMH,QAAQT,WAAR,CAAoBxG,OAAOoH,EAAP,CAApB,CAAN;AACD;;AAED,SAAIT,SAASH,WAAb,EAA0B;AACxBG,gBAASH,WAAT,CAAqBS,OAArB;AACD;AACF;;AAED,UAAON,QAAP;AACD;;AAED,UAASU,UAAT,CAAqBX,EAArB,EAAyB;AACvB,UAAOE,SAASU,cAAT,CAAwBZ,GAAGT,WAA3B,CAAP;AACD;;AAEc,UAASjG,MAAT,CAAiB0G,EAAjB,EAAqB;AAClC,OAAIA,cAAcvG,IAAlB,EAAwB;AACtB,YAAOuG,EAAP;AACD;AACD,OAAIrC,MAAMC,OAAN,CAAcoC,EAAd,CAAJ,EAAuB;AAAA;AACrB,WAAMa,OAAOX,SAASM,sBAAT,EAAb;AACAR,UAAGL,OAAH,CAAW;AAAA,gBAAQkB,KAAKf,WAAL,CAAiBxG,OAAOwH,IAAP,CAAjB,CAAR;AAAA,QAAX;AACA;AAAA,YAAOD;AAAP;AAHqB;;AAAA;AAItB;AACD,OAAMZ,WAAWD,GAAGzD,OAAH,GAAawD,cAAcC,EAAd,CAAb,GAAiCW,WAAWX,EAAX,CAAlD;AACA,yBAAYtE,GAAZ,CAAgBsE,GAAGvE,IAAnB,EAAyBwE,QAAzB;AACA,UAAOA,QAAP;AACD,E;;;;;;;;;;;;mBCzDc,UAAUvF,GAAV,EAAeC,GAAf,EAAoBX,IAApB,EAA0B;AACvC,iCAAe,wBAASU,GAAT,CAAf,EAA8BV,KAAK+C,IAAnC;AACD,E;;AALD;;AACA;;;;;;;;;;;;;;;;mBCCe,UAAUrC,GAAV,EAAeC,GAAf,EAAoB;AACjC,OAAMoG,UAAU,wBAASpG,GAAT,CAAhB;AACA,OAAMqG,UAAU,wBAAStG,GAAT,CAAhB;;AAEA;AACA;AACAsG,WAAQC,WAAR,CAAoBF,OAApB;AACD,E;;AATD;;;;;;;;;;;;;;;;mBCGe,UAAUrG,GAAV,EAAeC,GAAf,EAAoB;AACjC,OAAMqG,UAAU,wBAAStG,GAAT,CAAhB;AACAsG,cAAWA,QAAQE,UAAnB,IAAiCF,QAAQE,UAAR,CAAmBC,YAAnB,CAAgC,mBAAIxG,GAAJ,CAAhC,EAA0CqG,OAA1C,CAAjC;AACD,E;;AAND;;;;AACA;;;;;;;;;;;;;;;;mBCEe,UAAUtG,GAAV,EAAeC,GAAf,EAAoBX,IAApB,EAA0B;AACvC,8BAAY,wBAASU,GAAT,CAAZ,EAA2BV,KAAK+C,IAAhC,EAAsC/C,KAAKmD,KAA3C;AACD,E;;AALD;;AACA;;;;;;;;;;;;;;;;mBCEe,UAAUzC,GAAV,EAAeC,GAAf,EAAoBX,IAApB,EAA0B;AACvC,OAAMgH,UAAU,wBAAStG,GAAT,CAAhB;AACA,OAAMyF,gBAAgB,wBAASa,OAAT,CAAtB;AACA,OAAMjE,OAAO/C,KAAK+C,IAAlB;AACA,OAAMqE,cAAcjB,cAAcpD,IAAd,CAApB;AACA,OAAMsE,cAAcrH,KAAKmD,KAAzB;;AAEA,OAAI,OAAOiE,WAAP,KAAuB,UAA3B,EAAuC;AACrC,YAAOjB,cAAcpD,IAAd,CAAP;AACAiE,aAAQM,mBAAR,CAA4BvE,IAA5B,EAAkCqE,WAAlC;AACD;;AAED,OAAI,OAAOC,WAAP,KAAuB,UAA3B,EAAuC;AACrClB,mBAAcpD,IAAd,IAAsBsE,WAAtB;AACAL,aAAQlH,gBAAR,CAAyBiD,IAAzB,EAA+BsE,WAA/B;AACD;AACF,E;;AAnBD;;;;AACA;;;;;;;;;;;;;;;;mBCCe,UAAU3G,GAAV,EAAeC,GAAf,EAAoB;AACjC,2BAASD,GAAT,EAAc6E,WAAd,GAA4B5E,IAAI4E,WAAhC;AACD,E;;AAJD;;;;;;;;;;;;;;;;mBCQe,UAAUjG,MAAV,EAAkB;AAC/B,UAAO,UAAUyF,IAAV,EAAgBlF,IAAhB,EAAsB;AAC3BkF,YAAOA,gBAAgBtF,IAAhB,GAAuBsF,IAAvB,GAA8B,IAArC;;AAEA,SAAI,EAAEA,gBAAgBtF,IAAlB,CAAJ,EAA6B;AAC3B,aAAM,IAAI8H,KAAJ,CAAU,gFAAV,CAAN;AACD;;AAED;AACA,SAAMC,UAAU,uBAAc,KAAd,EAAqB,IAArB,EAA2BlI,OAAOyF,IAAP,CAA3B,CAAhB;AACA,SAAM0C,UAAUC,WAAW1C,GAAX,CAAeD,IAAf,CAAhB;;AAEA,SAAI0C,OAAJ,EAAa;AACX,4BAAM;AACJtH,sBAAaqH,OADT;AAEJtH,iBAAQuH,OAFJ;AAGJ5H;AAHI,QAAN;AAKD,MAND,MAMO;AACL,4BAAMkF,IAAN,EAAYyC,QAAQzG,UAApB;AACA,WAAI,OAAOlB,IAAP,KAAgB,UAApB,EAAgC;AAC9BA;AACD;AACF;;AAED6H,gBAAWhG,GAAX,CAAeqD,IAAf,EAAqByC,OAArB;AACD,IAzBD;AA0BD,E;;AAnCD;;;;AACA;;;;AACA;;;;AACA;;;;;;eAEiBhI,M;KAATC,I,WAAAA,I;;AACR,KAAMiI,aAAa,uBAAnB,C;;;;;;;;;;;;;;mBC+DwBC,O;;AArExB;;AACA;;;;;;AAEA,UAASC,YAAT,CAAuBlE,GAAvB,EAA4B;AAC1B,OAAMmE,QAAQ,EAAd;AACA,OAAMjD,SAAS,EAAf;AACA,OAAMR,OAAO,EAAb;AACA,OAAI0D,UAAU,CAAd;;AAEA,QAAK,IAAI/E,IAAT,IAAiBW,GAAjB,EAAsB;AACpB,SAAIP,QAAQO,IAAIX,IAAJ,CAAZ;;AAEA,SAAIA,KAAKgF,OAAL,CAAa,IAAb,MAAuB,CAA3B,EAA8B;AAC5BnD,cAAO7B,KAAKiF,SAAL,CAAe,CAAf,CAAP,IAA4B7E,KAA5B;AACD,MAFD,MAEO;AACL0E,aAAMC,SAAN,IAAmBD,MAAM9E,IAAN,IAAc,EAAEA,UAAF,EAAQI,YAAR,EAAjC;AACA,kCAAYiB,IAAZ,EAAkBrB,IAAlB,EAAwBI,KAAxB;AACD;AACF;;AAED0E,SAAM3G,MAAN,GAAe4G,OAAf;AACA,UAAO,EAAED,YAAF,EAASjD,cAAT,EAAiBR,UAAjB,EAAP;AACD;;AAED,UAAS6D,WAAT,CAAsBC,GAAtB,EAA2B;AACzB,OAAIC,MAAM,EAAV;AACA,OAAI,CAACxE,MAAMC,OAAN,CAAcsE,GAAd,CAAL,EAAyB;AACvBA,WAAM,CAACA,GAAD,CAAN;AACD;AACDA,OAAIlE,MAAJ,CAAWoE,OAAX,EAAoBzC,OAApB,CAA4B,UAAUmB,IAAV,EAAgB;AAC1C,SAAInD,MAAMC,OAAN,CAAckD,IAAd,CAAJ,EAAyB;AACvBqB,aAAMA,IAAI5H,MAAJ,CAAW0H,YAAYnB,IAAZ,CAAX,CAAN;AACD,MAFD,MAEO,IAAI,QAAOA,IAAP,yCAAOA,IAAP,OAAgB,QAApB,EAA8B;AACnCqB,WAAI5G,IAAJ,CAAS8G,mBAAmBvB,IAAnB,CAAT;AACD,MAFM,MAEA;AACLqB,WAAI5G,IAAJ,CAAS,oBAAeuF,IAAf,CAAT;AACD;AACF,IARD;AASA,UAAOqB,GAAP;AACD;;AAED,UAASG,aAAT,CAAwBvF,IAAxB,EAA8B;AAC5B,UAAO,CAAC,OAAOA,IAAP,KAAgB,UAAhB,GAA6BA,KAAK2C,EAAL,IAAW3C,KAAKA,IAA7C,GAAoDA,IAArD,EAA2DwF,WAA3D,EAAP;AACD;;AAED,UAASC,UAAT,CAAqBC,GAArB,EAA0B;AACxB,UAAOA,QAAQ,OAAOA,GAAP,KAAe,QAAf,IAA2B9E,MAAMC,OAAN,CAAc6E,GAAd,CAA3B,IAAiD,OAAOA,IAAItG,QAAX,KAAwB,QAAzE,IAAqFuG,YAAYD,GAAZ,CAA7F,CAAP;AACD;;AAED,UAASC,WAAT,CAAsB5B,IAAtB,EAA4B;AAC1B,UAAOA,QAAQA,KAAKtG,IAAb,IAAqBsG,KAAK6B,KAAjC;AACD;;AAED,UAASN,kBAAT,CAA6BvB,IAA7B,EAAmC;AACjC,OAAI4B,YAAY5B,IAAZ,CAAJ,EAAuB;AACrB,SAAM6B,QAAQ7B,KAAK6B,KAAnB;AACA,SAAMC,QAAQX,YAAYU,MAAMvC,QAAlB,CAAd;AACA,YAAOuC,MAAMvC,QAAb;AACA,YAAO;AACLjE,iBAAU,CADL;AAELI,gBAASuE,KAAKtG,IAFT;AAGLiC,mBAAYkG,KAHP;AAIL5H,mBAAY6H;AAJP,MAAP;AAMD;AACD,UAAO9B,IAAP;AACD;;AAED,KAAI+B,QAAQ,CAAZ;AACe,UAASlB,OAAT,CAAkB5E,IAAlB,EAA8C;AAAA,OAAtB8E,KAAsB,uEAAd,EAAc;;AAC3D,OAAMiB,cAAcN,WAAWX,KAAX,CAApB;AACA,OAAM7H,OAAO4H,aAAakB,cAAc,EAAd,GAAmBjB,KAAhC,CAAb;AACA,OAAMzD,OAAOpE,KAAKoE,IAAlB;AACAA,QAAK3C,IAAL,GAAY,EAAEoH,KAAd;AACAzE,QAAKjC,QAAL,GAAgB,CAAhB;AACAiC,QAAK7B,OAAL,GAAe+F,cAAcvF,IAAd,CAAf;AACAqB,QAAK3B,UAAL,GAAkBzC,KAAK6H,KAAvB;AACAzD,QAAKQ,MAAL,GAAc5E,KAAK4E,MAAnB;;AAR2D,qCAAPgE,KAAO;AAAPA,UAAO;AAAA;;AAS3DxE,QAAKrD,UAAL,GAAkBkH,YAAYa,cAAc,CAACjB,KAAD,EAAQtH,MAAR,CAAeqI,KAAf,CAAd,GAAsCA,KAAlD,CAAlB;AACA,UAAOxE,IAAP;AACD;;AAED;AACAuD,SAAQoB,KAAR,GAAgBd,WAAhB;;AAEA;AACA,EACE,GADF,EAEE,MAFF,EAGE,SAHF,EAIE,MAJF,EAKE,SALF,EAME,OANF,EAOE,OAPF,EAQE,GARF,EASE,MATF,EAUE,KAVF,EAWE,KAXF,EAYE,SAZF,EAaE,YAbF,EAcE,MAdF,EAeE,IAfF,EAgBE,QAhBF,EAiBE,QAjBF,EAkBE,SAlBF,EAmBE,MAnBF,EAoBE,MApBF,EAqBE,KArBF,EAsBE,UAtBF,EAuBE,SAvBF,EAwBE,SAxBF,EAyBE,MAzBF,EA0BE,UA1BF,EA2BE,IA3BF,EA4BE,KA5BF,EA6BE,SA7BF,EA8BE,KA9BF,EA+BE,QA/BF,EAgCE,KAhCF,EAiCE,IAjCF,EAkCE,IAlCF,EAmCE,SAnCF,EAoCE,IApCF,EAqCE,OArCF,EAsCE,UAtCF,EAuCE,YAvCF,EAwCE,QAxCF,EAyCE,MAzCF,EA0CE,QA1CF,EA2CE,MA3CF,EA4CE,IA5CF,EA6CE,IA7CF,EA8CE,IA9CF,EA+CE,IA/CF,EAgDE,IAhDF,EAiDE,IAjDF,EAkDE,MAlDF,EAmDE,QAnDF,EAoDE,QApDF,EAqDE,IArDF,EAsDE,MAtDF,EAuDE,GAvDF,EAwDE,QAxDF,EAyDE,OAzDF,EA0DE,KA1DF,EA2DE,OA3DF,EA4DE,KA5DF,EA6DE,KA7DF,EA8DE,QA9DF,EA+DE,OA/DF,EAgEE,QAhEF,EAiEE,IAjEF,EAkEE,MAlEF,EAmEE,MAnEF,EAoEE,KApEF,EAqEE,MArEF,EAsEE,SAtEF,EAuEE,MAvEF,EAwEE,UAxEF,EAyEE,MAzEF,EA0EE,OA1EF,EA2EE,UA3EF,EA4EE,KA5EF,EA6EE,MA7EF,EA8EE,SA9EF,EA+EE,UA/EF,EAgFE,UAhFF,EAiFE,QAjFF,EAkFE,IAlFF,EAmFE,UAnFF,EAoFE,QApFF,EAqFE,QArFF,EAsFE,GAtFF,EAuFE,OAvFF,EAwFE,SAxFF,EAyFE,KAzFF,EA0FE,UA1FF,EA2FE,GA3FF,EA4FE,IA5FF,EA6FE,IA7FF,EA8FE,KA9FF,EA+FE,MA/FF,EAgGE,GAhGF,EAiGE,MAjGF,EAkGE,QAlGF,EAmGE,SAnGF,EAoGE,QApGF,EAqGE,QArGF,EAsGE,OAtGF,EAuGE,QAvGF,EAwGE,MAxGF,EAyGE,QAzGF,EA0GE,OA1GF,EA2GE,KA3GF,EA4GE,SA5GF,EA6GE,KA7GF,EA8GE,OA9GF,EA+GE,OA/GF,EAgHE,IAhHF,EAiHE,UAjHF,EAkHE,UAlHF,EAmHE,OAnHF,EAoHE,IApHF,EAqHE,OArHF,EAsHE,MAtHF,EAuHE,OAvHF,EAwHE,IAxHF,EAyHE,OAzHF,EA0HE,GA1HF,EA2HE,IA3HF,EA4HE,KA5HF,EA6HE,OA7HF,EA8HE,KA9HF,EA+HEtC,OA/HF,CA+HU,UAAUqD,GAAV,EAAe;AACvBrB,WAAQqB,GAAR,IAAerB,QAAQsB,IAAR,CAAa,IAAb,EAAmBD,GAAnB,CAAf;AACD,EAjID,E;;;;;;;;;;;mBCtFwBpC,c;AAAT,UAASA,cAAT,CAAyBE,IAAzB,EAA+B;AAC5C,UAAO;AACL3E,eAAU,CADL;AAELoD,kBAAauB;AAFR,IAAP;AAID,E;;;;;;;;;;;;mBCIc,UAAU/B,IAAV,EAAgBmE,IAAhB,EAAsB;AACnCC,oBAAiBpE,IAAjB;AACAA,QAAKe,WAAL,CAAiB,mBAAIoD,IAAJ,CAAjB;AACD,E;;AAZD;;;;;;AAEA,UAASC,gBAAT,CAA2BpE,IAA3B,EAAiC;AAC/B,UAAOA,KAAKqE,UAAZ,EAAwB;AACtB,SAAMC,QAAQtE,KAAKqE,UAAnB;AACAC,WAAMnC,UAAN,CAAiBD,WAAjB,CAA6BoC,KAA7B;AACD;AACF,E;;;;;;;;;;;;ACPD;;;;AACA;;;;AACA;;;;AACA;;;;;;mBAEe;AACbC,qBADa;AAEb3B,6BAFa;AAGb4B,yBAHa;AAIbC;AAJa,E","file":"dist/index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"skatejsDomDiff\"] = factory();\n\telse\n\t\troot[\"skatejsDomDiff\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bef7b4dc7aa6ac50b1d3","import diff from './diff';\nimport merge from './merge';\nimport patch from './patch';\nimport render from './render';\nimport * as types from './types';\nimport vdom from './vdom';\n\nexport default {\n diff,\n merge,\n patch,\n render,\n types,\n vdom\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","import diffMain from './diff-main';\nimport DiffWorker from 'worker-loader?name=./dist/[hash].[ext]!./diff-worker';\n\nconst { Node } = window;\n\nfunction diffWorker (opts) {\n const worker = new DiffWorker();\n const { done } = opts;\n worker.addEventListener('message', e => done(e.data));\n delete opts.done;\n worker.postMessage(opts);\n}\n\nexport default function diff (opts = {}) {\n const { source, destination, done } = opts;\n const canDiffInWorker = done && !(source instanceof Node && destination instanceof Node);\n return canDiffInWorker ? diffWorker(opts) : diffMain(opts);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff.js","import * as types from './types';\nimport compareNode from './compare/node';\nimport realNode from './util/real-node';\nimport realNodeMap from './util/real-node-map';\n\nfunction diffNode (source, destination) {\n let nodeInstructions = compareNode(source, destination);\n\n // If there are instructions (even an empty array) it means the node can be\n // diffed and doesn't have to be replaced. If the instructions are falsy\n // it means that the nodes are not similar (cannot be changed) and must be\n // replaced instead.\n if (nodeInstructions) {\n return nodeInstructions.concat(diff({ source, destination }));\n }\n\n return [{\n destination,\n source,\n type: types.REPLACE_CHILD\n }];\n}\n\nexport default function diff (opts) {\n const src = opts.source;\n const dst = opts.destination;\n\n if (!src || !dst) {\n return [];\n }\n\n let instructions = opts.root ? diffNode(src, dst) : [];\n\n const srcChs = src.childNodes;\n const dstChs = dst.childNodes;\n const srcChsLen = srcChs ? srcChs.length : 0;\n const dstChsLen = dstChs ? dstChs.length : 0;\n\n for (let a = 0; a < dstChsLen; a++) {\n const curSrc = srcChs[a];\n const curDst = dstChs[a];\n\n // If there is no matching destination node it means we need to remove the\n // current source node from the source.\n if (!curSrc) {\n instructions.push({\n destination: dstChs[a],\n source: src,\n type: types.APPEND_CHILD\n });\n continue;\n } else {\n // Ensure the real node is carried over even if the destination isn't used.\n // This is used in the render() function to keep track of the real node\n // that corresponds to a virtual node if a virtual tree is being used.\n if (typeof curDst.__id !== 'undefined') {\n realNodeMap.set(curDst.__id, realNode(curSrc));\n }\n }\n\n instructions = instructions.concat(diffNode(curSrc, curDst));\n }\n\n if (dstChsLen < srcChsLen) {\n for (let a = dstChsLen; a < srcChsLen; a++) {\n instructions.push({\n destination: srcChs[a],\n source: src,\n type: types.REMOVE_CHILD\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diff-main.js","export const APPEND_CHILD = 1;\nexport const REMOVE_CHILD = 2;\nexport const REMOVE_ATTRIBUTE = 3;\nexport const REPLACE_CHILD = 4;\nexport const SET_ATTRIBUTE = 5;\nexport const SET_EVENT = 6;\nexport const SET_PROPERTY = 7;\nexport const TEXT_CONTENT = 8;\n\n\n\n// WEBPACK FOOTER //\n// ./src/types.js","import compareElement from './element';\nimport compareText from './text';\nimport compareComment from './comment';\n\nconst NODE_COMMENT = 8;\nconst NODE_ELEMENT = 1;\nconst NODE_TEXT = 3;\n\nexport default function (src, dst) {\n let dstType, srcType;\n\n if (!dst || !src) {\n return;\n }\n\n dstType = dst.nodeType;\n srcType = src.nodeType;\n\n if (dstType !== srcType) {\n return;\n } else if (dstType === NODE_ELEMENT) {\n return compareElement(src, dst);\n } else if (dstType === NODE_TEXT) {\n return compareText(src, dst);\n } else if (dstType === NODE_COMMENT) {\n return compareComment(src, dst);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/node.js","import compareAttributes from './attributes';\nimport compareEvents from './events';\n\nexport default function (src, dst) {\n if (src.tagName === dst.tagName) {\n return compareAttributes(src, dst).concat(compareEvents(src, dst));\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/element.js","import * as types from '../types';\nimport { getAccessor } from '../util/accessor';\n\nexport default function (src, dst) {\n const srcAttrs = src.attributes;\n const dstAttrs = dst.attributes;\n const srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n const dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n const instructions = [];\n\n // Bail early if possible.\n if (!srcAttrsLen && !dstAttrsLen) {\n return instructions;\n }\n\n // Merge attributes that exist in source with destination's.\n for (let a = 0; a < srcAttrsLen; a++) {\n const srcAttr = srcAttrs[a];\n const srcAttrName = srcAttr.name;\n const srcAttrValue = getAccessor(src, srcAttrName);\n const dstAttr = dstAttrs[srcAttrName];\n const dstAttrValue = getAccessor(dst, srcAttrName);\n\n if (!dstAttr) {\n instructions.push({\n data: { name: srcAttrName },\n destination: dst,\n source: src,\n type: types.REMOVE_ATTRIBUTE\n });\n } else if (srcAttrValue !== dstAttrValue) {\n instructions.push({\n data: { name: srcAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n // We only need to worry about setting attributes that don't already exist\n // in the source.\n for (let a = 0; a < dstAttrsLen; a++) {\n const dstAttr = dstAttrs[a];\n const dstAttrName = dstAttr.name;\n const dstAttrValue = getAccessor(dst, dstAttrName);\n const srcAttr = srcAttrs[dstAttrName];\n\n if (!srcAttr) {\n instructions.push({\n data: { name: dstAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/attributes.js","function classToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.join(' ');\n }\n\n return Object.keys(obj).filter(function (key) {\n return obj[key] ? key : false;\n }).join(' ');\n}\n\nfunction styleToString (obj) {\n if (typeof obj === 'string') {\n return obj;\n }\n\n return Object.keys(obj).map(function (key) {\n return `${key}: ${obj[key]};`;\n }).join(' ');\n}\n\nexport function getAccessor (node, name) {\n if (name === 'class') {\n return node.className;\n } else if (name === 'style') {\n return node.style.cssText;\n // most things\n } else if (name !== 'type' && name in node) {\n return node[name];\n // real DOM elements\n } else if (node.getAttribute) {\n return node.getAttribute(name);\n // vDOM nodes\n } else if (node.attributes && node.attributes[name]) {\n return node.attributes[name].value;\n }\n}\n\nexport function mapAccessor (node, name, value) {\n if (name === 'class') {\n node.className = classToString(value);\n } else if (name === 'style') {\n node.style = { cssText: styleToString(value) };\n }\n}\n\nexport function removeAccessor (node, name) {\n if (name === 'class') {\n node.className = '';\n } else if (name === 'style') {\n node.style.cssText = '';\n // most things\n } else if (name !== 'type' && name in node) {\n node[name] = '';\n // real DOM elements\n } else if (node.removeAttribute) {\n node.removeAttribute(name);\n // vDOM nodes\n } else if (node.attributes) {\n delete node.attributes[name];\n }\n}\n\nexport function setAccessor (node, name, value) {\n if (name === 'class') {\n node.className = value;\n } else if (name === 'style') {\n node.style.cssText = value;\n // most things\n } else if (name !== 'type' && name in node || typeof value !== 'string') {\n // We check if it's undefined or null because IE throws \"invalid argument\"\n // errors for some types of properties. Essentially this is the same as\n // removing the accessor.\n node[name] = value == null ? '' : value;\n // real DOM elements\n } else if (node.setAttribute) {\n node.setAttribute(name, value);\n // vDOM nodes\n } else if (node.attributes) {\n node.attributes[node.attributes.length] = node.attributes[name] = { name, value };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/accessor.js","import * as types from '../types';\nimport eventMap from '../util/event-map';\n\nexport default function (src, dst) {\n const dstEvents = dst.events;\n const srcEvents = eventMap(src);\n const instructions = [];\n\n // Remove any source events that aren't in the destination before seeing if\n // we need to add any from the destination.\n if (srcEvents) {\n for (let name in srcEvents) {\n if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n instructions.push({\n data: { name, value: undefined },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n // After instructing to remove any old events, we then can instruct to add\n // new events. This prevents the new events from being removed from earlier\n // instructions.\n if (dstEvents) {\n for (let name in dstEvents) {\n const value = dstEvents[name];\n if (srcEvents[name] !== value) {\n instructions.push({\n data: { name, value },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/events.js","import WeakMap from './weak-map';\n\nconst map = new WeakMap();\n\nexport default function (elem) {\n let events = map.get(elem);\n events || map.set(elem, events = {});\n return events;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/event-map.js","// Because weak map polyfills either are too big or don't use native if\n// available properly.\n\nlet index = 0;\nconst prefix = '__WEAK_MAP_POLYFILL_';\n\nexport default (function () {\n if (typeof WeakMap !== 'undefined') {\n return WeakMap;\n }\n\n function Polyfill () {\n this.key = prefix + index;\n ++index;\n }\n\n Polyfill.prototype = {\n get (obj) {\n return obj[this.key];\n },\n set (obj, val) {\n obj[this.key] = val;\n }\n };\n\n return Polyfill;\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/weak-map.js","import * as types from '../types';\n\nexport default function (src, dst) {\n if (src.textContent === dst.textContent) {\n return [];\n }\n\n return [{\n destination: dst,\n source: src,\n type: types.TEXT_CONTENT\n }];\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/text.js","import text from './text';\nexport default text;\n\n\n\n// WEBPACK FOOTER //\n// ./src/compare/comment.js","import realNodeMap from './real-node-map';\n\nconst isWindow = typeof window !== 'undefined';\nconst { Node } = isWindow ? window : self;\n\nexport default function (node) {\n return isWindow && node instanceof Node ? node : realNodeMap.get(node.__id);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node.js","// import WeakMap from './weak-map';\n// export default new WeakMap();\nconst map = [];\nexport default {\n get (id) {\n return map[id];\n },\n set (id, node) {\n map[id] = node;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/real-node-map.js","module.exports = function() {\n\treturn new Worker(__webpack_public_path__ + \"./dist/e375e330bcafe442dfca.js\");\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/worker-loader?name=./dist/[hash].[ext]!./src/diff-worker.js\n// module id = 15\n// module chunks = 0 1 2","import diff from './diff';\nimport patch from './patch';\n\nexport default function (opts = {}) {\n const { source, destination, done } = opts;\n if (done) {\n return diff({\n source,\n destination,\n done (instructions) {\n patch(instructions);\n done(instructions);\n }\n });\n }\n const instructions = diff(opts);\n patch(instructions);\n return instructions;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/merge.js","import * as types from './types';\nimport appendChild from './patch/append-child';\nimport removeAttribute from './patch/remove-attribute';\nimport removeChild from './patch/remove-child';\nimport replaceChild from './patch/replace-child';\nimport setAttribute from './patch/set-attribute';\nimport setEvent from './patch/set-event';\nimport textContent from './patch/text-content';\n\nconst patchers = {};\npatchers[types.APPEND_CHILD] = appendChild;\npatchers[types.REMOVE_ATTRIBUTE] = removeAttribute;\npatchers[types.REMOVE_CHILD] = removeChild;\npatchers[types.REPLACE_CHILD] = replaceChild;\npatchers[types.SET_ATTRIBUTE] = setAttribute;\npatchers[types.SET_EVENT] = setEvent;\npatchers[types.TEXT_CONTENT] = textContent;\n\nfunction patch (instruction) {\n patchers[instruction.type](\n instruction.source,\n instruction.destination,\n instruction.data\n );\n}\n\nexport default function (instructions) {\n instructions.forEach(patch);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch.js","import realNode from '../util/real-node';\nimport dom from '../vdom/dom';\n\nexport default function (src, dst) {\n realNode(src).appendChild(dom(dst));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/append-child.js","import { setAccessor } from '../util/accessor';\nimport eventMap from '../util/event-map';\nimport realNodeMap from '../util/real-node-map';\n\nconst { Node } = window;\n\nfunction createElement (el) {\n const realNode = document.createElement(el.tagName);\n const attributes = el.attributes;\n const events = el.events;\n const eventHandlers = eventMap(realNode);\n const children = el.childNodes;\n\n if (attributes) {\n const attributesLen = attributes.length;\n for (let a = 0; a < attributesLen; a++) {\n const attr = attributes[a];\n setAccessor(realNode, attr.name, attr.value);\n }\n }\n\n if (events) {\n for (let name in events) {\n realNode.addEventListener(name, eventHandlers[name] = events[name]);\n }\n }\n\n if (children) {\n const docfrag = document.createDocumentFragment();\n const childrenLen = children.length;\n\n for (let a = 0; a < childrenLen; a++) {\n const ch = children[a];\n ch && docfrag.appendChild(render(ch));\n }\n\n if (realNode.appendChild) {\n realNode.appendChild(docfrag);\n }\n }\n\n return realNode;\n}\n\nfunction createText (el) {\n return document.createTextNode(el.textContent);\n}\n\nexport default function render (el) {\n if (el instanceof Node) {\n return el;\n }\n if (Array.isArray(el)) {\n const frag = document.createDocumentFragment();\n el.forEach(item => frag.appendChild(render(item)));\n return frag;\n }\n const realNode = el.tagName ? createElement(el) : createText(el);\n realNodeMap.set(el.__id, realNode);\n return realNode;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/dom.js","import { removeAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n removeAccessor(realNode(src), data.name);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-attribute.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realDst = realNode(dst);\n const realSrc = realNode(src);\n\n // We don't do parentNode.removeChild because parentNode may report\n // incorrectly in some prollyfills since it's impossible (?) to spoof.\n realSrc.removeChild(realDst);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/remove-child.js","import dom from '../vdom/dom';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realSrc = realNode(src);\n realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/replace-child.js","import { setAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n setAccessor(realNode(src), data.name, data.value);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-attribute.js","import eventMap from '../util/event-map';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n const realSrc = realNode(src);\n const eventHandlers = eventMap(realSrc);\n const name = data.name;\n const prevHandler = eventHandlers[name];\n const nextHandler = data.value;\n\n if (typeof prevHandler === 'function') {\n delete eventHandlers[name];\n realSrc.removeEventListener(name, prevHandler);\n }\n\n if (typeof nextHandler === 'function') {\n eventHandlers[name] = nextHandler;\n realSrc.addEventListener(name, nextHandler);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/set-event.js","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n realNode(src).textContent = dst.textContent;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/patch/text-content.js","import WeakMap from './util/weak-map';\nimport createElement from './vdom/element';\nimport merge from './merge';\nimport mount from './vdom/mount';\n\nconst { Node } = window;\nconst oldTreeMap = new WeakMap();\n\nexport default function (render) {\n return function (elem, done) {\n elem = elem instanceof Node ? elem : this;\n\n if (!(elem instanceof Node)) {\n throw new Error('No node provided to diff renderer as either the first argument or the context.');\n }\n\n // Create a new element to house the new tree since we diff / mount fragments.\n const newTree = createElement('div', null, render(elem));\n const oldTree = oldTreeMap.get(elem);\n\n if (oldTree) {\n merge({\n destination: newTree,\n source: oldTree,\n done\n });\n } else {\n mount(elem, newTree.childNodes);\n if (typeof done === 'function') {\n done();\n }\n }\n\n oldTreeMap.set(elem, newTree);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/render.js","import { mapAccessor } from '../util/accessor';\nimport createTextNode from './text';\n\nfunction separateData (obj) {\n const attrs = {};\n const events = {};\n const node = {};\n let attrIdx = 0;\n\n for (let name in obj) {\n let value = obj[name];\n\n if (name.indexOf('on') === 0) {\n events[name.substring(2)] = value;\n } else {\n attrs[attrIdx++] = attrs[name] = { name, value };\n mapAccessor(node, name, value);\n }\n }\n\n attrs.length = attrIdx;\n return { attrs, events, node };\n}\n\nfunction ensureNodes (arr) {\n let out = [];\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n arr.filter(Boolean).forEach(function (item) {\n if (Array.isArray(item)) {\n out = out.concat(ensureNodes(item));\n } else if (typeof item === 'object') {\n out.push(translateFromReact(item));\n } else {\n out.push(createTextNode(item));\n }\n });\n return out;\n}\n\nfunction ensureTagName (name) {\n return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n}\n\nfunction isChildren (arg) {\n return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n}\n\nfunction isReactNode (item) {\n return item && item.type && item.props;\n}\n\nfunction translateFromReact (item) {\n if (isReactNode(item)) {\n const props = item.props;\n const chren = ensureNodes(props.children);\n delete props.children;\n return {\n nodeType: 1,\n tagName: item.type,\n attributes: props,\n childNodes: chren\n };\n }\n return item;\n}\n\nlet count = 0;\nexport default function element (name, attrs = {}, ...chren) {\n const isAttrsNode = isChildren(attrs);\n const data = separateData(isAttrsNode ? {} : attrs);\n const node = data.node;\n node.__id = ++count;\n node.nodeType = 1;\n node.tagName = ensureTagName(name);\n node.attributes = data.attrs;\n node.events = data.events;\n node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n return node;\n}\n\n// Add an array factory that returns an array of virtual nodes.\nelement.array = ensureNodes;\n\n// Generate built-in factories.\n[\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n].forEach(function (tag) {\n element[tag] = element.bind(null, tag);\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/element.js","export default function createTextNode (item) {\n return {\n nodeType: 3,\n textContent: item\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/text.js","import dom from './dom';\n\nfunction removeChildNodes (elem) {\n while (elem.firstChild) {\n const first = elem.firstChild;\n first.parentNode.removeChild(first);\n }\n}\n\nexport default function (elem, tree) {\n removeChildNodes(elem);\n elem.appendChild(dom(tree));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/mount.js","import dom from './dom';\nimport element from './element';\nimport mount from './mount';\nimport text from './text';\n\nexport default {\n dom,\n element,\n mount,\n text\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/vdom/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.min.js b/dist/index.min.js deleted file mode 100644 index 114fb98..0000000 --- a/dist/index.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.skatejsDomDiff=t.skatejsDomDiff||{})}(this,function(t){function e(t){return"string"==typeof t?t:Array.isArray(t)?t.join(" "):Object.keys(t).filter(function(e){return!!t[e]&&e}).join(" ")}function n(t){return"string"==typeof t?t:Object.keys(t).map(function(e){return e+": "+t[e]+";"}).join(" ")}function r(t,e){return"class"===e?t.className:"style"===e?t.style.cssText:"type"!==e&&e in t?t[e]:t.getAttribute?t.getAttribute(e):t.attributes&&t.attributes[e]?t.attributes[e].value:void 0}function o(t,r,o){"class"===r?t.className=e(o):"style"===r&&(t.style={cssText:n(o)})}function i(t,e){"class"===e?t.className="":"style"===e?t.style.cssText="":"type"!==e&&e in t?t[e]="":t.removeAttribute?t.removeAttribute(e):t.attributes&&delete t.attributes[e]}function a(t,e,n){"class"===e?t.className=n:"style"===e?t.style.cssText=n:"type"!==e&&e in t||"string"!=typeof n?t[e]=null==n?"":n:t.setAttribute?t.setAttribute(e,n):t.attributes&&(t.attributes[t.attributes.length]=t.attributes[e]={name:e,value:n})}function u(t,e){var n=V(t,e);return n?n.concat(s({source:t,destination:e})):[{destination:e,source:t,type:k}]}function s(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.source,n=t.destination;if(!e||!n)return[];for(var r=t.root?u(e,n):[],o=e.childNodes,i=n.childNodes,a=o?o.length:0,s=i?i.length:0,c=0;c1&&void 0!==arguments[1]?arguments[1]:{},n=h(e),r=v(n?{}:e),o=r.node;o.nodeType=1,o.tagName=m(t),o.attributes=r.attrs,o.events=r.events;for(var i=arguments.length,a=Array(i>2?i-2:0),u=2;u frag.appendChild(render(item)));\n return frag;\n }\n const realNode = el.tagName ? createElement(el) : createText(el);\n realNodeMap.set(el, realNode);\n return realNode;\n}\n","import * as types from './types';\nimport appendChild from './patch/append-child';\nimport removeAttribute from './patch/remove-attribute';\nimport removeChild from './patch/remove-child';\nimport replaceChild from './patch/replace-child';\nimport setAttribute from './patch/set-attribute';\nimport setEvent from './patch/set-event';\nimport textContent from './patch/text-content';\n\nconst patchers = {};\npatchers[types.APPEND_CHILD] = appendChild;\npatchers[types.REMOVE_ATTRIBUTE] = removeAttribute;\npatchers[types.REMOVE_CHILD] = removeChild;\npatchers[types.REPLACE_CHILD] = replaceChild;\npatchers[types.SET_ATTRIBUTE] = setAttribute;\npatchers[types.SET_EVENT] = setEvent;\npatchers[types.TEXT_CONTENT] = textContent;\n\nfunction patch (instruction) {\n patchers[instruction.type](\n instruction.source,\n instruction.destination,\n instruction.data\n );\n}\n\nexport default function (instructions) {\n instructions.forEach(patch);\n}\n","export default function createTextNode (item) {\n return {\n nodeType: 3,\n textContent: item\n };\n}\n","import { mapAccessor } from '../util/accessor';\nimport createTextNode from './text';\n\nfunction separateData (obj) {\n const attrs = {};\n const events = {};\n const node = {};\n let attrIdx = 0;\n\n for (let name in obj) {\n let value = obj[name];\n\n if (name.indexOf('on') === 0) {\n events[name.substring(2)] = value;\n } else {\n attrs[attrIdx++] = attrs[name] = { name, value };\n mapAccessor(node, name, value);\n }\n }\n\n attrs.length = attrIdx;\n return { attrs, events, node };\n}\n\nfunction ensureNodes (arr) {\n let out = [];\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n arr.filter(Boolean).forEach(function (item) {\n if (Array.isArray(item)) {\n out = out.concat(ensureNodes(item));\n } else if (typeof item === 'object') {\n out.push(translateFromReact(item));\n } else {\n out.push(createTextNode(item));\n }\n });\n return out;\n}\n\nfunction ensureTagName (name) {\n return (typeof name === 'function' ? name.id || name.name : name).toUpperCase();\n}\n\nfunction isChildren (arg) {\n return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg));\n}\n\nfunction isReactNode (item) {\n return item && item.type && item.props;\n}\n\nfunction translateFromReact (item) {\n if (isReactNode(item)) {\n const props = item.props;\n const chren = ensureNodes(props.children);\n delete props.children;\n return {\n nodeType: 1,\n tagName: item.type,\n attributes: props,\n childNodes: chren\n };\n }\n return item;\n}\n\nexport default function element (name, attrs = {}, ...chren) {\n const isAttrsNode = isChildren(attrs);\n const data = separateData(isAttrsNode ? {} : attrs);\n const node = data.node;\n node.nodeType = 1;\n node.tagName = ensureTagName(name);\n node.attributes = data.attrs;\n node.events = data.events;\n node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren);\n return node;\n}\n\n// Add an array factory that returns an array of virtual nodes.\nelement.array = ensureNodes;\n\n// Generate built-in factories.\n[\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'bgsound',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'command',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'image',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'multicol',\n 'nav',\n 'nobr',\n 'noembed',\n 'noframes',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n].forEach(function (tag) {\n element[tag] = element.bind(null, tag);\n});\n","import dom from './dom';\n\nfunction removeChildNodes (elem) {\n while (elem.firstChild) {\n const first = elem.firstChild;\n first.parentNode.removeChild(first);\n }\n}\n\nexport default function (elem, tree) {\n removeChildNodes(elem);\n elem.appendChild(dom(tree));\n}\n","export const APPEND_CHILD = 1;\nexport const REMOVE_CHILD = 2;\nexport const REMOVE_ATTRIBUTE = 3;\nexport const REPLACE_CHILD = 4;\nexport const SET_ATTRIBUTE = 5;\nexport const SET_EVENT = 6;\nexport const SET_PROPERTY = 7;\nexport const TEXT_CONTENT = 8;\n","import * as types from '../types';\nimport { getAccessor } from '../util/accessor';\n\nexport default function (src, dst) {\n let srcAttrs = src.attributes;\n let dstAttrs = dst.attributes;\n let srcAttrsLen = (srcAttrs || 0) && srcAttrs.length;\n let dstAttrsLen = (dstAttrs || 0) && dstAttrs.length;\n let instructions = [];\n\n // Bail early if possible.\n if (!srcAttrsLen && !dstAttrsLen) {\n return instructions;\n }\n\n // Merge attributes that exist in source with destination's.\n for (let a = 0; a < srcAttrsLen; a++) {\n const srcAttr = srcAttrs[a];\n const srcAttrName = srcAttr.name;\n const srcAttrValue = getAccessor(src, srcAttrName);\n const dstAttr = dstAttrs[srcAttrName];\n const dstAttrValue = getAccessor(dst, srcAttrName);\n\n if (!dstAttr) {\n instructions.push({\n data: { name: srcAttrName },\n destination: dst,\n source: src,\n type: types.REMOVE_ATTRIBUTE\n });\n } else if (srcAttrValue !== dstAttrValue) {\n instructions.push({\n data: { name: srcAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n // We only need to worry about setting attributes that don't already exist\n // in the source.\n for (let a = 0; a < dstAttrsLen; a++) {\n const dstAttr = dstAttrs[a];\n const dstAttrName = dstAttr.name;\n const dstAttrValue = getAccessor(dst, dstAttrName);\n const srcAttr = srcAttrs[dstAttrName];\n\n if (!srcAttr) {\n instructions.push({\n data: { name: dstAttrName, value: dstAttrValue },\n destination: dst,\n source: src,\n type: types.SET_ATTRIBUTE\n });\n }\n }\n\n return instructions;\n}\n","// Because weak map polyfills either are too big or don't use native if\n// available properly.\n\nlet index = 0;\nconst prefix = '__WEAK_MAP_POLYFILL_';\n\nexport default (function () {\n if (typeof WeakMap !== 'undefined') {\n return WeakMap;\n }\n\n function Polyfill () {\n this.key = prefix + index;\n ++index;\n }\n\n Polyfill.prototype = {\n get (obj) {\n return obj[this.key];\n },\n set (obj, val) {\n obj[this.key] = val;\n }\n };\n\n return Polyfill;\n})();\n","import WeakMap from './weak-map';\n\nconst map = new WeakMap();\n\nexport default function (elem) {\n let events = map.get(elem);\n events || map.set(elem, events = {});\n return events;\n}\n","import * as types from '../types';\nimport eventMap from '../util/event-map';\n\nexport default function (src, dst) {\n const dstEvents = dst.events;\n const srcEvents = eventMap(src);\n const instructions = [];\n\n // Remove any source events that aren't in the destination before seeing if\n // we need to add any from the destination.\n if (srcEvents) {\n for (let name in srcEvents) {\n if (dstEvents && dstEvents[name] !== srcEvents[name]) {\n instructions.push({\n data: { name, value: undefined },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n // After instructing to remove any old events, we then can instruct to add\n // new events. This prevents the new events from being removed from earlier\n // instructions.\n if (dstEvents) {\n for (let name in dstEvents) {\n const value = dstEvents[name];\n if (srcEvents[name] !== value) {\n instructions.push({\n data: { name, value },\n destination: dst,\n source: src,\n type: types.SET_EVENT\n });\n }\n }\n }\n\n return instructions;\n}\n","import compareAttributes from './attributes';\nimport compareEvents from './events';\n\nexport default function (src, dst) {\n if (src.tagName === dst.tagName) {\n return compareAttributes(src, dst).concat(compareEvents(src, dst));\n }\n}\n","import * as types from '../types';\n\nexport default function (src, dst) {\n if (src.textContent === dst.textContent) {\n return [];\n }\n\n return [{\n destination: dst,\n source: src,\n type: types.TEXT_CONTENT\n }];\n}\n","import compareElement from './element';\nimport compareText from './text';\nimport compareComment from './comment';\n\nconst NODE_COMMENT = 8;\nconst NODE_ELEMENT = 1;\nconst NODE_TEXT = 3;\n\nexport default function (src, dst) {\n let dstType, srcType;\n\n if (!dst || !src) {\n return;\n }\n\n dstType = dst.nodeType;\n srcType = src.nodeType;\n\n if (dstType !== srcType) {\n return;\n } else if (dstType === NODE_ELEMENT) {\n return compareElement(src, dst);\n } else if (dstType === NODE_TEXT) {\n return compareText(src, dst);\n } else if (dstType === NODE_COMMENT) {\n return compareComment(src, dst);\n }\n}\n","import WeakMap from './weak-map';\nexport default new WeakMap();\n","import realNodeMap from './real-node-map';\n\nconst { Node } = window;\n\nexport default function (node) {\n return node instanceof Node ? node : realNodeMap.get(node);\n}\n","import realNode from '../util/real-node';\nimport dom from '../vdom/dom';\n\nexport default function (src, dst) {\n realNode(src).appendChild(dom(dst));\n}\n","import { removeAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n removeAccessor(realNode(src), data.name);\n}\n","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realDst = realNode(dst);\n const realSrc = realNode(src);\n\n // We don't do parentNode.removeChild because parentNode may report\n // incorrectly in some prollyfills since it's impossible (?) to spoof.\n realSrc.removeChild(realDst);\n}\n","import dom from '../vdom/dom';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst) {\n const realSrc = realNode(src);\n realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc);\n}\n","import { setAccessor } from '../util/accessor';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n setAccessor(realNode(src), data.name, data.value);\n}\n","import eventMap from '../util/event-map';\nimport realNode from '../util/real-node';\n\nexport default function (src, dst, data) {\n const realSrc = realNode(src);\n const eventHandlers = eventMap(realSrc);\n const name = data.name;\n const prevHandler = eventHandlers[name];\n const nextHandler = data.value;\n\n if (typeof prevHandler === 'function') {\n delete eventHandlers[name];\n realSrc.removeEventListener(name, prevHandler);\n }\n\n if (typeof nextHandler === 'function') {\n eventHandlers[name] = nextHandler;\n realSrc.addEventListener(name, nextHandler);\n }\n}\n","import realNode from '../util/real-node';\n\nexport default function (src, dst) {\n realNode(src).textContent = dst.textContent;\n}\n","import diff from './diff';\nimport patch from './patch';\n\nexport default function (opts) {\n var inst = diff(opts);\n patch(inst);\n return inst;\n}\n","import WeakMap from './util/weak-map';\nimport createElement from './vdom/element';\nimport merge from './merge';\nimport mount from './vdom/mount';\n\nconst { Node } = window;\nconst oldTreeMap = new WeakMap();\n\nexport default function (render) {\n return function (elem) {\n elem = elem instanceof Node ? elem : this;\n\n if (!(elem instanceof Node)) {\n throw new Error('No node provided to diff renderer as either the first argument or the context.');\n }\n\n // Create a new element to house the new tree since we diff / mount fragments.\n const newTree = createElement('div', null, render(elem));\n const oldTree = oldTreeMap.get(elem);\n\n if (oldTree) {\n merge({\n destination: newTree,\n source: oldTree\n });\n } else {\n mount(elem, newTree.childNodes);\n }\n\n oldTreeMap.set(elem, newTree);\n };\n}\n","export default '0.3.1';\n"],"names":["classToString","obj","Array","isArray","join","Object","keys","filter","key","styleToString","map","getAccessor","node","name","className","style","cssText","getAttribute","attributes","value","mapAccessor","removeAccessor","removeAttribute","setAccessor","setAttribute","length","diffNode","source","destination","nodeInstructions","compareNode","concat","diff","types","opts","src","dst","instructions","root","srcChs","childNodes","dstChs","srcChsLen","dstChsLen","a","curSrc","curDst","Node","set","realNode","push","createElement","el","document","tagName","events","eventHandlers","eventMap","children","attributesLen","attr","addEventListener","docfrag","createDocumentFragment","childrenLen","ch","appendChild","render","createText","createTextNode","textContent","frag","forEach","item","patch","instruction","type","data","separateData","attrs","attrIdx","indexOf","substring","ensureNodes","arr","out","Boolean","translateFromReact","ensureTagName","id","toUpperCase","isChildren","arg","nodeType","isReactNode","props","chren","element","isAttrsNode","removeChildNodes","elem","firstChild","first","parentNode","removeChild","APPEND_CHILD","REMOVE_CHILD","REMOVE_ATTRIBUTE","REPLACE_CHILD","SET_ATTRIBUTE","SET_EVENT","SET_PROPERTY","TEXT_CONTENT","srcAttrs","dstAttrs","srcAttrsLen","dstAttrsLen","srcAttr","srcAttrName","srcAttrValue","dstAttr","dstAttrValue","dstAttrName","index","prefix","Polyfill","WeakMap","prototype","this","val","get","dstEvents","srcEvents","undefined","compareAttributes","compareEvents","NODE_COMMENT","NODE_ELEMENT","NODE_TEXT","dstType","srcType","compareElement","compareText","compareComment","window","realNodeMap","dom","realDst","realSrc","replaceChild","prevHandler","nextHandler","removeEventListener","patchers","setEvent","inst","array","tag","bind","tree","oldTreeMap","Error","newTree","oldTree"],"mappings":"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BT,GAChCiI,GAASxH,GAAmByH,GAC5BD,GAASxH,GAAsBqC,EAU/B,QAAe,SAAUjC,KACVmC,QAAQE,OqBxBR,SAAUxC,MACnByH,GAAO3H,EAAKE,aACVyH,GACCA,EnB2ET1D,GAAQ2D,MAAQzE,GAId,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,UACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,UACA,UACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,UACA,KACA,QACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,QACA,MACA,QACA,MACA,MACA,SACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,UACA,OACA,WACA,OACA,QACA,WACA,MACA,OACA,UACA,WACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,UACA,SACA,SACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OACAX,QAAQ,SAAUqF,KACVA,GAAO5D,EAAQ6D,KAAK,KAAMD,IC3MpC,QAAe,SAAUzD,EAAM2D,KACZ3D,KACZlC,YAAYgF,EAAIa,QmBNNf,OAATjG,MAAAA,KACFiH,GAAa,GAAIlC,MAER,SAAU3D,SAChB,UAAUiC,QACRA,YAAgBrD,IAAOqD,EAAO4B,OAE/B5B,YAAgBrD,UACd,IAAIkH,OAAM,qFAIZC,GAAU/G,EAAc,MAAO,KAAMgB,EAAOiC,IAC5C+D,EAAUH,GAAW9B,IAAI9B,EAE3B+D,mBAEaD,SACLC,OAGJ/D,EAAM8D,EAAQ1H,eAGXQ,IAAIoD,EAAM8D,6CC7BV"} \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 8102bf0..0000000 --- a/rollup.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('skatejs-build/rollup.config'); diff --git a/src/diff.js b/src/diff.js index 3283907..bcdf670 100644 --- a/src/diff.js +++ b/src/diff.js @@ -1,5 +1,5 @@ import diffMain from './diff-main'; -import DiffWorker from 'worker-loader!./diff-worker'; +import DiffWorker from 'worker-loader?name=./dist/[hash].[ext]!./diff-worker'; const { Node } = window; diff --git a/webpack.config.js b/webpack.config.js index 342723a..2760bf5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1 +1,2 @@ -module.exports = require('skatejs-build/webpack.config'); +const conf = module.exports = require('skatejs-build/webpack.config'); +conf.entry['dist/index.js'] = './src/index.js'; From 22a4f5de39ee4053bb8eee3fbf8e7369f594497e Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Mon, 5 Dec 2016 19:25:36 +1100 Subject: [PATCH 09/14] refactor: Refactor tests and start major refactor to make api consistent and predictable. --- src/compare/attributes.js | 66 ++-- src/compare/element.js | 5 +- src/compare/properties.js | 35 ++ src/diff.js | 4 +- src/{diff-main.js => diff/main.js} | 8 +- src/{diff-worker.js => diff/worker.js} | 2 +- src/h.js | 74 ++++ src/index.js | 16 +- src/{vdom => }/mount.js | 4 +- src/patch.js | 2 + src/patch/append-child.js | 10 +- src/patch/remove-attribute.js | 8 +- src/patch/remove-child.js | 10 +- src/patch/replace-child.js | 13 +- src/patch/set-attribute.js | 9 +- src/patch/set-event.js | 6 + src/patch/set-property.js | 6 + src/patch/text-content.js | 2 +- src/render.js | 6 +- src/{vdom => }/text.js | 2 +- src/to-dom.js | 46 +++ src/to-vdom.js | 3 + src/util/accessor.js | 85 ---- src/vdom/dom.js | 61 --- src/vdom/element.js | 216 ---------- src/vdom/index.js | 11 - test/unit.js | 520 +------------------------ test/unit/algorithm/events.js | 87 +++++ test/unit/algorithm/key.js | 32 ++ test/unit/algorithm/worker.js | 56 +++ test/unit/diff.js | 40 ++ test/unit/h-jsx.js | 35 ++ test/unit/h.js | 84 ++++ test/unit/patch.js | 229 +++++++++++ test/unit/render.js | 18 + test/unit/to-vdom.js | 7 + 36 files changed, 862 insertions(+), 956 deletions(-) create mode 100644 src/compare/properties.js rename src/{diff-main.js => diff/main.js} (92%) rename src/{diff-worker.js => diff/worker.js} (78%) create mode 100644 src/h.js rename src/{vdom => }/mount.js (77%) create mode 100644 src/patch/set-property.js rename src/{vdom => }/text.js (54%) create mode 100644 src/to-dom.js create mode 100644 src/to-vdom.js delete mode 100644 src/util/accessor.js delete mode 100644 src/vdom/dom.js delete mode 100644 src/vdom/element.js delete mode 100644 src/vdom/index.js create mode 100644 test/unit/algorithm/events.js create mode 100644 test/unit/algorithm/key.js create mode 100644 test/unit/algorithm/worker.js create mode 100644 test/unit/diff.js create mode 100644 test/unit/h-jsx.js create mode 100644 test/unit/h.js create mode 100644 test/unit/patch.js create mode 100644 test/unit/render.js create mode 100644 test/unit/to-vdom.js diff --git a/src/compare/attributes.js b/src/compare/attributes.js index fd11811..e61cf8b 100644 --- a/src/compare/attributes.js +++ b/src/compare/attributes.js @@ -1,59 +1,51 @@ import * as types from '../types'; -import { getAccessor } from '../util/accessor'; + +function formatAttributes (attrs) { + if (typeof attrs === 'object' && typeof attrs.length === 'undefined') { + return attrs; + } + const obj = {}; + const len = attrs.length; + for (let a = 0; a < len; a++) { + const att = attrs[a]; + obj[att.name] = att.value; + } + return obj; +} export default function (src, dst) { - const srcAttrs = src.attributes; - const dstAttrs = dst.attributes; - const srcAttrsLen = (srcAttrs || 0) && srcAttrs.length; - const dstAttrsLen = (dstAttrs || 0) && dstAttrs.length; + const srcAttrs = formatAttributes(src.attributes); + const dstAttrs = formatAttributes(dst.attributes); const instructions = []; - // Bail early if possible. - if (!srcAttrsLen && !dstAttrsLen) { - return instructions; - } - // Merge attributes that exist in source with destination's. - for (let a = 0; a < srcAttrsLen; a++) { - const srcAttr = srcAttrs[a]; - const srcAttrName = srcAttr.name; - const srcAttrValue = getAccessor(src, srcAttrName); - const dstAttr = dstAttrs[srcAttrName]; - const dstAttrValue = getAccessor(dst, srcAttrName); - - if (!dstAttr) { + for (let name in srcAttrs) { + if (name in dstAttrs) { instructions.push({ - data: { name: srcAttrName }, + data: { name, value: dstAttrs[name] }, destination: dst, source: src, - type: types.REMOVE_ATTRIBUTE + type: types.SET_ATTRIBUTE }); - } else if (srcAttrValue !== dstAttrValue) { + } else { instructions.push({ - data: { name: srcAttrName, value: dstAttrValue }, + data: { name }, destination: dst, source: src, - type: types.SET_ATTRIBUTE + type: types.REMOVE_ATTRIBUTE }); } } // We only need to worry about setting attributes that don't already exist // in the source. - for (let a = 0; a < dstAttrsLen; a++) { - const dstAttr = dstAttrs[a]; - const dstAttrName = dstAttr.name; - const dstAttrValue = getAccessor(dst, dstAttrName); - const srcAttr = srcAttrs[dstAttrName]; - - if (!srcAttr) { - instructions.push({ - data: { name: dstAttrName, value: dstAttrValue }, - destination: dst, - source: src, - type: types.SET_ATTRIBUTE - }); - } + for (let name in dstAttrs) { + instructions.push({ + data: { name, value: dstAttrs[name] }, + destination: dst, + source: src, + type: types.SET_ATTRIBUTE + }); } return instructions; diff --git a/src/compare/element.js b/src/compare/element.js index 6d4b33c..26cee6c 100644 --- a/src/compare/element.js +++ b/src/compare/element.js @@ -1,8 +1,11 @@ import compareAttributes from './attributes'; import compareEvents from './events'; +import compareProperties from './properties'; export default function (src, dst) { if (src.tagName === dst.tagName) { - return compareAttributes(src, dst).concat(compareEvents(src, dst)); + return compareAttributes(src, dst) + .concat(compareEvents(src, dst)) + .concat(compareProperties(src, dst)); } } diff --git a/src/compare/properties.js b/src/compare/properties.js new file mode 100644 index 0000000..c86c4d3 --- /dev/null +++ b/src/compare/properties.js @@ -0,0 +1,35 @@ +import * as types from '../types'; + +export default function (src, dst) { + const { properties: srcProps } = src; + const { properties: dstProps } = dst; + const instructions = []; + + for (let name in srcProps) { + const srcValue = srcProps[name]; + const dstValue = dstProps[name]; + if (srcValue !== dstValue) { + instructions.push({ + data: { name }, + destination: dst, + source: src, + type: types.SET_PROPERTY + }); + } + } + + for (let name in dstProps) { + const srcValue = srcProps[name]; + const dstValue = dstProps[name]; + if (srcValue !== dstValue) { + instructions.push({ + data: { name }, + destination: dst, + source: src, + type: types.SET_PROPERTY + }); + } + } + + return instructions; +} diff --git a/src/diff.js b/src/diff.js index bcdf670..f777be4 100644 --- a/src/diff.js +++ b/src/diff.js @@ -1,5 +1,5 @@ -import diffMain from './diff-main'; -import DiffWorker from 'worker-loader?name=./dist/[hash].[ext]!./diff-worker'; +import diffMain from './diff/main'; +import DiffWorker from 'worker-loader?name=./dist/[hash].[ext]!./diff/worker'; const { Node } = window; diff --git a/src/diff-main.js b/src/diff/main.js similarity index 92% rename from src/diff-main.js rename to src/diff/main.js index 8562f52..67cef59 100644 --- a/src/diff-main.js +++ b/src/diff/main.js @@ -1,7 +1,7 @@ -import * as types from './types'; -import compareNode from './compare/node'; -import realNode from './util/real-node'; -import realNodeMap from './util/real-node-map'; +import * as types from '../types'; +import compareNode from '../compare/node'; +import realNode from '../util/real-node'; +import realNodeMap from '../util/real-node-map'; function diffNode (source, destination) { let nodeInstructions = compareNode(source, destination); diff --git a/src/diff-worker.js b/src/diff/worker.js similarity index 78% rename from src/diff-worker.js rename to src/diff/worker.js index 8338c61..a680e20 100644 --- a/src/diff-worker.js +++ b/src/diff/worker.js @@ -1,4 +1,4 @@ -import diff from './diff-main'; +import diff from './main'; self.addEventListener('message', e => { const instructions = diff(e.data); diff --git a/src/h.js b/src/h.js new file mode 100644 index 0000000..5af36ff --- /dev/null +++ b/src/h.js @@ -0,0 +1,74 @@ +import createTextNode from './text'; + +function ensureNodes (arr) { + let out = []; + if (!Array.isArray(arr)) { + arr = [arr]; + } + arr.filter(Boolean).forEach(function (item) { + if (Array.isArray(item)) { + out = out.concat(ensureNodes(item)); + } else if (typeof item === 'object') { + out.push(translateFromReact(item)); + } else { + out.push(createTextNode(item)); + } + }); + return out; +} + +function ensureTagName (name) { + return (typeof name === 'function' ? name.id || name.name : name).toUpperCase(); +} + +function isNode (arg) { + return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg)); +} + +function isReactNode (item) { + return item && item.type && item.props; +} + +function translateFromReact (item) { + if (isReactNode(item)) { + const props = item.props; + const chren = ensureNodes(props.children); + delete props.children; + return { + nodeType: 1, + tagName: item.type, + attributes: props, + childNodes: chren + }; + } + return item; +} + +let count = 0; +export default function (name, props, ...chren) { + const isPropsNode = isNode(props); + const node = { + __id: ++count, + childNodes: ensureNodes(isPropsNode ? [props].concat(chren) : chren), + nodeType: 1, + tagName: ensureTagName(name) + }; + + if (isPropsNode) { + node.attributes = {}; + node.childNodes = [props].concat(chren); + node.events = {}; + node.properties = {}; + } else { + props = props || {}; + const { attributes, events } = props; + node.attributes = attributes || {}; + node.childNodes = chren; + node.events = events || {}; + node.properties = props; + delete props.attributes; + delete props.events; + } + + return node; +} diff --git a/src/index.js b/src/index.js index 873a00f..743022b 100644 --- a/src/index.js +++ b/src/index.js @@ -1,15 +1,23 @@ import diff from './diff'; +import h from './h'; import merge from './merge'; +import mount from './mount'; import patch from './patch'; import render from './render'; +import text from './text'; +import toDom from './to-dom'; +import toVdom from './to-vdom'; import * as types from './types'; -import vdom from './vdom'; -export default { +export { diff, + h, merge, + mount, patch, render, - types, - vdom + text, + toDom, + toVdom, + types }; diff --git a/src/vdom/mount.js b/src/mount.js similarity index 77% rename from src/vdom/mount.js rename to src/mount.js index bfdb79e..52098f0 100644 --- a/src/vdom/mount.js +++ b/src/mount.js @@ -1,4 +1,4 @@ -import dom from './dom'; +import toDom from './to-dom'; function removeChildNodes (elem) { while (elem.firstChild) { @@ -9,5 +9,5 @@ function removeChildNodes (elem) { export default function (elem, tree) { removeChildNodes(elem); - elem.appendChild(dom(tree)); + elem.appendChild(toDom(tree)); } diff --git a/src/patch.js b/src/patch.js index 21f94d4..88fab7a 100644 --- a/src/patch.js +++ b/src/patch.js @@ -5,6 +5,7 @@ import removeChild from './patch/remove-child'; import replaceChild from './patch/replace-child'; import setAttribute from './patch/set-attribute'; import setEvent from './patch/set-event'; +import setProperty from './patch/set-property'; import textContent from './patch/text-content'; const patchers = {}; @@ -14,6 +15,7 @@ patchers[types.REMOVE_CHILD] = removeChild; patchers[types.REPLACE_CHILD] = replaceChild; patchers[types.SET_ATTRIBUTE] = setAttribute; patchers[types.SET_EVENT] = setEvent; +patchers[types.SET_PROPERTY] = setProperty; patchers[types.TEXT_CONTENT] = textContent; function patch (instruction) { diff --git a/src/patch/append-child.js b/src/patch/append-child.js index 8e30e70..5920d8d 100644 --- a/src/patch/append-child.js +++ b/src/patch/append-child.js @@ -1,6 +1,12 @@ import realNode from '../util/real-node'; -import dom from '../vdom/dom'; +import toDom from '../to-dom'; +import toVdom from '../to-vdom'; export default function (src, dst) { - realNode(src).appendChild(dom(dst)); + const real = realNode(src); + if (real) { + realNode(src).appendChild(toDom(dst)); + } else { + src.childNodes.push(toVdom(dst)); + } } diff --git a/src/patch/remove-attribute.js b/src/patch/remove-attribute.js index b26f8fb..b3b66eb 100644 --- a/src/patch/remove-attribute.js +++ b/src/patch/remove-attribute.js @@ -1,6 +1,10 @@ -import { removeAccessor } from '../util/accessor'; import realNode from '../util/real-node'; export default function (src, dst, data) { - removeAccessor(realNode(src), data.name); + const real = realNode(src); + if (real) { + real.removeAttribute(data.name); + } else { + delete src.attributes[data.name]; + } } diff --git a/src/patch/remove-child.js b/src/patch/remove-child.js index a483ea0..ed68481 100644 --- a/src/patch/remove-child.js +++ b/src/patch/remove-child.js @@ -6,5 +6,13 @@ export default function (src, dst) { // We don't do parentNode.removeChild because parentNode may report // incorrectly in some prollyfills since it's impossible (?) to spoof. - realSrc.removeChild(realDst); + if (realSrc) { + realSrc.removeChild(realDst); + } else { + const { childNodes } = realSrc; + const index = childNodes.indexOf(realDst); + if (index > -1) { + childNodes.splice(index, 1); + } + } } diff --git a/src/patch/replace-child.js b/src/patch/replace-child.js index 2506270..92ee45d 100644 --- a/src/patch/replace-child.js +++ b/src/patch/replace-child.js @@ -1,7 +1,16 @@ -import dom from '../vdom/dom'; +import dom from '../to-dom'; import realNode from '../util/real-node'; export default function (src, dst) { const realSrc = realNode(src); - realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc); + if (realSrc) { + realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc); + } else { + src.__id = dst.__id; + src.nodeType = dst.nodeType; + src.tagName = dst.tagName; + src.attributes = dst.attributes; + src.events = dst.events; + src.childNodes = dst.childNodes; + } } diff --git a/src/patch/set-attribute.js b/src/patch/set-attribute.js index 1ff1feb..bd9c1cf 100644 --- a/src/patch/set-attribute.js +++ b/src/patch/set-attribute.js @@ -1,6 +1,11 @@ -import { setAccessor } from '../util/accessor'; import realNode from '../util/real-node'; export default function (src, dst, data) { - setAccessor(realNode(src), data.name, data.value); + const { name, value } = data; + const real = realNode(src); + if (real) { + real.setAttribute(name, value); + } else { + src.attributes[name] = value; + } } diff --git a/src/patch/set-event.js b/src/patch/set-event.js index be8ba51..9167fca 100644 --- a/src/patch/set-event.js +++ b/src/patch/set-event.js @@ -3,6 +3,12 @@ import realNode from '../util/real-node'; export default function (src, dst, data) { const realSrc = realNode(src); + + if (!realSrc) { + src.events[data.name] = data.value; + return; + } + const eventHandlers = eventMap(realSrc); const name = data.name; const prevHandler = eventHandlers[name]; diff --git a/src/patch/set-property.js b/src/patch/set-property.js new file mode 100644 index 0000000..4d9ee12 --- /dev/null +++ b/src/patch/set-property.js @@ -0,0 +1,6 @@ +import realNode from '../util/real-node'; + +export default function (src, dst, data) { + const { name } = data; + realNode(src)[name] = dst[name]; +} diff --git a/src/patch/text-content.js b/src/patch/text-content.js index 87230d5..5706b77 100644 --- a/src/patch/text-content.js +++ b/src/patch/text-content.js @@ -1,5 +1,5 @@ import realNode from '../util/real-node'; export default function (src, dst) { - realNode(src).textContent = dst.textContent; + (realNode(src) || src).textContent = dst.textContent; } diff --git a/src/render.js b/src/render.js index 2d3ffcf..357ffbf 100644 --- a/src/render.js +++ b/src/render.js @@ -1,7 +1,7 @@ import WeakMap from './util/weak-map'; -import createElement from './vdom/element'; +import h from './h'; import merge from './merge'; -import mount from './vdom/mount'; +import mount from './mount'; const { Node } = window; const oldTreeMap = new WeakMap(); @@ -15,7 +15,7 @@ export default function (render) { } // Create a new element to house the new tree since we diff / mount fragments. - const newTree = createElement('div', null, render(elem)); + const newTree = h('div', null, render(elem)); const oldTree = oldTreeMap.get(elem); if (oldTree) { diff --git a/src/vdom/text.js b/src/text.js similarity index 54% rename from src/vdom/text.js rename to src/text.js index 6770598..9ddb67d 100644 --- a/src/vdom/text.js +++ b/src/text.js @@ -1,4 +1,4 @@ -export default function createTextNode (item) { +export default function (item) { return { nodeType: 3, textContent: item diff --git a/src/to-dom.js b/src/to-dom.js new file mode 100644 index 0000000..f94c447 --- /dev/null +++ b/src/to-dom.js @@ -0,0 +1,46 @@ +import eventMap from './util/event-map'; +import realNodeMap from './util/real-node-map'; + +const { Node } = window; + +function createElement (node) { + const { attributes, childNodes, events } = node; + const realNode = document.createElement(node.tagName); + const eventHandlers = eventMap(realNode); + + if (attributes) { + for (let name in attributes) { + realNode.setAttribute(name, attributes[name]); + } + } + + if (events) { + for (let name in events) { + realNode.addEventListener(name, eventHandlers[name] = events[name]); + } + } + + if (childNodes) { + childNodes.forEach(ch => realNode.appendChild(render(ch))); + } + + return realNode; +} + +function createText (el) { + return document.createTextNode(el.textContent); +} + +export default function render (node) { + if (node instanceof Node) { + return node; + } + if (Array.isArray(node)) { + const frag = document.createDocumentFragment(); + node.forEach(item => frag.appendChild(render(item))); + return frag; + } + const realNode = node.tagName ? createElement(node) : createText(node); + realNodeMap.set(node.__id, realNode); + return realNode; +} diff --git a/src/to-vdom.js b/src/to-vdom.js new file mode 100644 index 0000000..3ff15e5 --- /dev/null +++ b/src/to-vdom.js @@ -0,0 +1,3 @@ +export default function (dom) { + return dom; +} diff --git a/src/util/accessor.js b/src/util/accessor.js deleted file mode 100644 index f7c1851..0000000 --- a/src/util/accessor.js +++ /dev/null @@ -1,85 +0,0 @@ -function classToString (obj) { - if (typeof obj === 'string') { - return obj; - } - - if (Array.isArray(obj)) { - return obj.join(' '); - } - - return Object.keys(obj).filter(function (key) { - return obj[key] ? key : false; - }).join(' '); -} - -function styleToString (obj) { - if (typeof obj === 'string') { - return obj; - } - - return Object.keys(obj).map(function (key) { - return `${key}: ${obj[key]};`; - }).join(' '); -} - -export function getAccessor (node, name) { - if (name === 'class') { - return node.className; - } else if (name === 'style') { - return node.style.cssText; - // most things - } else if (name !== 'type' && name in node) { - return node[name]; - // real DOM elements - } else if (node.getAttribute) { - return node.getAttribute(name); - // vDOM nodes - } else if (node.attributes && node.attributes[name]) { - return node.attributes[name].value; - } -} - -export function mapAccessor (node, name, value) { - if (name === 'class') { - node.className = classToString(value); - } else if (name === 'style') { - node.style = { cssText: styleToString(value) }; - } -} - -export function removeAccessor (node, name) { - if (name === 'class') { - node.className = ''; - } else if (name === 'style') { - node.style.cssText = ''; - // most things - } else if (name !== 'type' && name in node) { - node[name] = ''; - // real DOM elements - } else if (node.removeAttribute) { - node.removeAttribute(name); - // vDOM nodes - } else if (node.attributes) { - delete node.attributes[name]; - } -} - -export function setAccessor (node, name, value) { - if (name === 'class') { - node.className = value; - } else if (name === 'style') { - node.style.cssText = value; - // most things - } else if (name !== 'type' && name in node || typeof value !== 'string') { - // We check if it's undefined or null because IE throws "invalid argument" - // errors for some types of properties. Essentially this is the same as - // removing the accessor. - node[name] = value == null ? '' : value; - // real DOM elements - } else if (node.setAttribute) { - node.setAttribute(name, value); - // vDOM nodes - } else if (node.attributes) { - node.attributes[node.attributes.length] = node.attributes[name] = { name, value }; - } -} diff --git a/src/vdom/dom.js b/src/vdom/dom.js deleted file mode 100644 index cc6a8b4..0000000 --- a/src/vdom/dom.js +++ /dev/null @@ -1,61 +0,0 @@ -import { setAccessor } from '../util/accessor'; -import eventMap from '../util/event-map'; -import realNodeMap from '../util/real-node-map'; - -const { Node } = window; - -function createElement (el) { - const realNode = document.createElement(el.tagName); - const attributes = el.attributes; - const events = el.events; - const eventHandlers = eventMap(realNode); - const children = el.childNodes; - - if (attributes) { - const attributesLen = attributes.length; - for (let a = 0; a < attributesLen; a++) { - const attr = attributes[a]; - setAccessor(realNode, attr.name, attr.value); - } - } - - if (events) { - for (let name in events) { - realNode.addEventListener(name, eventHandlers[name] = events[name]); - } - } - - if (children) { - const docfrag = document.createDocumentFragment(); - const childrenLen = children.length; - - for (let a = 0; a < childrenLen; a++) { - const ch = children[a]; - ch && docfrag.appendChild(render(ch)); - } - - if (realNode.appendChild) { - realNode.appendChild(docfrag); - } - } - - return realNode; -} - -function createText (el) { - return document.createTextNode(el.textContent); -} - -export default function render (el) { - if (el instanceof Node) { - return el; - } - if (Array.isArray(el)) { - const frag = document.createDocumentFragment(); - el.forEach(item => frag.appendChild(render(item))); - return frag; - } - const realNode = el.tagName ? createElement(el) : createText(el); - realNodeMap.set(el.__id, realNode); - return realNode; -} diff --git a/src/vdom/element.js b/src/vdom/element.js deleted file mode 100644 index 90c6df5..0000000 --- a/src/vdom/element.js +++ /dev/null @@ -1,216 +0,0 @@ -import { mapAccessor } from '../util/accessor'; -import createTextNode from './text'; - -function separateData (obj) { - const attrs = {}; - const events = {}; - const node = {}; - let attrIdx = 0; - - for (let name in obj) { - let value = obj[name]; - - if (name.indexOf('on') === 0) { - events[name.substring(2)] = value; - } else { - attrs[attrIdx++] = attrs[name] = { name, value }; - mapAccessor(node, name, value); - } - } - - attrs.length = attrIdx; - return { attrs, events, node }; -} - -function ensureNodes (arr) { - let out = []; - if (!Array.isArray(arr)) { - arr = [arr]; - } - arr.filter(Boolean).forEach(function (item) { - if (Array.isArray(item)) { - out = out.concat(ensureNodes(item)); - } else if (typeof item === 'object') { - out.push(translateFromReact(item)); - } else { - out.push(createTextNode(item)); - } - }); - return out; -} - -function ensureTagName (name) { - return (typeof name === 'function' ? name.id || name.name : name).toUpperCase(); -} - -function isChildren (arg) { - return arg && (typeof arg === 'string' || Array.isArray(arg) || typeof arg.nodeType === 'number' || isReactNode(arg)); -} - -function isReactNode (item) { - return item && item.type && item.props; -} - -function translateFromReact (item) { - if (isReactNode(item)) { - const props = item.props; - const chren = ensureNodes(props.children); - delete props.children; - return { - nodeType: 1, - tagName: item.type, - attributes: props, - childNodes: chren - }; - } - return item; -} - -let count = 0; -export default function element (name, attrs = {}, ...chren) { - const isAttrsNode = isChildren(attrs); - const data = separateData(isAttrsNode ? {} : attrs); - const node = data.node; - node.__id = ++count; - node.nodeType = 1; - node.tagName = ensureTagName(name); - node.attributes = data.attrs; - node.events = data.events; - node.childNodes = ensureNodes(isAttrsNode ? [attrs].concat(chren) : chren); - return node; -} - -// Add an array factory that returns an array of virtual nodes. -element.array = ensureNodes; - -// Generate built-in factories. -[ - 'a', - 'abbr', - 'address', - 'area', - 'article', - 'aside', - 'audio', - 'b', - 'base', - 'bdi', - 'bdo', - 'bgsound', - 'blockquote', - 'body', - 'br', - 'button', - 'canvas', - 'caption', - 'cite', - 'code', - 'col', - 'colgroup', - 'command', - 'content', - 'data', - 'datalist', - 'dd', - 'del', - 'details', - 'dfn', - 'dialog', - 'div', - 'dl', - 'dt', - 'element', - 'em', - 'embed', - 'fieldset', - 'figcaption', - 'figure', - 'font', - 'footer', - 'form', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'header', - 'hgroup', - 'hr', - 'html', - 'i', - 'iframe', - 'image', - 'img', - 'input', - 'ins', - 'kbd', - 'keygen', - 'label', - 'legend', - 'li', - 'link', - 'main', - 'map', - 'mark', - 'marquee', - 'menu', - 'menuitem', - 'meta', - 'meter', - 'multicol', - 'nav', - 'nobr', - 'noembed', - 'noframes', - 'noscript', - 'object', - 'ol', - 'optgroup', - 'option', - 'output', - 'p', - 'param', - 'picture', - 'pre', - 'progress', - 'q', - 'rp', - 'rt', - 'rtc', - 'ruby', - 's', - 'samp', - 'script', - 'section', - 'select', - 'shadow', - 'small', - 'source', - 'span', - 'strong', - 'style', - 'sub', - 'summary', - 'sup', - 'table', - 'tbody', - 'td', - 'template', - 'textarea', - 'tfoot', - 'th', - 'thead', - 'time', - 'title', - 'tr', - 'track', - 'u', - 'ul', - 'var', - 'video', - 'wbr' -].forEach(function (tag) { - element[tag] = element.bind(null, tag); -}); diff --git a/src/vdom/index.js b/src/vdom/index.js deleted file mode 100644 index d8ca521..0000000 --- a/src/vdom/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import dom from './dom'; -import element from './element'; -import mount from './mount'; -import text from './text'; - -export default { - dom, - element, - mount, - text -}; diff --git a/test/unit.js b/test/unit.js index 371f908..7ff78bc 100644 --- a/test/unit.js +++ b/test/unit.js @@ -1,518 +1,2 @@ -/* eslint-env jasmine, mocha */ - -import 'custom-event-polyfill'; -import * as types from '../src/types'; -import sd from '../src/index'; -import vdom from '../src/vdom/element'; - -const { assert, CustomEvent } = window; - -function createElement (...args) { - return sd.vdom.dom(sd.vdom.element.apply(null, args)); -} - -describe('vdom/element', function () { - it('should render a built-in element', function () { - const el = vdom('div'); - expect(el.tagName).to.equal('DIV'); - }); - - it('should render a custom element', function () { - const el = vdom('x-div'); - expect(el.tagName).to.equal('X-DIV'); - }); - - it('should set attributes', function () { - const el = vdom('div', { attr1: undefined, attr2: null, attr3: false, attr4: 0, attr5: '' }); - expect(el.attributes.attr1.name).to.equal('attr1'); - expect(el.attributes.attr2.name).to.equal('attr2'); - expect(el.attributes.attr3.name).to.equal('attr3'); - expect(el.attributes.attr4.name).to.equal('attr4'); - expect(el.attributes.attr5.name).to.equal('attr5'); - expect(el.attributes.attr1.value).to.equal(undefined); - expect(el.attributes.attr2.value).to.equal(null); - expect(el.attributes.attr3.value).to.equal(false); - expect(el.attributes.attr4.value).to.equal(0); - expect(el.attributes.attr5.value).to.equal(''); - }); - - it('should bind events', function () { - const el = vdom('div', { onclick: function () {} }); - expect(el.events.click).to.be.a('function'); - }); - - it('should take children as the second and third arguments', function () { - const el1 = vdom('div', 'text-1-1', 'text-1-2'); - const el2 = vdom('div', vdom('span-2-1'), vdom('span-2-2')); - const el3 = vdom('div', ['text-3-1', vdom('span-3-1')], ['text-3-2', vdom('span-3-2')]); - const el4 = vdom('div', [['text-4-1'], [vdom('span-4-1')]], [['text-4-2'], [vdom('span-4-2')]]); - - expect(el1.childNodes[0].textContent).to.equal('text-1-1'); - expect(el1.childNodes[1].textContent).to.equal('text-1-2'); - - expect(el2.childNodes[0].tagName).to.equal('SPAN-2-1'); - expect(el2.childNodes[1].tagName).to.equal('SPAN-2-2'); - - expect(el3.childNodes[0].textContent).to.equal('text-3-1'); - expect(el3.childNodes[1].tagName).to.equal('SPAN-3-1'); - expect(el3.childNodes[2].textContent).to.equal('text-3-2'); - expect(el3.childNodes[3].tagName).to.equal('SPAN-3-2'); - - expect(el4.childNodes[0].textContent).to.equal('text-4-1'); - expect(el4.childNodes[1].tagName).to.equal('SPAN-4-1'); - expect(el4.childNodes[2].textContent).to.equal('text-4-2'); - expect(el4.childNodes[3].tagName).to.equal('SPAN-4-2'); - }); - - it('should take class as an array of strings', function () { - const el = vdom('div', { - class: ['class1', 'class2'] - }); - expect(el.className).to.equal('class1 class2'); - }); - - it('should take class as an object of key (string) value (boolean) pairs', function () { - const el = vdom('div', { - class: { - class1: false, - class2: true - } - }); - expect(el.className).to.equal('class2'); - }); - - it('should take style as an object', function () { - const el = vdom('div', { - style: { - background: 'something', - display: 'none' - } - }); - expect(el.style.cssText).to.equal('background: something; display: none;'); - }); - - it('should export factories for standard HTML5 elements', function () { - expect(vdom.a).to.be.a('function'); - expect(vdom.wbr).to.be.a('function'); - expect(vdom.div().tagName).to.equal('DIV'); - }); -}); - -describe('jsx', function () { - const React = { createElement: sd.vdom.element }; // eslint-disable-line no-unused-vars - - it('should render a built-in element', function () { - const el =
; - expect(el.tagName).to.equal('DIV'); - }); - - it('should render a custom element', function () { - const el = ; - expect(el.tagName).to.equal('X-DIV'); - }); - - it('should set attributes', function () { - const el =
; - expect(el.attributes.attr1.name).to.equal('attr1'); - expect(el.attributes.attr2.name).to.equal('attr2'); - expect(el.attributes.attr3.name).to.equal('attr3'); - expect(el.attributes.attr4.name).to.equal('attr4'); - expect(el.attributes.attr5.name).to.equal('attr5'); - expect(el.attributes.attr1.value).to.equal(undefined); - expect(el.attributes.attr2.value).to.equal(null); - expect(el.attributes.attr3.value).to.equal(false); - expect(el.attributes.attr4.value).to.equal(0); - expect(el.attributes.attr5.value).to.equal(''); - }); - - it('should bind events', function () { - const el =
; - expect(el.events.click).to.be.a('function'); - }); -}); - -// Run the same tests for both real and virtual elements. -[createElement, sd.vdom.element].forEach(function (element, index) { - function _describe (name, func) { - const prefix = index === 0 ? 'REAL destination' : 'VIRTUAL destination'; - describe(`${prefix} - ${name}`, func); - } - - _describe('diff', function () { - it('instructions array', function () { - const src = createElement('div'); - const dst = element('div'); - const instructions = sd.diff({ destination: dst, source: src }); - - assert.ok(Array.isArray(instructions)); - }); - - it('instruction object', function () { - const src = createElement('div', null, element('span')); - const dst = element('div', null, element('a')); - const instructions = sd.diff({ destination: dst, source: src }); - - assert.equal(instructions.length, 1, 'instruction length'); - assert.equal(instructions[0].destination.tagName, 'A', 'destination tagName'); - assert.equal(instructions[0].source.tagName, 'SPAN', 'source tagName'); - assert.equal(instructions[0].type, types.REPLACE_CHILD, 'type'); - }); - - it('diffing root nodes (as opposed to only decendant trees)', () => { - const root = true; - const source = createElement('div'); - const destination = element('div', { test: 'test' }); - const instructions = sd.diff({ destination, root, source }); - - assert.equal(instructions.length, 1, 'should have instructions'); - assert.equal(instructions[0].data.name, 'test'); - assert.equal(instructions[0].data.value, 'test'); - assert.equal(instructions[0].destination, destination); - assert.equal(instructions[0].source, source); - assert.equal(instructions[0].type, types.SET_ATTRIBUTE); - }); - }); - - _describe('patch', function () { - it('host should not change', function () { - const src = createElement('div', null, element('span')); - const dst = element('div', null, element('a')); - const instructions = sd.diff({ destination: dst, source: src }); - - sd.patch(instructions); - assert.equal(src.tagName, 'DIV'); - }); - - it('same elements should not change', function () { - const src = createElement('div', null, element('span')); - const dst = element('div', null, element('span'), element('a')); - const instructions = sd.diff({ destination: dst, source: src }); - const srcSpan = src.childNodes[0]; - - sd.patch(instructions); - assert.equal(src.childNodes[0], srcSpan); - }); - - it('only compares items at the same index', function () { - const src = createElement('div', null, element('span')); - const dst = element('div', null, element('a'), element('span')); - const instructions = sd.diff({ destination: dst, source: src }); - const srcSpan = src.childNodes[0]; - - sd.patch(instructions); - assert.notEqual(src.childNodes[0], srcSpan); - assert.notEqual(src.childNodes[1], srcSpan); - }); - - it('should not patch equal text nodes', function () { - const src = createElement('div', null, 'text'); - const dst = element('div', null, 'text'); - const text = src.childNodes[0]; - - sd.merge({ source: src, destination: dst }); - assert.equal(text, src.childNodes[0]); - }); - - it('should patch on subsequent runs', function () { - const src = createElement('div', null, 'test 1'); - const dst1 = element('div', null, 'test 2'); - const dst2 = element('div', null, 'test 3'); - - sd.merge({ source: src, destination: dst1 }); - assert.equal(src.textContent, 'test 2'); - - sd.merge({ source: src, destination: dst2 }); - assert.equal(src.textContent, 'test 3'); - }); - - describe('attributes', function () { - it('should add attributes', function () { - const src = createElement('div', null, createElement('div')); - const dst = element('div', null, element('div', { name: 'value' })); - - sd.merge({ source: src, destination: dst }); - expect(src.children[0].getAttribute('name')).to.equal('value'); - }); - - it('should updated attributes', function () { - const src = createElement('div', null, createElement('div', { name: 'old' })); - const dst = element('div', null, element('div', { name: 'new' })); - - sd.merge({ source: src, destination: dst }); - expect(src.children[0].getAttribute('name')).to.equal('new'); - }); - - it('should remove attributes', function () { - const src = createElement('div', null, createElement('div', { name: 'value' })); - const dst = element('div', null, element('div')); - - sd.merge({ source: src, destination: dst }); - expect(src.children[0].hasAttribute('name')).to.equal(false); - }); - }); - - describe('properties', function () { - describe('props "in" an element', function () { - it('sets a property', function () { - const src = createElement('div', null, createElement('input')); - const dst = element('div', null, element('input', { name: 'value' })); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); - expect(src.children[0].getAttribute('name')).to.equal('value'); - expect(src.children[0].name).to.equal('value'); - }); - - it('updates a property', function () { - const src = createElement('div', null, createElement('input', { name: 'old' })); - const dst = element('div', null, element('input', { name: 'new' })); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); - expect(src.children[0].getAttribute('name')).to.equal('new'); - expect(src.children[0].name).to.equal('new'); - }); - - it('does not update an attribute if the values are the same', function () { - const src = createElement('div', null, createElement('input', { name: 'value' })); - const dst = element('div', null, element('input', { name: 'value' })); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(0); - }); - - it('removes a property', function () { - const src = createElement('div', null, createElement('input', { name: 'old' })); - const dst = element('div', null, element('input')); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.REMOVE_ATTRIBUTE); - expect(src.children[0].getAttribute('name')).to.equal(''); - expect(src.children[0].name).to.equal(''); - }); - }); - - describe('props *not* "in" an element', function () { - it('sets an attribute', function () { - const src = createElement('div', null, createElement('div')); - const dst = element('div', null, element('div', { name: 'value' })); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); - expect(src.children[0].getAttribute('name')).to.equal('value'); - expect(src.children[0].name).to.equal(undefined); - }); - - it('updates an attribute', function () { - const src = createElement('div', null, createElement('div', { name: 'old' })); - const dst = element('div', null, element('div', { name: 'new' })); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); - expect(src.children[0].getAttribute('name')).to.equal('new'); - expect(src.children[0].name).to.equal(undefined); - }); - - it('does not update a property if the values are the same', function () { - const src = createElement('div', null, createElement('div', { name: 'value' })); - const dst = element('div', null, element('div', { name: 'value' })); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(0); - }); - - it('removes an attribute', function () { - const src = createElement('div', null, createElement('div', { name: 'old' })); - const dst = element('div', null, element('div')); - const instructions = sd.merge({ source: src, destination: dst }); - - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.REMOVE_ATTRIBUTE); - expect(src.children[0].hasAttribute('name')).to.equal(false); - expect(src.children[0].name).to.equal(undefined); - }); - }); - - describe('class -> className', function () { - it('sets', function () { - const src = createElement('div', null, createElement('div')); - const dst = element('div', null, element('div', { class: 'value' })); - - sd.merge({ source: src, destination: dst }); - expect(src.children[0].getAttribute('class')).to.equal('value'); - expect(src.children[0].className).to.equal('value'); - }); - }); - - describe('style -> style.cssText', function () { - it('sets', function () { - const src = createElement('div', null, createElement('div')); - const dst = element('div', null, element('div', { style: 'display: block;' })); - - sd.merge({ source: src, destination: dst }); - expect(src.children[0].getAttribute('style')).to.equal('display: block;'); - expect(src.children[0].style.cssText).to.equal('display: block;'); - }); - }); - - describe('type -> type', function () { - it('sets', function () { - const src = createElement('div', null, createElement('input')); - const dst = element('div', null, element('input', { type: 'text' })); - - sd.merge({ source: src, destination: dst }); - expect(src.children[0].getAttribute('type')).to.equal('text'); - expect(src.children[0].type).to.equal('text'); - }); - }); - }); - }); -}); - -describe('events', function () { - const onclick = e => (e.target.triggered = true); - - it('should add listeners', function () { - const src = createElement('div', null, createElement('button')); - const dst = sd.vdom.element('div', null, sd.vdom.element('button', { onclick })); - const instructions = sd.merge({ source: src, destination: dst }); - - // The instruction should explicitly set an event. - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.SET_EVENT); - expect(instructions[0].data.name).to.equal('click'); - expect(instructions[0].data.value).to.equal(onclick); - - // It should be added via addEventListener(). - expect(src.children[0].hasAttribute('onclick')).to.equal(false); - expect(src.children[0].onclick).to.equal(null); - - src.children[0].dispatchEvent(new CustomEvent('click')); - expect(src.children[0].triggered).to.equal(true); - }); - - it('should replace different listeners', function () { - const noop = function () {}; - const src = createElement('div', null, createElement('button')); - const dst1 = sd.vdom.element('div', null, sd.vdom.element('button', { onclick })); - const dst2 = sd.vdom.element('div', null, sd.vdom.element('button', { onclick: noop })); - - const instructions1 = sd.merge({ source: src, destination: dst1 }); - expect(instructions1.length).to.equal(1); - expect(instructions1[0].type).to.equal(types.SET_EVENT); - expect(instructions1[0].data.name).to.equal('click'); - expect(instructions1[0].data.value).to.equal(onclick); - - const instructions2 = sd.merge({ source: src, destination: dst2 }); - expect(instructions2.length).to.equal(2); - expect(instructions2[0].type).to.equal(types.SET_EVENT); - expect(instructions2[0].data.name).to.equal('click'); - expect(instructions2[0].data.value).to.equal(undefined); - expect(instructions2[1].type).to.equal(types.SET_EVENT); - expect(instructions2[1].data.name).to.equal('click'); - expect(instructions2[1].data.value).to.equal(noop); - }); - - it('should not replace or add same listeners', function () { - const src = createElement('div', null, createElement('button')); - const dst1 = sd.vdom.element('div', null, sd.vdom.element('button', { onclick })); - const dst2 = sd.vdom.element('div', null, sd.vdom.element('button', { onclick })); - - const instructions1 = sd.merge({ source: src, destination: dst1 }); - expect(instructions1.length).to.equal(1); - - // Since we are passing the same handler here and are testing that there - // no instructions, we are testing both: - // - // 1. That it is not replaced. - // 2. That it is not being added again. - const instructions2 = sd.merge({ source: src, destination: dst2 }); - expect(instructions2.length).to.equal(0); - }); - - it('should remove listeners', function () { - const src = createElement('div', null, createElement('button')); - const dst1 = sd.vdom.element('div', null, sd.vdom.element('button', { onclick })); - const dst2 = sd.vdom.element('div', null, sd.vdom.element('button')); - - const instructions1 = sd.merge({ source: src, destination: dst1 }); - expect(instructions1.length).to.equal(1); - - const instructions2 = sd.merge({ source: src, destination: dst2 }); - expect(instructions2.length).to.equal(1); - - src.children[0].dispatchEvent(new CustomEvent('click')); - expect(src.children[0].triggered).to.equal(undefined); - }); -}); - -describe('render', function () { - it('should initially render and re-render', function () { - const root = document.createElement('div'); - const render = sd.render(function (root) { - return sd.vdom.element('div', null, sd.vdom.element('span', null, root.test)); - }); - - ['test 1', 'test 1', 'test 2', 'test 2'].forEach(function (test) { - root.test = test; - render(root); - assert.equal(root.innerHTML, `
${test}
`); - }); - }); -}); - -describe('worker', function () { - it('diff', done => { - const source = sd.vdom.element('div', null, 'text 1'); - const destination = sd.vdom.element('div', null, 'text 2'); - const realDom = sd.vdom.dom(source); - - sd.diff({ - destination, - source, - done (instructions) { - assert.ok(Array.isArray(instructions)); - sd.patch(instructions); - assert.ok(realDom.textContent === 'text 2'); - done(); - } - }); - }); - - it('merge', done => { - const source = sd.vdom.element('div', null, 'test 1'); - const destination = sd.vdom.element('div', null, 'test 2'); - const realDom = sd.vdom.dom(source); - - sd.merge({ - destination, - source, - done () { - assert.ok(realDom.textContent === 'test 2'); - done(); - } - }); - }); - - it('render', done => { - const root = document.createElement('div'); - const render = sd.render(function (root) { - return sd.vdom.element('div', null, root.test); - }); - - root.test = 'test 1'; - render(root, () => { - assert.ok(root.textContent === 'test 1', 'not updated to test 1'); - root.test = 'test 2'; - render(root, () => { - assert.ok(root.textContent === 'test 2', 'not updated to test 2'); - done(); - }); - }); - }); -}); +const reqTests = require.context('./unit', true, /^.*\.js$/); +reqTests.keys().map(reqTests); diff --git a/test/unit/algorithm/events.js b/test/unit/algorithm/events.js new file mode 100644 index 0000000..c82a426 --- /dev/null +++ b/test/unit/algorithm/events.js @@ -0,0 +1,87 @@ +/* eslint-env jasmine, mocha */ + +import 'custom-event-polyfill'; +import { h, merge, toDom, types } from '../../../src/index'; + +const { CustomEvent } = window; + +function createElement (...args) { + return toDom(h.apply(null, args)); +} + +describe('events', function () { + const onclick = e => (e.target.triggered = true); + + it('should add listeners', function () { + const src = createElement('div', null, createElement('button')); + const dst = h('div', null, h('button', { onclick })); + const instructions = merge({ source: src, destination: dst }); + + // The instruction should explicitly set an event. + expect(instructions.length).to.equal(1); + expect(instructions[0].type).to.equal(types.SET_EVENT); + expect(instructions[0].data.name).to.equal('click'); + expect(instructions[0].data.value).to.equal(onclick); + + // It should be added via addEventListener(). + expect(src.children[0].hasAttribute('onclick')).to.equal(false); + expect(src.children[0].onclick).to.equal(null); + + src.children[0].dispatchEvent(new CustomEvent('click')); + expect(src.children[0].triggered).to.equal(true); + }); + + it('should replace different listeners', function () { + const noop = function () {}; + const src = createElement('div', null, createElement('button')); + const dst1 = h('div', null, h('button', { onclick })); + const dst2 = h('div', null, h('button', { onclick: noop })); + + const instructions1 = merge({ source: src, destination: dst1 }); + expect(instructions1.length).to.equal(1); + expect(instructions1[0].type).to.equal(types.SET_EVENT); + expect(instructions1[0].data.name).to.equal('click'); + expect(instructions1[0].data.value).to.equal(onclick); + + const instructions2 = merge({ source: src, destination: dst2 }); + expect(instructions2.length).to.equal(2); + expect(instructions2[0].type).to.equal(types.SET_EVENT); + expect(instructions2[0].data.name).to.equal('click'); + expect(instructions2[0].data.value).to.equal(undefined); + expect(instructions2[1].type).to.equal(types.SET_EVENT); + expect(instructions2[1].data.name).to.equal('click'); + expect(instructions2[1].data.value).to.equal(noop); + }); + + it('should not replace or add same listeners', function () { + const src = createElement('div', null, createElement('button')); + const dst1 = h('div', null, h('button', { onclick })); + const dst2 = h('div', null, h('button', { onclick })); + + const instructions1 = merge({ source: src, destination: dst1 }); + expect(instructions1.length).to.equal(1); + + // Since we are passing the same handler here and are testing that there + // no instructions, we are testing both: + // + // 1. That it is not replaced. + // 2. That it is not being added again. + const instructions2 = merge({ source: src, destination: dst2 }); + expect(instructions2.length).to.equal(0); + }); + + it('should remove listeners', function () { + const src = createElement('div', null, createElement('button')); + const dst1 = h('div', null, h('button', { onclick })); + const dst2 = h('div', null, h('button')); + + const instructions1 = merge({ source: src, destination: dst1 }); + expect(instructions1.length).to.equal(1); + + const instructions2 = merge({ source: src, destination: dst2 }); + expect(instructions2.length).to.equal(1); + + src.children[0].dispatchEvent(new CustomEvent('click')); + expect(src.children[0].triggered).to.equal(undefined); + }); +}); diff --git a/test/unit/algorithm/key.js b/test/unit/algorithm/key.js new file mode 100644 index 0000000..257743d --- /dev/null +++ b/test/unit/algorithm/key.js @@ -0,0 +1,32 @@ +/* eslint-env jasmine, mocha */ + +import { h, merge, mount } from '../../../src'; + +describe('key', () => { + it('should maintain nodes in a list', () => { + const source = h('ul', null, + h('li', { key: 0 }, '0'), + h('li', { key: 1 }, '1'), + h('li', { key: 2 }, '2') + ); + const destination = h('ul', null, + h('li', { key: 0 }, '0'), + h('li', { key: 2 }, '2') + ); + + const root = document.createElement('div'); + mount(root, source); + + const lastLiBefore = root.firstElementChild.children[2]; + + merge({ source, destination }); + + const lastLiAfter = root.firstElementChild.children[1]; + + expect(lastLiBefore).to.equal(lastLiAfter); + }); + + it('should maintain nodes anywhere in the DOM', () => { + + }); +}); diff --git a/test/unit/algorithm/worker.js b/test/unit/algorithm/worker.js new file mode 100644 index 0000000..fb7dee5 --- /dev/null +++ b/test/unit/algorithm/worker.js @@ -0,0 +1,56 @@ +/* eslint-env jasmine, mocha */ + +import { diff, h, merge, patch, render, toDom } from '../../../src/index'; + +const { assert } = window; + +describe('worker', function () { + it('diff', done => { + const source = h('div', null, 'text 1'); + const destination = h('div', null, 'text 2'); + const realDom = toDom(source); + + diff({ + destination, + source, + done (instructions) { + assert.ok(Array.isArray(instructions)); + patch(instructions); + assert.ok(realDom.textContent === 'text 2'); + done(); + } + }); + }); + + it('merge', done => { + const source = h('div', null, 'test 1'); + const destination = h('div', null, 'test 2'); + const realDom = toDom(source); + + merge({ + destination, + source, + done () { + assert.ok(realDom.textContent === 'test 2'); + done(); + } + }); + }); + + it('render', done => { + const root = document.createElement('div'); + const rend = render(function (root) { + return h('div', null, root.test); + }); + + root.test = 'test 1'; + rend(root, () => { + assert.ok(root.textContent === 'test 1', 'not updated to test 1'); + root.test = 'test 2'; + rend(root, () => { + assert.ok(root.textContent === 'test 2', 'not updated to test 2'); + done(); + }); + }); + }); +}); diff --git a/test/unit/diff.js b/test/unit/diff.js new file mode 100644 index 0000000..8a271bd --- /dev/null +++ b/test/unit/diff.js @@ -0,0 +1,40 @@ +/* eslint-env jasmine, mocha */ + +import { diff, h, types } from '../../src'; + +const { assert } = window; + +describe('diff', () => { + it('instructions array', function () { + const src = h('div'); + const dst = h('div'); + const instructions = diff({ destination: dst, source: src }); + + assert.ok(Array.isArray(instructions)); + }); + + it('instruction object', function () { + const src = h('div', null, h('span')); + const dst = h('div', null, h('a')); + const instructions = diff({ destination: dst, source: src }); + + assert.equal(instructions.length, 1, 'instruction length'); + assert.equal(instructions[0].destination.tagName, 'A', 'destination tagName'); + assert.equal(instructions[0].source.tagName, 'SPAN', 'source tagName'); + assert.equal(instructions[0].type, types.REPLACE_CHILD, 'type'); + }); + + it('diffing root nodes (as opposed to only decendant trees)', () => { + const root = true; + const source = h('div'); + const destination = h('div', { test: 'test' }); + const instructions = diff({ destination, root, source }); + + assert.equal(instructions.length, 1, 'should have instructions'); + assert.equal(instructions[0].data.name, 'test'); + assert.equal(instructions[0].data.value, 'test'); + assert.equal(instructions[0].destination, destination); + assert.equal(instructions[0].source, source); + assert.equal(instructions[0].type, types.SET_ATTRIBUTE); + }); +}); diff --git a/test/unit/h-jsx.js b/test/unit/h-jsx.js new file mode 100644 index 0000000..25900b0 --- /dev/null +++ b/test/unit/h-jsx.js @@ -0,0 +1,35 @@ +/* eslint-env jasmine, mocha */ +/** @jsx h */ + +import { h } from '../../src'; + +describe('jsx', function () { + it('should render a built-in element', function () { + const el =
; + expect(el.tagName).to.equal('DIV'); + }); + + it('should render a custom element', function () { + const el = ; + expect(el.tagName).to.equal('X-DIV'); + }); + + it('should set attributes', function () { + const el =
; + expect(el.attributes.attr1.name).to.equal('attr1'); + expect(el.attributes.attr2.name).to.equal('attr2'); + expect(el.attributes.attr3.name).to.equal('attr3'); + expect(el.attributes.attr4.name).to.equal('attr4'); + expect(el.attributes.attr5.name).to.equal('attr5'); + expect(el.attributes.attr1.value).to.equal(undefined); + expect(el.attributes.attr2.value).to.equal(null); + expect(el.attributes.attr3.value).to.equal(false); + expect(el.attributes.attr4.value).to.equal(0); + expect(el.attributes.attr5.value).to.equal(''); + }); + + it('should bind events', function () { + const el =
; + expect(el.events.click).to.be.a('function'); + }); +}); diff --git a/test/unit/h.js b/test/unit/h.js new file mode 100644 index 0000000..7e95e60 --- /dev/null +++ b/test/unit/h.js @@ -0,0 +1,84 @@ +/* eslint-env jasmine, mocha */ + +import { h } from '../../src'; + +describe('h', function () { + it('should render a built-in element', function () { + const el = h('div'); + expect(el.tagName).to.equal('DIV'); + }); + + it('should render a custom element', function () { + const el = h('x-div'); + expect(el.tagName).to.equal('X-DIV'); + }); + + it('should set attributes', function () { + const el = h('div', { attr1: undefined, attr2: null, attr3: false, attr4: 0, attr5: '' }); + expect(el.attributes.attr1.name).to.equal('attr1'); + expect(el.attributes.attr2.name).to.equal('attr2'); + expect(el.attributes.attr3.name).to.equal('attr3'); + expect(el.attributes.attr4.name).to.equal('attr4'); + expect(el.attributes.attr5.name).to.equal('attr5'); + expect(el.attributes.attr1.value).to.equal(undefined); + expect(el.attributes.attr2.value).to.equal(null); + expect(el.attributes.attr3.value).to.equal(false); + expect(el.attributes.attr4.value).to.equal(0); + expect(el.attributes.attr5.value).to.equal(''); + }); + + it('should bind events', function () { + const el = h('div', { onclick: function () {} }); + expect(el.events.click).to.be.a('function'); + }); + + it('should take children as the second and third arguments', function () { + const el1 = h('div', 'text-1-1', 'text-1-2'); + const el2 = h('div', h('span-2-1'), h('span-2-2')); + const el3 = h('div', ['text-3-1', h('span-3-1')], ['text-3-2', h('span-3-2')]); + const el4 = h('div', [['text-4-1'], [h('span-4-1')]], [['text-4-2'], [h('span-4-2')]]); + + expect(el1.childNodes[0].textContent).to.equal('text-1-1'); + expect(el1.childNodes[1].textContent).to.equal('text-1-2'); + + expect(el2.childNodes[0].tagName).to.equal('SPAN-2-1'); + expect(el2.childNodes[1].tagName).to.equal('SPAN-2-2'); + + expect(el3.childNodes[0].textContent).to.equal('text-3-1'); + expect(el3.childNodes[1].tagName).to.equal('SPAN-3-1'); + expect(el3.childNodes[2].textContent).to.equal('text-3-2'); + expect(el3.childNodes[3].tagName).to.equal('SPAN-3-2'); + + expect(el4.childNodes[0].textContent).to.equal('text-4-1'); + expect(el4.childNodes[1].tagName).to.equal('SPAN-4-1'); + expect(el4.childNodes[2].textContent).to.equal('text-4-2'); + expect(el4.childNodes[3].tagName).to.equal('SPAN-4-2'); + }); + + it('should take class as an array of strings', function () { + const el = h('div', { + class: ['class1', 'class2'] + }); + expect(el.className).to.equal('class1 class2'); + }); + + it('should take class as an object of key (string) value (boolean) pairs', function () { + const el = h('div', { + class: { + class1: false, + class2: true + } + }); + expect(el.className).to.equal('class2'); + }); + + it('should take style as an object', function () { + const el = h('div', { + style: { + background: 'something', + display: 'none' + } + }); + expect(el.style.cssText).to.equal('background: something; display: none;'); + }); +}); diff --git a/test/unit/patch.js b/test/unit/patch.js new file mode 100644 index 0000000..3a87ecd --- /dev/null +++ b/test/unit/patch.js @@ -0,0 +1,229 @@ +/* eslint-env jasmine, mocha */ + +import { diff, h, merge, patch, toDom, types } from '../../src'; + +const { assert } = window; + +describe('patch', () => { + it('host should not change', function () { + const src = h('div', null, h('span')); + const dst = h('div', null, h('a')); + const instructions = diff({ destination: dst, source: src }); + + patch(instructions); + assert.equal(src.tagName, 'DIV'); + }); + + it('same elements should not change', function () { + const src = h('div', null, h('span')); + const dst = h('div', null, h('span'), h('a')); + const instructions = diff({ destination: dst, source: src }); + const srcSpan = src.childNodes[0]; + + patch(instructions); + assert.equal(src.childNodes[0], srcSpan); + }); + + it('only compares items at the same index', function () { + const src = h('div', null, h('span')); + const dst = h('div', null, h('a'), h('span')); + const instructions = diff({ destination: dst, source: src }); + const srcSpan = src.childNodes[0]; + + patch(instructions); + assert.notEqual(src.childNodes[0], srcSpan); + assert.notEqual(src.childNodes[1], srcSpan); + }); + + it('should not patch equal text nodes', function () { + const src = h('div', null, 'text'); + const dst = h('div', null, 'text'); + const text = src.childNodes[0]; + + merge({ source: src, destination: dst }); + assert.equal(text, src.childNodes[0]); + }); + + it('should patch on subsequent runs', function () { + const src = h('div', null, 'test 1'); + const dst1 = h('div', null, 'test 2'); + const dst2 = h('div', null, 'test 3'); + + merge({ source: src, destination: dst1 }); + assert.equal(src.textContent, 'test 2'); + + merge({ source: src, destination: dst2 }); + assert.equal(src.textContent, 'test 3'); + }); + + describe('attributes', function () { + it('should add attributes', function () { + const src = h('div', null, h('div')); + const dst = h('div', null, h('div', { name: 'value' })); + + merge({ source: src, destination: dst }); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('name')).to.equal('value'); + }); + + it('should updated attributes', function () { + const src = h('div', null, h('div', { name: 'old' })); + const dst = h('div', null, h('div', { name: 'new' })); + + merge({ source: src, destination: dst }); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('name')).to.equal('new'); + }); + + it('should remove attributes', function () { + const src = h('div', null, h('div', { name: 'value' })); + const dst = h('div', null, h('div')); + + merge({ source: src, destination: dst }); + + const realSrc = toDom(src); + expect(realSrc.children[0].hasAttribute('name')).to.equal(false); + }); + }); + + describe('properties', function () { + describe('props "in" an element', function () { + it('sets a property', function () { + const src = h('div', null, h('input')); + const dst = h('div', null, h('input', { name: 'value' })); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(1); + expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('name')).to.equal('value'); + expect(realSrc.children[0].name).to.equal('value'); + }); + + it('updates a property', function () { + const src = h('div', null, h('input', { name: 'old' })); + const dst = h('div', null, h('input', { name: 'new' })); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(1); + expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('name')).to.equal('new'); + expect(realSrc.children[0].name).to.equal('new'); + }); + + it('does not update an attribute if the values are the same', function () { + const src = h('div', null, h('input', { name: 'value' })); + const dst = h('div', null, h('input', { name: 'value' })); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(0); + }); + + it('removes a property', function () { + const src = h('div', null, h('input', { name: 'old' })); + const dst = h('div', null, h('input')); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(1); + expect(instructions[0].type).to.equal(types.REMOVE_ATTRIBUTE); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('name')).to.equal(''); + expect(realSrc.children[0].name).to.equal(''); + }); + }); + + describe('props *not* "in" an element', function () { + it('sets an attribute', function () { + const src = h('div', null, h('div')); + const dst = h('div', null, h('div', { name: 'value' })); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(1); + expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('name')).to.equal('value'); + expect(realSrc.children[0].name).to.equal(undefined); + }); + + it('updates an attribute', function () { + const src = h('div', null, h('div', { name: 'old' })); + const dst = h('div', null, h('div', { name: 'new' })); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(1); + expect(instructions[0].type).to.equal(types.SET_ATTRIBUTE); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('name')).to.equal('new'); + expect(realSrc.children[0].name).to.equal(undefined); + }); + + it('does not update a property if the values are the same', function () { + const src = h('div', null, h('div', { name: 'value' })); + const dst = h('div', null, h('div', { name: 'value' })); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(0); + }); + + it('removes an attribute', function () { + const src = h('div', null, h('div', { name: 'old' })); + const dst = h('div', null, h('div')); + const instructions = merge({ source: src, destination: dst }); + + expect(instructions.length).to.equal(1); + expect(instructions[0].type).to.equal(types.REMOVE_ATTRIBUTE); + + const realSrc = toDom(src); + expect(realSrc.children[0].hasAttribute('name')).to.equal(false); + expect(realSrc.children[0].name).to.equal(undefined); + }); + }); + + describe('class -> className', function () { + it('sets', function () { + const src = h('div', null, h('div')); + const dst = h('div', null, h('div', { class: 'value' })); + + merge({ source: src, destination: dst }); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('class')).to.equal('value'); + expect(realSrc.children[0].className).to.equal('value'); + }); + }); + + describe('style -> style.cssText', function () { + it.only('sets', function () { + const src = h('div', null, h('div')); + const dst = h('div', null, h('div', { style: { display: 'block' } })); + + merge({ source: src, destination: dst }); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('style')).to.equal('display: block;'); + expect(realSrc.children[0].style.cssText).to.equal('display: block;'); + }); + }); + + describe('type -> type', function () { + it('sets', function () { + const src = h('div', null, h('input')); + const dst = h('div', null, h('input', { attributes: { type: 'text' } })); + + merge({ source: src, destination: dst }); + + const realSrc = toDom(src); + expect(realSrc.children[0].getAttribute('type')).to.equal('text'); + expect(realSrc.children[0].type).to.equal('text'); + }); + }); + }); +}); diff --git a/test/unit/render.js b/test/unit/render.js new file mode 100644 index 0000000..ab7a085 --- /dev/null +++ b/test/unit/render.js @@ -0,0 +1,18 @@ +/* eslint-env jasmine, mocha */ + +import { h, render } from '../../src'; + +describe('render', function () { + it('should initially render and re-render', function () { + const root = document.createElement('div'); + const rend = render(function (root) { + return h('div', null, h('span', null, root.test)); + }); + + ['test 1', 'test 1', 'test 2', 'test 2'].forEach(function (test) { + root.test = test; + rend(root); + expect(root.innerHTML).to.equal(`
${test}
`); + }); + }); +}); diff --git a/test/unit/to-vdom.js b/test/unit/to-vdom.js new file mode 100644 index 0000000..c6c5071 --- /dev/null +++ b/test/unit/to-vdom.js @@ -0,0 +1,7 @@ +/* eslint-env jasmine, mocha */ + +describe('vdom/undom', () => { + it('should turn a real tree into a virtual tree', () => { + + }); +}); From 8ce2f30ce5cdc2845f5971a2a562373fb24d84aa Mon Sep 17 00:00:00 2001 From: Trey Shugart Date: Tue, 6 Dec 2016 00:08:56 +1100 Subject: [PATCH 10/14] refactor: Simplify code. --- src/compare/attributes.js | 52 -------- src/compare/comment.js | 2 - src/compare/element.js | 4 +- src/compare/events.js | 16 ++- src/compare/node.js | 4 - src/diff/main.js | 11 +- src/h.js | 2 - src/mount.js | 13 +- src/patch.js | 4 - src/patch/append-child.js | 10 +- src/patch/remove-attribute.js | 10 -- src/patch/remove-child.js | 6 +- src/patch/replace-child.js | 4 +- src/patch/set-attribute.js | 11 -- src/patch/set-event.js | 10 +- src/patch/set-property.js | 25 +++- src/patch/text-content.js | 4 +- src/render.js | 5 +- src/to-dom.js | 16 ++- src/types.js | 10 +- src/util/node-map.js | 1 + src/util/real-node-map.js | 11 -- src/util/real-node.js | 8 -- test/lib/index.js | 7 + test/unit.js | 1 + test/unit/algorithm/events.js | 88 +++---------- test/unit/algorithm/key.js | 2 +- test/unit/diff.js | 14 -- test/unit/h-jsx.js | 35 ----- test/unit/h.js | 78 +---------- test/unit/patch.js | 239 ++++++++++------------------------ test/unit/to-dom.js | 29 +++++ 32 files changed, 199 insertions(+), 533 deletions(-) delete mode 100644 src/compare/attributes.js delete mode 100644 src/compare/comment.js delete mode 100644 src/patch/remove-attribute.js delete mode 100644 src/patch/set-attribute.js create mode 100644 src/util/node-map.js delete mode 100644 src/util/real-node-map.js delete mode 100644 src/util/real-node.js create mode 100644 test/lib/index.js delete mode 100644 test/unit/h-jsx.js create mode 100644 test/unit/to-dom.js diff --git a/src/compare/attributes.js b/src/compare/attributes.js deleted file mode 100644 index e61cf8b..0000000 --- a/src/compare/attributes.js +++ /dev/null @@ -1,52 +0,0 @@ -import * as types from '../types'; - -function formatAttributes (attrs) { - if (typeof attrs === 'object' && typeof attrs.length === 'undefined') { - return attrs; - } - const obj = {}; - const len = attrs.length; - for (let a = 0; a < len; a++) { - const att = attrs[a]; - obj[att.name] = att.value; - } - return obj; -} - -export default function (src, dst) { - const srcAttrs = formatAttributes(src.attributes); - const dstAttrs = formatAttributes(dst.attributes); - const instructions = []; - - // Merge attributes that exist in source with destination's. - for (let name in srcAttrs) { - if (name in dstAttrs) { - instructions.push({ - data: { name, value: dstAttrs[name] }, - destination: dst, - source: src, - type: types.SET_ATTRIBUTE - }); - } else { - instructions.push({ - data: { name }, - destination: dst, - source: src, - type: types.REMOVE_ATTRIBUTE - }); - } - } - - // We only need to worry about setting attributes that don't already exist - // in the source. - for (let name in dstAttrs) { - instructions.push({ - data: { name, value: dstAttrs[name] }, - destination: dst, - source: src, - type: types.SET_ATTRIBUTE - }); - } - - return instructions; -} diff --git a/src/compare/comment.js b/src/compare/comment.js deleted file mode 100644 index f8e18ec..0000000 --- a/src/compare/comment.js +++ /dev/null @@ -1,2 +0,0 @@ -import text from './text'; -export default text; diff --git a/src/compare/element.js b/src/compare/element.js index 26cee6c..fe69a3a 100644 --- a/src/compare/element.js +++ b/src/compare/element.js @@ -1,11 +1,9 @@ -import compareAttributes from './attributes'; import compareEvents from './events'; import compareProperties from './properties'; export default function (src, dst) { if (src.tagName === dst.tagName) { - return compareAttributes(src, dst) - .concat(compareEvents(src, dst)) + return compareEvents(src, dst) .concat(compareProperties(src, dst)); } } diff --git a/src/compare/events.js b/src/compare/events.js index 1958c4d..b327938 100644 --- a/src/compare/events.js +++ b/src/compare/events.js @@ -1,18 +1,19 @@ import * as types from '../types'; -import eventMap from '../util/event-map'; export default function (src, dst) { const dstEvents = dst.events; - const srcEvents = eventMap(src); + const srcEvents = src.events; const instructions = []; // Remove any source events that aren't in the destination before seeing if // we need to add any from the destination. if (srcEvents) { for (let name in srcEvents) { - if (dstEvents && dstEvents[name] !== srcEvents[name]) { + const srcEvent = srcEvents[name]; + const dstEvent = dstEvents[name]; + if (!dstEvent || srcEvent !== dstEvent) { instructions.push({ - data: { name, value: undefined }, + data: { name }, destination: dst, source: src, type: types.SET_EVENT @@ -26,10 +27,11 @@ export default function (src, dst) { // instructions. if (dstEvents) { for (let name in dstEvents) { - const value = dstEvents[name]; - if (srcEvents[name] !== value) { + const srcEvent = srcEvents[name]; + const dstEvent = dstEvents[name]; + if (srcEvent !== dstEvent) { instructions.push({ - data: { name, value }, + data: { name, value: dstEvent }, destination: dst, source: src, type: types.SET_EVENT diff --git a/src/compare/node.js b/src/compare/node.js index 9bc7c1b..28c8252 100644 --- a/src/compare/node.js +++ b/src/compare/node.js @@ -1,8 +1,6 @@ import compareElement from './element'; import compareText from './text'; -import compareComment from './comment'; -const NODE_COMMENT = 8; const NODE_ELEMENT = 1; const NODE_TEXT = 3; @@ -22,7 +20,5 @@ export default function (src, dst) { return compareElement(src, dst); } else if (dstType === NODE_TEXT) { return compareText(src, dst); - } else if (dstType === NODE_COMMENT) { - return compareComment(src, dst); } } diff --git a/src/diff/main.js b/src/diff/main.js index 67cef59..6f0bace 100644 --- a/src/diff/main.js +++ b/src/diff/main.js @@ -1,7 +1,5 @@ import * as types from '../types'; import compareNode from '../compare/node'; -import realNode from '../util/real-node'; -import realNodeMap from '../util/real-node-map'; function diffNode (source, destination) { let nodeInstructions = compareNode(source, destination); @@ -29,7 +27,7 @@ export default function diff (opts) { return []; } - let instructions = opts.root ? diffNode(src, dst) : []; + let instructions = compareNode(src, dst); const srcChs = src.childNodes; const dstChs = dst.childNodes; @@ -49,13 +47,6 @@ export default function diff (opts) { type: types.APPEND_CHILD }); continue; - } else { - // Ensure the real node is carried over even if the destination isn't used. - // This is used in the render() function to keep track of the real node - // that corresponds to a virtual node if a virtual tree is being used. - if (typeof curDst.__id !== 'undefined') { - realNodeMap.set(curDst.__id, realNode(curSrc)); - } } instructions = instructions.concat(diffNode(curSrc, curDst)); diff --git a/src/h.js b/src/h.js index 5af36ff..696e72e 100644 --- a/src/h.js +++ b/src/h.js @@ -56,14 +56,12 @@ export default function (name, props, ...chren) { if (isPropsNode) { node.attributes = {}; - node.childNodes = [props].concat(chren); node.events = {}; node.properties = {}; } else { props = props || {}; const { attributes, events } = props; node.attributes = attributes || {}; - node.childNodes = chren; node.events = events || {}; node.properties = props; delete props.attributes; diff --git a/src/mount.js b/src/mount.js index 52098f0..8ce96f1 100644 --- a/src/mount.js +++ b/src/mount.js @@ -1,13 +1,8 @@ import toDom from './to-dom'; -function removeChildNodes (elem) { - while (elem.firstChild) { - const first = elem.firstChild; - first.parentNode.removeChild(first); - } -} - -export default function (elem, tree) { - removeChildNodes(elem); +export default function (tree, elem) { + elem = elem || document.createElement('div'); + elem.innerHTML = ''; elem.appendChild(toDom(tree)); + return elem; } diff --git a/src/patch.js b/src/patch.js index 88fab7a..87a86fa 100644 --- a/src/patch.js +++ b/src/patch.js @@ -1,19 +1,15 @@ import * as types from './types'; import appendChild from './patch/append-child'; -import removeAttribute from './patch/remove-attribute'; import removeChild from './patch/remove-child'; import replaceChild from './patch/replace-child'; -import setAttribute from './patch/set-attribute'; import setEvent from './patch/set-event'; import setProperty from './patch/set-property'; import textContent from './patch/text-content'; const patchers = {}; patchers[types.APPEND_CHILD] = appendChild; -patchers[types.REMOVE_ATTRIBUTE] = removeAttribute; patchers[types.REMOVE_CHILD] = removeChild; patchers[types.REPLACE_CHILD] = replaceChild; -patchers[types.SET_ATTRIBUTE] = setAttribute; patchers[types.SET_EVENT] = setEvent; patchers[types.SET_PROPERTY] = setProperty; patchers[types.TEXT_CONTENT] = textContent; diff --git a/src/patch/append-child.js b/src/patch/append-child.js index 5920d8d..1a4a228 100644 --- a/src/patch/append-child.js +++ b/src/patch/append-child.js @@ -1,12 +1,6 @@ -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; import toDom from '../to-dom'; -import toVdom from '../to-vdom'; export default function (src, dst) { - const real = realNode(src); - if (real) { - realNode(src).appendChild(toDom(dst)); - } else { - src.childNodes.push(toVdom(dst)); - } + nodeMap[src.__id].appendChild(toDom(dst)); } diff --git a/src/patch/remove-attribute.js b/src/patch/remove-attribute.js deleted file mode 100644 index b3b66eb..0000000 --- a/src/patch/remove-attribute.js +++ /dev/null @@ -1,10 +0,0 @@ -import realNode from '../util/real-node'; - -export default function (src, dst, data) { - const real = realNode(src); - if (real) { - real.removeAttribute(data.name); - } else { - delete src.attributes[data.name]; - } -} diff --git a/src/patch/remove-child.js b/src/patch/remove-child.js index ed68481..5bc42ef 100644 --- a/src/patch/remove-child.js +++ b/src/patch/remove-child.js @@ -1,8 +1,8 @@ -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; export default function (src, dst) { - const realDst = realNode(dst); - const realSrc = realNode(src); + const realDst = nodeMap[dst.__id]; + const realSrc = nodeMap[dst.__id]; // We don't do parentNode.removeChild because parentNode may report // incorrectly in some prollyfills since it's impossible (?) to spoof. diff --git a/src/patch/replace-child.js b/src/patch/replace-child.js index 92ee45d..291c76c 100644 --- a/src/patch/replace-child.js +++ b/src/patch/replace-child.js @@ -1,8 +1,8 @@ import dom from '../to-dom'; -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; export default function (src, dst) { - const realSrc = realNode(src); + const realSrc = nodeMap[src.__id]; if (realSrc) { realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc); } else { diff --git a/src/patch/set-attribute.js b/src/patch/set-attribute.js deleted file mode 100644 index bd9c1cf..0000000 --- a/src/patch/set-attribute.js +++ /dev/null @@ -1,11 +0,0 @@ -import realNode from '../util/real-node'; - -export default function (src, dst, data) { - const { name, value } = data; - const real = realNode(src); - if (real) { - real.setAttribute(name, value); - } else { - src.attributes[name] = value; - } -} diff --git a/src/patch/set-event.js b/src/patch/set-event.js index 9167fca..d35d111 100644 --- a/src/patch/set-event.js +++ b/src/patch/set-event.js @@ -1,14 +1,8 @@ import eventMap from '../util/event-map'; -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; export default function (src, dst, data) { - const realSrc = realNode(src); - - if (!realSrc) { - src.events[data.name] = data.value; - return; - } - + const realSrc = nodeMap[src.__id]; const eventHandlers = eventMap(realSrc); const name = data.name; const prevHandler = eventHandlers[name]; diff --git a/src/patch/set-property.js b/src/patch/set-property.js index 4d9ee12..b49d18d 100644 --- a/src/patch/set-property.js +++ b/src/patch/set-property.js @@ -1,6 +1,27 @@ -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; + +const { prototype: HTMLElementPrototype } = window.HTMLElement; export default function (src, dst, data) { const { name } = data; - realNode(src)[name] = dst[name]; + const node = nodeMap[src.__id]; + const prop = dst.properties[name]; + + // Unfurtunately we have to handle style manually. + if (name === 'style') { + node.setAttribute('style', ''); + if (typeof prop === 'string') { + node.style.cssText = prop; + } else { + Object.assign(node.style, prop); + } + } else if (name in HTMLElementPrototype) { + if (typeof prop === 'undefined') { + delete node[name]; + } else { + node[name] = prop; + } + } else { + node[name] = prop; + } } diff --git a/src/patch/text-content.js b/src/patch/text-content.js index 5706b77..6e3085a 100644 --- a/src/patch/text-content.js +++ b/src/patch/text-content.js @@ -1,5 +1,5 @@ -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; export default function (src, dst) { - (realNode(src) || src).textContent = dst.textContent; + nodeMap[src.__id].textContent = dst.textContent; } diff --git a/src/render.js b/src/render.js index 357ffbf..237de43 100644 --- a/src/render.js +++ b/src/render.js @@ -1,5 +1,4 @@ import WeakMap from './util/weak-map'; -import h from './h'; import merge from './merge'; import mount from './mount'; @@ -15,7 +14,7 @@ export default function (render) { } // Create a new element to house the new tree since we diff / mount fragments. - const newTree = h('div', null, render(elem)); + const newTree = render(elem); const oldTree = oldTreeMap.get(elem); if (oldTree) { @@ -25,7 +24,7 @@ export default function (render) { done }); } else { - mount(elem, newTree.childNodes); + mount(newTree, elem); if (typeof done === 'function') { done(); } diff --git a/src/to-dom.js b/src/to-dom.js index f94c447..cc9f3c8 100644 --- a/src/to-dom.js +++ b/src/to-dom.js @@ -1,10 +1,10 @@ import eventMap from './util/event-map'; -import realNodeMap from './util/real-node-map'; +import nodeMap from './util/node-map'; const { Node } = window; function createElement (node) { - const { attributes, childNodes, events } = node; + const { attributes, childNodes, events, properties } = node; const realNode = document.createElement(node.tagName); const eventHandlers = eventMap(realNode); @@ -14,14 +14,20 @@ function createElement (node) { } } + if (childNodes) { + childNodes.forEach(ch => realNode.appendChild(render(ch))); + } + if (events) { for (let name in events) { realNode.addEventListener(name, eventHandlers[name] = events[name]); } } - if (childNodes) { - childNodes.forEach(ch => realNode.appendChild(render(ch))); + if (properties) { + for (let name in properties) { + realNode[name] = properties[name]; + } } return realNode; @@ -41,6 +47,6 @@ export default function render (node) { return frag; } const realNode = node.tagName ? createElement(node) : createText(node); - realNodeMap.set(node.__id, realNode); + nodeMap[node.__id] = realNode; return realNode; } diff --git a/src/types.js b/src/types.js index d90fe49..2f6652a 100644 --- a/src/types.js +++ b/src/types.js @@ -1,8 +1,6 @@ export const APPEND_CHILD = 1; export const REMOVE_CHILD = 2; -export const REMOVE_ATTRIBUTE = 3; -export const REPLACE_CHILD = 4; -export const SET_ATTRIBUTE = 5; -export const SET_EVENT = 6; -export const SET_PROPERTY = 7; -export const TEXT_CONTENT = 8; +export const REPLACE_CHILD = 3; +export const SET_EVENT = 4; +export const SET_PROPERTY = 5; +export const TEXT_CONTENT = 6; diff --git a/src/util/node-map.js b/src/util/node-map.js new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/src/util/node-map.js @@ -0,0 +1 @@ +export default {}; diff --git a/src/util/real-node-map.js b/src/util/real-node-map.js deleted file mode 100644 index fc2e800..0000000 --- a/src/util/real-node-map.js +++ /dev/null @@ -1,11 +0,0 @@ -// import WeakMap from './weak-map'; -// export default new WeakMap(); -const map = []; -export default { - get (id) { - return map[id]; - }, - set (id, node) { - map[id] = node; - } -}; diff --git a/src/util/real-node.js b/src/util/real-node.js deleted file mode 100644 index c583978..0000000 --- a/src/util/real-node.js +++ /dev/null @@ -1,8 +0,0 @@ -import realNodeMap from './real-node-map'; - -const isWindow = typeof window !== 'undefined'; -const { Node } = isWindow ? window : self; - -export default function (node) { - return isWindow && node instanceof Node ? node : realNodeMap.get(node.__id); -} diff --git a/test/lib/index.js b/test/lib/index.js new file mode 100644 index 0000000..c2a93d5 --- /dev/null +++ b/test/lib/index.js @@ -0,0 +1,7 @@ +import { merge, mount } from '../../src'; + +export function run (source, destination) { + const tree = mount(source); + merge({ source, destination }); + return tree; +} diff --git a/test/unit.js b/test/unit.js index 7ff78bc..65d78f9 100644 --- a/test/unit.js +++ b/test/unit.js @@ -1,2 +1,3 @@ +import 'custom-event-polyfill'; const reqTests = require.context('./unit', true, /^.*\.js$/); reqTests.keys().map(reqTests); diff --git a/test/unit/algorithm/events.js b/test/unit/algorithm/events.js index c82a426..c2c43b4 100644 --- a/test/unit/algorithm/events.js +++ b/test/unit/algorithm/events.js @@ -1,87 +1,41 @@ /* eslint-env jasmine, mocha */ +/** @jsx h */ import 'custom-event-polyfill'; -import { h, merge, toDom, types } from '../../../src/index'; +import { h } from '../../../src/index'; +import { run } from '../../lib'; const { CustomEvent } = window; -function createElement (...args) { - return toDom(h.apply(null, args)); -} - describe('events', function () { - const onclick = e => (e.target.triggered = true); + const click = e => (e.target.triggered = true); it('should add listeners', function () { - const src = createElement('div', null, createElement('button')); - const dst = h('div', null, h('button', { onclick })); - const instructions = merge({ source: src, destination: dst }); - - // The instruction should explicitly set an event. - expect(instructions.length).to.equal(1); - expect(instructions[0].type).to.equal(types.SET_EVENT); - expect(instructions[0].data.name).to.equal('click'); - expect(instructions[0].data.value).to.equal(onclick); + const dom = run(