diff --git a/bench/implementations/inferno/dist/bundle.js b/bench/implementations/inferno/dist/bundle.js new file mode 100644 index 0000000..12a233a --- /dev/null +++ b/bench/implementations/inferno/dist/bundle.js @@ -0,0 +1,3248 @@ +/******/ (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 = "dist"; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _inferno = __webpack_require__(1); + + var _inferno2 = _interopRequireDefault(_inferno); + + var _infernoComponent = __webpack_require__(3); + + var _infernoComponent2 = _interopRequireDefault(_infernoComponent); + + var _share = __webpack_require__(5); + + var _base = __webpack_require__(6); + + var _model = __webpack_require__(7); + + var _model2 = _interopRequireDefault(_model); + + var _item = __webpack_require__(8); + + var _item2 = _interopRequireDefault(_item); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var render = _inferno2.default.render; + + var model = new _model2.default(); + + var App = function (_Component) { + _inherits(App, _Component); + + function App() { + var _temp, _this, _ret; + + _classCallCheck(this, App); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.state = { + route: (0, _share.read)(), + todos: model.get() + }, _this.update = function (arr) { + return _this.setState({ todos: arr }); + }, _this.componentWillMount = function () { + window.onhashchange = function () { + return _this.setState({ route: (0, _share.read)() }); + }; + }, _this.add = function (e) { + if (e.which !== _share.ENTER) return; + + var val = e.target.value.trim(); + if (!val) return; + + e.target.value = ''; + _this.update(model.add(val)); + }, _this.edit = function (todo, val) { + val = val.trim(); + if (val.length) { + _this.update(model.put(todo, { title: val, editing: 0 })); + } else { + _this.remove(todo); + } + }, _this.focus = function (todo) { + return _this.update(model.put(todo, { editing: 1 })); + }, _this.blur = function (todo) { + return _this.update(model.put(todo, { editing: 0 })); + }, _this.remove = function (todo) { + return _this.update(model.del(todo)); + }, _this.toggleOne = function (todo) { + return _this.update(model.toggle(todo)); + }, _this.toggleAll = function (ev) { + return _this.update(model.toggleAll(ev.target.checked)); + }, _this.clearCompleted = function () { + return _this.update(model.clearCompleted()); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + App.prototype.render = function render(_, _ref) { + var _this2 = this; + + var todos = _ref.todos, + route = _ref.route; + + var num = todos.length; + var shown = todos.filter(_share.filters[route]); + var numDone = todos.filter(_share.filters.completed).length; + var numAct = num - numDone; + + return _inferno2.default.createVNode(2, 'div', null, [_inferno2.default.createVNode(16, _base.Head, { + 'onEnter': this.add + }), num ? _inferno2.default.createVNode(2, 'section', { + 'className': 'main' + }, [_inferno2.default.createVNode(512, 'input', { + 'className': 'toggle-all', + 'type': 'checkbox', + 'checked': numAct === 0 + }, null, { + 'onClick': this.toggleAll + }), _inferno2.default.createVNode(2, 'ul', { + 'className': 'todo-list' + }, shown.map(function (t) { + return _inferno2.default.createVNode(16, _item2.default, { + 'data': t, + 'onBlur': function onBlur() { + return _this2.blur(t); + }, + 'onFocus': function onFocus() { + return _this2.focus(t); + }, + 'doDelete': function doDelete() { + return _this2.remove(t); + }, + 'doSave': function doSave(val) { + return _this2.edit(t, val); + }, + 'doToggle': function doToggle() { + return _this2.toggleOne(t); + } + }); + }))]) : null, numAct || numDone ? _inferno2.default.createVNode(16, _base.Foot, { + 'onClear': this.clearCompleted, + 'left': numAct, + 'done': numDone, + 'route': route + }) : null]); + }; + + return App; + }(_infernoComponent2.default); + + render(_inferno2.default.createVNode(16, App), document.getElementById('app')); + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(2); + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /*! + * inferno v1.0.0-beta32 + * (c) 2016 Dominic Gannaway + * Released under the MIT License. + */ + (function (global, factory) { + true ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.Inferno = global.Inferno || {}))); + }(this, (function (exports) { 'use strict'; + + var NO_OP = '$NO_OP'; + var ERROR_MSG = 'a runtime error occured! Use Inferno in development environment to find the error.'; + var isBrowser = typeof window !== 'undefined' && window.document; + + // this is MUCH faster than .constructor === Array and instanceof Array + // in Node 7 and the later versions of V8, slower in older versions though + var isArray = Array.isArray; + function isStatefulComponent(o) { + return !isUndefined(o.prototype) && !isUndefined(o.prototype.render); + } + function isStringOrNumber(obj) { + return isString(obj) || isNumber(obj); + } + function isNullOrUndef(obj) { + return isUndefined(obj) || isNull(obj); + } + function isInvalid(obj) { + return isNull(obj) || obj === false || isTrue(obj) || isUndefined(obj); + } + function isFunction(obj) { + return typeof obj === 'function'; + } + function isAttrAnEvent(attr) { + return attr[0] === 'o' && attr[1] === 'n' && attr.length > 3; + } + function isString(obj) { + return typeof obj === 'string'; + } + function isNumber(obj) { + return typeof obj === 'number'; + } + function isNull(obj) { + return obj === null; + } + function isTrue(obj) { + return obj === true; + } + function isUndefined(obj) { + return obj === undefined; + } + function isObject(o) { + return typeof o === 'object'; + } + function throwError(message) { + if (!message) { + message = ERROR_MSG; + } + throw new Error(("Inferno Error: " + message)); + } + function warning(condition, message) { + if (!condition) { + console.error(message); + } + } + var EMPTY_OBJ = {}; + + function cloneVNode(vNodeToClone, props) { + var _children = [], len = arguments.length - 2; + while ( len-- > 0 ) _children[ len ] = arguments[ len + 2 ]; + + var children = _children; + if (_children.length > 0 && !isNull(_children[0])) { + if (!props) { + props = {}; + } + if (_children.length === 1) { + children = _children[0]; + } + if (isUndefined(props.children)) { + props.children = children; + } + else { + if (isArray(children)) { + if (isArray(props.children)) { + props.children = props.children.concat(children); + } + else { + props.children = [props.children].concat(children); + } + } + else { + if (isArray(props.children)) { + props.children.push(children); + } + else { + props.children = [props.children]; + props.children.push(children); + } + } + } + } + children = null; + var flags = vNodeToClone.flags; + var events = vNodeToClone.events || (props && props.events) || null; + var newVNode; + if (isArray(vNodeToClone)) { + newVNode = vNodeToClone.map(function (vNode) { return cloneVNode(vNode); }); + } + else if (isNullOrUndef(props) && isNullOrUndef(children)) { + newVNode = Object.assign({}, vNodeToClone); + } + else { + var key = !isNullOrUndef(vNodeToClone.key) ? vNodeToClone.key : props.key; + var ref = vNodeToClone.ref || props.ref; + if (flags & 28 /* Component */) { + newVNode = createVNode(flags, vNodeToClone.type, Object.assign({}, vNodeToClone.props, props), null, events, key, ref, true); + } + else if (flags & 3970 /* Element */) { + children = (props && props.children) || vNodeToClone.children; + newVNode = createVNode(flags, vNodeToClone.type, Object.assign({}, vNodeToClone.props, props), children, events, key, ref, !children); + } + } + if (flags & 28 /* Component */) { + var newProps = newVNode.props; + if (newProps) { + var newChildren = newProps.children; + // we need to also clone component children that are in props + // as the children may also have been hoisted + if (newChildren) { + if (isArray(newChildren)) { + for (var i = 0; i < newChildren.length; i++) { + var child = newChildren[i]; + if (!isInvalid(child) && isVNode(child)) { + newProps.children[i] = cloneVNode(child); + } + } + } + else if (isVNode(newChildren)) { + newProps.children = cloneVNode(newChildren); + } + } + } + newVNode.children = null; + } + newVNode.dom = null; + return newVNode; + } + + function _normalizeVNodes(nodes, result, i) { + for (; i < nodes.length; i++) { + var n = nodes[i]; + if (!isInvalid(n)) { + if (Array.isArray(n)) { + _normalizeVNodes(n, result, 0); + } + else { + if (isStringOrNumber(n)) { + n = createTextVNode(n); + } + else if (isVNode(n) && n.dom) { + n = cloneVNode(n); + } + result.push(n); + } + } + } + } + function normalizeVNodes(nodes) { + var newNodes; + // we assign $ which basically means we've flagged this array for future note + // if it comes back again, we need to clone it, as people are using it + // in an immutable way + // tslint:disable + if (nodes['$']) { + nodes = nodes.slice(); + } + else { + nodes['$'] = true; + } + // tslint:enable + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + if (isInvalid(n)) { + if (!newNodes) { + newNodes = nodes.slice(0, i); + } + newNodes.push(n); + } + else if (Array.isArray(n)) { + var result = (newNodes || nodes).slice(0, i); + _normalizeVNodes(nodes, result, i); + return result; + } + else if (isStringOrNumber(n)) { + if (!newNodes) { + newNodes = nodes.slice(0, i); + } + newNodes.push(createTextVNode(n)); + } + else if (isVNode(n) && n.dom) { + if (!newNodes) { + newNodes = nodes.slice(0, i); + } + newNodes.push(cloneVNode(n)); + } + else if (newNodes) { + newNodes.push(cloneVNode(n)); + } + } + return newNodes || nodes; + } + function normalizeChildren(children) { + if (isArray(children)) { + return normalizeVNodes(children); + } + else if (isVNode(children) && children.dom) { + return cloneVNode(children); + } + return children; + } + function normalizeProps(vNode, props, children) { + if (!(vNode.flags & 28 /* Component */) && isNullOrUndef(children) && !isNullOrUndef(props.children)) { + vNode.children = props.children; + } + if (props.ref) { + vNode.ref = props.ref; + } + if (props.events) { + vNode.events = props.events; + } + if (!isNullOrUndef(props.key)) { + vNode.key = props.key; + } + } + function normalize(vNode) { + var props = vNode.props; + var children = vNode.children; + // convert a wrongly created type back to element + if (isString(vNode.type) && (vNode.flags & 28 /* Component */)) { + vNode.flags = 3970 /* Element */; + } + if (props) { + normalizeProps(vNode, props, children); + } + if (!isInvalid(children)) { + vNode.children = normalizeChildren(children); + } + if (props && !isInvalid(props.children)) { + props.children = normalizeChildren(props.children); + } + } + function createVNode(flags, type, props, children, events, key, ref, noNormalise) { + if (flags & 16 /* ComponentUnknown */) { + flags = isStatefulComponent(type) ? 4 /* ComponentClass */ : 8 /* ComponentFunction */; + } + var vNode = { + children: isUndefined(children) ? null : children, + dom: null, + events: events || null, + flags: flags || 0, + key: key === undefined ? null : key, + props: props || null, + ref: ref || null, + type: type + }; + if (!noNormalise) { + normalize(vNode); + } + return vNode; + } + function createVoidVNode() { + return createVNode(4096 /* Void */); + } + function createTextVNode(text) { + return createVNode(1 /* Text */, null, null, text); + } + function isVNode(o) { + return !!o.flags; + } + + var devToolsStatus = { + connected: false + }; + var internalIncrementer = { + id: 0 + }; + var componentIdMap = new Map(); + function getIncrementalId() { + return internalIncrementer.id++; + } + function sendToDevTools(global, data) { + var event = new CustomEvent('inferno.client.message', { + detail: JSON.stringify(data, function (key, val) { + if (!isNull(val) && !isUndefined(val)) { + if (key === '_vComponent' || !isUndefined(val.nodeType)) { + return; + } + else if (isFunction(val)) { + return ("$$f:" + (val.name)); + } + } + return val; + }) + }); + global.dispatchEvent(event); + } + function rerenderRoots() { + for (var i = 0; i < roots.length; i++) { + var root = roots[i]; + render(root.input, root.dom); + } + } + function initDevToolsHooks(global) { + global.__INFERNO_DEVTOOLS_GLOBAL_HOOK__ = roots; + global.addEventListener('inferno.devtools.message', function (message) { + var detail = JSON.parse(message.detail); + var type = detail.type; + switch (type) { + case 'get-roots': + if (!devToolsStatus.connected) { + devToolsStatus.connected = true; + rerenderRoots(); + sendRoots(global); + } + break; + default: + // TODO:? + break; + } + }); + } + function sendRoots(global) { + sendToDevTools(global, { type: 'roots', data: roots }); + } + + var Lifecycle = function Lifecycle() { + this.listeners = []; + this.fastUnmount = true; + }; + Lifecycle.prototype.addListener = function addListener (callback) { + this.listeners.push(callback); + }; + Lifecycle.prototype.trigger = function trigger () { + var this$1 = this; + + for (var i = 0; i < this.listeners.length; i++) { + this$1.listeners[i](); + } + }; + + function constructDefaults(string, object, value) { + /* eslint no-return-assign: 0 */ + string.split(',').forEach(function (i) { return object[i] = value; }); + } + var xlinkNS = 'http://www.w3.org/1999/xlink'; + var xmlNS = 'http://www.w3.org/XML/1998/namespace'; + var svgNS = 'http://www.w3.org/2000/svg'; + var strictProps = {}; + var booleanProps = {}; + var namespaces = {}; + var isUnitlessNumber = {}; + var skipProps = {}; + var dehyphenProps = { + textAnchor: 'text-anchor' + }; + var delegatedProps = {}; + constructDefaults('xlink:href,xlink:arcrole,xlink:actuate,xlink:role,xlink:titlef,xlink:type', namespaces, xlinkNS); + constructDefaults('xml:base,xml:lang,xml:space', namespaces, xmlNS); + constructDefaults('volume,defaultValue,defaultChecked', strictProps, true); + constructDefaults('children,ref,key,selected,checked,value,multiple', skipProps, true); + constructDefaults('onClick,onMouseDown,onMouseUp,onMouseMove', delegatedProps, true); + constructDefaults('muted,scoped,loop,open,checked,default,capture,disabled,readonly,required,autoplay,controls,seamless,reversed,allowfullscreen,novalidate', booleanProps, true); + constructDefaults('animationIterationCount,borderImageOutset,borderImageSlice,borderImageWidth,boxFlex,boxFlexGroup,boxOrdinalGroup,columnCount,flex,flexGrow,flexPositive,flexShrink,flexNegative,flexOrder,gridRow,gridColumn,fontWeight,lineClamp,lineHeight,opacity,order,orphans,tabSize,widows,zIndex,zoom,fillOpacity,floodOpacity,stopOpacity,strokeDasharray,strokeDashoffset,strokeMiterlimit,strokeOpacity,strokeWidth,', isUnitlessNumber, true); + + var delegatedEvents = new Map(); + function handleEvent(name, lastEvent, nextEvent, dom) { + var delegatedRoots = delegatedEvents.get(name); + if (nextEvent) { + if (!delegatedRoots) { + delegatedRoots = { items: new Map(), count: 0, docEvent: null }; + var docEvent = attachEventToDocument(name, delegatedRoots); + delegatedRoots.docEvent = docEvent; + delegatedEvents.set(name, delegatedRoots); + } + if (!lastEvent) { + delegatedRoots.count++; + } + delegatedRoots.items.set(dom, nextEvent); + } + else if (delegatedRoots) { + if (delegatedRoots.items.has(dom)) { + delegatedRoots.count--; + delegatedRoots.items.delete(dom); + if (delegatedRoots.count === 0) { + document.removeEventListener(normalizeEventName(name), delegatedRoots.docEvent); + delegatedEvents.delete(name); + } + } + } + } + function dispatchEvent(event, dom, items, count, eventData) { + var eventsToTrigger = items.get(dom); + if (eventsToTrigger) { + count--; + // linkEvent object + eventData.dom = dom; + if (eventsToTrigger.event) { + eventsToTrigger.event(eventsToTrigger.data, event); + } + else { + eventsToTrigger(event); + } + if (eventData.stopPropagation) { + return; + } + } + var parentDom = dom.parentNode; + if (count > 0 && (parentDom || parentDom === document.body)) { + dispatchEvent(event, parentDom, items, count, eventData); + } + } + function normalizeEventName(name) { + return name.substr(2).toLowerCase(); + } + function attachEventToDocument(name, delegatedRoots) { + var docEvent = function (event) { + var eventData = { + stopPropagation: false, + dom: document + }; + // we have to do this as some browsers recycle the same Event between calls + // so we need to make the property configurable + Object.defineProperty(event, 'currentTarget', { + configurable: true, + get: function get() { + return eventData.dom; + } + }); + event.stopPropagation = function () { + eventData.stopPropagation = true; + }; + var count = delegatedRoots.count; + if (count > 0) { + dispatchEvent(event, event.target, delegatedRoots.items, count, eventData); + } + }; + document.addEventListener(normalizeEventName(name), docEvent); + return docEvent; + } + + function isCheckedType(type) { + return type === 'checkbox' || type === 'radio'; + } + function isControlled(props) { + var usesChecked = isCheckedType(props.type); + return usesChecked ? !isNullOrUndef(props.checked) : !isNullOrUndef(props.value); + } + function onTextInputChange(e) { + var vNode = this.vNode; + var events = vNode.events || EMPTY_OBJ; + var dom = vNode.dom; + if (events.onInput) { + events.onInput(e); + } + else if (events.oninput) { + events.oninput(e); + } + // the user may have updated the vNode from the above onInput events + // so we need to get it from the context of `this` again + applyValue(this.vNode, dom); + } + function onCheckboxChange(e) { + var vNode = this.vNode; + var events = vNode.events || EMPTY_OBJ; + var dom = vNode.dom; + if (events.onClick) { + events.onClick(e); + } + else if (events.onclick) { + events.onclick(e); + } + // the user may have updated the vNode from the above onClick events + // so we need to get it from the context of `this` again + applyValue(this.vNode, dom); + } + function handleAssociatedRadioInputs(name) { + var inputs = document.querySelectorAll(("input[type=\"radio\"][name=\"" + name + "\"]")); + [].forEach.call(inputs, function (dom) { + var inputWrapper = wrappers.get(dom); + if (inputWrapper) { + var props = inputWrapper.vNode.props; + if (props) { + dom.checked = inputWrapper.vNode.props.checked; + } + } + }); + } + function processInput(vNode, dom) { + var props = vNode.props || EMPTY_OBJ; + applyValue(vNode, dom); + if (isControlled(props)) { + var inputWrapper = wrappers.get(dom); + if (!inputWrapper) { + inputWrapper = { + vNode: vNode + }; + if (isCheckedType(props.type)) { + dom.onclick = onCheckboxChange.bind(inputWrapper); + dom.onclick.wrapped = true; + } + else { + dom.oninput = onTextInputChange.bind(inputWrapper); + dom.oninput.wrapped = true; + } + wrappers.set(dom, inputWrapper); + } + inputWrapper.vNode = vNode; + } + } + function applyValue(vNode, dom) { + var props = vNode.props || EMPTY_OBJ; + var type = props.type; + var value = props.value; + var checked = props.checked; + if (type !== dom.type && type) { + dom.type = type; + } + if (props.multiple !== dom.multiple) { + dom.multiple = props.multiple; + } + if (isCheckedType(type)) { + if (!isNullOrUndef(value)) { + dom.value = value; + } + dom.checked = checked; + if (type === 'radio' && props.name) { + handleAssociatedRadioInputs(props.name); + } + } + else { + if (!isNullOrUndef(value) && dom.value !== value) { + dom.value = value; + } + else if (!isNullOrUndef(checked)) { + dom.checked = checked; + } + } + } + + function isControlled$1(props) { + return !isNullOrUndef(props.value); + } + function updateChildOption(vNode, value) { + var props = vNode.props || EMPTY_OBJ; + var dom = vNode.dom; + // we do this as multiple may have changed + dom.value = props.value; + if ((isArray(value) && value.indexOf(props.value) !== -1) || props.value === value) { + dom.selected = true; + } + else { + dom.selected = props.selected || false; + } + } + function onSelectChange(e) { + var vNode = this.vNode; + var events = vNode.events || EMPTY_OBJ; + var dom = vNode.dom; + if (events.onChange) { + events.onChange(e); + } + else if (events.onchange) { + events.onchange(e); + } + // the user may have updated the vNode from the above onChange events + // so we need to get it from the context of `this` again + applyValue$1(this.vNode, dom); + } + function processSelect(vNode, dom) { + var props = vNode.props || EMPTY_OBJ; + applyValue$1(vNode, dom); + if (isControlled$1(props)) { + var selectWrapper = wrappers.get(dom); + if (!selectWrapper) { + selectWrapper = { + vNode: vNode + }; + dom.onchange = onSelectChange.bind(selectWrapper); + dom.onchange.wrapped = true; + wrappers.set(dom, selectWrapper); + } + selectWrapper.vNode = vNode; + } + } + function applyValue$1(vNode, dom) { + var props = vNode.props || EMPTY_OBJ; + if (props.multiple !== dom.multiple) { + dom.multiple = props.multiple; + } + var children = vNode.children; + var value = props.value; + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + updateChildOption(children[i], value); + } + } + else if (isVNode(children)) { + updateChildOption(children, value); + } + } + + function isControlled$2(props) { + return !isNullOrUndef(props.value); + } + function onTextareaInputChange(e) { + var vNode = this.vNode; + var events = vNode.events || EMPTY_OBJ; + var dom = vNode.dom; + if (events.onInput) { + events.onInput(e); + } + else if (events.oninput) { + events.oninput(e); + } + // the user may have updated the vNode from the above onInput events + // so we need to get it from the context of `this` again + applyValue$2(this.vNode, dom); + } + function processTextarea(vNode, dom) { + var props = vNode.props || EMPTY_OBJ; + applyValue$2(vNode, dom); + var textareaWrapper = wrappers.get(dom); + if (isControlled$2(props)) { + if (!textareaWrapper) { + textareaWrapper = { + vNode: vNode + }; + dom.oninput = onTextareaInputChange.bind(textareaWrapper); + dom.oninput.wrapped = true; + wrappers.set(dom, textareaWrapper); + } + textareaWrapper.vNode = vNode; + } + } + function applyValue$2(vNode, dom) { + var props = vNode.props || EMPTY_OBJ; + var value = props.value; + if (dom.value !== value) { + dom.value = value; + } + } + + var wrappers = new Map(); + function processElement(flags, vNode, dom) { + if (flags & 512 /* InputElement */) { + processInput(vNode, dom); + } + else if (flags & 2048 /* SelectElement */) { + processSelect(vNode, dom); + } + else if (flags & 1024 /* TextareaElement */) { + processTextarea(vNode, dom); + } + } + + function unmount(vNode, parentDom, lifecycle, canRecycle, shallowUnmount, isRecycling) { + var flags = vNode.flags; + if (flags & 28 /* Component */) { + unmountComponent(vNode, parentDom, lifecycle, canRecycle, shallowUnmount, isRecycling); + } + else if (flags & 3970 /* Element */) { + unmountElement(vNode, parentDom, lifecycle, canRecycle, shallowUnmount, isRecycling); + } + else if (flags & (1 /* Text */ | 4096 /* Void */)) { + unmountVoidOrText(vNode, parentDom); + } + } + function unmountVoidOrText(vNode, parentDom) { + if (parentDom) { + removeChild(parentDom, vNode.dom); + } + } + function unmountComponent(vNode, parentDom, lifecycle, canRecycle, shallowUnmount, isRecycling) { + var instance = vNode.children; + var flags = vNode.flags; + var isStatefulComponent$$1 = flags & 4; + var ref = vNode.ref; + var dom = vNode.dom; + if (!isRecycling) { + if (!shallowUnmount) { + if (isStatefulComponent$$1) { + var subLifecycle = instance._lifecycle; + if (!subLifecycle.fastUnmount) { + unmount(instance._lastInput, null, lifecycle, false, shallowUnmount, isRecycling); + } + } + else { + if (!lifecycle.fastUnmount) { + unmount(instance, null, lifecycle, false, shallowUnmount, isRecycling); + } + } + } + if (isStatefulComponent$$1) { + instance._ignoreSetState = true; + instance.componentWillUnmount(); + if (ref && !isRecycling) { + ref(null); + } + instance._unmounted = true; + findDOMNodeEnabled && componentToDOMNodeMap.delete(instance); + } + else if (!isNullOrUndef(ref)) { + if (!isNullOrUndef(ref.onComponentWillUnmount)) { + ref.onComponentWillUnmount(dom); + } + } + } + if (parentDom) { + var lastInput = instance._lastInput; + if (isNullOrUndef(lastInput)) { + lastInput = instance; + } + removeChild(parentDom, dom); + } + if (recyclingEnabled && !isStatefulComponent$$1 && (parentDom || canRecycle)) { + poolComponent(vNode); + } + } + function unmountElement(vNode, parentDom, lifecycle, canRecycle, shallowUnmount, isRecycling) { + var dom = vNode.dom; + var ref = vNode.ref; + var events = vNode.events; + if (!shallowUnmount && !lifecycle.fastUnmount) { + if (ref && !isRecycling) { + unmountRef(ref); + } + var children = vNode.children; + if (!isNullOrUndef(children)) { + unmountChildren$1(children, lifecycle, shallowUnmount, isRecycling); + } + } + if (!isNull(events)) { + for (var name in events) { + // do not add a hasOwnProperty check here, it affects performance + patchEvent(name, events[name], null, dom, lifecycle); + events[name] = null; + } + } + if (parentDom) { + removeChild(parentDom, dom); + } + if (recyclingEnabled && (parentDom || canRecycle)) { + poolElement(vNode); + } + } + function unmountChildren$1(children, lifecycle, shallowUnmount, isRecycling) { + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (!isInvalid(child) && isObject(child)) { + unmount(child, null, lifecycle, false, shallowUnmount, isRecycling); + } + } + } + else if (isObject(children)) { + unmount(children, null, lifecycle, false, shallowUnmount, isRecycling); + } + } + function unmountRef(ref) { + if (isFunction(ref)) { + ref(null); + } + else { + if (isInvalid(ref)) { + return; + } + if (false) { + throwError('string "refs" are not supported in Inferno 1.0. Use callback "refs" instead.'); + } + throwError(); + } + } + + function patch(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isRecycling) { + if (lastVNode !== nextVNode) { + var lastFlags = lastVNode.flags; + var nextFlags = nextVNode.flags; + if (nextFlags & 28 /* Component */) { + if (lastFlags & 28 /* Component */) { + patchComponent(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, nextFlags & 4 /* ComponentClass */, isRecycling); + } + else { + replaceVNode(parentDom, mountComponent(nextVNode, null, lifecycle, context, isSVG, nextFlags & 4 /* ComponentClass */), lastVNode, lifecycle, isRecycling); + } + } + else if (nextFlags & 3970 /* Element */) { + if (lastFlags & 3970 /* Element */) { + patchElement(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isRecycling); + } + else { + replaceVNode(parentDom, mountElement(nextVNode, null, lifecycle, context, isSVG), lastVNode, lifecycle, isRecycling); + } + } + else if (nextFlags & 1 /* Text */) { + if (lastFlags & 1 /* Text */) { + patchText(lastVNode, nextVNode); + } + else { + replaceVNode(parentDom, mountText(nextVNode, null), lastVNode, lifecycle, isRecycling); + } + } + else if (nextFlags & 4096 /* Void */) { + if (lastFlags & 4096 /* Void */) { + patchVoid(lastVNode, nextVNode); + } + else { + replaceVNode(parentDom, mountVoid(nextVNode, null), lastVNode, lifecycle, isRecycling); + } + } + else { + // Error case: mount new one replacing old one + replaceLastChildAndUnmount(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isRecycling); + } + } + } + function unmountChildren(children, dom, lifecycle, isRecycling) { + if (isVNode(children)) { + unmount(children, dom, lifecycle, true, false, isRecycling); + } + else if (isArray(children)) { + removeAllChildren(dom, children, lifecycle, false, isRecycling); + } + else { + dom.textContent = ''; + } + } + function patchElement(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isRecycling) { + var nextTag = nextVNode.type; + var lastTag = lastVNode.type; + if (lastTag !== nextTag) { + replaceWithNewNode(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isRecycling); + } + else { + var dom = lastVNode.dom; + var lastProps = lastVNode.props; + var nextProps = nextVNode.props; + var lastChildren = lastVNode.children; + var nextChildren = nextVNode.children; + var lastFlags = lastVNode.flags; + var nextFlags = nextVNode.flags; + var lastRef = lastVNode.ref; + var nextRef = nextVNode.ref; + var lastEvents = lastVNode.events; + var nextEvents = nextVNode.events; + nextVNode.dom = dom; + if (isSVG || (nextFlags & 128 /* SvgElement */)) { + isSVG = true; + } + if (lastChildren !== nextChildren) { + patchChildren(lastFlags, nextFlags, lastChildren, nextChildren, dom, lifecycle, context, isSVG, isRecycling); + } + if (!(nextFlags & 2 /* HtmlElement */)) { + processElement(nextFlags, nextVNode, dom); + } + if (lastProps !== nextProps) { + patchProps(lastProps, nextProps, dom, lifecycle, context, isSVG); + } + if (lastEvents !== nextEvents) { + patchEvents(lastEvents, nextEvents, dom, lifecycle); + } + if (nextRef) { + if (lastRef !== nextRef || isRecycling) { + mountRef(dom, nextRef, lifecycle); + } + } + } + } + function patchChildren(lastFlags, nextFlags, lastChildren, nextChildren, dom, lifecycle, context, isSVG, isRecycling) { + var patchArray = false; + var patchKeyed = false; + if (nextFlags & 64 /* HasNonKeyedChildren */) { + patchArray = true; + } + else if ((lastFlags & 32 /* HasKeyedChildren */) && (nextFlags & 32 /* HasKeyedChildren */)) { + patchKeyed = true; + patchArray = true; + } + else if (isInvalid(nextChildren)) { + unmountChildren(lastChildren, dom, lifecycle, isRecycling); + } + else if (isInvalid(lastChildren)) { + if (isStringOrNumber(nextChildren)) { + setTextContent(dom, nextChildren); + } + else { + if (isArray(nextChildren)) { + mountArrayChildren(nextChildren, dom, lifecycle, context, isSVG); + } + else { + mount(nextChildren, dom, lifecycle, context, isSVG); + } + } + } + else if (isStringOrNumber(nextChildren)) { + if (isStringOrNumber(lastChildren)) { + updateTextContent(dom, nextChildren); + } + else { + unmountChildren(lastChildren, dom, lifecycle, isRecycling); + setTextContent(dom, nextChildren); + } + } + else if (isArray(nextChildren)) { + if (isArray(lastChildren)) { + patchArray = true; + if (isKeyed(lastChildren, nextChildren)) { + patchKeyed = true; + } + } + else { + unmountChildren(lastChildren, dom, lifecycle, isRecycling); + mountArrayChildren(nextChildren, dom, lifecycle, context, isSVG); + } + } + else if (isArray(lastChildren)) { + removeAllChildren(dom, lastChildren, lifecycle, false, isRecycling); + mount(nextChildren, dom, lifecycle, context, isSVG); + } + else if (isVNode(nextChildren)) { + if (isVNode(lastChildren)) { + patch(lastChildren, nextChildren, dom, lifecycle, context, isSVG, isRecycling); + } + else { + unmountChildren(lastChildren, dom, lifecycle, isRecycling); + mount(nextChildren, dom, lifecycle, context, isSVG); + } + } + else if (isVNode(lastChildren)) { + } + else { + } + if (patchArray) { + if (patchKeyed) { + patchKeyedChildren(lastChildren, nextChildren, dom, lifecycle, context, isSVG, isRecycling); + } + else { + patchNonKeyedChildren(lastChildren, nextChildren, dom, lifecycle, context, isSVG, isRecycling); + } + } + } + function patchComponent(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isClass, isRecycling) { + var lastType = lastVNode.type; + var nextType = nextVNode.type; + var nextProps = nextVNode.props || EMPTY_OBJ; + var lastKey = lastVNode.key; + var nextKey = nextVNode.key; + if (lastType !== nextType) { + if (isClass) { + replaceWithNewNode(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isRecycling); + } + else { + var lastInput = lastVNode.children._lastInput || lastVNode.children; + var nextInput = createStatelessComponentInput(nextVNode, nextType, nextProps, context); + patch(lastInput, nextInput, parentDom, lifecycle, context, isSVG, isRecycling); + var dom = nextVNode.dom = nextInput.dom; + nextVNode.children = nextInput; + mountStatelessComponentCallbacks(nextVNode.ref, dom, lifecycle); + unmount(lastVNode, null, lifecycle, false, true, isRecycling); + } + } + else { + if (isClass) { + if (lastKey !== nextKey) { + replaceWithNewNode(lastVNode, nextVNode, parentDom, lifecycle, context, isSVG, isRecycling); + return false; + } + var instance = lastVNode.children; + if (instance._unmounted) { + if (isNull(parentDom)) { + return true; + } + replaceChild(parentDom, mountComponent(nextVNode, null, lifecycle, context, isSVG, nextVNode.flags & 4 /* ComponentClass */), lastVNode.dom); + } + else { + var defaultProps = nextType.defaultProps; + var lastProps = instance.props; + if (instance._devToolsStatus.connected && !instance._devToolsId) { + componentIdMap.set(instance._devToolsId = getIncrementalId(), instance); + } + lifecycle.fastUnmount = false; + if (!isUndefined(defaultProps)) { + copyPropsTo(lastProps, nextProps); + nextVNode.props = nextProps; + } + var lastState = instance.state; + var nextState = instance.state; + var childContext = instance.getChildContext(); + nextVNode.children = instance; + instance._isSVG = isSVG; + if (!isNullOrUndef(childContext)) { + childContext = Object.assign({}, context, childContext); + } + else { + childContext = context; + } + var lastInput$1 = instance._lastInput; + var nextInput$1 = instance._updateComponent(lastState, nextState, lastProps, nextProps, context, false); + var didUpdate = true; + instance._childContext = childContext; + if (isInvalid(nextInput$1)) { + nextInput$1 = createVoidVNode(); + } + else if (isArray(nextInput$1)) { + if (false) { + throwError('a valid Inferno VNode (or null) must be returned from a component render. You may have returned an array or an invalid object.'); + } + throwError(); + } + else if (nextInput$1 === NO_OP) { + nextInput$1 = lastInput$1; + didUpdate = false; + } + else if (isObject(nextInput$1) && nextInput$1.dom) { + nextInput$1 = cloneVNode(nextInput$1); + } + if (nextInput$1.flags & 28 /* Component */) { + nextInput$1.parentVNode = nextVNode; + } + else if (lastInput$1.flags & 28 /* Component */) { + lastInput$1.parentVNode = nextVNode; + } + instance._lastInput = nextInput$1; + instance._vNode = nextVNode; + if (didUpdate) { + var fastUnmount = lifecycle.fastUnmount; + var subLifecycle = instance._lifecycle; + lifecycle.fastUnmount = subLifecycle.fastUnmount; + patch(lastInput$1, nextInput$1, parentDom, lifecycle, childContext, isSVG, isRecycling); + subLifecycle.fastUnmount = lifecycle.unmount; + lifecycle.fastUnmount = fastUnmount; + instance.componentDidUpdate(lastProps, lastState); + findDOMNodeEnabled && componentToDOMNodeMap.set(instance, nextInput$1.dom); + } + nextVNode.dom = nextInput$1.dom; + } + } + else { + var shouldUpdate = true; + var lastProps$1 = lastVNode.props; + var nextHooks = nextVNode.ref; + var nextHooksDefined = !isNullOrUndef(nextHooks); + var lastInput$2 = lastVNode.children; + var nextInput$2 = lastInput$2; + nextVNode.dom = lastVNode.dom; + nextVNode.children = lastInput$2; + if (lastKey !== nextKey) { + shouldUpdate = true; + } + else { + if (nextHooksDefined && !isNullOrUndef(nextHooks.onComponentShouldUpdate)) { + shouldUpdate = nextHooks.onComponentShouldUpdate(lastProps$1, nextProps); + } + } + if (shouldUpdate !== false) { + if (nextHooksDefined && !isNullOrUndef(nextHooks.onComponentWillUpdate)) { + lifecycle.fastUnmount = false; + nextHooks.onComponentWillUpdate(lastProps$1, nextProps); + } + nextInput$2 = nextType(nextProps, context); + if (isInvalid(nextInput$2)) { + nextInput$2 = createVoidVNode(); + } + else if (isArray(nextInput$2)) { + if (false) { + throwError('a valid Inferno VNode (or null) must be returned from a component render. You may have returned an array or an invalid object.'); + } + throwError(); + } + else if (isObject(nextInput$2) && nextInput$2.dom) { + nextInput$2 = cloneVNode(nextInput$2); + } + if (nextInput$2 !== NO_OP) { + patch(lastInput$2, nextInput$2, parentDom, lifecycle, context, isSVG, isRecycling); + nextVNode.children = nextInput$2; + if (nextHooksDefined && !isNullOrUndef(nextHooks.onComponentDidUpdate)) { + lifecycle.fastUnmount = false; + nextHooks.onComponentDidUpdate(lastProps$1, nextProps); + } + nextVNode.dom = nextInput$2.dom; + } + } + if (nextInput$2.flags & 28 /* Component */) { + nextInput$2.parentVNode = nextVNode; + } + else if (lastInput$2.flags & 28 /* Component */) { + lastInput$2.parentVNode = nextVNode; + } + } + } + return false; + } + function patchText(lastVNode, nextVNode) { + var nextText = nextVNode.children; + var dom = lastVNode.dom; + nextVNode.dom = dom; + if (lastVNode.children !== nextText) { + dom.nodeValue = nextText; + } + } + function patchVoid(lastVNode, nextVNode) { + nextVNode.dom = lastVNode.dom; + } + function patchNonKeyedChildren(lastChildren, nextChildren, dom, lifecycle, context, isSVG, isRecycling) { + var lastChildrenLength = lastChildren.length; + var nextChildrenLength = nextChildren.length; + var commonLength = lastChildrenLength > nextChildrenLength ? nextChildrenLength : lastChildrenLength; + var i; + var nextNode = null; + var newNode; + // Loop backwards so we can use insertBefore + if (lastChildrenLength < nextChildrenLength) { + for (i = nextChildrenLength - 1; i >= commonLength; i--) { + var child = nextChildren[i]; + if (!isInvalid(child)) { + if (child.dom) { + nextChildren[i] = child = cloneVNode(child); + } + newNode = mount(child, null, lifecycle, context, isSVG); + insertOrAppend(dom, newNode, nextNode); + nextNode = newNode; + } + } + } + else if (nextChildrenLength === 0) { + removeAllChildren(dom, lastChildren, lifecycle, false, isRecycling); + } + else if (lastChildrenLength > nextChildrenLength) { + for (i = commonLength; i < lastChildrenLength; i++) { + var child$1 = lastChildren[i]; + if (!isInvalid(child$1)) { + unmount(lastChildren[i], dom, lifecycle, false, false, isRecycling); + } + } + } + for (i = commonLength - 1; i >= 0; i--) { + var lastChild = lastChildren[i]; + var nextChild = nextChildren[i]; + if (isInvalid(nextChild)) { + if (!isInvalid(lastChild)) { + unmount(lastChild, dom, lifecycle, true, false, isRecycling); + } + } + else { + if (nextChild.dom) { + nextChildren[i] = nextChild = cloneVNode(nextChild); + } + if (isInvalid(lastChild)) { + newNode = mount(nextChild, null, lifecycle, context, isSVG); + insertOrAppend(dom, newNode, nextNode); + nextNode = newNode; + } + else { + patch(lastChild, nextChild, dom, lifecycle, context, isSVG, isRecycling); + nextNode = nextChild.dom; + } + } + } + } + function patchKeyedChildren(a, b, dom, lifecycle, context, isSVG, isRecycling) { + var aLength = a.length; + var bLength = b.length; + var aEnd = aLength - 1; + var bEnd = bLength - 1; + var aStart = 0; + var bStart = 0; + var i; + var j; + var aNode; + var bNode; + var nextNode; + var nextPos; + var node; + if (aLength === 0) { + if (bLength !== 0) { + mountArrayChildren(b, dom, lifecycle, context, isSVG); + } + return; + } + else if (bLength === 0) { + removeAllChildren(dom, a, lifecycle, false, isRecycling); + return; + } + var aStartNode = a[aStart]; + var bStartNode = b[bStart]; + var aEndNode = a[aEnd]; + var bEndNode = b[bEnd]; + if (bStartNode.dom) { + b[bStart] = bStartNode = cloneVNode(bStartNode); + } + if (bEndNode.dom) { + b[bEnd] = bEndNode = cloneVNode(bEndNode); + } + // Step 1 + /* eslint no-constant-condition: 0 */ + outer: while (true) { + // Sync nodes with the same key at the beginning. + while (aStartNode.key === bStartNode.key) { + patch(aStartNode, bStartNode, dom, lifecycle, context, isSVG, isRecycling); + aStart++; + bStart++; + if (aStart > aEnd || bStart > bEnd) { + break outer; + } + aStartNode = a[aStart]; + bStartNode = b[bStart]; + if (bStartNode.dom) { + b[bStart] = bStartNode = cloneVNode(bStartNode); + } + } + // Sync nodes with the same key at the end. + while (aEndNode.key === bEndNode.key) { + patch(aEndNode, bEndNode, dom, lifecycle, context, isSVG, isRecycling); + aEnd--; + bEnd--; + if (aStart > aEnd || bStart > bEnd) { + break outer; + } + aEndNode = a[aEnd]; + bEndNode = b[bEnd]; + if (bEndNode.dom) { + b[bEnd] = bEndNode = cloneVNode(bEndNode); + } + } + // Move and sync nodes from right to left. + if (aEndNode.key === bStartNode.key) { + patch(aEndNode, bStartNode, dom, lifecycle, context, isSVG, isRecycling); + insertOrAppend(dom, bStartNode.dom, aStartNode.dom); + aEnd--; + bStart++; + aEndNode = a[aEnd]; + bStartNode = b[bStart]; + if (bStartNode.dom) { + b[bStart] = bStartNode = cloneVNode(bStartNode); + } + continue; + } + // Move and sync nodes from left to right. + if (aStartNode.key === bEndNode.key) { + patch(aStartNode, bEndNode, dom, lifecycle, context, isSVG, isRecycling); + nextPos = bEnd + 1; + nextNode = nextPos < b.length ? b[nextPos].dom : null; + insertOrAppend(dom, bEndNode.dom, nextNode); + aStart++; + bEnd--; + aStartNode = a[aStart]; + bEndNode = b[bEnd]; + if (bEndNode.dom) { + b[bEnd] = bEndNode = cloneVNode(bEndNode); + } + continue; + } + break; + } + if (aStart > aEnd) { + if (bStart <= bEnd) { + nextPos = bEnd + 1; + nextNode = nextPos < b.length ? b[nextPos].dom : null; + while (bStart <= bEnd) { + node = b[bStart]; + if (node.dom) { + b[bStart] = node = cloneVNode(node); + } + bStart++; + insertOrAppend(dom, mount(node, null, lifecycle, context, isSVG), nextNode); + } + } + } + else if (bStart > bEnd) { + while (aStart <= aEnd) { + unmount(a[aStart++], dom, lifecycle, false, false, isRecycling); + } + } + else { + aLength = aEnd - aStart + 1; + bLength = bEnd - bStart + 1; + var aNullable = a; + var sources = new Array(bLength); + // Mark all nodes as inserted. + for (i = 0; i < bLength; i++) { + sources[i] = -1; + } + var moved = false; + var pos = 0; + var patched = 0; + if ((bLength <= 4) || (aLength * bLength <= 16)) { + for (i = aStart; i <= aEnd; i++) { + aNode = a[i]; + if (patched < bLength) { + for (j = bStart; j <= bEnd; j++) { + bNode = b[j]; + if (aNode.key === bNode.key) { + sources[j - bStart] = i; + if (pos > j) { + moved = true; + } + else { + pos = j; + } + if (bNode.dom) { + b[j] = bNode = cloneVNode(bNode); + } + patch(aNode, bNode, dom, lifecycle, context, isSVG, isRecycling); + patched++; + aNullable[i] = null; + break; + } + } + } + } + } + else { + var keyIndex = new Map(); + for (i = bStart; i <= bEnd; i++) { + node = b[i]; + keyIndex.set(node.key, i); + } + for (i = aStart; i <= aEnd; i++) { + aNode = a[i]; + if (patched < bLength) { + j = keyIndex.get(aNode.key); + if (!isUndefined(j)) { + bNode = b[j]; + sources[j - bStart] = i; + if (pos > j) { + moved = true; + } + else { + pos = j; + } + if (bNode.dom) { + b[j] = bNode = cloneVNode(bNode); + } + patch(aNode, bNode, dom, lifecycle, context, isSVG, isRecycling); + patched++; + aNullable[i] = null; + } + } + } + } + if (aLength === a.length && patched === 0) { + removeAllChildren(dom, a, lifecycle, false, isRecycling); + while (bStart < bLength) { + node = b[bStart]; + if (node.dom) { + b[bStart] = node = cloneVNode(node); + } + bStart++; + insertOrAppend(dom, mount(node, null, lifecycle, context, isSVG), null); + } + } + else { + i = aLength - patched; + while (i > 0) { + aNode = aNullable[aStart++]; + if (!isNull(aNode)) { + unmount(aNode, dom, lifecycle, false, false, isRecycling); + i--; + } + } + if (moved) { + var seq = lis_algorithm(sources); + j = seq.length - 1; + for (i = bLength - 1; i >= 0; i--) { + if (sources[i] === -1) { + pos = i + bStart; + node = b[pos]; + if (node.dom) { + b[pos] = node = cloneVNode(node); + } + nextPos = pos + 1; + nextNode = nextPos < b.length ? b[nextPos].dom : null; + insertOrAppend(dom, mount(node, dom, lifecycle, context, isSVG), nextNode); + } + else { + if (j < 0 || i !== seq[j]) { + pos = i + bStart; + node = b[pos]; + nextPos = pos + 1; + nextNode = nextPos < b.length ? b[nextPos].dom : null; + insertOrAppend(dom, node.dom, nextNode); + } + else { + j--; + } + } + } + } + else if (patched !== bLength) { + for (i = bLength - 1; i >= 0; i--) { + if (sources[i] === -1) { + pos = i + bStart; + node = b[pos]; + if (node.dom) { + b[pos] = node = cloneVNode(node); + } + nextPos = pos + 1; + nextNode = nextPos < b.length ? b[nextPos].dom : null; + insertOrAppend(dom, mount(node, null, lifecycle, context, isSVG), nextNode); + } + } + } + } + } + } + // // https://en.wikipedia.org/wiki/Longest_increasing_subsequence + function lis_algorithm(a) { + var p = a.slice(0); + var result = []; + result.push(0); + var i; + var j; + var u; + var v; + var c; + for (i = 0; i < a.length; i++) { + if (a[i] === -1) { + continue; + } + j = result[result.length - 1]; + if (a[j] < a[i]) { + p[i] = j; + result.push(i); + continue; + } + u = 0; + v = result.length - 1; + while (u < v) { + c = ((u + v) / 2) | 0; + if (a[result[c]] < a[i]) { + u = c + 1; + } + else { + v = c; + } + } + if (a[i] < a[result[u]]) { + if (u > 0) { + p[i] = result[u - 1]; + } + result[u] = i; + } + } + u = result.length; + v = result[u - 1]; + while (u-- > 0) { + result[u] = v; + v = p[v]; + } + return result; + } + function patchProp(prop, lastValue, nextValue, dom, isSVG, lifecycle) { + if (skipProps[prop]) { + return; + } + if (booleanProps[prop]) { + dom[prop] = nextValue ? true : false; + } + else if (strictProps[prop]) { + var value = isNullOrUndef(nextValue) ? '' : nextValue; + if (dom[prop] !== value) { + dom[prop] = value; + } + } + else if (isAttrAnEvent(prop)) { + patchEvent(prop, lastValue, nextValue, dom, lifecycle); + } + else if (lastValue !== nextValue) { + if (isNullOrUndef(nextValue)) { + dom.removeAttribute(prop); + } + else if (prop === 'className') { + if (isSVG) { + dom.setAttribute('class', nextValue); + } + else { + dom.className = nextValue; + } + } + else if (prop === 'style') { + patchStyle(lastValue, nextValue, dom); + } + else if (prop === 'dangerouslySetInnerHTML') { + var lastHtml = lastValue && lastValue.__html; + var nextHtml = nextValue && nextValue.__html; + if (lastHtml !== nextHtml) { + if (!isNullOrUndef(nextHtml)) { + dom.innerHTML = nextHtml; + } + } + } + else if (prop !== 'childrenType' && prop !== 'ref' && prop !== 'key') { + var dehyphenProp = dehyphenProps[prop]; + var ns = namespaces[prop]; + if (ns) { + dom.setAttributeNS(ns, dehyphenProp || prop, nextValue); + } + else { + dom.setAttribute(dehyphenProp || prop, nextValue); + } + } + } + } + function patchEvents(lastEvents, nextEvents, dom, lifecycle) { + lastEvents = lastEvents || EMPTY_OBJ; + nextEvents = nextEvents || EMPTY_OBJ; + if (nextEvents !== EMPTY_OBJ) { + for (var name in nextEvents) { + // do not add a hasOwnProperty check here, it affects performance + patchEvent(name, lastEvents[name], nextEvents[name], dom, lifecycle); + } + } + if (lastEvents !== EMPTY_OBJ) { + for (var name$1 in lastEvents) { + // do not add a hasOwnProperty check here, it affects performance + if (isNullOrUndef(nextEvents[name$1])) { + patchEvent(name$1, lastEvents[name$1], null, dom, lifecycle); + } + } + } + } + function patchEvent(name, lastValue, nextValue, dom, lifecycle) { + if (lastValue !== nextValue) { + var nameLowerCase = name.toLowerCase(); + var domEvent = dom[nameLowerCase]; + // if the function is wrapped, that means it's been controlled by a wrapper + if (domEvent && domEvent.wrapped) { + return; + } + if (delegatedProps[name]) { + lifecycle.fastUnmount = false; + handleEvent(name, lastValue, nextValue, dom); + } + else { + dom[nameLowerCase] = nextValue; + } + } + } + function patchProps(lastProps, nextProps, dom, lifecycle, context, isSVG) { + lastProps = lastProps || EMPTY_OBJ; + nextProps = nextProps || EMPTY_OBJ; + if (nextProps !== EMPTY_OBJ) { + for (var prop in nextProps) { + // do not add a hasOwnProperty check here, it affects performance + var nextValue = nextProps[prop]; + var lastValue = lastProps[prop]; + if (isNullOrUndef(nextValue)) { + removeProp(prop, dom); + } + else { + patchProp(prop, lastValue, nextValue, dom, isSVG, lifecycle); + } + } + } + if (lastProps !== EMPTY_OBJ) { + for (var prop$1 in lastProps) { + // do not add a hasOwnProperty check here, it affects performance + if (isNullOrUndef(nextProps[prop$1])) { + removeProp(prop$1, dom); + } + } + } + } + // We are assuming here that we come from patchProp routine + // -nextAttrValue cannot be null or undefined + function patchStyle(lastAttrValue, nextAttrValue, dom) { + if (isString(nextAttrValue)) { + dom.style.cssText = nextAttrValue; + return; + } + for (var style in nextAttrValue) { + // do not add a hasOwnProperty check here, it affects performance + var value = nextAttrValue[style]; + if (isNumber(value) && !isUnitlessNumber[style]) { + dom.style[style] = value + 'px'; + } + else { + dom.style[style] = value; + } + } + if (!isNullOrUndef(lastAttrValue)) { + for (var style$1 in lastAttrValue) { + if (isNullOrUndef(nextAttrValue[style$1])) { + dom.style[style$1] = ''; + } + } + } + } + function removeProp(prop, dom) { + if (prop === 'className') { + dom.removeAttribute('class'); + } + else if (prop === 'value') { + dom.value = ''; + } + else if (prop === 'style') { + dom.style.cssText = null; + dom.removeAttribute('style'); + } + else if (delegatedProps[prop]) { + handleEvent(prop, null, null, dom); + } + else { + dom.removeAttribute(prop); + } + } + + var recyclingEnabled = true; + var componentPools = new Map(); + var elementPools = new Map(); + function disableRecycling() { + recyclingEnabled = false; + componentPools.clear(); + elementPools.clear(); + } + + function recycleElement(vNode, lifecycle, context, isSVG) { + var tag = vNode.type; + var key = vNode.key; + var pools = elementPools.get(tag); + if (!isUndefined(pools)) { + var pool = key === null ? pools.nonKeyed : pools.keyed.get(key); + if (!isUndefined(pool)) { + var recycledVNode = pool.pop(); + if (!isUndefined(recycledVNode)) { + patchElement(recycledVNode, vNode, null, lifecycle, context, isSVG, true); + return vNode.dom; + } + } + } + return null; + } + function poolElement(vNode) { + var tag = vNode.type; + var key = vNode.key; + var pools = elementPools.get(tag); + if (isUndefined(pools)) { + pools = { + nonKeyed: [], + keyed: new Map() + }; + elementPools.set(tag, pools); + } + if (isNull(key)) { + pools.nonKeyed.push(vNode); + } + else { + var pool = pools.keyed.get(key); + if (isUndefined(pool)) { + pool = []; + pools.keyed.set(key, pool); + } + pool.push(vNode); + } + } + function recycleComponent(vNode, lifecycle, context, isSVG) { + var type = vNode.type; + var key = vNode.key; + var pools = componentPools.get(type); + if (!isUndefined(pools)) { + var pool = key === null ? pools.nonKeyed : pools.keyed.get(key); + if (!isUndefined(pool)) { + var recycledVNode = pool.pop(); + if (!isUndefined(recycledVNode)) { + var flags = vNode.flags; + var failed = patchComponent(recycledVNode, vNode, null, lifecycle, context, isSVG, flags & 4 /* ComponentClass */, true); + if (!failed) { + return vNode.dom; + } + } + } + } + return null; + } + function poolComponent(vNode) { + var type = vNode.type; + var key = vNode.key; + var hooks = vNode.ref; + var nonRecycleHooks = hooks && (hooks.onComponentWillMount || + hooks.onComponentWillUnmount || + hooks.onComponentDidMount || + hooks.onComponentWillUpdate || + hooks.onComponentDidUpdate); + if (nonRecycleHooks) { + return; + } + var pools = componentPools.get(type); + if (isUndefined(pools)) { + pools = { + nonKeyed: [], + keyed: new Map() + }; + componentPools.set(type, pools); + } + if (isNull(key)) { + pools.nonKeyed.push(vNode); + } + else { + var pool = pools.keyed.get(key); + if (isUndefined(pool)) { + pool = []; + pools.keyed.set(key, pool); + } + pool.push(vNode); + } + } + + function mount(vNode, parentDom, lifecycle, context, isSVG) { + var flags = vNode.flags; + if (flags & 3970 /* Element */) { + return mountElement(vNode, parentDom, lifecycle, context, isSVG); + } + else if (flags & 28 /* Component */) { + return mountComponent(vNode, parentDom, lifecycle, context, isSVG, flags & 4 /* ComponentClass */); + } + else if (flags & 4096 /* Void */) { + return mountVoid(vNode, parentDom); + } + else if (flags & 1 /* Text */) { + return mountText(vNode, parentDom); + } + else { + if (false) { + throwError(("mount() expects a valid VNode, instead it received an object with the type \"" + (typeof vNode) + "\".")); + } + throwError(); + } + } + function mountText(vNode, parentDom) { + var dom = document.createTextNode(vNode.children); + vNode.dom = dom; + if (parentDom) { + appendChild(parentDom, dom); + } + return dom; + } + function mountVoid(vNode, parentDom) { + var dom = document.createTextNode(''); + vNode.dom = dom; + if (parentDom) { + appendChild(parentDom, dom); + } + return dom; + } + function mountElement(vNode, parentDom, lifecycle, context, isSVG) { + if (recyclingEnabled) { + var dom$1 = recycleElement(vNode, lifecycle, context, isSVG); + if (!isNull(dom$1)) { + if (!isNull(parentDom)) { + appendChild(parentDom, dom$1); + } + return dom$1; + } + } + var tag = vNode.type; + var flags = vNode.flags; + if (isSVG || (flags & 128 /* SvgElement */)) { + isSVG = true; + } + var dom = documentCreateElement(tag, isSVG); + var children = vNode.children; + var props = vNode.props; + var events = vNode.events; + var ref = vNode.ref; + vNode.dom = dom; + if (!isNull(children)) { + if (isStringOrNumber(children)) { + setTextContent(dom, children); + } + else if (isArray(children)) { + mountArrayChildren(children, dom, lifecycle, context, isSVG); + } + else if (isVNode(children)) { + mount(children, dom, lifecycle, context, isSVG); + } + } + if (!(flags & 2 /* HtmlElement */)) { + processElement(flags, vNode, dom); + } + if (!isNull(props)) { + for (var prop in props) { + // do not add a hasOwnProperty check here, it affects performance + patchProp(prop, null, props[prop], dom, isSVG, lifecycle); + } + } + if (!isNull(events)) { + for (var name in events) { + // do not add a hasOwnProperty check here, it affects performance + patchEvent(name, null, events[name], dom, lifecycle); + } + } + if (!isNull(ref)) { + mountRef(dom, ref, lifecycle); + } + if (!isNull(parentDom)) { + appendChild(parentDom, dom); + } + return dom; + } + function mountArrayChildren(children, dom, lifecycle, context, isSVG) { + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (!isInvalid(child)) { + if (child.dom) { + children[i] = child = cloneVNode(child); + } + mount(children[i], dom, lifecycle, context, isSVG); + } + } + } + function mountComponent(vNode, parentDom, lifecycle, context, isSVG, isClass) { + if (recyclingEnabled) { + var dom$1 = recycleComponent(vNode, lifecycle, context, isSVG); + if (!isNull(dom$1)) { + if (!isNull(parentDom)) { + appendChild(parentDom, dom$1); + } + return dom$1; + } + } + var type = vNode.type; + var props = vNode.props || EMPTY_OBJ; + var ref = vNode.ref; + var dom; + if (isClass) { + var defaultProps = type.defaultProps; + lifecycle.fastUnmount = false; + if (!isUndefined(defaultProps)) { + copyPropsTo(defaultProps, props); + vNode.props = props; + } + var instance = createStatefulComponentInstance(vNode, type, props, context, isSVG, devToolsStatus); + var input = instance._lastInput; + var fastUnmount = lifecycle.fastUnmount; + // we store the fastUnmount value, but we set it back to true on the lifecycle + // we do this so we can determine if the component render has a fastUnmount or not + lifecycle.fastUnmount = true; + instance._vNode = vNode; + vNode.dom = dom = mount(input, null, lifecycle, instance._childContext, isSVG); + // we now create a lifecycle for this component and store the fastUnmount value + var subLifecycle = instance._lifecycle = new Lifecycle(); + subLifecycle.fastUnmount = lifecycle.fastUnmount; + // we then set the lifecycle fastUnmount value back to what it was before the mount + lifecycle.fastUnmount = fastUnmount; + if (!isNull(parentDom)) { + appendChild(parentDom, dom); + } + mountStatefulComponentCallbacks(ref, instance, lifecycle); + findDOMNodeEnabled && componentToDOMNodeMap.set(instance, dom); + vNode.children = instance; + } + else { + var input$1 = createStatelessComponentInput(vNode, type, props, context); + vNode.dom = dom = mount(input$1, null, lifecycle, context, isSVG); + vNode.children = input$1; + mountStatelessComponentCallbacks(ref, dom, lifecycle); + if (!isNull(parentDom)) { + appendChild(parentDom, dom); + } + } + return dom; + } + function mountStatefulComponentCallbacks(ref, instance, lifecycle) { + if (ref) { + if (isFunction(ref)) { + ref(instance); + } + else { + if (false) { + throwError('string "refs" are not supported in Inferno 1.0. Use callback "refs" instead.'); + } + throwError(); + } + } + if (!isNull(instance.componentDidMount)) { + lifecycle.addListener(function () { + instance.componentDidMount(); + }); + } + } + function mountStatelessComponentCallbacks(ref, dom, lifecycle) { + if (ref) { + if (!isNullOrUndef(ref.onComponentWillMount)) { + lifecycle.fastUnmount = false; + ref.onComponentWillMount(); + } + if (!isNullOrUndef(ref.onComponentDidMount)) { + lifecycle.fastUnmount = false; + lifecycle.addListener(function () { return ref.onComponentDidMount(dom); }); + } + } + } + function mountRef(dom, value, lifecycle) { + if (isFunction(value)) { + lifecycle.fastUnmount = false; + lifecycle.addListener(function () { return value(dom); }); + } + else { + if (isInvalid(value)) { + return; + } + if (false) { + throwError('string "refs" are not supported in Inferno 1.0. Use callback "refs" instead.'); + } + throwError(); + } + } + + function copyPropsTo(copyFrom, copyTo) { + for (var prop in copyFrom) { + if (isUndefined(copyTo[prop])) { + copyTo[prop] = copyFrom[prop]; + } + } + } + function createStatefulComponentInstance(vNode, Component, props, context, isSVG, devToolsStatus) { + if (isUndefined(context)) { + context = {}; + } + var instance = new Component(props, context); + instance.context = context; + if (instance.props === EMPTY_OBJ) { + instance.props = props; + } + instance._patch = patch; + instance._devToolsStatus = devToolsStatus; + if (findDOMNodeEnabled) { + instance._componentToDOMNodeMap = componentToDOMNodeMap; + } + var childContext = instance.getChildContext(); + if (!isNullOrUndef(childContext)) { + instance._childContext = Object.assign({}, context, childContext); + } + else { + instance._childContext = context; + } + instance._unmounted = false; + instance._pendingSetState = true; + instance._isSVG = isSVG; + instance.componentWillMount(); + instance._beforeRender && instance._beforeRender(); + var input = instance.render(props, instance.state, context); + instance._afterRender && instance._afterRender(); + if (isArray(input)) { + if (false) { + throwError('a valid Inferno VNode (or null) must be returned from a component render. You may have returned an array or an invalid object.'); + } + throwError(); + } + else if (isInvalid(input)) { + input = createVoidVNode(); + } + else { + if (input.dom) { + input = cloneVNode(input); + } + if (input.flags & 28 /* Component */) { + // if we have an input that is also a component, we run into a tricky situation + // where the root vNode needs to always have the correct DOM entry + // so we break monomorphism on our input and supply it our vNode as parentVNode + // we can optimise this in the future, but this gets us out of a lot of issues + input.parentVNode = vNode; + } + } + instance._pendingSetState = false; + instance._lastInput = input; + return instance; + } + function replaceLastChildAndUnmount(lastInput, nextInput, parentDom, lifecycle, context, isSVG, isRecycling) { + replaceVNode(parentDom, mount(nextInput, null, lifecycle, context, isSVG), lastInput, lifecycle, isRecycling); + } + function replaceVNode(parentDom, dom, vNode, lifecycle, isRecycling) { + var shallowUnmount = false; + // we cannot cache nodeType here as vNode might be re-assigned below + if (vNode.flags & 28 /* Component */) { + // if we are accessing a stateful or stateless component, we want to access their last rendered input + // accessing their DOM node is not useful to us here + unmount(vNode, null, lifecycle, false, false, isRecycling); + vNode = vNode.children._lastInput || vNode.children; + shallowUnmount = true; + } + replaceChild(parentDom, dom, vNode.dom); + unmount(vNode, null, lifecycle, false, shallowUnmount, isRecycling); + } + function createStatelessComponentInput(vNode, component, props, context) { + var input = component(props, context); + if (isArray(input)) { + if (false) { + throwError('a valid Inferno VNode (or null) must be returned from a component render. You may have returned an array or an invalid object.'); + } + throwError(); + } + else if (isInvalid(input)) { + input = createVoidVNode(); + } + else { + if (input.dom) { + input = cloneVNode(input); + } + if (input.flags & 28 /* Component */) { + // if we have an input that is also a component, we run into a tricky situation + // where the root vNode needs to always have the correct DOM entry + // so we break monomorphism on our input and supply it our vNode as parentVNode + // we can optimise this in the future, but this gets us out of a lot of issues + input.parentVNode = vNode; + } + } + return input; + } + function setTextContent(dom, text) { + if (text !== '') { + dom.textContent = text; + } + else { + dom.appendChild(document.createTextNode('')); + } + } + function updateTextContent(dom, text) { + dom.firstChild.nodeValue = text; + } + function appendChild(parentDom, dom) { + parentDom.appendChild(dom); + } + function insertOrAppend(parentDom, newNode, nextNode) { + if (isNullOrUndef(nextNode)) { + appendChild(parentDom, newNode); + } + else { + parentDom.insertBefore(newNode, nextNode); + } + } + function documentCreateElement(tag, isSVG) { + if (isSVG === true) { + return document.createElementNS(svgNS, tag); + } + else { + return document.createElement(tag); + } + } + function replaceWithNewNode(lastNode, nextNode, parentDom, lifecycle, context, isSVG, isRecycling) { + unmount(lastNode, null, lifecycle, false, false, isRecycling); + var dom = mount(nextNode, null, lifecycle, context, isSVG); + nextNode.dom = dom; + replaceChild(parentDom, dom, lastNode.dom); + } + function replaceChild(parentDom, nextDom, lastDom) { + if (!parentDom) { + parentDom = lastDom.parentNode; + } + parentDom.replaceChild(nextDom, lastDom); + } + function removeChild(parentDom, dom) { + parentDom.removeChild(dom); + } + function removeAllChildren(dom, children, lifecycle, shallowUnmount, isRecycling) { + dom.textContent = ''; + if (!lifecycle.fastUnmount) { + removeChildren(null, children, lifecycle, shallowUnmount, isRecycling); + } + } + function removeChildren(dom, children, lifecycle, shallowUnmount, isRecycling) { + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (!isInvalid(child)) { + unmount(child, dom, lifecycle, true, shallowUnmount, isRecycling); + } + } + } + function isKeyed(lastChildren, nextChildren) { + return nextChildren.length && !isNullOrUndef(nextChildren[0]) && !isNullOrUndef(nextChildren[0].key) + && lastChildren.length && !isNullOrUndef(lastChildren[0]) && !isNullOrUndef(lastChildren[0].key); + } + + function normaliseChildNodes(dom) { + var rawChildNodes = dom.childNodes; + var length = rawChildNodes.length; + var i = 0; + while (i < length) { + var rawChild = rawChildNodes[i]; + if (rawChild.nodeType === 8) { + if (rawChild.data === '!') { + var placeholder = document.createTextNode(''); + dom.replaceChild(placeholder, rawChild); + i++; + } + else { + dom.removeChild(rawChild); + length--; + } + } + else { + i++; + } + } + } + function hydrateComponent(vNode, dom, lifecycle, context, isSVG, isClass) { + var type = vNode.type; + var props = vNode.props || {}; + var ref = vNode.ref; + vNode.dom = dom; + if (isClass) { + var _isSVG = dom.namespaceURI === svgNS; + var defaultProps = type.defaultProps; + lifecycle.fastUnmount = false; + if (!isUndefined(defaultProps)) { + copyPropsTo(defaultProps, props); + vNode.props = props; + } + var instance = createStatefulComponentInstance(vNode, type, props, context, _isSVG, devToolsStatus); + var input = instance._lastInput; + var fastUnmount = lifecycle.fastUnmount; + // we store the fastUnmount value, but we set it back to true on the lifecycle + // we do this so we can determine if the component render has a fastUnmount or not + lifecycle.fastUnmount = true; + instance._vComponent = vNode; + instance._vNode = vNode; + hydrate(input, dom, lifecycle, instance._childContext, _isSVG); + var subLifecycle = instance._lifecycle = new Lifecycle(); + subLifecycle.fastUnmount = lifecycle.fastUnmount; + // we then set the lifecycle fastUnmount value back to what it was before the mount + lifecycle.fastUnmount = fastUnmount; + mountStatefulComponentCallbacks(ref, instance, lifecycle); + findDOMNodeEnabled && componentToDOMNodeMap.set(instance, dom); + vNode.children = instance; + } + else { + var input$1 = createStatelessComponentInput(vNode, type, props, context); + hydrate(input$1, dom, lifecycle, context, isSVG); + vNode.children = input$1; + vNode.dom = input$1.dom; + mountStatelessComponentCallbacks(ref, dom, lifecycle); + } + } + function hydrateElement(vNode, dom, lifecycle, context, isSVG) { + var tag = vNode.type; + var children = vNode.children; + var props = vNode.props; + var events = vNode.events; + var flags = vNode.flags; + if (isSVG || (flags & 128 /* SvgElement */)) { + isSVG = true; + } + if (dom.nodeType !== 1 || dom.tagName.toLowerCase() !== tag) { + var newDom = mountElement(vNode, null, lifecycle, context, isSVG); + vNode.dom = newDom; + replaceChild(dom.parentNode, newDom, dom); + } + else { + vNode.dom = dom; + if (children) { + hydrateChildren(children, dom, lifecycle, context, isSVG); + } + if (!(flags & 2 /* HtmlElement */)) { + processElement(flags, vNode, dom); + } + for (var prop in props) { + patchProp(prop, null, props[prop], dom, isSVG, lifecycle); + } + for (var name in events) { + patchEvent(name, null, events[name], dom, lifecycle); + } + } + } + function hydrateChildren(children, dom, lifecycle, context, isSVG) { + normaliseChildNodes(dom); + var domNodes = Array.prototype.slice.call(dom.childNodes); + var childNodeIndex = 0; + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (isObject(child) && !isNull(child)) { + hydrate(child, domNodes[childNodeIndex++], lifecycle, context, isSVG); + } + } + } + else if (isObject(children)) { + hydrate(children, dom.firstChild, lifecycle, context, isSVG); + } + } + function hydrateText(vNode, dom) { + if (dom.nodeType === 3) { + var newDom = mountText(vNode, null); + vNode.dom = newDom; + replaceChild(dom.parentNode, newDom, dom); + } + else { + vNode.dom = dom; + } + } + function hydrateVoid(vNode, dom) { + vNode.dom = dom; + } + function hydrate(vNode, dom, lifecycle, context, isSVG) { + if (false) { + if (isInvalid(dom)) { + throwError("failed to hydrate. The server-side render doesn't match client side."); + } + } + var flags = vNode.flags; + if (flags & 28 /* Component */) { + return hydrateComponent(vNode, dom, lifecycle, context, isSVG, flags & 4 /* ComponentClass */); + } + else if (flags & 3970 /* Element */) { + return hydrateElement(vNode, dom, lifecycle, context, isSVG); + } + else if (flags & 1 /* Text */) { + return hydrateText(vNode, dom); + } + else if (flags & 4096 /* Void */) { + return hydrateVoid(vNode, dom); + } + else { + if (false) { + throwError(("hydrate() expects a valid VNode, instead it received an object with the type \"" + (typeof vNode) + "\".")); + } + throwError(); + } + } + function hydrateRoot(input, parentDom, lifecycle) { + if (parentDom && parentDom.nodeType === 1 && parentDom.firstChild) { + hydrate(input, parentDom.firstChild, lifecycle, {}, false); + return true; + } + return false; + } + + // rather than use a Map, like we did before, we can use an array here + // given there shouldn't be THAT many roots on the page, the difference + // in performance is huge: https://esbench.com/bench/5802a691330ab09900a1a2da + var roots = []; + var componentToDOMNodeMap = new Map(); + var findDOMNodeEnabled = false; + function enableFindDOMNode() { + findDOMNodeEnabled = true; + } + function findDOMNode(ref) { + if (!findDOMNodeEnabled) { + if (false) { + throwError('findDOMNode() has been disabled, use enableFindDOMNode() enabled findDOMNode(). Warning this can significantly impact performance!'); + } + throwError(); + } + var dom = ref && ref.nodeType ? ref : null; + return componentToDOMNodeMap.get(ref) || dom; + } + function getRoot(dom) { + for (var i = 0; i < roots.length; i++) { + var root = roots[i]; + if (root.dom === dom) { + return root; + } + } + return null; + } + function setRoot(dom, input, lifecycle) { + roots.push({ + dom: dom, + input: input, + lifecycle: lifecycle + }); + } + function removeRoot(root) { + for (var i = 0; i < roots.length; i++) { + if (roots[i] === root) { + roots.splice(i, 1); + return; + } + } + } + var documentBody = isBrowser ? document.body : null; + function render(input, parentDom) { + if (documentBody === parentDom) { + if (false) { + throwError('you cannot render() to the "document.body". Use an empty element as a container instead.'); + } + throwError(); + } + if (input === NO_OP) { + return; + } + var root = getRoot(parentDom); + if (isNull(root)) { + var lifecycle = new Lifecycle(); + if (!isInvalid(input)) { + if (input.dom) { + input = cloneVNode(input); + } + if (!hydrateRoot(input, parentDom, lifecycle)) { + mount(input, parentDom, lifecycle, {}, false); + } + lifecycle.trigger(); + setRoot(parentDom, input, lifecycle); + } + } + else { + var lifecycle$1 = root.lifecycle; + lifecycle$1.listeners = []; + if (isNullOrUndef(input)) { + unmount(root.input, parentDom, lifecycle$1, false, false, false); + removeRoot(root); + } + else { + if (input.dom) { + input = cloneVNode(input); + } + patch(root.input, input, parentDom, lifecycle$1, {}, false, false); + } + lifecycle$1.trigger(); + root.input = input; + } + if (devToolsStatus.connected) { + sendRoots(window); + } + } + function createRenderer() { + var parentDom; + return function renderer(lastInput, nextInput) { + if (!parentDom) { + parentDom = lastInput; + } + render(nextInput, parentDom); + }; + } + + function linkEvent(data, event) { + return { data: data, event: event }; + } + + if (isBrowser) { + window.process = { + env: { + NODE_ENV: 'development' + } + }; + initDevToolsHooks(window); + } + + if (false) { + var testFunc = function testFn() {}; + warning( + (testFunc.name || testFunc.toString()).indexOf('testFn') !== -1, + 'It looks like you\'re using a minified copy of the development build ' + + 'of Inferno. When deploying Inferno apps to production, make sure to use ' + + 'the production build which skips development warnings and is faster. ' + + 'See http://infernojs.org for more details.' + ); + } + + // we duplicate it so it plays nicely with different module loading systems + var index = { + linkEvent: linkEvent, + // core shapes + createVNode: createVNode, + + // cloning + cloneVNode: cloneVNode, + + // used to shared common items between Inferno libs + NO_OP: NO_OP, + EMPTY_OBJ: EMPTY_OBJ, + + //DOM + render: render, + findDOMNode: findDOMNode, + createRenderer: createRenderer, + disableRecycling: disableRecycling, + enableFindDOMNode: enableFindDOMNode + }; + + exports['default'] = index; + exports.linkEvent = linkEvent; + exports.createVNode = createVNode; + exports.cloneVNode = cloneVNode; + exports.NO_OP = NO_OP; + exports.EMPTY_OBJ = EMPTY_OBJ; + exports.render = render; + exports.findDOMNode = findDOMNode; + exports.createRenderer = createRenderer; + exports.disableRecycling = disableRecycling; + exports.enableFindDOMNode = enableFindDOMNode; + + Object.defineProperty(exports, '__esModule', { value: true }); + + }))); + + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(4); + + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + + /*! + * inferno-component v1.0.0-beta32 + * (c) 2016 Dominic Gannaway + * Released under the MIT License. + */ + (function (global, factory) { + true ? module.exports = factory(__webpack_require__(2)) : + typeof define === 'function' && define.amd ? define(['inferno'], factory) : + (global.Inferno = global.Inferno || {}, global.Inferno.Component = factory(global.Inferno)); + }(this, (function (inferno) { 'use strict'; + + var ERROR_MSG = 'a runtime error occured! Use Inferno in development environment to find the error.'; + + + // this is MUCH faster than .constructor === Array and instanceof Array + // in Node 7 and the later versions of V8, slower in older versions though + var isArray = Array.isArray; + + + function isNullOrUndef(obj) { + return isUndefined(obj) || isNull(obj); + } + function isInvalid(obj) { + return isNull(obj) || obj === false || isTrue(obj) || isUndefined(obj); + } + function isFunction(obj) { + return typeof obj === 'function'; + } + + + + function isNull(obj) { + return obj === null; + } + function isTrue(obj) { + return obj === true; + } + function isUndefined(obj) { + return obj === undefined; + } + + function throwError(message) { + if (!message) { + message = ERROR_MSG; + } + throw new Error(("Inferno Error: " + message)); + } + + var Lifecycle = function Lifecycle() { + this.listeners = []; + this.fastUnmount = true; + }; + Lifecycle.prototype.addListener = function addListener (callback) { + this.listeners.push(callback); + }; + Lifecycle.prototype.trigger = function trigger () { + var this$1 = this; + + for (var i = 0; i < this.listeners.length; i++) { + this$1.listeners[i](); + } + }; + + var noOp = ERROR_MSG; + if (false) { + noOp = 'Inferno Error: Can only update a mounted or mounting component. This usually means you called setState() or forceUpdate() on an unmounted component. This is a no-op.'; + } + var componentCallbackQueue = new Map(); + // when a components root VNode is also a component, we can run into issues + // this will recursively look for vNode.parentNode if the VNode is a component + function updateParentComponentVNodes(vNode, dom) { + if (vNode.flags & 28 /* Component */) { + var parentVNode = vNode.parentVNode; + if (parentVNode) { + parentVNode.dom = dom; + updateParentComponentVNodes(parentVNode, dom); + } + } + } + // this is in shapes too, but we don't want to import from shapes as it will pull in a duplicate of createVNode + function createVoidVNode() { + return inferno.createVNode(4096 /* Void */); + } + function addToQueue(component, force, callback) { + // TODO this function needs to be revised and improved on + var queue = componentCallbackQueue.get(component); + if (!queue) { + queue = []; + componentCallbackQueue.set(component, queue); + Promise.resolve().then(function () { + applyState(component, force, function () { + for (var i = 0; i < queue.length; i++) { + queue[i](); + } + }); + componentCallbackQueue.delete(component); + component._processingSetState = false; + }); + } + if (callback) { + queue.push(callback); + } + } + function queueStateChanges(component, newState, callback) { + if (isFunction(newState)) { + newState = newState(component.state); + } + for (var stateKey in newState) { + component._pendingState[stateKey] = newState[stateKey]; + } + if (!component._pendingSetState) { + if (component._processingSetState || callback) { + addToQueue(component, false, callback); + } + else { + component._pendingSetState = true; + component._processingSetState = true; + applyState(component, false, callback); + component._processingSetState = false; + } + } + else { + component.state = Object.assign({}, component.state, component._pendingState); + component._pendingState = {}; + } + } + function applyState(component, force, callback) { + if ((!component._deferSetState || force) && !component._blockRender) { + component._pendingSetState = false; + var pendingState = component._pendingState; + var prevState = component.state; + var nextState = Object.assign({}, prevState, pendingState); + var props = component.props; + var context = component.context; + component._pendingState = {}; + var nextInput = component._updateComponent(prevState, nextState, props, props, context, force); + var didUpdate = true; + if (isInvalid(nextInput)) { + nextInput = createVoidVNode(); + } + else if (isArray(nextInput)) { + if (false) { + throwError('a valid Inferno VNode (or null) must be returned from a component render. You may have returned an array or an invalid object.'); + } + throwError(); + } + else if (nextInput === inferno.NO_OP) { + nextInput = component._lastInput; + didUpdate = false; + } + var lastInput = component._lastInput; + var parentDom = lastInput.dom.parentNode; + component._lastInput = nextInput; + if (didUpdate) { + var subLifecycle = component._lifecycle; + if (!subLifecycle) { + subLifecycle = new Lifecycle(); + } + else { + subLifecycle.listeners = []; + } + component._lifecycle = subLifecycle; + var childContext = component.getChildContext(); + if (!isNullOrUndef(childContext)) { + childContext = Object.assign({}, context, component._childContext, childContext); + } + else { + childContext = Object.assign({}, context, component._childContext); + } + component._patch(lastInput, nextInput, parentDom, subLifecycle, childContext, component._isSVG, false); + subLifecycle.trigger(); + component.componentDidUpdate(props, prevState); + } + var vNode = component._vNode; + var dom = vNode.dom = nextInput.dom; + var componentToDOMNodeMap = component._componentToDOMNodeMap; + componentToDOMNodeMap && componentToDOMNodeMap.set(component, nextInput.dom); + updateParentComponentVNodes(vNode, dom); + if (!isNullOrUndef(callback)) { + callback(); + } + } + } + var Component$1 = function Component$1(props, context) { + this.state = {}; + this.refs = {}; + this._processingSetState = false; + this._blockRender = false; + this._ignoreSetState = false; + this._blockSetState = false; + this._deferSetState = false; + this._pendingSetState = false; + this._pendingState = {}; + this._lastInput = null; + this._vNode = null; + this._unmounted = true; + this._devToolsStatus = null; + this._devToolsId = null; + this._lifecycle = null; + this._childContext = null; + this._patch = null; + this._isSVG = false; + this._componentToDOMNodeMap = null; + /** @type {object} */ + this.props = props || inferno.EMPTY_OBJ; + /** @type {object} */ + this.context = context || {}; + if (!this.componentDidMount) { + this.componentDidMount = null; + } + }; + Component$1.prototype.render = function render (nextProps, nextState, nextContext) { + }; + Component$1.prototype.forceUpdate = function forceUpdate (callback) { + if (this._unmounted) { + throw Error(noOp); + } + applyState(this, true, callback); + }; + Component$1.prototype.setState = function setState (newState, callback) { + if (this._unmounted) { + throw Error(noOp); + } + if (!this._blockSetState) { + if (!this._ignoreSetState) { + queueStateChanges(this, newState, callback); + } + } + else { + if (false) { + throwError('cannot update state via setState() in componentWillUpdate().'); + } + throwError(); + } + }; + Component$1.prototype.componentWillMount = function componentWillMount () { + }; + Component$1.prototype.componentDidMount = function componentDidMount () { + }; + Component$1.prototype.componentWillUnmount = function componentWillUnmount () { + }; + Component$1.prototype.componentDidUpdate = function componentDidUpdate (prevProps, prevState, prevContext) { + }; + Component$1.prototype.shouldComponentUpdate = function shouldComponentUpdate (nextProps, nextState, context) { + return true; + }; + Component$1.prototype.componentWillReceiveProps = function componentWillReceiveProps (nextProps, context) { + }; + Component$1.prototype.componentWillUpdate = function componentWillUpdate (nextProps, nextState, nextContext) { + }; + Component$1.prototype.getChildContext = function getChildContext () { + }; + Component$1.prototype._updateComponent = function _updateComponent (prevState, nextState, prevProps, nextProps, context, force) { + if (this._unmounted === true) { + if (false) { + throwError(noOp); + } + throwError(); + } + if ((prevProps !== nextProps || nextProps === inferno.EMPTY_OBJ) || prevState !== nextState || force) { + if (prevProps !== nextProps || nextProps === inferno.EMPTY_OBJ) { + this._blockRender = true; + this.componentWillReceiveProps(nextProps, context); + this._blockRender = false; + if (this._pendingSetState) { + nextState = Object.assign({}, nextState, this._pendingState); + this._pendingSetState = false; + this._pendingState = {}; + } + } + var shouldUpdate = this.shouldComponentUpdate(nextProps, nextState, context); + if (shouldUpdate !== false || force) { + this._blockSetState = true; + this.componentWillUpdate(nextProps, nextState, context); + this._blockSetState = false; + this.props = nextProps; + var state = this.state = nextState; + this.context = context; + this._beforeRender && this._beforeRender(); + var render = this.render(nextProps, state, context); + this._afterRender && this._afterRender(); + return render; + } + } + return inferno.NO_OP; + }; + + return Component$1; + + }))); + + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.read = read; + exports.assign = assign; + exports.isEqual = isEqual; + /** + * Shared funcs/values + */ + + var ENTER = exports.ENTER = 13; + var ESCAPE = exports.ESCAPE = 27; + + var filters = exports.filters = { + all: function all(t) { + return true; + }, + active: function active(t) { + return !t.completed; + }, + completed: function completed(t) { + return t.completed; + } + }; + + /** + * Read the `location.hash` value + * @return {String} + */ + function read() { + return location.hash.replace('#/', '') || 'all'; + } + + /** + * Modified `Object.assign` shim + * - always writes to new object + * @return {Object} + */ + function assign() { + var src = void 0; + var tar = {}; + for (var s = 0; s < arguments.length; s++) { + src = Object(arguments[s]); + for (var k in src) { + tar[k] = src[k]; + } + } + return tar; + } + + /** + * Are two Objects equal values? + * @param {Object} a + * @param {Object} b + * @return {Boolean} + */ + function isEqual(a, b) { + // Create arrays of property names + var aProps = Object.getOwnPropertyNames(a); + var bProps = Object.getOwnPropertyNames(b); + + if (aProps.length !== bProps.length) return false; + + for (var i = 0; i < aProps.length; i++) { + var k = aProps[i]; + if (a[k] !== b[k]) return false; + } + + return true; + } + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + exports.links = undefined; + exports.Head = Head; + exports.Foot = Foot; + + var _inferno = __webpack_require__(1); + + var _inferno2 = _interopRequireDefault(_inferno); + + var _share = __webpack_require__(5); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + /** + * Stateless Header component + */ + function Head(_ref) { + var onEnter = _ref.onEnter; + + return _inferno2.default.createVNode(2, 'header', { + 'className': 'header' + }, [_inferno2.default.createVNode(2, 'h1', null, 'todos'), _inferno2.default.createVNode(512, 'input', { + 'className': 'new-todo', + 'autofocus': true, + 'autocomplete': 'off', + 'placeholder': 'What needs to be done?' + }, null, { + 'onkeydown': onEnter + })]); + } + + var links = exports.links = [{ hash: '#/', name: 'All' }, { hash: '#/active', name: 'Active' }, { hash: '#/completed', name: 'Completed' }]; + + /** + * Stateless Footer component + */ + function Foot(_ref2) { + var left = _ref2.left, + done = _ref2.done, + route = _ref2.route, + onClear = _ref2.onClear; + + return _inferno2.default.createVNode(2, 'footer', { + 'className': 'footer' + }, [_inferno2.default.createVNode(2, 'span', { + 'className': 'todo-count' + }, [_inferno2.default.createVNode(2, 'strong', null, left), ' ', left > 1 ? 'items' : 'item', ' left']), _inferno2.default.createVNode(2, 'ul', { + 'className': 'filters' + }, links.map(function (_ref3) { + var hash = _ref3.hash, + name = _ref3.name; + return _inferno2.default.createVNode(2, 'li', null, _inferno2.default.createVNode(2, 'a', { + 'href': hash, + 'className': name.toLowerCase() === route ? 'selected' : '' + }, name)); + })), done > 0 ? _inferno2.default.createVNode(2, 'button', { + 'className': 'clear-completed' + }, 'Clear completed', { + 'onClick': onClear + }) : null]); + } + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + var _share = __webpack_require__(5); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var STOR = window.localStorage; + var STOR_ID = 'todos-inferno'; + + var Model = function Model() { + var _this = this; + + _classCallCheck(this, Model); + + this.get = function () { + return _this.data = JSON.parse(STOR.getItem(STOR_ID) || '[]'); + }; + + this.set = function (arr) { + _this.data = arr || _this.data || []; + STOR.setItem(STOR_ID, JSON.stringify(_this.data)); + return _this.data; + }; + + this.add = function (str) { + return _this.set(_this.data.concat({ title: str, completed: false })); + }; + + this.put = function (todo, obj) { + return _this.set(_this.data.map(function (t) { + return (0, _share.isEqual)(t, todo) ? (0, _share.assign)(todo, obj) : t; + })); + }; + + this.del = function (todo) { + return _this.set(_this.data.filter(function (t) { + return !(0, _share.isEqual)(t, todo); + })); + }; + + this.toggle = function (todo) { + return _this.put(todo, { completed: !todo.completed }); + }; + + this.toggleAll = function (completed) { + return _this.set(_this.data.map(function (t) { + return _extends({}, t, { completed: completed }); + })); + }; + + this.clearCompleted = function () { + return _this.set(_this.data.filter(function (t) { + return !t.completed; + })); + }; + }; + + exports.default = Model; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _inferno = __webpack_require__(1); + + var _inferno2 = _interopRequireDefault(_inferno); + + var _infernoComponent = __webpack_require__(3); + + var _infernoComponent2 = _interopRequireDefault(_infernoComponent); + + var _share = __webpack_require__(5); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var Item = function (_Component) { + _inherits(Item, _Component); + + function Item(_ref) { + var data = _ref.data, + props = _objectWithoutProperties(_ref, ['data']); + + _classCallCheck(this, Item); + + var _this = _possibleConstructorReturn(this, _Component.call(this, props)); + + _initialiseProps.call(_this); + + _this.todo = data; + _this.state = { text: data.title }; + _this.editor = null; + return _this; + } + + Item.prototype.render = function render(_ref2, _ref3) { + var _this2 = this; + + var doToggle = _ref2.doToggle, + doDelete = _ref2.doDelete, + doSave = _ref2.doSave, + onBlur = _ref2.onBlur, + onFocus = _ref2.onFocus; + var text = _ref3.text; + var _todo = this.todo, + title = _todo.title, + completed = _todo.completed, + editing = _todo.editing; + + + var cls = []; + editing && cls.push('editing'); + completed && cls.push('completed'); + + var handleKeydown = function handleKeydown(e) { + if (e.which === _share.ESCAPE) return onBlur(); + if (e.which === _share.ENTER) return doSave(text); + }; + + // tmp fix + var handleBlur = function handleBlur() { + return doSave(text); + }; + var handleInput = function handleInput(e) { + return _this2.setText(e.target.value); + }; + + return _inferno2.default.createVNode(2, 'li', { + 'className': cls.join(' ') + }, [_inferno2.default.createVNode(2, 'div', { + 'className': 'view' + }, [_inferno2.default.createVNode(512, 'input', { + 'className': 'toggle', + 'type': 'checkbox', + 'checked': completed + }, null, { + 'onClick': doToggle + }), _inferno2.default.createVNode(2, 'label', null, title, { + 'ondblclick': onFocus + }), _inferno2.default.createVNode(2, 'button', { + 'className': 'destroy' + }, null, { + 'onClick': doDelete + })]), _inferno2.default.createVNode(512, 'input', { + 'className': 'edit', + 'value': editing && text + }, null, { + 'onblur': handleBlur, + 'oninput': handleInput, + 'onkeydown': handleKeydown + }, null, function (el) { + _this2.editor = el; + })]); + }; + + return Item; + }(_infernoComponent2.default); + + var _initialiseProps = function _initialiseProps() { + var _this3 = this; + + this.componentWillReceiveProps = function (_ref4) { + var data = _ref4.data; + return _this3.setText(data.title); + }; + + this.shouldComponentUpdate = function (_ref5, _ref6) { + var data = _ref5.data; + var text = _ref6.text; + return !((0, _share.isEqual)(data, _this3.todo) && text === _this3.state.text); + }; + + this.componentWillUpdate = function (_ref7) { + var data = _ref7.data; + return _this3.todo = data; + }; + + this.componentDidUpdate = function () { + return _this3.editor.focus(); + }; + + this.setText = function (text) { + return _this3.setState({ text: text }); + }; + }; + + exports.default = Item; + +/***/ }) +/******/ ]); \ No newline at end of file diff --git a/bench/implementations/inferno/index.html b/bench/implementations/inferno/index.html new file mode 100644 index 0000000..eac678f --- /dev/null +++ b/bench/implementations/inferno/index.html @@ -0,0 +1,20 @@ + + + + + Inferno • TodoMVC + + + + +
+ + + + + + diff --git a/bench/implementations/inferno/package.json b/bench/implementations/inferno/package.json new file mode 100644 index 0000000..075ed52 --- /dev/null +++ b/bench/implementations/inferno/package.json @@ -0,0 +1,24 @@ +{ + "private": true, + "scripts": { + "dev": "webpack-dev-server", + "build": "webpack -p", + "test": "cd test && npm test" + }, + "dependencies": { + "inferno": "beta32", + "inferno-component": "beta32", + "todomvc-app-css": "^2.0.0", + "todomvc-common": "^1.0.0" + }, + "devDependencies": { + "babel-core": "^6.5.2", + "babel-loader": "^6.2.1", + "babel-plugin-inferno": "beta13", + "babel-preset-es2015": "^6.5.0", + "babel-preset-es2015-loose": "^7.0.0", + "babel-preset-stage-0": "^6.5.0", + "webpack": "^1.12.14", + "webpack-dev-server": "^1.14.1" + } +} diff --git a/bench/implementations/inferno/src/base.js b/bench/implementations/inferno/src/base.js new file mode 100644 index 0000000..c517d91 --- /dev/null +++ b/bench/implementations/inferno/src/base.js @@ -0,0 +1,49 @@ +import Inferno from 'inferno'; +import { states } from './share'; + +/** + * Stateless Header component + */ +export function Head({onEnter}) { + return ( +
+

todos

+ +
+ ); +} + +export const links = [ + {hash: '#/', name: 'All'}, + {hash: '#/active', name: 'Active'}, + {hash: '#/completed', name: 'Completed'} +]; + +/** + * Stateless Footer component + */ +export function Foot({left, done, route, onClear}) { + return ( + + ); +} diff --git a/bench/implementations/inferno/src/index.js b/bench/implementations/inferno/src/index.js new file mode 100644 index 0000000..a805ae3 --- /dev/null +++ b/bench/implementations/inferno/src/index.js @@ -0,0 +1,112 @@ +import Inferno from 'inferno'; +import Component from 'inferno-component'; +import { ENTER, filters, read } from './share'; +import { Head, Foot } from './base'; +import Model from './model'; +import Item from './item'; + +const { render } = Inferno; +const model = new Model(); + +class App extends Component { + state = { + route: read(), + todos: model.get() + }; + + update = arr => this.setState({todos: arr}); + + componentWillMount = () => { + window.onhashchange = () => this.setState({route: read()}); + }; + + add = e => { + if (e.which !== ENTER) return; + + const val = e.target.value.trim(); + if (!val) return; + + e.target.value = ''; + this.update( + model.add(val) + ); + }; + + edit = (todo, val) => { + val = val.trim(); + if (val.length) { + this.update( + model.put(todo, {title: val, editing: 0}) + ); + } else { + this.remove(todo); + } + }; + + focus = todo => this.update( + model.put(todo, {editing: 1}) + ); + + blur = todo => this.update( + model.put(todo, {editing: 0}) + ); + + remove = todo => this.update( + model.del(todo) + ); + + toggleOne = todo => this.update( + model.toggle(todo) + ); + + toggleAll = ev => this.update( + model.toggleAll(ev.target.checked) + ); + + clearCompleted = () => this.update( + model.clearCompleted() + ); + + render(_, {todos, route}) { + const num = todos.length; + const shown = todos.filter(filters[route]); + const numDone = todos.filter(filters.completed).length; + const numAct = num - numDone; + + return ( +
+ + + { num ? ( +
+ + + +
+ ) : null } + + { (numAct || numDone) ? ( + + ) : null } +
+ ) + } +} + +render(, document.getElementById('app')); diff --git a/bench/implementations/inferno/src/item.js b/bench/implementations/inferno/src/item.js new file mode 100644 index 0000000..5b97227 --- /dev/null +++ b/bench/implementations/inferno/src/item.js @@ -0,0 +1,58 @@ +import Inferno from 'inferno'; +import Component from 'inferno-component'; +import { ESCAPE, ENTER, isEqual } from './share'; + +export default class Item extends Component { + constructor({data, ...props}) { + super(props); + this.todo = data; + this.state = {text: data.title}; + this.editor = null; + } + + componentWillReceiveProps = ({data}) => this.setText(data.title); + shouldComponentUpdate = ({data}, {text}) => !(isEqual(data, this.todo) && text === this.state.text); + componentWillUpdate = ({data}) => (this.todo = data); + componentDidUpdate = () => this.editor.focus(); + + setText = text => this.setState({text}); + + render({doToggle, doDelete, doSave, onBlur, onFocus}, {text}) { + const {title, completed, editing} = this.todo; + + const cls = []; + editing && cls.push('editing'); + completed && cls.push('completed'); + + const handleKeydown = e => { + if (e.which === ESCAPE) return onBlur(); + if (e.which === ENTER) return doSave(text); + }; + + // tmp fix + const handleBlur = () => doSave(text); + const handleInput = e => this.setText(e.target.value); + + return ( +
  • +
    + + + + + +
    + + { this.editor = el }} + value={ editing && text } + onblur={ handleBlur } + oninput={ handleInput } + onkeydown={ handleKeydown } + /> +
  • + ); + } +} diff --git a/bench/implementations/inferno/src/model.js b/bench/implementations/inferno/src/model.js new file mode 100644 index 0000000..1d73064 --- /dev/null +++ b/bench/implementations/inferno/src/model.js @@ -0,0 +1,36 @@ +import { assign, isEqual } from './share'; + +const STOR = window.localStorage; +const STOR_ID = 'todos-inferno'; + +export default class Model { + get = () => (this.data = JSON.parse(STOR.getItem(STOR_ID) || '[]')) + + set = arr => { + this.data = arr || this.data || []; + STOR.setItem(STOR_ID, JSON.stringify(this.data)); + return this.data; + } + + add = str => this.set( + this.data.concat({title: str, completed: false}) + ) + + put = (todo, obj) => this.set( + this.data.map(t => isEqual(t, todo) ? assign(todo, obj) : t) + ) + + del = todo => this.set( + this.data.filter(t => !isEqual(t, todo)) + ) + + toggle = todo => this.put(todo, {completed: !todo.completed}) + + toggleAll = completed => this.set( + this.data.map(t => ({...t, completed})) + ) + + clearCompleted = () => this.set( + this.data.filter(t => !t.completed) + ) +} diff --git a/bench/implementations/inferno/src/share.js b/bench/implementations/inferno/src/share.js new file mode 100644 index 0000000..89ff4a7 --- /dev/null +++ b/bench/implementations/inferno/src/share.js @@ -0,0 +1,58 @@ +/** + * Shared funcs/values + */ + +export const ENTER = 13; +export const ESCAPE = 27; + +export const filters = { + all: t => true, + active: t => !t.completed, + completed: t => t.completed +} + +/** + * Read the `location.hash` value + * @return {String} + */ +export function read() { + return location.hash.replace('#/', '') || 'all'; +} + +/** + * Modified `Object.assign` shim + * - always writes to new object + * @return {Object} + */ +export function assign() { + let src; + let tar = {}; + for (let s = 0; s < arguments.length; s++) { + src = Object(arguments[s]); + for (const k in src) { + tar[k] = src[k]; + } + } + return tar; +} + +/** + * Are two Objects equal values? + * @param {Object} a + * @param {Object} b + * @return {Boolean} + */ +export function isEqual(a, b) { + // Create arrays of property names + const aProps = Object.getOwnPropertyNames(a); + const bProps = Object.getOwnPropertyNames(b); + + if (aProps.length !== bProps.length) return false; + + for (let i = 0; i < aProps.length; i++) { + const k = aProps[i]; + if (a[k] !== b[k]) return false; + } + + return true; +} diff --git a/bench/implementations/inferno/test/.gitignore b/bench/implementations/inferno/test/.gitignore new file mode 100644 index 0000000..93f1361 --- /dev/null +++ b/bench/implementations/inferno/test/.gitignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log diff --git a/bench/implementations/inferno/test/README.md b/bench/implementations/inferno/test/README.md new file mode 100644 index 0000000..6488647 --- /dev/null +++ b/bench/implementations/inferno/test/README.md @@ -0,0 +1,189 @@ +# TodoMVC Browser Tests + +The TodoMVC project has a great many implementations of exactly the same app using different MV* frameworks. Each app should be functionally identical. The goal of these tests is to provide a fully automated browser-based test that can be used to ensure that the specification is being followed by each and every TodoMVC app. + + +## Todo + +- [ ] Complete the test implementation (27 out of 28 are now complete). The only test that I am struggling with is to test that the delete button becomes visible on hover. +- [ ] Make it work with PhantomJS. In practice, Phantom is only a little bit faster, but it should work. Currently there are a few Phantom specific failures. +- [ ] Allow testing of apps that require a server (see: https://github.com/tastejs/todomvc/pull/821/files#r9377070) + + +## Running the tests + +These tests use Selenium 2 (WebDriver), via the JavaScript API (WebdriverJS). In order to run the tests, you will need to install the dependencies. npm must be version 2.0.0 or greater, so upgrade it first with `npm install -g npm` if `npm --version` outputs anything less than 2.0.0. Run the following command from within the `tests` folder: + +```sh +$ npm install +``` + +If you haven't already run `npm install` in the root directory, execute `npm install` there as well. + +You need to run a local server for the tests. Start the test server using: + +```sh +$ gulp test-server +``` + +To run the tests for all TodoMVC implementations, run the following: + +```sh +$ npm run test +``` + +In order to run tests for a single TodoMVC implementation, supply a framework argument as follows: + +```sh +$ npm run test -- --framework=angularjs +``` + +N.B. Remember the extra -- to separate the script arguments from the npm arguments. + +In order to run a specific test, use the mocha 'grep' function. For example: + +``` +$ npm run test -- --framework=jquery --grep 'should trim entered text' + + TodoMVC - jquery + Editing + ✓ should trim entered text (1115ms) + + + 1 passing (3s) +``` + +### Specifying the browser + +You can also specify the browser that will be used to execute the tests via the `---browser` argument. The tests default to using Chrome. For example, to run against phantomjs, use the following: + +```sh +$ npm run test -- --browser=phantomjs +``` + +You must install phantomjs first of course! + +Valid browser names can be found within webdriver via the `webdriver.Browser` enumeration. + + +## Reporting against known issues + +The `knownIssues.js` file details the currently known issues with the TodoMVC implementations. You can run the tests and compare against these issues using the `mocha-known-issues-reporter`: + +```sh +$ npm run test -- --reporter=mocha-known-issues-reporter +``` + +When run via grunt the suite supports exactly the same command line arguments. + +An example output with the known issues reporter is shown below: + +``` +$ npm run test -- --reporter=mocha-known-issues-reporter --framework=jquery +... +Running "simplemocha:files" (simplemocha) task +(1 of 27) pass: TodoMVC - jquery, No Todos, should hide #main and #footer +[...] +(17 of 27) pass: TodoMVC - jquery, Editing, should remove the item if an empty text string was entered +(18 of 27) known issue: TodoMVC - jquery, Editing, should cancel edits on escape -- error: undefined +(19 of 27) pass: TodoMVC - jquery, Counter, should display the current number of todo items +(20 of 27) pass: TodoMVC - jquery, Clear completed button, should display the number of completed items +(21 of 27) pass: TodoMVC - jquery, Clear completed button, should remove completed items when clicked +(22 of 27) pass: TodoMVC - jquery, Clear completed button, should be hidden when there are no items that are completed +(23 of 27) pass: TodoMVC - jquery, Persistence, should persist its data +(24 of 27) known issue: TodoMVC - jquery, Routing, should allow me to display active items -- error: Cannot call method 'click' of undefined +(25 of 27) known issue: TodoMVC - jquery, Routing, should allow me to display completed items -- error: Cannot call method 'click' of undefined +(26 of 27) known issue: TodoMVC - jquery, Routing, should allow me to display all items -- error: Cannot call method 'click' of undefined +(27 of 27) known issue: TodoMVC - jquery, Routing, should highlight the currently applied filter -- error: Cannot call method 'getAttribute' of undefined + +passed: 22/27 +failed: 5/27 +new issues: 0 +resolved issues: 0 +``` + +The reporter indicates the number of passes, failed, new and resolved issues. This makes it ideal for regression testing. + +### Example output + +A test run with the 'spec' reporter looks something like the following: + +``` +$ npm run test -- --framework=angularjs + + angularjs + TodoMVC + No Todos + ✓ should hide #main and #footer (201ms) + New Todo + ✓ should allow me to add todo items (548ms) + ✓ should clear text input field when an item is added (306ms) + ✓ should trim text input (569ms) + ✓ should show #main and #footer when items added (405ms) + Mark all as completed + ✓ should allow me to mark all items as completed (1040ms) + ✓ should allow me to clear the completion state of all items (1014ms) + ✓ complete all checkbox should update state when items are completed (1413ms) + Item + ✓ should allow me to mark items as complete (843ms) + ✓ should allow me to un-mark items as complete (978ms) + ✓ should allow me to edit an item (1155ms) + ✓ should show the remove button on hover + Editing + ✓ should hide other controls when editing (718ms) + ✓ should save edits on enter (1093ms) + ✓ should save edits on blur (1256ms) + ✓ should trim entered text (1163ms) + ✓ should remove the item if an empty text string was entered (1033ms) + ✓ should cancel edits on escape (1115ms) + Counter + ✓ should display the current number of todo items (462ms) + Clear completed button + ✓ should display the number of completed items (873ms) + ✓ should remove completed items when clicked (898ms) + ✓ should be hidden when there are no items that are completed (893ms) + Persistence + ✓ should persist its data (3832ms) + Routing + ✓ should allow me to display active items (871ms) + ✓ should allow me to display completed items (960ms) + ✓ should allow me to display all items (1192ms) + ✓ should highlight the currently applied filter (1095ms) + + + 27 passing (1m) +``` + + +## Speed mode + +In order to keep each test case fully isolated, the browser is closed then re-opened in between each test. This does mean that the tests can take quite a long time to run. If you don't mind the risk of side-effects you can run the tests in speed mode by adding the `--speedMode` argument. + +```sh +$ npm run test -- --speedMode +``` + +Before each test, all the todo items are checked as completed and the 'clear complete' button pressed. This makes the tests run in around half the time, but with the obvious risk that the tear-down code may fail. + + +## Lax mode + +There are certain implementations (e.g. GWT and Dojo) where the constraints of the framework mean that it is not possible to match exactly the HTML specification for TodoMVC. In these cases, the tests can be run in a 'lax' mode where the XPath queries used to locate DOM elements are more general. For example, rather than looking for a checkbox `input` element with a class of `toggle`, in lax mode it simply looks for any `input` elements of type `checkbox`. To run the tests in lax mode, simply use the `--laxMode` argument: + + +```sh +$ npm run test -- --laxMode +``` + + +## Test design + +Very briefly, the tests are designed as follows: + +- `page.js` - provides an abstraction layer for the HTML template. All the code required to access elements from the DOM is found within this file. The XPaths used to locate elements are based on the TodoMVC specification, using the required element classes / ids. +- `pageLaxMode.js` - extends the above in order to relax the XPath constraints. +- `testOperations.js` - provides common assertions and operations. +- `test.js` - Erm … the tests! These are written to closely match the TodoMVC spec. +- `allTest.js` - A simple file that locates all of the framework examples, and runs the tests for each. + +**NOTE:** All of the WebdriverJS methods return promises and are executed asynchronously. However, you do not have to 'chain' them using `then`, they are instead automagically added to a queue, then executed. This means that if you add non-WebdriverJS operations (asserts, log messages) these will not be executed at the point you might expect. This is why `TestOperations.js` uses an explicit `then` each time it asserts. diff --git a/bench/implementations/inferno/test/index.js b/bench/implementations/inferno/test/index.js new file mode 100644 index 0000000..962374e --- /dev/null +++ b/bench/implementations/inferno/test/index.js @@ -0,0 +1,414 @@ +'use strict'; + +var webdriver = require('selenium-webdriver'); +var chrome = require('selenium-webdriver/chrome'); +var test = require('selenium-webdriver/testing'); +var Page = require('./page'); +var PageLaxMode = require('./pageLaxMode'); +var TestOperations = require('./testOperations'); + +var argv = require('optimist').default('laxMode', false).default('browser', 'chrome').argv; + +function todoMVCTest(baseUrl, speedMode, laxMode, browserName) { + test.describe('TodoMVC: ', function () { + + var TODO_ITEM_ONE = 'buy some cheese'; + var TODO_ITEM_TWO = 'feed the cat'; + var TODO_ITEM_THREE = 'book a doctors appointment'; + var browser, testOps, page; + + // a number of tests use this set of ToDo items. + function createStandardItems(done) { + page.enterItem(TODO_ITEM_ONE); + page.enterItem(TODO_ITEM_TWO); + return page.enterItem(TODO_ITEM_THREE) + .then(function () { + if (done instanceof Function) { + done(); + } + }); + } + + function launchBrowser(done) { + var chromeOptions = new chrome.Options(); + chromeOptions.addArguments('no-sandbox'); + + if (process.env.CHROME_PATH !== undefined) { + chromeOptions.setChromeBinaryPath(process.env.CHROME_PATH); + } + + browser = new webdriver.Builder() + .withCapabilities({browserName: browserName}) + .setChromeOptions(chromeOptions) + .build(); + + browser.get(baseUrl); + + page = laxMode ? new PageLaxMode(browser) : new Page(browser); + testOps = new TestOperations(page); + + return page.ensureAppIsVisibleAndLoaded() + .then(function () { + if (done instanceof Function) { + done(); + } + }); + } + + function printCapturedLogs() { + var logs = browser.manage().logs(); + + return logs.get('browser') + .then(function (entries) { + if (entries && entries.length) { + console.log(entries); + } + }); + } + + function closeBrowser(done) { + return browser + .quit() + .then(function () { + if (done instanceof Function) { done(); } + }); + } + + if (speedMode) { + test.before(launchBrowser); + test.after(closeBrowser); + test.afterEach(function (done) { + return browser.executeScript('window.localStorage && localStorage.clear(); location.reload(true);') + .then(function () { done(); }); + }); + } else { + test.beforeEach(launchBrowser); + test.afterEach(function (done) { + printCapturedLogs() + .then(function () { + return closeBrowser(done); + }); + }); + } + + test.describe('When page is initially opened', function () { + + test.it('should focus on the todo input field', function (done) { + testOps.assertNewInputFocused() + .then(function () { done(); }); + }); + + }); + + test.describe('No Todos', function () { + + test.it('should hide #main and #footer', function (done) { + testOps.assertItemCount(0); + testOps.assertMainSectionVisibility(false); + testOps.assertFooterVisibility(false) + .then(function () { done(); }); + }); + + }); + + test.describe('New Todo', function () { + + test.it('should allow me to add todo items', function (done) { + page.enterItem(TODO_ITEM_ONE); + testOps.assertItems([TODO_ITEM_ONE]); + page.enterItem(TODO_ITEM_TWO); + testOps.assertItems([TODO_ITEM_ONE, TODO_ITEM_TWO]) + .then(function () { done(); }); + }); + + test.it('should clear text input field when an item is added', function (done) { + page.enterItem(TODO_ITEM_ONE); + testOps.assertNewItemInputFieldText('') + .then(function () { done(); }); + }); + + test.it('should append new items to the bottom of the list', function (done) { + createStandardItems(); + testOps.assertItemCount(3); + testOps.assertItemText(0, TODO_ITEM_ONE); + testOps.assertItemText(1, TODO_ITEM_TWO); + testOps.assertItemText(2, TODO_ITEM_THREE) + .then(function () { done(); }); + }); + + test.it('should trim text input', function (done) { + page.enterItem(' ' + TODO_ITEM_ONE + ' '); + testOps.assertItemText(0, TODO_ITEM_ONE) + .then(function () { done(); }); + }); + + test.it('should show #main and #footer when items added', function (done) { + page.enterItem(TODO_ITEM_ONE); + testOps.assertMainSectionVisibility(true); + testOps.assertFooterVisibility(true) + .then(function () { done(); }); + }); + + }); + + test.describe('Mark all as completed', function () { + + test.beforeEach(createStandardItems); + + test.it('should allow me to mark all items as completed', function (done) { + page.clickMarkAllCompletedCheckBox(); + testOps.assertItemCompletedStates([true, true, true]) + .then(function () { done(); }); + }); + + test.it('should correctly update the complete all checked state', function (done) { + // manually check all items + page.toggleItemAtIndex(0); + page.toggleItemAtIndex(1); + page.toggleItemAtIndex(2); + + // ensure checkall is in the correct state + testOps.assertCompleteAllCheckedStatus(true) + .then(function () { done(); }); + }); + + test.it('should allow me to clear the completion state of all items', function (done) { + page.clickMarkAllCompletedCheckBox(); + page.clickMarkAllCompletedCheckBox(); + + testOps.assertItemCompletedStates([false, false, false]) + .then(function () { done(); }); + }); + + test.it('complete all checkbox should update state when items are completed / cleared', function (done) { + page.clickMarkAllCompletedCheckBox(); + testOps.assertCompleteAllCheckedStatus(true); + + // all items are complete, now mark one as not-complete + page.toggleItemAtIndex(0); + testOps.assertCompleteAllCheckedStatus(false); + + // now mark as complete, so that once again all items are completed + page.toggleItemAtIndex(0); + testOps.assertCompleteAllCheckedStatus(true) + .then(function () { done(); }); + }); + + }); + + test.describe('Item', function () { + + test.it('should allow me to mark items as complete', function (done) { + page.enterItem(TODO_ITEM_ONE); + page.enterItem(TODO_ITEM_TWO); + + page.toggleItemAtIndex(0); + testOps.assertItemCompletedStates([true, false]); + + page.toggleItemAtIndex(1); + testOps.assertItemCompletedStates([true, true]) + .then(function () { done(); }); + }); + + test.it('should allow me to un-mark items as complete', function (done) { + page.enterItem(TODO_ITEM_ONE); + page.enterItem(TODO_ITEM_TWO); + + page.toggleItemAtIndex(0); + testOps.assertItemCompletedStates([true, false]); + + page.toggleItemAtIndex(0); + testOps.assertItemCompletedStates([false, false]) + .then(function () { done(); }); + }); + + }); + + test.describe('Editing', function () { + + test.beforeEach(function (done) { + createStandardItems(); + page.doubleClickItemAtIndex(1) + .then(function () { done(); }); + }); + + test.it('should focus the input', function (done) { + testOps.assertItemInputFocused(); + testOps.assertNewInputBlurred() // Unnecessary? The HTML spec dictates that only one element can be focused. + .then(function () { done(); }); + }); + + test.it('should hide other controls when editing', function (done) { + testOps.assertItemToggleIsHidden(1); + testOps.assertItemLabelIsHidden(1) + .then(function () { done(); }); + }); + + test.it('should save edits on enter', function (done) { + page.editItemAtIndex(1, 'buy some sausages' + webdriver.Key.ENTER); + testOps.assertItems([TODO_ITEM_ONE, 'buy some sausages', TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + test.it('should save edits on blur', function (done) { + page.editItemAtIndex(1, 'buy some sausages'); + // click a toggle button so that the blur() event is fired + page.toggleItemAtIndex(0); + testOps.assertItems([TODO_ITEM_ONE, 'buy some sausages', TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + test.it('should trim entered text', function (done) { + page.editItemAtIndex(1, ' buy some sausages ' + webdriver.Key.ENTER); + testOps.assertItems([TODO_ITEM_ONE, 'buy some sausages', TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + test.it('should remove the item if an empty text string was entered', function (done) { + page.editItemAtIndex(1, webdriver.Key.ENTER); + testOps.assertItems([TODO_ITEM_ONE, TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + test.it('should cancel edits on escape', function (done) { + page.editItemAtIndex(1, 'foo' + webdriver.Key.ESCAPE); + testOps.assertItems([TODO_ITEM_ONE, TODO_ITEM_TWO, TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + }); + + test.describe('Counter', function () { + + test.it('should display the current number of todo items', function (done) { + page.enterItem(TODO_ITEM_ONE); + testOps.assertItemCountText('1 item left'); + page.enterItem(TODO_ITEM_TWO); + testOps.assertItemCountText('2 items left') + .then(function () { done(); }); + }); + + }); + + test.describe('Clear completed button', function () { + + test.beforeEach(createStandardItems); + + test.it('should display the correct text', function (done) { + page.toggleItemAtIndex(1); + testOps.assertClearCompleteButtonText('Clear completed') + .then(function () { done(); }); + }); + + test.it('should remove completed items when clicked', function (done) { + page.toggleItemAtIndex(1); + page.clickClearCompleteButton(); + testOps.assertItemCount(2); + testOps.assertItems([TODO_ITEM_ONE, TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + test.it('should be hidden when there are no items that are completed', function (done) { + page.toggleItemAtIndex(1); + testOps.assertClearCompleteButtonVisibility(true); + page.clickClearCompleteButton(); + testOps.assertClearCompleteButtonVisibility(false) + .then(function () { done(); }); + }); + + }); + + test.describe('Persistence', function () { + + test.it('should persist its data', function (done) { + function stateTest() { + testOps.assertItemCount(2); + testOps.assertItems([TODO_ITEM_ONE, TODO_ITEM_TWO]); + return testOps.assertItemCompletedStates([false, true]); + } + + // set up state + page.enterItem(TODO_ITEM_ONE); + page.enterItem(TODO_ITEM_TWO); + page.toggleItemAtIndex(1); + stateTest(); + + // navigate away and back again + browser.get('about:blank'); + browser.get(baseUrl); + + // repeat the state test + stateTest() + .then(function () { done(); }); + }); + + }); + + test.describe('Routing', function () { + + test.beforeEach(createStandardItems); + + test.it('should allow me to display active items', function (done) { + page.toggleItemAtIndex(1); + page.filterByActiveItems(); + testOps.assertItems([TODO_ITEM_ONE, page.ITEM_HIDDEN_OR_REMOVED, TODO_ITEM_THREE]) + .then(function () { return done(); }); + }); + + test.it('should respect the back button', function (done) { + page.toggleItemAtIndex(1); + page.filterByActiveItems(); + page.filterByCompletedItems(); + testOps.assertItems([page.ITEM_HIDDEN_OR_REMOVED, TODO_ITEM_TWO]); // should show completed items + page.back(); // then active items + testOps.assertItems([TODO_ITEM_ONE, page.ITEM_HIDDEN_OR_REMOVED, TODO_ITEM_THREE]); + page.back(); // then all items + testOps.assertItems([TODO_ITEM_ONE, TODO_ITEM_TWO, TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + test.it('should allow me to display completed items', function (done) { + page.toggleItemAtIndex(1); + page.filterByCompletedItems(); + testOps.assertItems([page.ITEM_HIDDEN_OR_REMOVED, TODO_ITEM_TWO]); + page.filterByAllItems() // TODO: why + .then(function () { done(); }); + }); + + test.it('should allow me to display all items', function (done) { + page.toggleItemAtIndex(1); + + // apply the other filters first, before returning to the 'all' state + page.filterByActiveItems(); + page.filterByCompletedItems(); + page.filterByAllItems(); + testOps.assertItems([TODO_ITEM_ONE, TODO_ITEM_TWO, TODO_ITEM_THREE]) + .then(function () { done(); }); + }); + + test.it('should highlight the currently applied filter', function (done) { + // initially 'all' should be selected + testOps.assertFilterAtIndexIsSelected(0); + page.filterByActiveItems(); + testOps.assertFilterAtIndexIsSelected(1); + page.filterByCompletedItems(); + testOps.assertFilterAtIndexIsSelected(2) + .then(function () { done(); }); + }); + + }); + + }); +}; + +'use strict'; + +/** + * Init test + */ +todoMVCTest( + 'http://localhost:8000/index.html', + argv.speedMode, + argv.laxMode, + argv.browser +); diff --git a/bench/implementations/inferno/test/knownIssues.js b/bench/implementations/inferno/test/knownIssues.js new file mode 100644 index 0000000..65ed345 --- /dev/null +++ b/bench/implementations/inferno/test/knownIssues.js @@ -0,0 +1,131 @@ +module.exports = [ + + // durandal routing is very very slow. + // see: https://github.com/tastejs/todomvc/issues/831 + 'TodoMVC - durandal, Routing, should allow me to display active items', + 'TodoMVC - durandal, Routing, should allow me to display completed items', + 'TodoMVC - durandal, Routing, should allow me to display all items', + 'TodoMVC - durandal, Routing, should highlight the currently applied filter', + + // https://github.com/tastejs/todomvc/issues/828 + // routing should default to all + 'TodoMVC - sammyjs, Routing, should highlight the currently applied filter', + + // https://github.com/tastejs/todomvc/issues/824 + // this implementation has numerous edit experience issues + 'TodoMVC - angularjs_require, Mark all as completed, should allow me to mark all items as completed', + 'TodoMVC - angularjs_require, Mark all as completed, should allow me to clear the completion state of all items', + // jscs:disable + 'TodoMVC - angularjs_require, Mark all as completed, complete all checkbox should update state when items are completed / cleared', + + // jscs:enable + // https://github.com/tastejs/todomvc/issues/815 + // does not hide other controls while editing + 'TodoMVC - dojo, Editing, should hide other controls when editing', + + // https://github.com/tastejs/todomvc/issues/816 + // atma does not hide the main section, instead it hides the toggle-all checkbox + 'TodoMVC - atmajs, No Todos, should hide #main and #footer', + + // https://github.com/tastejs/todomvc/issues/819 + // the edit experience with soma is quite broken. You can + // get multiple elements into an edit state + 'TodoMVC - somajs_require, Editing, should remove the item if an empty text string was entered', + 'TodoMVC - somajs_require, Editing, should cancel edits on escape', + + // the following are covered by the following issue: + // https://github.com/tastejs/todomvc/issues/789 + 'TodoMVC - closure, Editing, should cancel edits on escape', + 'TodoMVC - ariatemplates, Editing, should cancel edits on escape', + 'TodoMVC - dermis, Editing, should cancel edits on escape', + 'TodoMVC - duel, Editing, should cancel edits on escape', + 'TodoMVC - extjs_deftjs, Editing, should cancel edits on escape', + 'TodoMVC - olives, Editing, should cancel edits on escape', + 'TodoMVC - rappidjs, Editing, should cancel edits on escape', + 'TodoMVC - serenadejs, Editing, should cancel edits on escape', + 'TodoMVC - typescript-angular, Editing, should cancel edits on escape', + 'TodoMVC - flight, Editing, should cancel edits on escape', + 'TodoMVC - backbone_require, Editing, should cancel edits on escape', + 'TodoMVC - dijon, Editing, should cancel edits on escape', + 'TodoMVC - knockoutjs_require, Editing, should cancel edits on escape', + + // all the following are covered by this issue: + // https://github.com/tastejs/todomvc/issues/856 + 'TodoMVC - knockoutjs, Routing, should respect the back button', + 'TodoMVC - spine, Routing, should respect the back button', + 'TodoMVC - serenadejs, Routing, should respect the back button', + 'TodoMVC - flight, Routing, should respect the back button', + 'TodoMVC - lavaca_require, Routing, should respect the back button', + 'TodoMVC - somajs_require, Routing, should respect the back button', + + // the following implementations do not support routing + 'TodoMVC - extjs_deftjs, Routing, should allow me to display active items', + 'TodoMVC - extjs_deftjs, Routing, should allow me to display completed items', + 'TodoMVC - extjs_deftjs, Routing, should allow me to display all items', + 'TodoMVC - extjs_deftjs, Routing, should highlight the currently applied filter', + 'TodoMVC - extjs_deftjs, Routing, should respect the back button', + 'TodoMVC - olives, Routing, should allow me to display active items', + 'TodoMVC - olives, Routing, should allow me to display completed items', + 'TodoMVC - olives, Routing, should allow me to display all items', + 'TodoMVC - olives, Routing, should highlight the currently applied filter', + 'TodoMVC - olives, Routing, should respect the back button', + 'TodoMVC - dijon, Routing, should allow me to display active items', + 'TodoMVC - dijon, Routing, should allow me to display completed items', + 'TodoMVC - dijon, Routing, should allow me to display all items', + 'TodoMVC - dijon, Routing, should highlight the currently applied filter', + 'TodoMVC - dijon, Routing, should respect the back button', + 'TodoMVC - duel, Routing, should allow me to display active items', + 'TodoMVC - duel, Routing, should allow me to display completed items', + 'TodoMVC - duel, Routing, should allow me to display all items', + 'TodoMVC - duel, Routing, should highlight the currently applied filter', + 'TodoMVC - duel, Routing, should respect the back button', + 'TodoMVC - knockoutjs_require, Routing, should allow me to display active items', + 'TodoMVC - knockoutjs_require, Routing, should allow me to display completed items', + 'TodoMVC - knockoutjs_require, Routing, should allow me to display all items', + 'TodoMVC - knockoutjs_require, Routing, should highlight the currently applied filter', + 'TodoMVC - knockoutjs_require, Routing, should respect the back button', + 'TodoMVC - angular-dart, Routing, should allow me to display active items', + 'TodoMVC - angular-dart, Routing, should allow me to display completed items', + 'TodoMVC - angular-dart, Routing, should allow me to display all items', + 'TodoMVC - angular-dart, Routing, should highlight the currently applied filter', + 'TodoMVC - angular-dart, Routing, should respect the back button', + 'TodoMVC - typescript-backbone, Routing, should allow me to display active items', + 'TodoMVC - typescript-backbone, Routing, should allow me to display completed items', + 'TodoMVC - typescript-backbone, Routing, should allow me to display all items', + 'TodoMVC - typescript-backbone, Routing, should highlight the currently applied filter', + 'TodoMVC - typescript-backbone, Routing, should respect the back button', + + // EXTJS is not spec compliant (by a long way!) + 'TodoMVC - extjs, New Todo, should show #main and #footer when items added', + 'TodoMVC - extjs, Mark all as completed, should allow me to mark all items as completed', + 'TodoMVC - extjs, Mark all as completed, complete all checkbox should update state when items are completed / cleared', + 'TodoMVC - extjs, Item, should allow me to mark items as complete', + 'TodoMVC - extjs, Item, should allow me to un-mark items as complete', + 'TodoMVC - extjs, Editing, should save edits on blur', + 'TodoMVC - extjs, Editing, should cancel edits on escape', + 'TodoMVC - extjs, Counter, should display the current number of todo items', + 'TodoMVC - extjs, Clear completed button, should display the number of completed items', + 'TodoMVC - extjs, Clear completed button, should remove completed items when clicked', + 'TodoMVC - extjs, Clear completed button, should be hidden when there are no items that are completed', + 'TodoMVC - extjs, Persistence, should persist its data', + 'TodoMVC - extjs, Routing, should allow me to display active items', + 'TodoMVC - extjs, Routing, should allow me to display completed items', + 'TodoMVC - extjs, Routing, should allow me to display all items', + 'TodoMVC - extjs, Routing, should highlight the currently applied filter', + 'TodoMVC - extjs, Routing, should respect the back button', + + // ----------------- Test framework issues ----------- + + // for some reason the persistence test fails for knockout, even though persistence is working + // just fine. Perhaps there is something asynchronous going on that is causing the assert + // to be executed early? + 'TodoMVC - knockoutjs, Persistence, should persist its data', + + // chaplin edit tests fail with the following: + // StaleElementReferenceError: stale element reference: element is not attached to the page document + 'TodoMVC - chaplin-brunch, Editing, should save edits on enter', + 'TodoMVC - chaplin-brunch, Editing, should save edits on blur', + 'TodoMVC - chaplin-brunch, Editing, should trim entered text', + 'TodoMVC - chaplin-brunch, Editing, should remove the item if an empty text string was entered', + 'TodoMVC - chaplin-brunch, Editing, should cancel edits on escape' +]; diff --git a/bench/implementations/inferno/test/learn.json b/bench/implementations/inferno/test/learn.json new file mode 100644 index 0000000..48de203 --- /dev/null +++ b/bench/implementations/inferno/test/learn.json @@ -0,0 +1,5 @@ +{ + "templates": { + "todomvc": "

    <%= name %>

    <% if (typeof examples !== 'undefined') { %> <% examples.forEach(function (example) { %>
    <%= example.name %>
    <% if (!location.href.match(example.url + '/')) { %> \" href=\"<%= example.url %>\">Demo, <% } if (example.type === 'backend') { %>\"><% } else { %>\"><% } %>Source <% }); %> <% } %>

    <%= description %>

    <% if (typeof link_groups !== 'undefined') { %>
    <% link_groups.forEach(function (link_group) { %>

    <%= link_group.heading %>

    <% }); %> <% } %> " + } +} diff --git a/bench/implementations/inferno/test/memory-exceptions.json b/bench/implementations/inferno/test/memory-exceptions.json new file mode 100644 index 0000000..acbdc39 --- /dev/null +++ b/bench/implementations/inferno/test/memory-exceptions.json @@ -0,0 +1,6 @@ +{ + "humble": { + "nodes": 30, + "listeners": 0 + } +} diff --git a/bench/implementations/inferno/test/memory.js b/bench/implementations/inferno/test/memory.js new file mode 100644 index 0000000..5d60410 --- /dev/null +++ b/bench/implementations/inferno/test/memory.js @@ -0,0 +1,99 @@ +'use strict'; + +var drool = require('drool'); +var exceptions = require('./memory-exceptions.json'); +var argv = require('optimist').default('laxMode', false).default('browser', 'chrome').argv; +var driverConfig = { + chromeOptions: 'no-sandbox' +}; + +if (typeof process.env.CHROME_PATH !== 'undefined') { + driverConfig.chromeBinaryPath = process.env.CHROME_PATH; +} + +var driver = drool.start(driverConfig); + +function idApp() { + return driver.findElement(drool.webdriver.By.css('#todoapp')) + .then(function () { return true; }) + .thenCatch(function () { return false; }); +} + +function newTodoSelector() { + return idApp().then(function (isId) { + if (isId) { + return '#new-todo'; + } + + return '.new-todo'; + }); +} + +function listSelector() { + return idApp().then(function (isId) { + if (isId) { + return '#todo-list li'; + } + + return '.todo-list li'; + }); +} + +/** + * Init + */ +drool.flow({ + repeatCount: 5, + setup: function () { + driver.get('http://localhost:8000/index.html'); + }, + action: function (name) { + driver.wait(function () { + driver.sleep(500); + return driver.findElement(drool.webdriver.By.css(newTodoSelector(name))) + .sendKeys('find magical goats', drool.webdriver.Key.ENTER) + .thenCatch(function () { + return false; + }) + .then(function () { + return driver.findElement(drool.webdriver.By.css(listSelector(name))).isDisplayed() + .then(function () { + return true; + }); + }); + }, 10000); + + driver.wait(function () { + return driver.findElement(drool.webdriver.By.css(listSelector(name))).click() + .thenCatch(function () { + return false; + }) + .then(function () { + return true; + }); + }); + + driver.findElement(drool.webdriver.By.css('.destroy')).click(); + }.bind(null, 'inferno'), + assert: function (after, initial) { + var nodeIncrease = (after.nodes - initial.nodes); + var listenerIncrease = (after.jsEventListeners - initial.jsEventListeners); + var memoryExceptions = exceptions['inferno'] || {}; + + console.log(this + ', ' + nodeIncrease + ', ' + + (after.jsHeapSizeUsed - initial.jsHeapSizeUsed) + ', ' + listenerIncrease); + + //https://code.google.com/p/chromium/issues/detail?id=516153 + if (nodeIncrease > memoryExceptions.nodes || 0) { + throw new Error('Node Count leak detected!'); + } + + if (listenerIncrease > memoryExceptions.listeners || 0) { + throw new Error('Event Listener leak detected!'); + } + + }.bind('inferno') +}, driver); + +driver.quit(); + diff --git a/bench/implementations/inferno/test/package.json b/bench/implementations/inferno/test/package.json new file mode 100644 index 0000000..f56e1c8 --- /dev/null +++ b/bench/implementations/inferno/test/package.json @@ -0,0 +1,15 @@ +{ + "private": true, + "devDependencies": { + "chromedriver": "^2.18.0", + "drool": "0.4.0", + "express": "^4.10", + "mocha": "*", + "mocha-known-issues-reporter": "git+https://github.com/ColinEberhardt/mocha-known-issues-reporter.git#v0.0.0", + "optimist": "^0.6.1", + "selenium-webdriver": "~2.53.1" + }, + "scripts": { + "test": "node server & mocha index.js --no-timeouts --reporter spec" + } +} diff --git a/bench/implementations/inferno/test/page.js b/bench/implementations/inferno/test/page.js new file mode 100644 index 0000000..7cb0866 --- /dev/null +++ b/bench/implementations/inferno/test/page.js @@ -0,0 +1,269 @@ +'use strict'; + +var webdriver = require('selenium-webdriver'); +var until = require('selenium-webdriver/lib/until'); + +var idSelectors = true; +var classOrId = idSelectors ? '#' : '.'; + +var DEFAULT_TIMEOUT = 3000; +var REMOVED_TIMEOUT = 100; + +var REMOVE_TEXT_KEY_SEQ = Array(51).join(webdriver.Key.BACK_SPACE + webdriver.Key.DELETE); + +// Unique symbols +var ELEMENT_MISSING = Object.freeze({}); +var ITEM_HIDDEN_OR_REMOVED = Object.freeze({}); + +module.exports = function Page(browser) { + // CSS ELEMENT SELECTORS + + this.getMainSectionCss = function () { return classOrId + 'main'; }; + + this.getFooterSectionCss = function () { return 'footer' + classOrId + 'footer'; }; + + this.getClearCompletedButtonCss = function () { return 'button' + classOrId + 'clear-completed'; }; + + this.getNewInputCss = function () { return 'input' + classOrId + 'new-todo'; }; + + this.getToggleAllCss = function () { return 'input' + classOrId + 'toggle-all'; }; + + this.getItemCountCss = function () { return 'span' + classOrId + 'todo-count'; }; + + this.getFilterCss = function (index) { + return classOrId + 'filters li:nth-of-type(' + (index + 1) + ') a, ' + + classOrId + 'filters a:nth-of-type(' + (index + 1) + ')'; + }; + + this.getSelectedFilterCss = function (index) { return this.getFilterCss(index) + '.selected'; }; + + this.getFilterAllCss = function () { return this.getFilterCss(0); }; + + this.getFilterActiveCss = function () { return this.getFilterCss(1); }; + + this.getFilterCompletedCss = function () { return this.getFilterCss(2); }; + + this.getListCss = function (suffixCss) { return 'ul' + classOrId + 'todo-list' + (suffixCss || ''); }; + + this.getListItemCss = function (index, suffixCss, excludeParentSelector) { + suffixCss = (index === undefined ? '' : ':nth-of-type(' + (index + 1) + ')') + (suffixCss || ''); + return excludeParentSelector ? 'li' + suffixCss : this.getListCss(' li' + suffixCss); + }; + + this.getListItemToggleCss = function (index) { return this.getListItemCss(index, ' input.toggle'); }; + + this.getListItemLabelCss = function (index) { return this.getListItemCss(index, ' label'); }; + + this.getLastListItemLabelCss = function (index) { return this.getListItemCss(index, ':last-of-type label'); }; + + this.getListItemInputCss = function (index) { return this.getListItemCss(index, ' input.edit'); }; + + this.getEditingListItemInputCss = function () { return this.getListItemCss(undefined, '.editing input.edit'); }; + + // This CSS selector returns the _last_ element of a list that exactly matches the provided list of completed states + // It is used as a boolean test of the item states + this.getListItemsWithCompletedStatesCss = function (completedStates) { + var suffixCss = ' ' + completedStates.map(function (completed, i) { + return this.getListItemCss(i, completed ? '.completed' : ':not(.completed)', true); + }, this).join(' + '); + return this.getListCss(suffixCss); + }; + + // PUBLIC SYMBOLS + + this.ITEM_HIDDEN_OR_REMOVED = ITEM_HIDDEN_OR_REMOVED; + + // NAVIGATION + + this.back = function () { + return browser.navigate().back(); + }; + + // ELEMENT RETREIVAL + // wait* methods guarantees to return an element, or throw an exception + // get* methods may return nothing at all, or in the case of element lists, an older version of the list + + this.getElements = function (css) { + return browser.findElements(webdriver.By.css(css)); + }; + + this.waitForElement = function (css, failMsg, timeout) { + return browser.wait(until.elementLocated(webdriver.By.css(css)), timeout || DEFAULT_TIMEOUT, failMsg); + }; + + this.waitForFocusedElement = function (css, failMsg) { + return this.waitForElement(css + ':focus', failMsg); + }; + + this.waitForBlurredElement = function (css, failMsg) { + return this.waitForElement(css + ':not(:focus)', failMsg); + }; + + this.waitForListItemCount = function (count) { + var self = this; + return browser.wait(function () { + return self.waitForElement(self.getListCss()) + .then(function (listElement) { + return listElement.findElements(webdriver.By.css(self.getListItemCss(undefined, undefined, true))); + }) + .then(function (listItems) { + return listItems.length === count; + }); + }, DEFAULT_TIMEOUT, 'Expected item list to contain ' + count + ' item' + (count === 1 ? '' : 's')); + }; + + this.waitForClearCompleteButton = function () { + return this.waitForElement(this.getClearCompletedButtonCss()); + }; + + this.waitForToggleForItem = function (index) { + return this.waitForElement(this.getListItemToggleCss(index)); + }; + + this.waitForItemLabel = function (index) { + return this.waitForElement(this.getListItemLabelCss(index)); + }; + + this.waitForNewItemInputField = function () { + return this.waitForElement(this.getNewInputCss()); + }; + + this.waitForMarkAllCompletedCheckBox = function () { + return this.waitForElement(this.getToggleAllCss()); + }; + + this.getListItems = function () { + return this.getElements(this.getListItemCss()); + }; + + this.waitForVisibility = function (shouldBeVisible, css, failMsg) { + if (shouldBeVisible) { + return this.waitForElement(css, failMsg) + .then(function (element) { + return browser.wait(until.elementIsVisible(element), DEFAULT_TIMEOUT, failMsg); + }); + } else { + return this.waitForElement(css, undefined, REMOVED_TIMEOUT) + .catch(function () { return ELEMENT_MISSING; }) + .then(function (elementOrError) { + return elementOrError === ELEMENT_MISSING ? + ELEMENT_MISSING : // Returning a value will resolve the promise + browser.wait(until.elementIsNotVisible(elementOrError), DEFAULT_TIMEOUT, failMsg); + }); + } + }; + + this.waitForMainSectionRemovedOrEmpty = function () { + return this.waitForElement(this.getMainSectionCss(), undefined, REMOVED_TIMEOUT) + .catch(function () { return ELEMENT_MISSING; }) + .then(function (elementOrError) { + return elementOrError === ELEMENT_MISSING ? ELEMENT_MISSING : this.waitForListItemCount(0); + }.bind(this)); + }; + + this.waitForCheckedStatus = function (shouldBeChecked, failMsg, element) { + var condition = shouldBeChecked ? 'elementIsSelected' : 'elementIsNotSelected'; + return browser.wait(until[condition](element), DEFAULT_TIMEOUT, failMsg); + }; + + this.waitForTextContent = function (text, failMsg, element) { + return browser.wait(until.elementTextIs(element, text), DEFAULT_TIMEOUT, failMsg); + }; + + // PAGE ACTIONS + + this.ensureAppIsVisibleAndLoaded = function () { + return this.waitForVisibility(false, this.getFooterSectionCss(), 'Footer is not hidden') + .then(this.waitForElement.bind( + this, '.new-todo, #new-todo', 'Could not find new todo input field', undefined)) + .then(function (newTodoElement) { + return newTodoElement.getAttribute('id'); + }) + .then(function (newTodoElementId) { + if (newTodoElementId === 'new-todo') { return; } + idSelectors = false; + classOrId = idSelectors ? '#' : '.'; + }); + }; + + this.clickMarkAllCompletedCheckBox = function () { + return this.waitForMarkAllCompletedCheckBox().click(); + }; + + this.clickClearCompleteButton = function () { + return this.waitForVisibility(true, this.getClearCompletedButtonCss(), + 'Expected clear completed items button to be visible') + .then(function (clearCompleteButton) { + clearCompleteButton.click(); + }); + }; + + this.enterItem = function (itemText) { + var self = this; + var nItems; + return self.getListItems() + .then(function (items) { + nItems = items.length; + }) + .then(this.waitForNewItemInputField.bind(this)) + .then(function (newItemInput) { + return newItemInput.sendKeys(itemText).then(function () { return newItemInput; }); + }) + .then(function (newItemInput) { + return browser.wait(function () { + // Hit Enter repeatedly until the text goes away + return newItemInput.sendKeys(webdriver.Key.ENTER) + .then(newItemInput.getAttribute.bind(newItemInput, 'value')) + .then(function (newItemInputValue) { + return newItemInputValue.length === 0; + }); + }, DEFAULT_TIMEOUT); + }) + .then(function () { + return self.waitForElement(self.getLastListItemLabelCss(nItems)); + }) + .then(this.waitForTextContent.bind(this, itemText.trim(), + 'Expected new item label to read ' + itemText.trim())); + }; + + this.toggleItemAtIndex = function (index) { + return this.waitForToggleForItem(index).click(); + }; + + this.editItemAtIndex = function (index, itemText) { + return this.waitForElement(this.getListItemInputCss(index)) + .then(function (itemEditField) { + return itemEditField.sendKeys(REMOVE_TEXT_KEY_SEQ, itemText); + }); + }; + + this.doubleClickItemAtIndex = function (index) { + return this.waitForItemLabel(index).then(function (itemLabel) { + // double click is not 'natively' supported, so we need to send the event direct to the element, see: + // jscs:disable + // http://stackoverflow.com/questions/3982442/selenium-2-webdriver-how-to-double-click-a-table-row-which-opens-a-new-window + // jscs:enable + return browser.executeScript('var evt = document.createEvent("MouseEvents");' + + 'evt.initMouseEvent("dblclick",true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);' + + 'arguments[0].dispatchEvent(evt);', itemLabel); + }); + }; + + this.filterBy = function (filterCss) { + return this.waitForElement(filterCss) + .click() + .then(this.waitForElement.bind(this, filterCss + '.selected', undefined, undefined)); + }; + + this.filterByActiveItems = function () { + return this.filterBy(this.getFilterActiveCss()); + }; + + this.filterByCompletedItems = function () { + return this.filterBy(this.getFilterCompletedCss()); + }; + + this.filterByAllItems = function () { + return this.filterBy(this.getFilterAllCss()); + }; +}; diff --git a/bench/implementations/inferno/test/pageLaxMode.js b/bench/implementations/inferno/test/pageLaxMode.js new file mode 100644 index 0000000..0830aec --- /dev/null +++ b/bench/implementations/inferno/test/pageLaxMode.js @@ -0,0 +1,73 @@ +'use strict'; + +var Page = require('./page'); + +module.exports = function PageLaxMode() { + + Page.apply(this, arguments); + + this.getMainSectionCss = function () { + return 'section section'; + }; + + this.getFooterSectionCss = function () { + return 'section footer'; + }; + + this.getListCss = function (suffixCss) { + return [ + 'section > ul', + 'section > div > ul', + 'ul#todo-list' + ].map(function (listCss) { + return listCss + (suffixCss || ''); + }).join(', '); + }; + + this.getToggleAllCss = function () { + return [ + 'section > input[type="checkbox"]', + 'section > * > input[type="checkbox"]', + 'input#toggle-all' + ].join(', '); + }; + + this.getClearCompletedButtonCss = function () { + return [ + 'footer > button', + 'footer > * > button', + 'button#clear-completed' + ].join(', '); + }; + + this.getItemCountCss = function () { + return [ + 'footer > span', + 'footer > * > span' + ].join(', '); + }; + + this.getFilterCss = function (index) { + return 'footer ul li:nth-child(' + (index + 1) + ') a'; + }; + + this.getNewInputCss = function () { + return [ + 'header > input', + 'header > * > input', + 'input#new-todo' + ].join(', '); + }; + + this.getListItemToggleCss = function (index) { + return this.getListItemCss(index, ' input[type="checkbox"]'); + }; + + this.getListItemInputCss = function (index) { + return [ + this.getListItemCss(index, ' input.edit'), + this.getListItemCss(index, ' input[type="text"]') + ].join(', '); + }; + +}; diff --git a/bench/implementations/inferno/test/run.sh b/bench/implementations/inferno/test/run.sh new file mode 100755 index 0000000..694bbb4 --- /dev/null +++ b/bench/implementations/inferno/test/run.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +args="$@" + +npm i && \ +eval "node memory.js $args" && \ +eval "npm test -- $args" diff --git a/bench/implementations/inferno/test/server.js b/bench/implementations/inferno/test/server.js new file mode 100644 index 0000000..d3efaf3 --- /dev/null +++ b/bench/implementations/inferno/test/server.js @@ -0,0 +1,15 @@ +const fs = require('fs'); +const path = require('path'); +const express = require('express'); +const learnJson = require('./learn.json'); + +const learner = require.resolve('./learn.json'); + +const app = express(); +const dir = path.resolve(__dirname, '..'); + +app.use(express.static(dir)); +app.use('/learn.json', express.static(learner)); +app.use('/favicon.ico', function () {}); + +app.listen(8000); diff --git a/bench/implementations/inferno/test/testOperations.js b/bench/implementations/inferno/test/testOperations.js new file mode 100644 index 0000000..447171d --- /dev/null +++ b/bench/implementations/inferno/test/testOperations.js @@ -0,0 +1,103 @@ +'use strict'; + +function TestOperations(page) { + + this.assertItemInputFocused = function () { + return page.waitForFocusedElement(page.getEditingListItemInputCss(), 'Expected the item input to be focused'); + }; + + this.assertNewInputFocused = function () { + return page.waitForFocusedElement(page.getNewInputCss()); + }; + + this.assertNewInputBlurred = function () { + return page.waitForBlurredElement(page.getNewInputCss()); + }; + + this.assertItemCount = function (itemCount) { + return itemCount === 0 ? + page.waitForMainSectionRemovedOrEmpty() : + page.waitForListItemCount(itemCount); + }; + + this.assertClearCompleteButtonText = function (buttonText) { + return page.waitForClearCompleteButton() + .then(page.waitForTextContent.bind(page, buttonText, 'Expected clear button text to be ' + buttonText)); + }; + + this.assertClearCompleteButtonVisibility = function (shouldBeVisible) { + var failMsg = 'Expected the clear completed items button to be ' + (shouldBeVisible ? 'visible' : 'hidden'); + return page.waitForVisibility(shouldBeVisible, page.getClearCompletedButtonCss(), failMsg); + }; + + this.assertMainSectionVisibility = function (shouldBeVisible) { + var failMsg = 'Expected main section to be ' + (shouldBeVisible ? 'visible' : 'hidden'); + return page.waitForVisibility(shouldBeVisible, page.getMainSectionCss(), failMsg); + }; + + this.assertFooterVisibility = function (shouldBeVisible) { + var failMsg = 'Expected footer to be ' + (shouldBeVisible ? 'visible' : 'hidden'); + return page.waitForVisibility(shouldBeVisible, page.getFooterSectionCss(), failMsg); + }; + + this.assertItemToggleIsHidden = function (index) { + return page.waitForVisibility(false, page.getListItemToggleCss(index), + 'Expected the item toggle button to be hidden'); + }; + + this.assertItemLabelIsHidden = function (index) { + return page.waitForVisibility(false, page.getListItemLabelCss(index), 'Expected the item label to be hidden'); + }; + + this.assertNewItemInputFieldText = function (text) { + return page.waitForNewItemInputField() + .then(page.waitForTextContent.bind(page, text, + 'Expected the new item input text field contents to be ' + text)); + }; + + this.assertItemText = function (itemIndex, text) { + return page.waitForItemLabel(itemIndex) + .then(page.waitForTextContent.bind(page, text, 'Expected the item label to be ' + text)); + }; + + this.assertItems = function (textArray) { + return page.getListItems().then(function (items) { + if (items.length < textArray.length) { + // This means that the framework removes rather than hides list items + textArray = textArray.filter(function (item) { return item !== page.ITEM_HIDDEN_OR_REMOVED; }); + } + var ret; + textArray.forEach(function (text, i) { + if (text === page.ITEM_HIDDEN_OR_REMOVED) { return; } + var promise = page.waitForTextContent(text, 'Expected item text to be ' + text, items[i]); + ret = ret ? ret.then(promise) : promise; + }); + return ret; + }); + }; + + this.assertItemCountText = function (text) { + return page.waitForElement(page.getItemCountCss()) + .then(page.waitForTextContent.bind(page, text, 'Expected item count text to be ' + text)); + }; + + this.assertItemCompletedStates = function (completedStates) { + return page.waitForElement( + page.getListItemsWithCompletedStatesCss(completedStates), + 'Item completed states were incorrect'); + }; + + this.assertFilterAtIndexIsSelected = function (selectedIndex) { + return page.waitForElement( + page.getSelectedFilterCss(selectedIndex), + 'Expexted the filter / route at index ' + selectedIndex + ' to be selected'); + }; + + this.assertCompleteAllCheckedStatus = function (shouldBeChecked) { + var failMsg = 'Expected the mark-all-completed checkbox to be ' + shouldBeChecked ? 'checked' : 'unchecked'; + return page.waitForMarkAllCompletedCheckBox() + .then(page.waitForCheckedStatus.bind(page, shouldBeChecked, failMsg)); + }; +} + +module.exports = TestOperations; diff --git a/bench/implementations/inferno/test/yarn.lock b/bench/implementations/inferno/test/yarn.lock new file mode 100644 index 0000000..2e5eefe --- /dev/null +++ b/bench/implementations/inferno/test/yarn.lock @@ -0,0 +1,581 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +adm-zip@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736" + +adm-zip@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +chromedriver@^2.18.0: + version "2.25.2" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.25.2.tgz#20bfcf1f84ede626be39abf94454a87c1a2ef0b5" + dependencies: + adm-zip "^0.4.7" + kew "^0.5.0" + mkdirp "^0.5.0" + npmconf "^2.1.1" + rimraf "^2.0.3" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +config-chain@~1.1.8: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +content-disposition@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +drool@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/drool/-/drool-0.4.0.tgz#bc60d33b46a956e756d78e995f44a6b3233401dc" + dependencies: + selenium-webdriver "2.53.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +express@^4.10: + version "4.14.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.1" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "~2.2.0" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + finalhandler "0.5.0" + fresh "0.3.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.2" + qs "6.2.0" + range-parser "~1.2.0" + send "0.14.1" + serve-static "~1.11.1" + type-is "~1.6.13" + utils-merge "1.0.0" + vary "~1.1.0" + +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +glob@7.0.5, glob@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +http-errors@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" + dependencies: + inherits "2.0.3" + setprototypeof "1.0.2" + statuses ">= 1.3.1 < 2" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.2.0, ini@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +ipaddr.js@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +kew@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.5.0.tgz#ece11cb5d8d01a81f8ce804c8d0bba06e6b25ca2" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +mime-db@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" + +mime-types@~2.1.11, mime-types@~2.1.13: + version "2.1.13" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" + dependencies: + mime-db "~1.25.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +minimatch@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.1, mkdirp@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +"mocha-known-issues-reporter@git+https://github.com/ColinEberhardt/mocha-known-issues-reporter.git#v0.0.0": + version "0.0.0" + resolved "git+https://github.com/ColinEberhardt/mocha-known-issues-reporter.git#8aea16b3e9596ee794295abbed8cdb95fb379e93" + +mocha@*: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.5" + glob "7.0.5" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +nopt@~3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +npmconf@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/npmconf/-/npmconf-2.1.2.tgz#66606a4a736f1e77a059aa071a79c94ab781853a" + dependencies: + config-chain "~1.1.8" + inherits "~2.0.0" + ini "^1.2.0" + mkdirp "^0.5.0" + nopt "~3.0.1" + once "~1.3.0" + osenv "^0.1.0" + semver "2 || 3 || 4" + uid-number "0.0.5" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + +proxy-addr@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.1.1" + +qs@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +rimraf@^2.0.3, rimraf@^2.2.8: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +sax@0.6.x: + version "0.6.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9" + +selenium-webdriver@2.53.1: + version "2.53.1" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-2.53.1.tgz#b50673955dc03b9164c07773a86b25ea7161dbd9" + dependencies: + adm-zip "0.4.4" + rimraf "^2.2.8" + tmp "0.0.24" + ws "^1.0.1" + xml2js "0.4.4" + +selenium-webdriver@~2.53.1: + version "2.53.3" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz#d29ff5a957dff1a1b49dc457756e4e4bfbdce085" + dependencies: + adm-zip "0.4.4" + rimraf "^2.2.8" + tmp "0.0.24" + ws "^1.0.1" + xml2js "0.4.4" + +"semver@2 || 3 || 4": + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +send@0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.5.0" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.0" + +serve-static@~1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.14.1" + +setprototypeof@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +tmp@0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12" + +type-is@~1.6.13: + version "1.6.14" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.13" + +uid-number@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.5.tgz#5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +vary@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +ws@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +xml2js@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.4.tgz#3111010003008ae19240eba17497b57c729c555d" + dependencies: + sax "0.6.x" + xmlbuilder ">=1.0.0" + +xmlbuilder@>=1.0.0: + version "8.2.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" diff --git a/bench/implementations/inferno/webpack.config.js b/bench/implementations/inferno/webpack.config.js new file mode 100644 index 0000000..f1a91aa --- /dev/null +++ b/bench/implementations/inferno/webpack.config.js @@ -0,0 +1,31 @@ +const webpack = require('webpack'); + +module.exports = { + entry: './src/index.js', + output: { + path: './dist', + publicPath: 'dist', + filename: 'bundle.js' + }, + module: { + loaders: [{ + test: /\.jsx?$/, + exclude: /node_modules/, + loader: 'babel', + query: { + presets: ['es2015-loose', 'stage-0'], + plugins: ['syntax-jsx', 'inferno'] + } + }] + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + 'NODE_ENV': JSON.stringify('production') + } + }), + ], + devServer: { + port: process.env.PORT || 8000 + } +}; diff --git a/bench/implementations/inferno/yarn.lock b/bench/implementations/inferno/yarn.lock new file mode 100644 index 0000000..3ad2f2a --- /dev/null +++ b/bench/implementations/inferno/yarn.lock @@ -0,0 +1,2597 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@^1.3.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-code-frame@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^2.0.0" + +babel-core@^6.18.0, babel-core@^6.5.2: + version "6.18.2" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" + dependencies: + babel-code-frame "^6.16.0" + babel-generator "^6.18.0" + babel-helpers "^6.16.0" + babel-messages "^6.8.0" + babel-register "^6.18.0" + babel-runtime "^6.9.1" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.19.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-helper-bindify-decorators@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" + dependencies: + babel-helper-explode-assignable-expression "^6.18.0" + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-call-delegate@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-explode-class@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" + dependencies: + babel-helper-bindify-decorators "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" + dependencies: + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-get-function-arity@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-hoist-variables@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-optimise-call-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-regex@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" + dependencies: + babel-helper-optimise-call-expression "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helpers@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" + dependencies: + babel-runtime "^6.0.0" + babel-template "^6.16.0" + +babel-loader@^6.2.1: + version "6.2.9" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.9.tgz#2bce6a1c29b47afa90b937ba1fb1f87084d61c61" + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.11" + mkdirp "^0.5.1" + object-assign "^4.0.1" + +babel-messages@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-check-es2015-constants@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-inferno@beta13: + version "1.2.0-beta13" + resolved "https://registry.yarnpkg.com/babel-plugin-inferno/-/babel-plugin-inferno-1.2.0-beta13.tgz#3a5beb856ea75e7b2891e692aeda861dcbfb190d" + dependencies: + babel-plugin-syntax-jsx "^6.18.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-do-expressions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-function-bind@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.3.13: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" + +babel-plugin-transform-async-generator-functions@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" + dependencies: + babel-helper-remap-async-to-generator "^6.16.2" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-async-to-generator@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" + dependencies: + babel-helper-remap-async-to-generator "^6.16.0" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-class-constructor-call@^6.3.13: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.18.0.tgz#80855e38a1ab47b8c6c647f8ea1bcd2c00ca3aae" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-class-properties@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" + dependencies: + babel-helper-function-name "^6.18.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.9.1" + babel-template "^6.15.0" + +babel-plugin-transform-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" + dependencies: + babel-helper-define-map "^6.8.0" + babel-helper-explode-class "^6.8.0" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-types "^6.13.0" + +babel-plugin-transform-do-expressions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.8.0.tgz#fda692af339835cc255bb7544efb8f7c1306c273" + dependencies: + babel-plugin-syntax-do-expressions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-arrow-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoping@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" + dependencies: + babel-runtime "^6.9.0" + babel-template "^6.15.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" + dependencies: + babel-helper-define-map "^6.18.0" + babel-helper-function-name "^6.18.0" + babel-helper-optimise-call-expression "^6.18.0" + babel-helper-replace-supers "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-template "^6.14.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-computed-properties@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" + dependencies: + babel-helper-define-map "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-destructuring@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" + dependencies: + babel-runtime "^6.9.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-for-of@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-function-name@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" + dependencies: + babel-helper-function-name "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.9.0" + +babel-plugin-transform-es2015-literals@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-modules-amd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" + dependencies: + babel-plugin-transform-strict-mode "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.11.6" + babel-template "^6.14.0" + +babel-plugin-transform-es2015-modules-umd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-object-super@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" + dependencies: + babel-helper-replace-supers "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-parameters@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" + dependencies: + babel-helper-call-delegate "^6.18.0" + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.9.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-shorthand-properties@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-spread@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-sticky-regex@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-template-literals@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-unicode-regex@^6.3.13: + version "6.11.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-export-extensions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.8.0.tgz#fa80ff655b636549431bfd38f6b817bd82e47f5b" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-function-bind@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.8.0.tgz#e7f334ce69f50d28fe850a822eaaab9fa4f4d821" + dependencies: + babel-plugin-syntax-function-bind "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-object-rest-spread@^6.16.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz#f6ac428ee3cb4c6aa00943ed1422ce813603b34c" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-regenerator@^6.16.0: + version "6.16.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.16.0" + private "~0.1.5" + +babel-plugin-transform-strict-mode@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-preset-es2015-loose@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2015-loose/-/babel-preset-es2015-loose-7.0.0.tgz#fd80c85d3b20cbf309bd0ce30a36380c5784bf06" + dependencies: + modify-babel-preset "^1.0.0" + +babel-preset-es2015@^6.5.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" + dependencies: + babel-plugin-check-es2015-constants "^6.3.13" + babel-plugin-transform-es2015-arrow-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoping "^6.18.0" + babel-plugin-transform-es2015-classes "^6.18.0" + babel-plugin-transform-es2015-computed-properties "^6.3.13" + babel-plugin-transform-es2015-destructuring "^6.18.0" + babel-plugin-transform-es2015-duplicate-keys "^6.6.0" + babel-plugin-transform-es2015-for-of "^6.18.0" + babel-plugin-transform-es2015-function-name "^6.9.0" + babel-plugin-transform-es2015-literals "^6.3.13" + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-plugin-transform-es2015-modules-systemjs "^6.18.0" + babel-plugin-transform-es2015-modules-umd "^6.18.0" + babel-plugin-transform-es2015-object-super "^6.3.13" + babel-plugin-transform-es2015-parameters "^6.18.0" + babel-plugin-transform-es2015-shorthand-properties "^6.18.0" + babel-plugin-transform-es2015-spread "^6.3.13" + babel-plugin-transform-es2015-sticky-regex "^6.3.13" + babel-plugin-transform-es2015-template-literals "^6.6.0" + babel-plugin-transform-es2015-typeof-symbol "^6.18.0" + babel-plugin-transform-es2015-unicode-regex "^6.3.13" + babel-plugin-transform-regenerator "^6.16.0" + +babel-preset-stage-0@^6.5.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.16.0.tgz#f5a263c420532fd57491f1a7315b3036e428f823" + dependencies: + babel-plugin-transform-do-expressions "^6.3.13" + babel-plugin-transform-function-bind "^6.3.13" + babel-preset-stage-1 "^6.16.0" + +babel-preset-stage-1@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.16.0.tgz#9d31fbbdae7b17c549fd3ac93e3cf6902695e479" + dependencies: + babel-plugin-transform-class-constructor-call "^6.3.13" + babel-plugin-transform-export-extensions "^6.3.13" + babel-preset-stage-2 "^6.16.0" + +babel-preset-stage-2@^6.16.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz#9eb7bf9a8e91c68260d5ba7500493caaada4b5b5" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.18.0" + babel-plugin-transform-decorators "^6.13.0" + babel-preset-stage-3 "^6.17.0" + +babel-preset-stage-3@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.3.13" + babel-plugin-transform-async-generator-functions "^6.17.0" + babel-plugin-transform-async-to-generator "^6.16.0" + babel-plugin-transform-exponentiation-operator "^6.3.13" + babel-plugin-transform-object-rest-spread "^6.16.0" + +babel-register@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" + dependencies: + babel-core "^6.18.0" + babel-runtime "^6.11.6" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" + dependencies: + babel-runtime "^6.9.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.16.0, babel-traverse@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" + dependencies: + babel-code-frame "^6.16.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.19.0" + babylon "^6.11.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.13.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" + dependencies: + babel-runtime "^6.9.1" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0: + version "6.14.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +base64-js@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +batch@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browserify-aes@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" + dependencies: + inherits "^2.0.1" + +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buffer@^4.9.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-2.0.0.tgz#6f22003baacf003ccd287afe6872151fddc58579" + +bytes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +compressible@~2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.9.tgz#6daab4e2b599c2770dd9e21e7a891b1c5a755425" + dependencies: + mime-db ">= 1.24.0 < 2" + +compression@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + dependencies: + accepts "~1.3.3" + bytes "2.3.0" + compressible "~2.0.8" + debug "~2.2.0" + on-headers "~1.0.1" + vary "~1.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +connect-history-api-fallback@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" + dependencies: + browserify-aes "0.4.0" + pbkdf2-compat "2.0.1" + ripemd160 "0.2.0" + sha.js "2.2.6" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@^2.1.1, debug@^2.2.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +domain-browser@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +enhanced-resolve@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + +errno@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@~0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express@^4.13.3: + version "4.14.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.1" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "~2.2.0" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + finalhandler "0.5.0" + fresh "0.3.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.2" + qs "6.2.0" + range-parser "~1.2.0" + send "0.14.1" + serve-static "~1.11.1" + type-is "~1.6.13" + utils-merge "1.0.0" + vary "~1.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.0.tgz#d9ccf0e789e7db725d74bc4877d23aa42972ac50" + dependencies: + websocket-driver ">=0.5.1" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "http://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + supports-color "^0.2.0" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" + +graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +http-errors@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" + dependencies: + inherits "2.0.3" + setprototypeof "1.0.2" + statuses ">= 1.3.1 < 2" + +http-proxy-middleware@~0.17.1: + version "0.17.3" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.3.tgz#940382147149b856084f5534752d5b5a8168cd1d" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" + lodash "^4.17.2" + micromatch "^2.3.11" + +http-proxy@^1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inferno-component@beta32: + version "1.0.0-beta32" + resolved "https://registry.yarnpkg.com/inferno-component/-/inferno-component-1.0.0-beta32.tgz#2bb0aac933c5033b186d809816e158f58a2590ed" + dependencies: + inferno "1.0.0-beta32" + +inferno@1.0.0-beta32, inferno@beta32: + version "1.0.0-beta32" + resolved "https://registry.yarnpkg.com/inferno/-/inferno-1.0.0-beta32.tgz#bd216a5117280da4a15ebcc4b4e1faf3603afc0d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +interpret@^0.6.4: + version "0.6.6" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.0.tgz#33411a482b046bf95e6b0cb27ee2711af4cf15ad" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +loader-utils@^0.2.11: + version "0.2.16" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +lodash@^4.17.2, lodash@^4.2.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" + dependencies: + js-tokens "^2.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + +memory-fs@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.24.0 < 2", mime-db@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: + version "2.1.13" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" + dependencies: + mime-db "~1.25.0" + +mime@1.3.4, mime@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +minimatch@^3.0.0, minimatch@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +modify-babel-preset@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/modify-babel-preset/-/modify-babel-preset-1.2.0.tgz#d1b7c8c24896e19dbc4847347213e6b7144d1bc7" + dependencies: + require-relative "^0.8.7" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +nan@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-libs-browser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.9.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "3.3.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.6.29: + version "0.6.32" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.1" + rc "~1.1.6" + request "^2.79.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +open@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + +optimist@~0.6.0, optimist@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +original@>=0.0.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + dependencies: + url-parse "1.0.x" + +os-browserify@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +pbkdf2-compat@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6, private@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.0: + version "0.11.9" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" + +proxy-addr@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.1.1" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" + +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.9.5: + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + +requires-port@1.0.x, requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +ripemd160@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.5.0" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.0" + +serve-index@^1.7.2: + version "1.8.0" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" + dependencies: + accepts "~1.3.3" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.5.0" + mime-types "~2.1.11" + parseurl "~1.3.1" + +serve-static@~1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.14.1" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" + +sha.js@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sockjs-client@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.1.tgz#284843e9a9784d7c474b1571b3240fca9dda4bb0" + dependencies: + debug "^2.2.0" + eventsource "~0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.1" + +sockjs@^0.3.15: + version "0.3.18" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" + dependencies: + faye-websocket "^0.10.0" + uuid "^2.0.2" + +source-list-map@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.7.tgz#d4b5ce2a46535c72c7e8527c71a77d250618172e" + +source-map-support@^0.4.2: + version "0.4.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" + dependencies: + source-map "^0.5.3" + +source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-cache@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stream-cache/-/stream-cache-0.0.2.tgz#1ac5ad6832428ca55667dbdee395dad4e6db118f" + +stream-http@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.5.0.tgz#585eee513217ed98fe199817e7313b6f772a6802" + dependencies: + builtin-status-codes "^2.0.0" + inherits "^2.0.1" + readable-stream "^2.1.0" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0, supports-color@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +tapable@^0.1.8, tapable@~0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +timers-browserify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +todomvc-app-css@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/todomvc-app-css/-/todomvc-app-css-2.0.6.tgz#0b3667c5e189f1568d9a9bf7947ebd928406961d" + +todomvc-common@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/todomvc-common/-/todomvc-common-1.0.3.tgz#cba1868109caa401b908ebf77794cc1014b74873" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.4" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b" + +type-is@~1.6.13: + version "1.6.14" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.13" + +uglify-js@~2.7.3: + version "2.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url-parse@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +vary@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +watchpack@^0.2.1: + version "0.2.9" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" + dependencies: + async "^0.9.0" + chokidar "^1.0.0" + graceful-fs "^4.1.2" + +webpack-core@~0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + dependencies: + source-list-map "~0.1.7" + source-map "~0.4.1" + +webpack-dev-middleware@^1.4.0: + version "1.8.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.8.4.tgz#e8765c9122887ce9e3abd4cc9c3eb31b61e0948d" + dependencies: + memory-fs "~0.3.0" + mime "^1.3.4" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + +webpack-dev-server@^1.14.1: + version "1.16.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.2.tgz#8bebc2c4ce1c45a15c72dd769d9ba08db306a793" + dependencies: + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + express "^4.13.3" + http-proxy-middleware "~0.17.1" + open "0.0.5" + optimist "~0.6.1" + serve-index "^1.7.2" + sockjs "^0.3.15" + sockjs-client "^1.0.3" + stream-cache "~0.0.1" + strip-ansi "^3.0.0" + supports-color "^3.1.1" + webpack-dev-middleware "^1.4.0" + +webpack@^1.12.14: + version "1.14.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.14.0.tgz#54f1ffb92051a328a5b2057d6ae33c289462c823" + dependencies: + acorn "^3.0.0" + async "^1.3.0" + clone "^1.0.2" + enhanced-resolve "~0.9.0" + interpret "^0.6.4" + loader-utils "^0.2.11" + memory-fs "~0.3.0" + mkdirp "~0.5.0" + node-libs-browser "^0.7.0" + optimist "~0.6.0" + supports-color "^3.1.0" + tapable "~0.1.8" + uglify-js "~2.7.3" + watchpack "^0.2.1" + webpack-core "~0.6.9" + +websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/bench/index.html b/bench/index.html index d16a0c1..8424d86 100644 --- a/bench/index.html +++ b/bench/index.html @@ -48,9 +48,10 @@ impl('Angular', '2', true, 'angular-2-optimized/index.html'), impl('Elm', '0.16', true, 'elm-0.16-optimized/index.html'), impl('Elm', '0.17', true, 'elm-0.17-optimized/index.html'), - impl('Nim-karax', '1.0', false, 'nim-karax/examples/todoapp/index.html'), - impl('Nim-karax-component', '1.0', false, 'nim-karax-comp/examples/todoapp/index.html'), - impl('Nim-karax-component-local', '1.0', false, 'nim-karax-comp-local/examples/todoapp/index.html') + impl('Inferno', '', false, 'inferno/index.html'), + impl('Nim-karax', '', false, 'nim-karax/examples/todoapp/index.html'), + impl('Nim-karax-component', '', false, 'nim-karax-comp/examples/todoapp/index.html'), + impl('Nim-karax-component-local', '', false, 'nim-karax-comp-local/examples/todoapp/index.html') ]); picker.ports.start.subscribe(function(impls) { diff --git a/bench/src/add-complete-delete.js b/bench/src/add-complete-delete.js index b5d2d24..2b2d9f7 100644 --- a/bench/src/add-complete-delete.js +++ b/bench/src/add-complete-delete.js @@ -81,8 +81,8 @@ function click(className, index) return { getFacts: getFacts, - steps: addCompleteDeleteSteps(500) + steps: addCompleteDeleteSteps(150) }; -}(); \ No newline at end of file +}();