diff --git a/README.md b/README.md index 7dfa773..9c1822f 100644 --- a/README.md +++ b/README.md @@ -1,241 +1,319 @@ # Dom Diff -Skate's DOM Diff is a library can diff and patch both real and virtual DOMs trees. +Skate's DOM Diff is a virtual DOM library for diffing, patching and converting between virtual and real DOM trees. [![Sauce Test Status](https://saucelabs.com/browser-matrix/skatejs-dom-diff.svg)](https://saucelabs.com/u/skatejs-dom-diff) -## Installing +- Serialise to and from read DOM trees +- Diff virtual trees and patch real trees +- Web worker support ```sh npm install skatejs-dom-diff ``` -## Including +## Usage + +Where `options` are accepted, you may provide: + +- `done` If specified, diffing is performed in a web worker and this callback is called when it's done. -You can use any module format. UMD is in `lib`, ES6 is in `src` and the global `skateDomDiff` is exported from `dist`. The `package.json` points to `lib` so you're probably safe just doing something like: +### `diff(source, target, options)` + +Diffs two virtual trees. ```js -import skateDomDiff from 'skatejs-dom-diff'; +/** @jsx h **/ +import { diff, h } from 'skatejs-dom-diff'; + +const source =
source
; +const target =
target
; +const instructions = diff(source, target); ``` -## Usage +The `patchInstructions` is an `array` that can be passed to `patch()` to update the `source` tree. Before passing the instructions to `patch()`, however, your source tree must be associated to real DOM nodes. This can be done by using `mount()` or by converting them to a tree using `toDom()`. + +### `fragment([virtualNodeOrNodes])` -It will diff the trees of two nodes, excluding the root nodes themselves. +Creates a virtual fragment. You can pass nothing to create an empty fragment: ```js -var fragment1 = document.createDocumentFragment(); -var fragment2 = document.createDocumentFragment(); +import { fragment } from 'skatejs-dom-diff'; -fragment1.appendChild(document.createElement('span')); -fragment2.appendChild(document.createElement('div')); +const vFrag = fragment(); +``` -var instructions = skateDomDiff.diff({ - // The fragment that you want the source to look like. - destination: fragment2, +A single virtual node: - // The fragment that you want to make look like the destination. - source: fragment1 -}); +```js +import { fragment } from 'skatejs-dom-diff'; -console.log(instructions); +const vFrag = fragment(
); ``` -Would log: +An array of virtual nodes: ```js -[{ - source: [object HTMLSpanElement], - destination: [object HTMLDivElement], - type: [number skateDomDiff.types.REPLACE_CHILD] -}] +import { fragment } from 'skatejs-dom-diff'; + +const vFrag = fragment([
, ]); ``` -You can then take the instructions and `patch()` the source node. +Or even a virtual fragment: ```js -skateDomDiff.patch(instructions); +import { fragment } from 'skatejs-dom-diff'; + +const vFrag = fragment(fragment(
)); ``` -If you want to do this all in one go, use `merge()`. +### `h(name, props, ...childrenOrText)` + +Creates a virtual node. ```js -skateDomDiff.merge({ - source: fragment1, - destination: fragment2 -}); +//
text or...
+h('div', { className: 'my-class' }, 'text or...', h('span')); ``` -### Virtual DOM usage +Or you could just use JSX: + +```js +/** @jsx h **/ +//
text or...
+
text or...
+``` -The algorithm for determining differences between DOM nodes utilises properties on the nodes to gather information about them and because of this, you can simply inject a virtual tree instead of a DOM tree. +#### Attributes -It comes with a simple, lightweight virtual DOM implementation but you can use anything that implements the following interface: +By default, `h` only sets properties, but you can specify attributes you want to set by passing the special `attributes` prop: ```js -const element = { - // The name of the node. Must be uppercase. - tagName: 'TAG-NAME', +//
+
+``` - // The same thing as `nodeType` on a normal element. - nodeType: 1, +#### Aria attributes - // An object that mimics a named-node map. It must have a `length` attribute - // and be able to be accessed by index as well as by name. In the example - // below both `0` and `name` should refer to the same object. - attributes: { - 0: { name: 'name', value: 'value' }, - name: { name: 'name', value: 'value' }, - length: 1 - }, +You can pass `aria-*` attributes using `attributes` but you can also specify the `aria` prop: - // An array of virtual children. Each item will be an object like this one. - childNodes: [] -}; +```js +//
+
+``` + +#### Data attributes + +Like the `aria` prop, you can also use the `data` prop: + +```js +//
+
+``` + +#### Events + +Events are bound using the special `events` prop: -const text = { - nodeType: 3, - textContent: 'text content' -}; +```js +const click = e => doSomethingWith(e); +
``` -#### Constructing a virtual tree +### `merge()` -There is a built-in function for creating virtual elements: +The `merge()` function is convenience for calling `diff()` and `patch()` sequentially. As with `diff()`, you must ensure the `source` virtual tree has been associated to real nodes first. ```js -import el from 'skatejs-dom-diff/vdom/element'; +/** @jsx h **/ +import { diff, h } from 'skatejs-dom-diff'; -el('div', null, - 'Hello, ', - el('span', { style: 'font-weight: bold'}, 'World!') -); +const source =
source
; +const target =
target
; +const dom = mount(source, target); +merge(source, target); ``` -The above would generate: +### `mount(vdom[, root])` + +Mounts the `vdom` to the real `root` DOM node. It returns the `root` node. If the `root` node was not specified, it automatically creates a `
` and returns it. ```js -{ - tagName: 'DIV', - nodeType: 1, - childNodes: [ - { - nodeType: 3, - textContent: 'Hello' - }, { - tagName: 'SPAN', - nodeType: 1, - attributes: { - 0: { name: 'style', value: 'font-weight: bold' }, - style: { name: 'style', value: 'font-weight: bold' }, - length: 1 - }, - childNodes: [ - { - nodeType: 3, - textContent: 'World!' - } - ] - } - ] -} +/** @jsx h **/ +import { h, mount } from 'skatejs-dom-diff'; + +const div = mount(

some text

); +``` + +Is the same thing as: + +```js +/** @jsx h **/ +import { h, mount } from 'skatejs-dom-diff'; + +const div = document.createElement('div'); +mount(

some text

, div); ``` -That information is then used to diff and generate patch instructions for the real DOM nodes. Upon initial mounting, the entire virtual tree is used to create the initial structure. +It's more than likely that you'll just mount it directly to the document: + +```js +/** @jsx h **/ +import { h, mount } from 'skatejs-dom-diff'; + +mount(

some text

, document.getElementById('app')); +``` -#### Diffing and patching a virtual tree +### `patch()` -Diffing a virtual tree is almost the same as diffing real nodes except that you must mount your virtual tree to an empty node before you can diff that tree with a new tree. +Takes instructiosn created using `diff()` and performs them on the associated DOM nodes that each instructions is for. ```js -import merge from 'skatejs-dom-diff/src/merge'; -import mount from 'skatejs-dom-diff/src/vdom/mount'; +/** @jsx h **/ +import { diff, h, mount, patch } from 'skatejs-dom-diff'; -const container = document.getElementById('container'); -let oldTree = el('div'); -let newTree = el('span'); +const source =

source tree

; +const target =

target tree

; +const instructions = diff(source, target); -mount(container, tree); -merge({ - destination: newTree, - source: oldTree -}); +mount(source, document.getElementById('app')); +patch(instructions); ``` -There is a built-in renderer that will do all of this for you. +### `render()` + +A highly convenient function for continually rendering a given template. ```js -import el from 'skatejs-dom-diff/src/vdom/element'; -import render from 'skatejs-dom-diff/src/render'; +/** @jsx h **/ +import { h, render } from 'skatejs-dom-diff'; + +const root = document.getElementById('app'); +const renderer = render((root) => ( +

{root.someProp}

+)); -// Create a function that takes props and will -const renderer = render(function (root) { - return el('div', { class: root.propName }); -}); +// Set the prop to render with +root.someProp = 'test 1'; -// The renderer is called against a real node as it will be mounted to this -// node. As shown above, you can also use this node for information. -document.body.propName = 'something'; -renderer(document.body); +// Initial render:

test 1

+renderer(root); -// And then re-render. -document.body.propName = 'something else'; -renderer(document.body); +// Update the prop +root.someProp = 'test 2'; + +// Re-render:

test 2

+renderer(root); ``` -The above would render: +### `text()` + +Returns a virtual text node: + +```js +import { text } from 'skatejs-dom-diff'; + +const vText = text('my text node'); +``` + +### `toDom()` + +Convers a virtual tree to a *real* DOM tree, event listeners and all: + +```js +import { toDom } from 'skatejs-dom-diff'; -```html - - -
- +const vdom =

I will soon be real!

+const dom = toDom(vdom); - - -
- +//

I will soon be real!

+console.log(dom.outerHTML); ``` -The only thing that would change would be the `class` attribute on the `
` since the node itself doesn't need to be replaced. +### `toVdom()` -#### JSX +Converts a real DOM tree into a virtual tree. It only copies over attributes. Event listeners can't be copied because the standard DOM APIs don't provide a way to get bound listeners. -JSX works out of the box, even if it's compiling down to `React.createElement` calls. All you have to do is define a second argument to your renderer: +*Properties currently aren't copied either, but is being worked on.* ```js -const renderer = render(function (root, React) { - return
; -}); +import { toVdom } from 'skatejs-dom-diff'; + +const dom = document.createElement('p'); +dom.textContent = 'I will soon be fake!'; + +const vdom = toVdom(dom); ``` -This is useful when you want to avoid extra transpilation steps, but you can transpile down to anything you want as long as it has a `createElement` function on the second argument. +### `types` + +The types of patches that can occur. Currently these are: + +```js +import { types } from 'skatejs-dom-diff'; + +const { + APPEND_CHILD, + REMOVE_CHILD, + REMOVE_ATTRIBUTE, + REPLACE_CHILD, + SET_ATTRIBUTE, + SET_EVENT, + SET_PROPERTY, + TEXT_CONTENT +} = types; +``` -#### Attribute conventions +### Web workers -When you specify attributes to the function that creates a virtual element, it will apply the following conventions - in the specified order - to each one. +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()`). -1. If the attribute value is a `string`, it will be set as an attribute. -2. If the attribute name begins with `on`, the value will be added as the corresponding event listener (but only if it is a function, otherwise it's a no-op). For example, if you specified `{ onclick: handler }`, then internally it does something like `element.addEventListener('click', handler)`. -3. If 1 or 2 is not met, then it is set as a property. +#### `diff(source, target, options)` -This comes in handy when using JSX because you can do stuff like: +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 - +/** @jsx h */ +import { h, diff } from 'skatejs-dom-diff'; + +function done (instructions) { + patch(instructions); +} +diff(

source

,

target

, { done }); ``` -The resulting HTML would be: +#### `merge(source, target, options)` -```html - +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 +/** @jsx h */ +import { h, merge } from 'skatejs-dom-diff'; + +function done (instructions) { + // The DOM has been updated, do what you want here. +} +merge(

source

,

target

, { done }); ``` -Additionally, it would have the `checked` property set to `true` and the `change` event would be handled by the value passed to `onchange`. +#### `render(source, target, options)` -#### Attribute patching behaviour +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. -When diffing and patching, the behaviour is much the same. If you're diffing real DOM nodes, then events and properties are ignored. Those are only available to virtual trees unless the element has an `events` and / or `properties` object on them. This is an implementation detail and may change and / or be formalised in the future. Nonetheless, it's something to be aware of. +```js +import { h, render } from 'skatejs-dom-diff'; + +function done (instructions) { + // Renering and patching is done... +} +const root = document.createElement('div'); +const doRender = render((root) => ( +
{root.test}
+)); -When patching event listeners, the previous one will be completely unbound and the new one will be bound. This prevents handlers from stacking. +div.test = 'initial text'; +doRender(div, done); -When patching properties, they're simply just set if the source and destination values aren't the same. +div.test = 'updated text'; +doRender(div, done); +``` 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":"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","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/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/package.json b/package.json index 9ffe7ce..0abe0f6 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", @@ -33,7 +34,8 @@ }, "homepage": "https://github.com/skatejs/dom-diff#readme", "dependencies": { - "object-assign": "^4.0.1" + "object-assign": "^4.0.1", + "skatejs-web-components": "^5.0.0" }, "config": { "commitizen": { 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/compare/attributes.js b/src/compare/attributes.js index 394dae6..af56dd1 100644 --- a/src/compare/attributes.js +++ b/src/compare/attributes.js @@ -1,57 +1,34 @@ -import * as types from '../types'; -import { getAccessor } from '../util/accessor'; +import { REMOVE_ATTRIBUTE, SET_ATTRIBUTE } from '../types'; -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 empty = v => v == null; - // 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); +export default function (src, tar) { + const { attributes: srcValues } = src; + const { attributes: tarValues } = tar; + const instructions = []; - if (!dstAttr) { - instructions.push({ - data: { name: srcAttrName }, - destination: dst, - source: src, - type: types.REMOVE_ATTRIBUTE - }); - } else if (srcAttrValue !== dstAttrValue) { + for (let name in srcValues) { + if (empty(tarValues[name])) { instructions.push({ - data: { name: srcAttrName, value: dstAttrValue }, - destination: dst, + data: { name }, + target: tar, source: src, - type: types.SET_ATTRIBUTE + type: 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]; + for (let name in tarValues) { + const srcValue = srcValues[name]; + const tarValue = tarValues[name]; - if (!srcAttr) { + // Only add attributes that have changed. + if (srcValue !== tarValue && !empty(tarValues[name])) { instructions.push({ - data: { name: dstAttrName, value: dstAttrValue }, - destination: dst, + data: { name }, + target: tar, source: src, - type: types.SET_ATTRIBUTE + type: SET_ATTRIBUTE }); } } 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 6d4b33c..55e6509 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)); +export default function (src, tar) { + if (src.localName === tar.localName) { + return compareAttributes(src, tar) + .concat(compareEvents(src, tar)) + .concat(compareProperties(src, tar)); } } diff --git a/src/compare/events.js b/src/compare/events.js index 1958c4d..8befc8d 100644 --- a/src/compare/events.js +++ b/src/compare/events.js @@ -1,19 +1,20 @@ import * as types from '../types'; -import eventMap from '../util/event-map'; -export default function (src, dst) { - const dstEvents = dst.events; - const srcEvents = eventMap(src); +export default function (src, tar) { + const tarEvents = tar.events; + 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. + // Remove any source events that aren't in the target before seeing if + // we need to add any from the target. if (srcEvents) { for (let name in srcEvents) { - if (dstEvents && dstEvents[name] !== srcEvents[name]) { + const srcEvent = srcEvents[name]; + const tarEvent = tarEvents[name]; + if (!tarEvent || srcEvent !== tarEvent) { instructions.push({ - data: { name, value: undefined }, - destination: dst, + data: { name }, + target: tar, source: src, type: types.SET_EVENT }); @@ -24,13 +25,14 @@ export default function (src, dst) { // 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 (let name in dstEvents) { - const value = dstEvents[name]; - if (srcEvents[name] !== value) { + if (tarEvents) { + for (let name in tarEvents) { + const srcEvent = srcEvents[name]; + const tarEvent = tarEvents[name]; + if (srcEvent !== tarEvent) { instructions.push({ - data: { name, value }, - destination: dst, + data: { name, value: tarEvent }, + target: tar, source: src, type: types.SET_EVENT }); diff --git a/src/compare/node.js b/src/compare/node.js index 9bc7c1b..6d30802 100644 --- a/src/compare/node.js +++ b/src/compare/node.js @@ -1,28 +1,20 @@ import compareElement from './element'; import compareText from './text'; -import compareComment from './comment'; -const NODE_COMMENT = 8; const NODE_ELEMENT = 1; const NODE_TEXT = 3; -export default function (src, dst) { - let dstType, srcType; +export default function (src, tar) { + const tarType = tar.nodeType; + const srcType = src.nodeType; - if (!dst || !src) { - return; + if (tarType !== srcType) { + return []; + } else if (tarType === NODE_ELEMENT) { + return compareElement(src, tar); + } else if (tarType === NODE_TEXT) { + return compareText(src, tar); } - 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 compareText(src, dst); - } else if (dstType === NODE_COMMENT) { - return compareComment(src, dst); - } + return []; } diff --git a/src/compare/properties.js b/src/compare/properties.js new file mode 100644 index 0000000..d8ed84c --- /dev/null +++ b/src/compare/properties.js @@ -0,0 +1,35 @@ +import { SET_PROPERTY } from '../types'; + +export default function (src, tar) { + const { properties: srcValues } = src; + const { properties: tarValues } = tar; + const instructions = []; + + for (let name in srcValues) { + const srcValue = srcValues[name]; + const tarValue = tarValues[name]; + if (srcValue !== tarValue) { + instructions.push({ + data: { name }, + target: tar, + source: src, + type: SET_PROPERTY + }); + } + } + + for (let name in tarValues) { + const srcValue = srcValues[name]; + const tarValue = tarValues[name]; + if (srcValue !== tarValue) { + instructions.push({ + data: { name }, + target: tar, + source: src, + type: SET_PROPERTY + }); + } + } + + return instructions; +} diff --git a/src/compare/text.js b/src/compare/text.js index 52c2482..018249e 100644 --- a/src/compare/text.js +++ b/src/compare/text.js @@ -1,12 +1,12 @@ import * as types from '../types'; -export default function (src, dst) { - if (src.textContent === dst.textContent) { +export default function (src, tar) { + if (src.textContent === tar.textContent) { return []; } return [{ - destination: dst, + target: tar, source: src, type: types.TEXT_CONTENT }]; diff --git a/src/diff.js b/src/diff.js index c234e37..7f50a19 100644 --- a/src/diff.js +++ b/src/diff.js @@ -1,77 +1,16 @@ -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?name=./dist/[hash].[ext]!./diff/worker'; +import root from './util/root'; -const { Node } = window; +const { Node } = root; -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 (src, tar, { done }) { + const worker = new DiffWorker(); + worker.addEventListener('message', e => done(e.data)); + worker.postMessage([ src, tar ]); } -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; +export default function diff (src, tar, { done } = {}) { + const canDiffInWorker = done && !(src instanceof Node && tar instanceof Node); + return canDiffInWorker ? diffWorker(src, tar, { done }) : diffMain(src, tar, { done }); } diff --git a/src/diff/main.js b/src/diff/main.js new file mode 100644 index 0000000..8621fb1 --- /dev/null +++ b/src/diff/main.js @@ -0,0 +1,59 @@ +import * as types from '../types'; +import compareNode from '../compare/node'; + +function diffNode (source, target) { + let nodeInstructions = compareNode(source, target); + + // 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, target)); + } + + return [{ + target, + source, + type: types.REPLACE_CHILD + }]; +} + +export default function diff (src, tar) { + let instructions = []; + + const srcChs = src.childNodes; + const tarChs = tar.childNodes; + const srcChsLen = srcChs ? srcChs.length : 0; + const tarChsLen = tarChs ? tarChs.length : 0; + + for (let a = 0; a < tarChsLen; a++) { + const curSrc = srcChs[a]; + const curtar = tarChs[a]; + + // If there is no matching target node it means we need to remove the + // current source node from the source. + if (!curSrc) { + instructions.push({ + target: tarChs[a], + source: src, + type: types.APPEND_CHILD + }); + continue; + } + + instructions = instructions.concat(diffNode(curSrc, curtar)); + } + + if (tarChsLen < srcChsLen) { + for (let a = tarChsLen; a < srcChsLen; a++) { + instructions.push({ + target: 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..1432753 --- /dev/null +++ b/src/diff/worker.js @@ -0,0 +1,8 @@ +import diff from './main'; + +// eslint-disable-next-line no-undef +self.addEventListener('message', e => { + const instructions = diff(...e.data); + // eslint-disable-next-line no-undef + self.postMessage(instructions); +}); diff --git a/src/fragment.js b/src/fragment.js new file mode 100644 index 0000000..2c375d6 --- /dev/null +++ b/src/fragment.js @@ -0,0 +1,6 @@ +const nodeType = 11; +export default function (childNodes) { + childNodes = childNodes || []; + childNodes = Array.isArray(childNodes) ? childNodes : [childNodes]; + return { childNodes, nodeType }; +} diff --git a/src/h.js b/src/h.js new file mode 100644 index 0000000..73dcc90 --- /dev/null +++ b/src/h.js @@ -0,0 +1,126 @@ +import createTextNode from './text'; +import root from './util/root'; +import WeakMap from './util/weak-map'; + +const { HTMLElement } = root; +const localNameMap = new WeakMap(); + +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 ensureObject (val) { + return val && typeof val === 'object' ? val : {}; +} + +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 { + attributes: props, + childNodes: chren, + localName: item.type, + nodeType: 1 + }; + } + return item; +} + +let count = 0; +export default function (localName, props, ...chren) { + const isPropsNode = isNode(props); + + if (isPropsNode) { + chren = ensureNodes([props].concat(chren)); + props = { + attributes: {}, + events: {}, + properties: {} + }; + } else { + props = ensureObject(props); + chren = ensureNodes(chren); + } + + // If it's a function that isn't an HTMLElement constructor. We test for a + // common property since this may be used in a worker / non browser + // environment. + if (localName.prototype instanceof HTMLElement) { + const cache = localNameMap.get(localName); + if (cache) { + return cache; + } + // eslint-disable-next-line new-cap + const tempLocalName = new localName().localName; + localNameMap.set(localName, tempLocalName); + localName = tempLocalName; + } else if (typeof localName === 'function') { + return localName(props, chren); + } + + const node = { + __id: ++count, + childNodes: chren, + localName, + nodeType: 1 + }; + + // Special props + // + // - aria: object that sets aria-* attributes + // - attributes: object of attributes to set + // - data: object that sets data-* attributes + // - events: object of event listeners to set + const { aria, attributes, data, events } = props; + + node.attributes = ensureObject(attributes); + node.events = ensureObject(events); + node.properties = ensureObject(props); + + const { attributes: nodeAttributes } = node; + + // Aria attributes + if (typeof aria === 'object') { + for (let name in aria) { + nodeAttributes[`aria-${name}`] = aria[name]; + } + } + + // Data attributes + if (typeof data === 'object') { + for (let name in data) { + nodeAttributes[`data-${name}`] = data[name]; + } + } + + // Clean up special props. + delete props.aria; + delete props.attributes; + delete props.data; + delete props.events; + + return node; +} diff --git a/src/index.js b/src/index.js index 4dee665..986643b 100644 --- a/src/index.js +++ b/src/index.js @@ -1,17 +1,25 @@ import diff from './diff'; +import fragment from './fragment'; +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'; -import version from './version'; -export default { +export { diff, + fragment, + h, merge, + mount, patch, render, - types, - vdom, - version + text, + toDom, + toVdom, + types }; diff --git a/src/merge.js b/src/merge.js index ae837fb..2824e8c 100644 --- a/src/merge.js +++ b/src/merge.js @@ -1,8 +1,16 @@ import diff from './diff'; import patch from './patch'; -export default function (opts) { - var inst = diff(opts); - patch(inst); - return inst; +export default function (src, tar, { done } = {}) { + if (done) { + return diff(src, tar, { + done (instructions) { + patch(instructions); + done(instructions); + } + }); + } + const instructions = diff(src, tar); + patch(instructions); + return instructions; } diff --git a/src/mount.js b/src/mount.js new file mode 100644 index 0000000..8ce96f1 --- /dev/null +++ b/src/mount.js @@ -0,0 +1,8 @@ +import toDom from './to-dom'; + +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 21f94d4..0a3931f 100644 --- a/src/patch.js +++ b/src/patch.js @@ -1,25 +1,27 @@ import * as types from './types'; import appendChild from './patch/append-child'; -import removeAttribute from './patch/remove-attribute'; import removeChild from './patch/remove-child'; +import removeAttribute from './patch/remove-attribute'; 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.REMOVE_ATTRIBUTE] = removeAttribute; patchers[types.REPLACE_CHILD] = replaceChild; -patchers[types.SET_ATTRIBUTE] = setAttribute; patchers[types.SET_EVENT] = setEvent; +patchers[types.SET_ATTRIBUTE] = setAttribute; +patchers[types.SET_PROPERTY] = setProperty; patchers[types.TEXT_CONTENT] = textContent; function patch (instruction) { patchers[instruction.type]( instruction.source, - instruction.destination, + instruction.target, instruction.data ); } diff --git a/src/patch/append-child.js b/src/patch/append-child.js index 8e30e70..6f75cab 100644 --- a/src/patch/append-child.js +++ b/src/patch/append-child.js @@ -1,6 +1,6 @@ -import realNode from '../util/real-node'; -import dom from '../vdom/dom'; +import nodeMap from '../util/node-map'; +import toDom from '../to-dom'; -export default function (src, dst) { - realNode(src).appendChild(dom(dst)); +export default function (src, tar) { + nodeMap[src.__id].appendChild(toDom(tar)); } diff --git a/src/patch/remove-attribute.js b/src/patch/remove-attribute.js index b26f8fb..ae28d6b 100644 --- a/src/patch/remove-attribute.js +++ b/src/patch/remove-attribute.js @@ -1,6 +1,6 @@ -import { removeAccessor } from '../util/accessor'; -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; -export default function (src, dst, data) { - removeAccessor(realNode(src), data.name); +export default function (src, tar, data) { + const { name } = data; + nodeMap[src.__id].removeAttribute(name); } diff --git a/src/patch/remove-child.js b/src/patch/remove-child.js index a483ea0..cd55f9a 100644 --- a/src/patch/remove-child.js +++ b/src/patch/remove-child.js @@ -1,10 +1,18 @@ -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); +export default function (src, tar) { + const realtar = nodeMap[tar.__id]; + const realSrc = nodeMap[tar.__id]; // 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(realtar); + } else { + const { childNodes } = realSrc; + const index = childNodes.indexOf(realtar); + if (index > -1) { + childNodes.splice(index, 1); + } + } } diff --git a/src/patch/replace-child.js b/src/patch/replace-child.js index 2506270..2567751 100644 --- a/src/patch/replace-child.js +++ b/src/patch/replace-child.js @@ -1,7 +1,16 @@ -import dom from '../vdom/dom'; -import realNode from '../util/real-node'; +import dom from '../to-dom'; +import nodeMap from '../util/node-map'; -export default function (src, dst) { - const realSrc = realNode(src); - realSrc && realSrc.parentNode && realSrc.parentNode.replaceChild(dom(dst), realSrc); +export default function (src, tar) { + const realSrc = nodeMap[src.__id]; + if (realSrc) { + realSrc.parentNode && realSrc.parentNode.replaceChild(dom(tar), realSrc); + } else { + src.__id = tar.__id; + src.nodeType = tar.nodeType; + src.localName = tar.localName; + src.attributes = tar.attributes; + src.events = tar.events; + src.childNodes = tar.childNodes; + } } diff --git a/src/patch/set-attribute.js b/src/patch/set-attribute.js index 1ff1feb..49dada9 100644 --- a/src/patch/set-attribute.js +++ b/src/patch/set-attribute.js @@ -1,6 +1,6 @@ -import { setAccessor } from '../util/accessor'; -import realNode from '../util/real-node'; +import nodeMap from '../util/node-map'; -export default function (src, dst, data) { - setAccessor(realNode(src), data.name, data.value); +export default function (src, tar, data) { + const { name } = data; + nodeMap[src.__id].setAttribute(name, tar.attributes[name]); } diff --git a/src/patch/set-event.js b/src/patch/set-event.js index be8ba51..4822b35 100644 --- a/src/patch/set-event.js +++ b/src/patch/set-event.js @@ -1,8 +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); +export default function (src, tar, data) { + 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 new file mode 100644 index 0000000..d60d878 --- /dev/null +++ b/src/patch/set-property.js @@ -0,0 +1,37 @@ +import nodeMap from '../util/node-map'; + +const propToAttrMap = { + className: 'class' +}; + +export default function (src, tar, data) { + const { name } = data; + const node = nodeMap[src.__id]; + const prop = tar.properties[name]; + const mapped = propToAttrMap[name]; + + if (mapped) { + if (prop == null) { + node.removeAttribute(mapped); + } else { + node.className = prop; + } + } else if (name === 'style') { + const { style } = node; + // Clear so we don't have to diff. + style.cssText = ''; + + // Handle both strings and objects. + if (typeof prop === 'string') { + style.cssText = prop; + } else { + for (let name in prop) { + if (prop.hasOwnProperty(name)) { + style[name] = prop[name]; + } + } + } + } else { + node[name] = prop; + } +} diff --git a/src/patch/text-content.js b/src/patch/text-content.js index 87230d5..c8e3fbd 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).textContent = dst.textContent; +export default function (src, tar) { + nodeMap[src.__id].textContent = tar.textContent; } diff --git a/src/render.js b/src/render.js index dccf523..4ef51c1 100644 --- a/src/render.js +++ b/src/render.js @@ -1,32 +1,17 @@ -import WeakMap from './util/weak-map'; -import createElement from './vdom/element'; +/** @jsx h */ + +import fragment from './fragment'; import merge from './merge'; -import mount from './vdom/mount'; +import toVdom from './to-vdom'; +import WeakMap from './util/weak-map'; -const { Node } = window; -const oldTreeMap = new WeakMap(); +const targetMap = new WeakMap(); export default function (render) { - return function (elem) { - 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. - const newTree = createElement('div', null, render(elem)); - const oldTree = oldTreeMap.get(elem); - - if (oldTree) { - merge({ - destination: newTree, - source: oldTree - }); - } else { - mount(elem, newTree.childNodes); - } - - oldTreeMap.set(elem, newTree); + return function (node, done) { + const src = targetMap.get(node) || toVdom(node); + const tar = fragment(render(node)); + merge(src, tar, { done }); + targetMap.set(node, tar); }; } diff --git a/src/text.js b/src/text.js new file mode 100644 index 0000000..8862ca5 --- /dev/null +++ b/src/text.js @@ -0,0 +1,4 @@ +const nodeType = 3; +export default function (textContent) { + return { nodeType, textContent }; +} diff --git a/src/to-dom.js b/src/to-dom.js new file mode 100644 index 0000000..fcf819c --- /dev/null +++ b/src/to-dom.js @@ -0,0 +1,53 @@ +import eventMap from './util/event-map'; +import nodeMap from './util/node-map'; +import root from './util/root'; + +const { Node } = root; + +function createElement (node) { + const { attributes, childNodes, events, properties } = node; + const realNode = document.createElement(node.localName); + const eventHandlers = eventMap(realNode); + + if (attributes) { + for (let name in attributes) { + realNode.setAttribute(name, attributes[name]); + } + } + + if (childNodes) { + childNodes.forEach(ch => realNode.appendChild(render(ch))); + } + + if (events) { + for (let name in events) { + realNode.addEventListener(name, eventHandlers[name] = events[name]); + } + } + + if (properties) { + for (let name in properties) { + realNode[name] = properties[name]; + } + } + + 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.localName ? createElement(node) : createText(node); + nodeMap[node.__id] = realNode; + return realNode; +} diff --git a/src/to-vdom.js b/src/to-vdom.js new file mode 100644 index 0000000..986f033 --- /dev/null +++ b/src/to-vdom.js @@ -0,0 +1,80 @@ +import { isElement, isFragment, isString } from './util/is-type'; +import fragment from './fragment'; +import h from './h'; +import nodeMap from './util/node-map'; +import root from './util/root'; +import text from './text'; +import WeakMap from './util/weak-map'; + +const { NodeFilter } = root; +const { SHOW_DOCUMENT_FRAGMENT, SHOW_ELEMENT, SHOW_TEXT } = NodeFilter; +const vNodeMap = new WeakMap(); + +function getAttributes (node) { + const temp = {}; + const { attributes } = node; + const { length } = attributes; + for (let a = 0; a < length; a++) { + const { name, value } = attributes[a]; + temp[name] = value; + } + return temp; +} + +function getFragmentFromString (str) { + const div = document.createElement('div'); + const fra = document.createDocumentFragment(); + div.innerHTML = str; + while (div.hasChildNodes()) { + fra.appendChild(div.firstChild); + } + return fra; +} + +function getVNode (node) { + const { nodeType } = node; + + if (nodeType === 3) { + return text(node.textContent); + } + + const vNode = h(node.localName); + vNode.attributes = getAttributes(node); + nodeMap[vNode.__id] = node; + vNodeMap.set(node, vNode); + return vNode; +} + +export default function (dom) { + let vRoot; + + if (isElement(dom)) { + vRoot = getVNode(dom); + } else if (isFragment(dom)) { + vRoot = fragment(); + } else if (isString(dom)) { + dom = getFragmentFromString(dom); + vRoot = fragment(); + } + + const walker = document.createTreeWalker( + dom, + SHOW_DOCUMENT_FRAGMENT | SHOW_ELEMENT | SHOW_TEXT, + null, + false + ); + + while (walker.nextNode()) { + const { currentNode } = walker; + const vNode = getVNode(currentNode); + const vNodeParent = vNodeMap.get(currentNode.parentNode); + + if (vNodeParent) { + vNodeParent.childNodes.push(vNode); + } else { + vRoot.childNodes.push(vNode); + } + } + + return vRoot; +} 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/util/is-type.js b/src/util/is-type.js new file mode 100644 index 0000000..0290fa3 --- /dev/null +++ b/src/util/is-type.js @@ -0,0 +1,12 @@ +import root from './root'; + +const { Node } = root; +const { ELEMENT_NODE, DOCUMENT_FRAGMENT_NODE, TEXT_NODE } = Node; + +export const isNode = (e, t) => e.nodeType === t; +export const isElement = e => isNode(e, ELEMENT_NODE); +export const isFragment = e => isNode(e, DOCUMENT_FRAGMENT_NODE); +export const isText = e => isNode(e, TEXT_NODE); + +export const isType = (v, t) => typeof v === t; +export const isString = v => isType(v, 'string'); 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 306e641..0000000 --- a/src/util/real-node-map.js +++ /dev/null @@ -1,2 +0,0 @@ -import WeakMap from './weak-map'; -export default new WeakMap(); diff --git a/src/util/real-node.js b/src/util/real-node.js deleted file mode 100644 index 1786077..0000000 --- a/src/util/real-node.js +++ /dev/null @@ -1,7 +0,0 @@ -import realNodeMap from './real-node-map'; - -const { Node } = window; - -export default function (node) { - return node instanceof Node ? node : realNodeMap.get(node); -} diff --git a/src/util/root.js b/src/util/root.js new file mode 100644 index 0000000..ca48603 --- /dev/null +++ b/src/util/root.js @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-undef +export default window || self || global; diff --git a/src/vdom/dom.js b/src/vdom/dom.js deleted file mode 100644 index cc74923..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, realNode); - return realNode; -} diff --git a/src/vdom/element.js b/src/vdom/element.js deleted file mode 100644 index 5dcb1a2..0000000 --- a/src/vdom/element.js +++ /dev/null @@ -1,214 +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; -} - -export default function element (name, attrs = {}, ...chren) { - const isAttrsNode = isChildren(attrs); - const data = separateData(isAttrsNode ? {} : attrs); - const node = data.node; - 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/src/vdom/mount.js b/src/vdom/mount.js deleted file mode 100644 index bfdb79e..0000000 --- a/src/vdom/mount.js +++ /dev/null @@ -1,13 +0,0 @@ -import dom from './dom'; - -function removeChildNodes (elem) { - while (elem.firstChild) { - const first = elem.firstChild; - first.parentNode.removeChild(first); - } -} - -export default function (elem, tree) { - removeChildNodes(elem); - elem.appendChild(dom(tree)); -} diff --git a/src/vdom/text.js b/src/vdom/text.js deleted file mode 100644 index 6770598..0000000 --- a/src/vdom/text.js +++ /dev/null @@ -1,6 +0,0 @@ -export default function createTextNode (item) { - return { - nodeType: 3, - textContent: item - }; -} 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'; diff --git a/test/lib/index.js b/test/lib/index.js new file mode 100644 index 0000000..76533c1 --- /dev/null +++ b/test/lib/index.js @@ -0,0 +1,7 @@ +import { fragment, merge, mount } from '../../src'; + +export function run (src, tar) { + const tree = mount(src); + merge(fragment(src), fragment(tar)); + return tree; +} diff --git a/test/unit.js b/test/unit.js index b27f5a9..f608c08 100644 --- a/test/unit.js +++ b/test/unit.js @@ -1,467 +1,5 @@ -/* 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)); - }); +import 'skatejs-web-components'; - ['test 1', 'test 1', 'test 2', 'test 2'].forEach(function (test) { - root.test = test; - render(root); - assert.equal(root.innerHTML, `
${test}
`); - }); - }); -}); +const reqTests = require.context('./unit', true, /^.*\.js$/); +reqTests.keys().map(reqTests); diff --git a/test/unit/diff.js b/test/unit/diff.js new file mode 100644 index 0000000..09af5d9 --- /dev/null +++ b/test/unit/diff.js @@ -0,0 +1,24 @@ +/* eslint-env jasmine, mocha */ + +import { diff, h, types } from '../../src'; + +describe('diff', () => { + it('instructions array', function () { + const src = h('div'); + const tar = h('div'); + const instructions = diff(src, tar); + + expect(Array.isArray(instructions)).to.be.true; + }); + + it('instruction object', function () { + const src = h('div', null, h('span')); + const tar = h('div', null, h('a')); + const instructions = diff(src, tar); + + expect(instructions.length).to.equal(1, 'instruction length'); + expect(instructions[0].target.localName).to.equal('a', 'target localName'); + expect(instructions[0].source.localName).to.equal('span', 'source localName'); + expect(instructions[0].type).to.equal(types.REPLACE_CHILD, 'type'); + }); +}); diff --git a/test/unit/diff/element-nodes.js b/test/unit/diff/element-nodes.js new file mode 100644 index 0000000..d45d902 --- /dev/null +++ b/test/unit/diff/element-nodes.js @@ -0,0 +1,23 @@ +/* eslint-env jasmine, mocha */ + +import { diff, h, types } from '../../../src'; + +describe('diff/element-nodes', () => { + it('same elements should not change', function () { + const src = h('div'); + const tar = h('div'); + const ins = diff(src, tar); + + expect(ins.length).to.equal(0); + }); + + it('only compares items at the same index', function () { + const src = h('div', null, h('span')); + const tar = h('div', null, h('a'), h('span')); + const ins = diff(src, tar); + + expect(ins.length).to.equal(2); + expect(ins[0].type).to.equal(types.REPLACE_CHILD); + expect(ins[1].type).to.equal(types.APPEND_CHILD); + }); +}); diff --git a/test/unit/diff/text-nodes.js b/test/unit/diff/text-nodes.js new file mode 100644 index 0000000..edb3d46 --- /dev/null +++ b/test/unit/diff/text-nodes.js @@ -0,0 +1,13 @@ +/* eslint-env jasmine, mocha */ + +import { diff, h } from '../../../src'; + +describe('patch', () => { + it('should not patch equal text nodes', function () { + const src = h('div', null, 'text'); + const tar = h('div', null, 'text'); + const ins = diff(src, tar); + + expect(ins.length).to.equal(0); + }); +}); diff --git a/test/unit/diff/worker.js b/test/unit/diff/worker.js new file mode 100644 index 0000000..4f21690 --- /dev/null +++ b/test/unit/diff/worker.js @@ -0,0 +1,50 @@ +/* eslint-env jasmine, mocha */ + +import { diff, h, merge, patch, render, toDom } from '../../../src/index'; + +describe('diff/worker', function () { + it('diff', done => { + const src = h('div', null, 'text 1'); + const tar = h('div', null, 'text 2'); + const realDom = toDom(src); + + diff(src, tar, { + done (instructions) { + expect(Array.isArray(instructions)).to.be.true; + patch(instructions); + expect(realDom.textContent).to.equal('text 2'); + done(); + } + }); + }); + + it('merge', done => { + const src = h('div', null, 'test 1'); + const tar = h('div', null, 'test 2'); + const realDom = toDom(src); + + merge(src, tar, { + done () { + expect(realDom.textContent).to.equal('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, () => { + expect(root.textContent).to.equal('test 1', 'not updated to test 1'); + root.test = 'test 2'; + rend(root, () => { + expect(root.textContent).to.equal('test 2', 'not updated to test 2'); + done(); + }); + }); + }); +}); diff --git a/test/unit/h.js b/test/unit/h.js new file mode 100644 index 0000000..05e512f --- /dev/null +++ b/test/unit/h.js @@ -0,0 +1,44 @@ +/* eslint-env jasmine, mocha */ +/** @jsx h */ + +import { h } from '../../src'; +import root from '../../src/util/root'; + +const { customElements, HTMLElement } = root; + +describe('h', function () { + it('should render a built-in element', function () { + const vdom =
; + expect(vdom.localName).to.equal('div'); + }); + + it('should render a custom element', function () { + const vdom = ; + expect(vdom.localName).to.equal('x-div'); + }); + + it('aria', () => { + const vdom =
; + expect(vdom.attributes['aria-label']).to.equal('test'); + expect(vdom.properties['aria']).to.be.undefined; + }); + + it('data', () => { + const vdom =
; + expect(vdom.attributes['data-label']).to.equal('test'); + expect(vdom.properties['data']).to.be.undefined; + }); + + it('calls functions', () => { + const Div = () =>
; + const vdom =
; + expect(vdom.localName).to.equal('div'); + }); + + it('converts custom element construtors into tag names', () => { + class CustomElement extends HTMLElement {} + customElements.define('custom-element', CustomElement); + const vdom = ; + expect(vdom.localName).to.equal('custom-element'); + }); +}); diff --git a/test/unit/patch/attributes.js b/test/unit/patch/attributes.js new file mode 100644 index 0000000..d5dc821 --- /dev/null +++ b/test/unit/patch/attributes.js @@ -0,0 +1,39 @@ +/* eslint-env jasmine, mocha */ +/** @jsx h */ + +import { h } from '../../../src'; +import { run } from '../../lib'; + +describe('patch/attributes', () => { + it('add', () => { + const dom = run( +
, +
+ ); + expect(dom.firstChild.getAttribute('class')).to.equal('test'); + }); + + it('update', () => { + const dom = run( +
, +
+ ); + expect(dom.firstChild.getAttribute('class')).to.equal('test2'); + }); + + it('remove', () => { + const dom = run( +
, +
+ ); + expect(dom.firstChild.getAttribute('class')).to.equal(null); + }); + + it('does not affect props for unlinked attributes', () => { + const dom = run( +
, +
+ ); + expect(dom.firstChild.getAttribute('aria-label')).to.equal('test'); + }); +}); diff --git a/test/unit/patch/events.js b/test/unit/patch/events.js new file mode 100644 index 0000000..fa82e95 --- /dev/null +++ b/test/unit/patch/events.js @@ -0,0 +1,42 @@ +/* eslint-env jasmine, mocha */ +/** @jsx h */ + +import 'custom-event-polyfill'; +import { h } from '../../../src/index'; +import { run } from '../../lib'; +import root from '../../../src/util/root'; + +const { CustomEvent } = root; + +describe('patch/events', function () { + const click = e => (e.target.triggered = true); + + it('should add listeners', function () { + const dom = run(