From c71d949d82be7758cdecc0f3430307edd23d661b Mon Sep 17 00:00:00 2001 From: dntzhang Date: Tue, 16 Jul 2019 17:22:07 +0800 Subject: [PATCH] omiax - chore * Using mock document * Add example build script --- packages/omiax/config/codemod-const.js | 43 + packages/omiax/config/codemod-let-name.js | 16 + packages/omiax/config/codemod-strip-tdz.js | 62 + packages/omiax/config/eslint-config.js | 66 + packages/omiax/config/properties.json | 51 + packages/omiax/config/rollup.config.esm.js | 10 + packages/omiax/config/rollup.config.js | 58 + packages/omiax/config/rollup.example.js | 56 + packages/omiax/examples/simple/b.js | 2831 +++++++++++++++++ packages/omiax/examples/simple/b.js.map | 1 + packages/omiax/examples/simple/index.html | 10 + packages/omiax/examples/simple/main.js | 29 + packages/omiax/package.json | 66 +- packages/omiax/src/index.js | 5 + .../omiax/src/omi/{native => mock}/README.md | 0 packages/omiax/src/omi/mock/document.js | 59 + packages/omiax/src/omi/mock/element.js | 274 ++ packages/omiax/src/omi/mock/index.js | 6 + packages/omiax/src/omi/mock/text-node.js | 88 + .../omiax/src/omi/{native => mock}/util.js | 5 +- packages/omiax/src/omi/native/document.js | 97 - packages/omiax/src/omi/native/element.js | 289 -- packages/omiax/src/omi/options.js | 7 +- 23 files changed, 3738 insertions(+), 391 deletions(-) create mode 100644 packages/omiax/config/codemod-const.js create mode 100644 packages/omiax/config/codemod-let-name.js create mode 100644 packages/omiax/config/codemod-strip-tdz.js create mode 100644 packages/omiax/config/eslint-config.js create mode 100644 packages/omiax/config/properties.json create mode 100644 packages/omiax/config/rollup.config.esm.js create mode 100644 packages/omiax/config/rollup.config.js create mode 100644 packages/omiax/config/rollup.example.js create mode 100644 packages/omiax/examples/simple/b.js create mode 100644 packages/omiax/examples/simple/b.js.map create mode 100644 packages/omiax/examples/simple/index.html create mode 100644 packages/omiax/examples/simple/main.js create mode 100644 packages/omiax/src/index.js rename packages/omiax/src/omi/{native => mock}/README.md (100%) create mode 100755 packages/omiax/src/omi/mock/document.js create mode 100755 packages/omiax/src/omi/mock/element.js create mode 100644 packages/omiax/src/omi/mock/index.js create mode 100755 packages/omiax/src/omi/mock/text-node.js rename packages/omiax/src/omi/{native => mock}/util.js (97%) delete mode 100755 packages/omiax/src/omi/native/document.js delete mode 100755 packages/omiax/src/omi/native/element.js diff --git a/packages/omiax/config/codemod-const.js b/packages/omiax/config/codemod-const.js new file mode 100644 index 000000000..53a43e2a9 --- /dev/null +++ b/packages/omiax/config/codemod-const.js @@ -0,0 +1,43 @@ +/* eslint no-console:0 */ + +/** Find constants (identified by ALL_CAPS_DECLARATIONS), and inline them globally. + * This is safe because Omi *only* uses global constants. + */ +export default (file, api) => { + let j = api.jscodeshift, + code = j(file.source), + constants = {}, + found = 0; + + code + .find(j.VariableDeclaration) + .filter(decl => { + for (let i = decl.value.declarations.length; i--; ) { + let node = decl.value.declarations[i], + name = node.id && node.id.name, + init = node.init; + if (name && init && name.match(/^[A-Z0-9_$]+$/g) && !init.regex) { + if (init.type === "Literal") { + // console.log(`Inlining constant: ${name}=${init.raw}`); + found++; + constants[name] = init; + // remove declaration + decl.value.declarations.splice(i, 1); + // if it's the last, we'll remove the whole statement + return !decl.value.declarations.length; + } + } + } + return false; + }) + .remove(); + + code + .find(j.Identifier) + .filter( + path => path.value.name && constants.hasOwnProperty(path.value.name) + ) + .replaceWith(path => (found++, constants[path.value.name])); + + return found ? code.toSource({ quote: "single" }) : null; +}; diff --git a/packages/omiax/config/codemod-let-name.js b/packages/omiax/config/codemod-let-name.js new file mode 100644 index 000000000..71be06ae1 --- /dev/null +++ b/packages/omiax/config/codemod-let-name.js @@ -0,0 +1,16 @@ +/** + * Restores var names transformed by babel's let block scoping + */ +export default (file, api) => { + let j = api.jscodeshift; + let code = j(file.source); + + // @TODO unsafe, but without it we gain 20b gzipped: https://www.diffchecker.com/bVrOJWTO + code + .findVariableDeclarators() + .filter(d => /^_i/.test(d.value.id.name)) + .renameTo("i"); + code.findVariableDeclarators("_key").renameTo("key"); + + return code.toSource({ quote: "single" }); +}; diff --git a/packages/omiax/config/codemod-strip-tdz.js b/packages/omiax/config/codemod-strip-tdz.js new file mode 100644 index 000000000..f326175a5 --- /dev/null +++ b/packages/omiax/config/codemod-strip-tdz.js @@ -0,0 +1,62 @@ +/* eslint no-console:0 */ + +// parent node types that we don't want to remove pointless initializations from (because it breaks hoisting) +const BLOCKED = ["ForStatement", "WhileStatement"]; // 'IfStatement', 'SwitchStatement' + +/** Removes var initialization to `void 0`, which Babel adds for TDZ strictness. */ +export default (file, api) => { + let { jscodeshift } = api, + found = 0; + + let code = jscodeshift(file.source) + .find(jscodeshift.VariableDeclaration) + .forEach(handleDeclaration); + + function handleDeclaration(decl) { + let p = decl, + remove = true; + + while ((p = p.parentPath)) { + if (~BLOCKED.indexOf(p.value.type)) { + remove = false; + break; + } + } + + decl.value.declarations.filter(isPointless).forEach(node => { + if (remove === false) { + console.log( + `> Skipping removal of undefined init for "${node.id.name}": within ${ + p.value.type + }` + ); + } else { + removeNodeInitialization(node); + } + }); + } + + function removeNodeInitialization(node) { + node.init = null; + found++; + } + + function isPointless(node) { + let { init } = node; + if (init) { + if ( + init.type === "UnaryExpression" && + init.operator === "void" && + init.argument.value == 0 + ) { + return true; + } + if (init.type === "Identifier" && init.name === "undefined") { + return true; + } + } + return false; + } + + return found ? code.toSource({ quote: "single" }) : null; +}; diff --git a/packages/omiax/config/eslint-config.js b/packages/omiax/config/eslint-config.js new file mode 100644 index 000000000..9c5adbccd --- /dev/null +++ b/packages/omiax/config/eslint-config.js @@ -0,0 +1,66 @@ +module.exports = { + parser: "babel-eslint", + // extends: "eslint:recommended", + // plugins: ["react"], + "extends": ["prettier"], + "plugins": ["prettier"], + env: { + browser: true, + mocha: true, + node: true, + es6: true + }, + parserOptions: { + ecmaFeatures: { + modules: true, + jsx: true + } + }, + globals: { + sinon: true, + expect: true + }, + rules: { + "prettier/prettier": "error", + "no-unused-vars": [1, { varsIgnorePattern: "^h$" }], + "no-cond-assign": 1, + "no-empty": 0, + "no-console": 1, + semi: [1, "never"], + camelcase: 0, + "comma-style": 2, + "comma-dangle": [2, "never"], + indent: ["error", 2], + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "no-trailing-spaces": [2, { skipBlankLines: true }], + "max-nested-callbacks": [2, 3], + "no-eval": 2, + "no-implied-eval": 2, + "no-new-func": 2, + "guard-for-in": 0, + eqeqeq: 0, + "no-else-return": 2, + "no-redeclare": 2, + "no-dupe-keys": 2, + radix: 2, + strict: [2, "never"], + "no-shadow": 0, + "callback-return": [1, ["callback", "cb", "next", "done"]], + "no-delete-var": 2, + "no-undef-init": 2, + "no-shadow-restricted-names": 2, + "handle-callback-err": 0, + "no-lonely-if": 2, + "keyword-spacing": 2, + "constructor-super": 2, + "no-this-before-super": 2, + "no-dupe-class-members": 2, + "no-const-assign": 2, + "prefer-spread": 2, + "no-useless-concat": 2, + "no-var": 2, + "object-shorthand": 2, + "prefer-arrow-callback": 2, + "quotes": [1, "single"] + } +}; diff --git a/packages/omiax/config/properties.json b/packages/omiax/config/properties.json new file mode 100644 index 000000000..d6ec23132 --- /dev/null +++ b/packages/omiax/config/properties.json @@ -0,0 +1,51 @@ +{ + "props": { + "cname": 42, + "props": { + "$_dirty": "__d", + "$_disable": "__x", + "$_listeners": "__l", + "$_renderCallbacks": "__h", + "$__key": "__k", + "$__ref": "__r", + "$normalizedNodeName": "__n", + "$nextBase": "__b", + "$prevContext": "__c", + "$prevProps": "__p", + "$prevState": "__s", + "$_parentComponent": "__u", + "$_componentConstructor": "_componentConstructor", + "$__html": "__html", + "$_component": "_component", + "$__omiattr_": "__omiattr_", + "$_preStyle": "r", + "$_id": "s", + "$__preactattr_": "t", + "$__config__": "v", + "$_isMockDocument": "w", + "$__omiSsrData": "x", + "$_vd": "y", + "$_css": "z", + "$_proxifyObjectTreeRecursively": "A", + "$_isInstalled": "B", + "$_useId": "C", + "$_useMap": "D", + "$___touchX": "F", + "$___touchY": "G", + "$___scrollTop": "H", + "$__elementId": "I", + "$_willUpdate": "J", + "$_preCss": "K", + "$_host": "L", + "$_updatePath": "M", + "$_customStyleElement": "N", + "$_customStyleContent": "O", + "$__hasChildren": "P", + "$__prevProps": "Q" + } + }, + "vars": { + "cname": -1, + "props": {} + } +} \ No newline at end of file diff --git a/packages/omiax/config/rollup.config.esm.js b/packages/omiax/config/rollup.config.esm.js new file mode 100644 index 000000000..fdf7ae3a0 --- /dev/null +++ b/packages/omiax/config/rollup.config.esm.js @@ -0,0 +1,10 @@ +import config from "./rollup.config"; + +// ES output +config.output.format = "es"; +config.output.file = "dist/omi.esm.js"; + +// remove memory() plugin +config.plugins.splice(0, 1); + +export default config; diff --git a/packages/omiax/config/rollup.config.js b/packages/omiax/config/rollup.config.js new file mode 100644 index 000000000..74100d7ce --- /dev/null +++ b/packages/omiax/config/rollup.config.js @@ -0,0 +1,58 @@ +import nodeResolve from "rollup-plugin-node-resolve"; +import babel from "rollup-plugin-babel"; +import memory from "rollup-plugin-memory"; + +const license = require("rollup-plugin-license"); +const pkg = require("../package.json"); +const licensePlugin = license({ + banner: + " omi v" + + pkg.version + + " http://omijs.org\r\nOmi === Preact + Scoped CSS + Store System + Native Support in 3kb javascript.\r\nBy dntzhang https://github.com/dntzhang \r\n Github: https://github.com/Tencent/omi\r\n MIT Licensed." +}); + +export default { + input: "src/omi.js", + output: { + format: "iife", + file: "dist/omi.dev.js", + name: "omi", + sourcemap: true, + strict: true + }, + plugins: [ + memory({ + path: "src/omi.js", + contents: ` + import Omi from './omi'; + if (typeof module!='undefined') module.exports = Omi; + else self.Omi = Omi; + ` + }), + nodeResolve({ + main: true + }), + babel({ + sourceMap: true, + exclude: "node_modules/**", + babelrc: false, + presets: [ + [ + "env", + { + modules: false, + loose: true, + exclude: ["transform-es2015-typeof-symbol"], + targets: { + browsers: ["last 2 versions", "IE >= 9"] + } + } + ] + ], + plugins: [ + "transform-class-properties" + ] + }), + licensePlugin + ] +}; diff --git a/packages/omiax/config/rollup.example.js b/packages/omiax/config/rollup.example.js new file mode 100644 index 000000000..4f2978b68 --- /dev/null +++ b/packages/omiax/config/rollup.example.js @@ -0,0 +1,56 @@ +import nodeResolve from "rollup-plugin-node-resolve"; +import babel from "rollup-plugin-babel"; +import memory from "rollup-plugin-memory"; +import commonjs from "rollup-plugin-commonjs"; + +var ENV = process.env.npm_lifecycle_event; + +export default { + input: "examples/" + ENV + "/main.js", + output: { + format: "iife", + file: "examples/" + ENV + "/b.js", + name: "omi", + sourcemap: true, + strict: true + }, + plugins: [ + memory({ + path: "src/omi.js", + contents: ` + import Omi from './omi'; + if (typeof module!='undefined') module.exports = Omi; + else self.Omi = Omi; + ` + }), + nodeResolve({ + main: true + }), + commonjs({ + include: 'node_modules/**' + }), + babel({ + sourceMap: true, + exclude: "node_modules/**", + babelrc: false, + presets: [ + [ + "env", + { + modules: false, + loose: true, + exclude: ["transform-es2015-typeof-symbol"], + targets: { + browsers: ["last 2 versions", "IE >= 9"] + } + } + ] + ], + plugins: [ + "transform-decorators-legacy", + "transform-class-properties", + ["transform-react-jsx", { pragma: "Omi.h" }] + ] + }) + ] +}; diff --git a/packages/omiax/examples/simple/b.js b/packages/omiax/examples/simple/b.js new file mode 100644 index 000000000..9b1b673b0 --- /dev/null +++ b/packages/omiax/examples/simple/b.js @@ -0,0 +1,2831 @@ +(function () { + 'use strict'; + + /** Virtual DOM Node */ + function VNode() {} + + var nodeId = 1; + function uniqueId() { + return nodeId++; + } + + var docMap = {}; + + function addDoc(id, doc) { + docMap[id] = doc; + } + + function getDoc(id) { + return docMap[id]; + } + + function removeDoc(id) { + delete docMap[id]; + } + + function insertIndex(target, list, newIndex) { + if (newIndex < 0) { + newIndex = 0; + } + var before = list[newIndex - 1]; + var after = list[newIndex]; + list.splice(newIndex, 0, target); + + before && (before.nextSibling = target); + target.previousSibling = before; + target.nextSibling = after; + after && (after.previousSibling = target); + + return newIndex; + } + + function moveIndex(target, list, newIndex) { + var index = list.indexOf(target); + + if (index < 0) { + return -1; + } + + var before = list[index - 1]; + var after = list[index + 1]; + before && (before.nextSibling = after); + after && (after.previousSibling = before); + + list.splice(index, 1); + var newIndexAfter = newIndex; + if (index <= newIndex) { + newIndexAfter = newIndex - 1; + } + var beforeNew = list[newIndexAfter - 1]; + var afterNew = list[newIndexAfter]; + list.splice(newIndexAfter, 0, target); + + beforeNew && (beforeNew.nextSibling = target); + target.previousSibling = beforeNew; + target.nextSibling = afterNew; + afterNew && (afterNew.previousSibling = target); + + if (index === newIndexAfter) { + return -1; + } + return newIndex; + } + + function removeIndex(target, list, changeSibling) { + var index = list.indexOf(target); + + if (index < 0) { + return; + } + if (changeSibling) { + var before = list[index - 1]; + var after = list[index + 1]; + before && (before.nextSibling = after); + after && (after.previousSibling = before); + } + list.splice(index, 1); + } + + function linkParent(node, parent) { + node.parentNode = parent; + if (parent.docId) { + node.docId = parent.docId; + node.ownerDocument = parent.ownerDocument; + node.ownerDocument.nodeMap[node.nodeId] = node; + node.depth = parent.depth + 1; + } + + node.childNodes && node.childNodes.forEach(function (child) { + linkParent(child, node); + }); + } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var displayMap = { + div: 'block', + span: 'inline-block' + }; + + function registerNode(docId, node) { + var doc = getDoc(docId); + doc.nodeMap[node.nodeId] = node; + } + + var Element$1 = function () { + function Element(type) { + _classCallCheck(this, Element); + + this.nodeType = 1; + this.nodeId = uniqueId(); + this.ref = this.nodeId; + this.type = type; + this.attributes = {}; + this.style = { + display: displayMap[type] + }; + this.classStyle = {}; + this.event = {}; + this.childNodes = []; + + this.nodeName = this.type; + + this.parentNode = null; + this.nextSibling = null; + this.previousSibling = null; + this.firstChild = null; + } + + Element.prototype.appendChild = function appendChild(node) { + if (!node.parentNode) { + linkParent(node, this); + insertIndex(node, this.childNodes, this.childNodes.length, true); + + if (this.docId != undefined) { + registerNode(this.docId, node); + } + + //this.ownerDocument.addElement(this.ref, node.toJSON(), -1) + } else { + node.parentNode.removeChild(node); + + this.appendChild(node); + + return; + } + + this.firstChild = this.childNodes[0]; + }; + + Element.prototype.insertBefore = function insertBefore(node, before) { + if (!node.parentNode) { + linkParent(node, this); + var index = insertIndex(node, this.childNodes, this.childNodes.indexOf(before), true); + if (this.docId != undefined) { + registerNode(this.docId, node); + } + + //this.ownerDocument.addElement(this.ref, node.toJSON(), index) + } else { + node.parentNode.removeChild(node); + this.insertBefore(node, before); + return; + } + + this.firstChild = this.childNodes[0]; + }; + + Element.prototype.insertAfter = function insertAfter(node, after) { + if (node.parentNode && node.parentNode !== this) { + return; + } + if (node === after || node.previousSibling && node.previousSibling === after) { + return; + } + if (!node.parentNode) { + linkParent(node, this); + var index = insertIndex(node, this.childNodes, this.childNodes.indexOf(after) + 1, true); + + if (this.docId != undefined) { + registerNode(this.docId, node); + } + + //this.ownerDocument.addElement(this.ref, node.toJSON(), index) + } else { + var _index = moveIndex(node, this.childNodes, this.childNodes.indexOf(after) + 1); + + //this.ownerDocument.moveElement(node.ref, this.ref, index) + } + + this.firstChild = this.childNodes[0]; + }; + + Element.prototype.removeChild = function removeChild(node) { + if (node.parentNode) { + removeIndex(node, this.childNodes, true); + + this.ownerDocument.removeElement(node.ref); + } + + node.parentNode = null; + + this.firstChild = this.childNodes[0]; + }; + + Element.prototype.setAttribute = function setAttribute(key, value, silent) { + if (this.attributes[key] === value && silent !== false) { + return; + } + this.attributes[key] = value; + if (!silent) { + var result = {}; + result[key] = value; + + this.ownerDocument.setAttr(this.ref, result); + } + }; + + Element.prototype.removeAttribute = function removeAttribute(key) { + if (this.attributes[key]) { + delete this.attributes[key]; + } + }; + + Element.prototype.setStyle = function setStyle(key, value, silent) { + if (this.style[key] === value && silent !== false) { + return; + } + this.style[key] = value; + if (!silent && this.ownerDocument) { + var result = {}; + result[key] = value; + + this.ownerDocument.setStyles(this.ref, result); + } + }; + + Element.prototype.setStyles = function setStyles(styles) { + Object.assign(this.style, styles); + if (this.ownerDocument) { + + this.ownerDocument.setStyles(this.ref, styles); + } + }; + + Element.prototype.setClassStyle = function setClassStyle(classStyle) { + for (var key in this.classStyle) { + this.classStyle[key] = ''; + } + + Object.assign(this.classStyle, classStyle); + + this.ownerDocument.setStyles(this.ref, this.toStyle()); + }; + + Element.prototype.addEventListener = function addEventListener(type, handler) { + if (!this.event[type]) { + this.event[type] = handler; + + //this.ownerDocument.addEvent(this.ref, type) + } + }; + + Element.prototype.removeEventListener = function removeEventListener(type) { + if (this.event[type]) { + delete this.event[type]; + var doc = getDoc(this.docId); + doc.nodeMap[this.ref] && doc.nodeMap[this.ref].event && doc.nodeMap[this.ref].event[type] ? doc.nodeMap[this.ref].event[type] = null : ''; + + this.ownerDocument.removeEvent(this.ref, type); + } + }; + + Element.prototype.fireEvent = function fireEvent(type, e) { + var handler = this.event[type]; + if (handler) { + return handler.call(this, e); + } + }; + + Element.prototype.toStyle = function toStyle() { + return Object.assign({}, this.classStyle, this.style); + }; + + Element.prototype.getComputedStyle = function getComputedStyle() {}; + + Element.prototype.toJSON = function toJSON() { + var result = { + id: this.ref, + type: this.type, + docId: this.docId || -10000, + attributes: this.attributes ? this.attributes : {} + }; + result.attributes.style = this.toStyle(); + + var event = Object.keys(this.event); + if (event.length) { + result.event = event; + } + + if (this.childNodes.length) { + result.children = this.childNodes.map(function (child) { + return child.toJSON(); + }); + } + return result; + }; + + Element.prototype.replaceChild = function replaceChild(newChild, oldChild) { + this.insertBefore(newChild, oldChild); + this.removeChild(oldChild); + }; + + Element.prototype.destroy = function destroy() { + var doc = getDoc(this.docId); + + if (doc) { + delete doc.nodeMap[this.nodeId]; + } + + this.parentNode = null; + this.childNodes.forEach(function (child) { + child.destroy(); + }); + }; + + return Element; + }(); + + function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var TextNode = function () { + function TextNode(nodeValue) { + _classCallCheck$1(this, TextNode); + + this.nodeType = 3; + this.nodeId = uniqueId(); + this.ref = this.nodeId; + this.attributes = {}; + this.style = { + display: 'inline' + }; + this.classStyle = {}; + this.event = {}; + this.nodeValue = nodeValue; + this.parentNode = null; + this.nextSibling = null; + this.previousSibling = null; + this.firstChild = null; + this.type = 'text'; + } + + TextNode.prototype.setAttribute = function setAttribute(key, value, silent) { + if (this.attributes[key] === value && silent !== false) { + return; + } + this.attributes[key] = value; + if (!silent) { + var result = {}; + result[key] = value; + + this.ownerDocument.setAttr(this.ref, result); + } + }; + + TextNode.prototype.removeAttribute = function removeAttribute(key) { + if (this.attributes[key]) { + delete this.attributes[key]; + } + }; + + TextNode.prototype.toStyle = function toStyle() { + return Object.assign({}, this.classStyle, this.style); + }; + + TextNode.prototype.splitText = function splitText() {}; + + TextNode.prototype.getComputedStyle = function getComputedStyle() {}; + + TextNode.prototype.toJSON = function toJSON() { + var result = { + id: this.ref, + type: this.type, + docId: this.docId || -10000, + attributes: this.attributes ? this.attributes : {} + }; + result.attributes.style = this.toStyle(); + + var event = Object.keys(this.event); + if (event.length) { + result.event = event; + } + + return result; + }; + + TextNode.prototype.destroy = function destroy() { + var doc = getDoc(this.docId); + + if (doc) { + delete doc.nodeMap[this.nodeId]; + } + + this.parentNode = null; + }; + + return TextNode; + }(); + + function _classCallCheck$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var Document = function () { + function Document(id) { + _classCallCheck$2(this, Document); + + this.id = id; + addDoc(id, this); + this.nodeMap = {}; + this._isMockDocument = true; + } + + // createBody(type, props) { + // if (!this.body) { + // const el = new Element(type, props) + // el.didMount = true + // el.ownerDocument = this + // el.docId = this.id + // el.style.alignItems = 'flex-start' + // this.body = el + // } + + // return this.body + // } + + Document.prototype.createElement = function createElement(tagName, props) { + var el = new Element$1(tagName, props); + el.ownerDocument = this; + el.docId = this.id; + return el; + }; + + Document.prototype.createTextNode = function createTextNode(txt) { + var node = new TextNode(txt); + node.docId = this.id; + return node; + }; + + Document.prototype.destroy = function destroy() { + delete this.listener; + delete this.nodeMap; + removeDoc(this.id); + }; + + Document.prototype.addEventListener = function addEventListener(ref, type) { + //document.addEvent(this.id, ref, type) + }; + + Document.prototype.removeEventListener = function removeEventListener(ref, type) { + //document.removeEvent(this.id, ref, type) + }; + + Document.prototype.scrollTo = function scrollTo(ref, x, y, animated) { + document.scrollTo(this.id, ref, x, y, animated); + }; + + return Document; + }(); + + var mock = { + document: new Document(0) + }; + + function getGlobal() { + if (typeof global !== 'object' || !global || global.Math !== Math || global.Array !== Array) { + if (typeof self !== 'undefined') { + return self; + } else if (typeof window !== 'undefined') { + return window; + } else if (typeof global !== 'undefined') { + return global; + } + return function () { + return this; + }(); + } + return global; + } + + /** Global options + * @public + * @namespace options {Object} + */ + var options = { + scopedStyle: true, + mapping: {}, + isWeb: true, + staticStyleMapping: {}, + doc: mock.document, + //doc: typeof document === 'object' ? document : null, + root: getGlobal(), + //styleCache :[{ctor:ctor,ctorName:ctorName,style:style}] + styleCache: [] + //componentChange(component, element) { }, + /** If `true`, `prop` changes trigger synchronous component updates. + * @name syncComponentUpdates + * @type Boolean + * @default true + */ + //syncComponentUpdates: true, + + /** Processes all created VNodes. + * @param {VNode} vnode A newly-created VNode to normalize/process + */ + //vnode(vnode) { } + + /** Hook invoked after a component is mounted. */ + //afterMount(component) { }, + + /** Hook invoked after the DOM is updated with a component's latest render. */ + //afterUpdate(component) { } + + /** Hook invoked immediately before a component is unmounted. */ + // beforeUnmount(component) { } + }; + + var stack = []; + + /** + * JSX/hyperscript reviver. + * @see http://jasonformat.com/wtf-is-jsx + * Benchmarks: https://esbench.com/bench/57ee8f8e330ab09900a1a1a0 + * + * Note: this is exported as both `h()` and `createElement()` for compatibility reasons. + * + * Creates a VNode (virtual DOM element). A tree of VNodes can be used as a lightweight representation + * of the structure of a DOM tree. This structure can be realized by recursively comparing it against + * the current _actual_ DOM structure, and applying only the differences. + * + * `h()`/`createElement()` accepts an element name, a list of attributes/props, + * and optionally children to append to the element. + * + * @example The following DOM tree + * + * `
Hello!
` + * + * can be constructed using this function as: + * + * `h('div', { id: 'foo', name : 'bar' }, 'Hello!');` + * + * @param {string} nodeName An element name. Ex: `div`, `a`, `span`, etc. + * @param {Object} attributes Any attributes/props to set on the created element. + * @param rest Additional arguments are taken to be children to append. Can be infinitely nested Arrays. + * + * @public + */ + function h(nodeName, attributes) { + var children = [], + lastSimple = void 0, + child = void 0, + simple = void 0, + i = void 0; + for (i = arguments.length; i-- > 2;) { + stack.push(arguments[i]); + } + if (attributes && attributes.children != null) { + if (!stack.length) stack.push(attributes.children); + delete attributes.children; + } + while (stack.length) { + if ((child = stack.pop()) && child.pop !== undefined) { + for (i = child.length; i--;) { + stack.push(child[i]); + } + } else { + if (typeof child === 'boolean') child = null; + + if (simple = typeof nodeName !== 'function') { + if (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false; + } + + if (simple && lastSimple) { + children[children.length - 1] += child; + } else if (children.length === 0) { + children = [child]; + } else { + children.push(child); + } + + lastSimple = simple; + } + } + + var p = new VNode(); + p.nodeName = nodeName; + p.children = children; + p.attributes = attributes == null ? undefined : attributes; + p.key = attributes == null ? undefined : attributes.key; + + // if a "vnode hook" is defined, pass every created VNode to it + if (options.vnode !== undefined) options.vnode(p); + + return p; + } + + /* eslint-disable no-unused-vars */ + + var getOwnPropertySymbols = Object.getOwnPropertySymbols; + var hasOwnProperty = Object.prototype.hasOwnProperty; + var propIsEnumerable = Object.prototype.propertyIsEnumerable; + + function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); + } + + function assign(target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; + } + + if (typeof Element !== 'undefined' && !Element.prototype.addEventListener) { + var runListeners = function runListeners(oEvent) { + if (!oEvent) { + oEvent = window.event; + } + for (var iLstId = 0, iElId = 0, oEvtListeners = oListeners[oEvent.type]; iElId < oEvtListeners.aEls.length; iElId++) { + if (oEvtListeners.aEls[iElId] === this) { + for (iLstId; iLstId < oEvtListeners.aEvts[iElId].length; iLstId++) { + oEvtListeners.aEvts[iElId][iLstId].call(this, oEvent); + } + break; + } + } + }; + + var oListeners = {}; + + Element.prototype.addEventListener = function (sEventType, fListener /*, useCapture (will be ignored!) */) { + if (oListeners.hasOwnProperty(sEventType)) { + var oEvtListeners = oListeners[sEventType]; + for (var nElIdx = -1, iElId = 0; iElId < oEvtListeners.aEls.length; iElId++) { + if (oEvtListeners.aEls[iElId] === this) { + nElIdx = iElId;break; + } + } + if (nElIdx === -1) { + oEvtListeners.aEls.push(this); + oEvtListeners.aEvts.push([fListener]); + this["on" + sEventType] = runListeners; + } else { + var aElListeners = oEvtListeners.aEvts[nElIdx]; + if (this["on" + sEventType] !== runListeners) { + aElListeners.splice(0); + this["on" + sEventType] = runListeners; + } + for (var iLstId = 0; iLstId < aElListeners.length; iLstId++) { + if (aElListeners[iLstId] === fListener) { + return; + } + } + aElListeners.push(fListener); + } + } else { + oListeners[sEventType] = { aEls: [this], aEvts: [[fListener]] }; + this["on" + sEventType] = runListeners; + } + }; + Element.prototype.removeEventListener = function (sEventType, fListener /*, useCapture (will be ignored!) */) { + if (!oListeners.hasOwnProperty(sEventType)) { + return; + } + var oEvtListeners = oListeners[sEventType]; + for (var nElIdx = -1, iElId = 0; iElId < oEvtListeners.aEls.length; iElId++) { + if (oEvtListeners.aEls[iElId] === this) { + nElIdx = iElId;break; + } + } + if (nElIdx === -1) { + return; + } + for (var iLstId = 0, aElListeners = oEvtListeners.aEvts[nElIdx]; iLstId < aElListeners.length; iLstId++) { + if (aElListeners[iLstId] === fListener) { + aElListeners.splice(iLstId, 1); + } + } + }; + } + + if (typeof Object.create !== 'function') { + Object.create = function (proto, propertiesObject) { + if (typeof proto !== 'object' && typeof proto !== 'function') { + throw new TypeError('Object prototype may only be an Object: ' + proto); + } else if (proto === null) { + throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument."); + } + + // if (typeof propertiesObject != 'undefined') { + // throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument."); + // } + + function F() {} + F.prototype = proto; + + return new F(); + }; + } + + if (!String.prototype.trim) { + String.prototype.trim = function () { + return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + }; + } + + /** + * Copy all properties from `props` onto `obj`. + * @param {Object} obj Object onto which properties should be copied. + * @param {Object} props Object from which to copy properties. + * @returns obj + * @private + */ + function extend(obj, props) { + for (var i in props) { + obj[i] = props[i]; + }return obj; + } + + /** Invoke or update a ref, depending on whether it is a function or object ref. + * @param {object|function} [ref=null] + * @param {any} [value] + */ + function applyRef(ref, value) { + if (ref) { + if (typeof ref == 'function') ref(value);else ref.current = value; + } + } + + /** + * Call a function asynchronously, as soon as possible. Makes + * use of HTML Promise to schedule the callback if available, + * otherwise falling back to `setTimeout` (mainly for IE<11). + * + * @param {Function} callback + */ + + var usePromise = typeof Promise == 'function'; + + // for native + if (typeof document !== 'object' && typeof global !== 'undefined' && global.__config__) { + if (global.__config__.platform === 'android') { + usePromise = true; + } else { + var systemVersion = global.__config__.systemVersion && global.__config__.systemVersion.split('.')[0] || 0; + if (systemVersion > 8) { + usePromise = true; + } + } + } + + var defer = usePromise ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout; + + function isArray(obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + } + + function nProps(props) { + if (!props || isArray(props)) return {}; + var result = {}; + Object.keys(props).forEach(function (key) { + result[key] = props[key].value; + }); + return result; + } + + function getUse(data, paths) { + var obj = []; + paths.forEach(function (path, index) { + var isPath = typeof path === 'string'; + if (isPath) { + obj[index] = getTargetByPath(data, path); + } else { + var key = Object.keys(path)[0]; + var value = path[key]; + if (typeof value === 'string') { + obj[index] = getTargetByPath(data, value); + } else { + var tempPath = value[0]; + if (typeof tempPath === 'string') { + var tempVal = getTargetByPath(data, tempPath); + obj[index] = value[1] ? value[1](tempVal) : tempVal; + } else { + var args = []; + tempPath.forEach(function (path) { + args.push(getTargetByPath(data, path)); + }); + obj[index] = value[1].apply(null, args); + } + } + obj[key] = obj[index]; + } + }); + return obj; + } + + function getTargetByPath(origin, path) { + var arr = path.replace(/]/g, '').replace(/\[/g, '.').split('.'); + var current = origin; + for (var i = 0, len = arr.length; i < len; i++) { + current = current[arr[i]]; + } + return current; + } + + /** + * Clones the given VNode, optionally adding attributes/props and replacing its children. + * @param {VNode} vnode The virtual DOM element to clone + * @param {Object} props Attributes/props to add when cloning + * @param {VNode} rest Any additional arguments will be used as replacement children. + */ + function cloneElement(vnode, props) { + return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children); + } + + // render modes + + var NO_RENDER = 0; + var SYNC_RENDER = 1; + var FORCE_RENDER = 2; + var ASYNC_RENDER = 3; + + var ATTR_KEY = '__omiattr_'; + + // DOM properties that should NOT have "px" added when numeric + var IS_NON_DIMENSIONAL$1 = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i; + + /** Managed queue of dirty components to be re-rendered */ + + var items = []; + + function enqueueRender(component) { + if (items.push(component) == 1) { + (options.debounceRendering || defer)(rerender); + } + } + + /** Rerender all enqueued dirty components */ + function rerender() { + var p = void 0; + while (p = items.pop()) { + renderComponent(p); + } + } + + var mapping = options.mapping; + /** + * Check if two nodes are equivalent. + * + * @param {Node} node DOM Node to compare + * @param {VNode} vnode Virtual DOM node to compare + * @param {boolean} [hydrating=false] If true, ignores component constructors when comparing. + * @private + */ + function isSameNodeType(node, vnode, hydrating) { + if (typeof vnode === 'string' || typeof vnode === 'number') { + return node.splitText !== undefined; + } + if (typeof vnode.nodeName === 'string') { + var ctor = mapping[vnode.nodeName]; + if (ctor) { + return hydrating || node._componentConstructor === ctor; + } + return !node._componentConstructor && isNamedNode(node, vnode.nodeName); + } + return hydrating || node._componentConstructor === vnode.nodeName; + } + + /** + * Check if an Element has a given nodeName, case-insensitively. + * + * @param {Element} node A DOM Element to inspect the name of. + * @param {String} nodeName Unnormalized name to compare against. + */ + function isNamedNode(node, nodeName) { + return node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase(); + } + + /** + * Reconstruct Component-style `props` from a VNode. + * Ensures default/fallback values from `defaultProps`: + * Own-properties of `defaultProps` not present in `vnode.attributes` are added. + * + * @param {VNode} vnode + * @returns {Object} props + */ + function getNodeProps(vnode) { + var props = extend({}, vnode.attributes); + props.children = vnode.children; + + var defaultProps = vnode.nodeName.defaultProps; + if (defaultProps !== undefined) { + for (var i in defaultProps) { + if (props[i] === undefined) { + props[i] = defaultProps[i]; + } + } + } + + return props; + } + + /** Create an element with the given nodeName. + * @param {String} nodeName + * @param {Boolean} [isSvg=false] If `true`, creates an element within the SVG namespace. + * @returns {Element} node + */ + function createNode(nodeName, isSvg) { + var node = isSvg ? options.doc.createElementNS('http://www.w3.org/2000/svg', nodeName) : options.doc.createElement(nodeName); + node.normalizedNodeName = nodeName; + return node; + } + + function parseCSSText(cssText) { + var cssTxt = cssText.replace(/\/\*(.|\s)*?\*\//g, ' ').replace(/\s+/g, ' '); + var style = {}, + _ref = cssTxt.match(/ ?(.*?) ?{([^}]*)}/) || [a, b, cssTxt], + a = _ref[0], + b = _ref[1], + rule = _ref[2]; + + var cssToJs = function cssToJs(s) { + return s.replace(/\W+\w/g, function (match) { + return match.slice(-1).toUpperCase(); + }); + }; + var properties = rule.split(';').map(function (o) { + return o.split(':').map(function (x) { + return x && x.trim(); + }); + }); + for (var _iterator = properties, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref3; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref3 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref3 = _i.value; + } + + var _ref2 = _ref3; + var property = _ref2[0]; + var value = _ref2[1]; + style[cssToJs(property)] = value; + }return style; + } + + /** Remove a child node from its parent if attached. + * @param {Element} node The node to remove + */ + function removeNode(node) { + var parentNode = node.parentNode; + if (parentNode) parentNode.removeChild(node); + } + + /** Set a named attribute on the given Node, with special behavior for some names and event handlers. + * If `value` is `null`, the attribute/handler will be removed. + * @param {Element} node An element to mutate + * @param {string} name The name/key to set, such as an event or attribute name + * @param {any} old The last value that was set for this name/node pair + * @param {any} value An attribute value, such as a function to be used as an event handler + * @param {Boolean} isSvg Are we currently diffing inside an svg? + * @private + */ + function setAccessor(node, name, old, value, isSvg) { + if (name === 'className') name = 'class'; + + if (name === 'key') { + // ignore + } else if (name === 'ref') { + applyRef(old, null); + applyRef(value, node); + } else if (name === 'class' && !isSvg) { + node.className = value || ''; + } else if (name === 'style') { + if (options.isWeb) { + if (!value || typeof value === 'string' || typeof old === 'string') { + node.style.cssText = value || ''; + } + if (value && typeof value === 'object') { + if (typeof old !== 'string') { + for (var i in old) { + if (!(i in value)) node.style[i] = ''; + } + } + for (var _i2 in value) { + node.style[_i2] = typeof value[_i2] === 'number' && IS_NON_DIMENSIONAL$1.test(_i2) === false ? value[_i2] + 'px' : value[_i2]; + } + } + } else { + var oldJson = old, + currentJson = value; + if (typeof old === 'string') { + oldJson = parseCSSText(old); + } + if (typeof value == 'string') { + currentJson = parseCSSText(value); + } + + var result = {}, + changed = false; + + if (oldJson) { + for (var key in oldJson) { + if (typeof currentJson == 'object' && !(key in currentJson)) { + result[key] = ''; + changed = true; + } + } + + for (var ckey in currentJson) { + if (currentJson[ckey] !== oldJson[ckey]) { + result[ckey] = currentJson[ckey]; + changed = true; + } + } + + if (changed) { + node.setStyles(result); + } + } else { + node.setStyles(currentJson); + } + } + } else if (name === 'dangerouslySetInnerHTML') { + if (value) node.innerHTML = value.__html || ''; + } else if (name[0] == 'o' && name[1] == 'n') { + var useCapture = name !== (name = name.replace(/Capture$/, '')); + name = name.toLowerCase().substring(2); + if (value) { + if (!old) { + node.addEventListener(name, eventProxy, useCapture); + if (name == 'tap') { + node.addEventListener('touchstart', touchStart, useCapture); + node.addEventListener('touchend', touchEnd, useCapture); + } + } + } else { + node.removeEventListener(name, eventProxy, useCapture); + if (name == 'tap') { + node.removeEventListener('touchstart', touchStart, useCapture); + node.removeEventListener('touchend', touchEnd, useCapture); + } + } + (node._listeners || (node._listeners = {}))[name] = value; + } else if (name !== 'list' && name !== 'type' && !isSvg && name in node) { + setProperty(node, name, value == null ? '' : value); + if (value == null || value === false) node.removeAttribute(name); + } else { + var ns = isSvg && name !== (name = name.replace(/^xlink:?/, '')); + if (value == null || value === false) { + if (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name); + } else if (typeof value !== 'function') { + if (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value); + } + } + } + + /** Attempt to set a DOM property to the given value. + * IE & FF throw for certain property-value combinations. + */ + function setProperty(node, name, value) { + try { + node[name] = value; + } catch (e) {} + } + + /** Proxy an event to hooked event handlers + * @private + */ + function eventProxy(e) { + return this._listeners[e.type](options.event && options.event(e) || e); + } + + function touchStart(e) { + this.___touchX = e.touches[0].pageX; + this.___touchY = e.touches[0].pageY; + this.___scrollTop = document.body.scrollTop; + } + + function touchEnd(e) { + if (Math.abs(e.changedTouches[0].pageX - this.___touchX) < 30 && Math.abs(e.changedTouches[0].pageY - this.___touchY) < 30 && Math.abs(document.body.scrollTop - this.___scrollTop) < 30) { + this.dispatchEvent(new CustomEvent('tap', { detail: e })); + } + } + + var styleId = 0; + + function getCtorName(ctor) { + for (var i = 0, len = options.styleCache.length; i < len; i++) { + var item = options.styleCache[i]; + + if (item.ctor === ctor) { + return item.attrName; + } + } + + var attrName = 's' + styleId; + options.styleCache.push({ ctor: ctor, attrName: attrName }); + styleId++; + + return attrName; + } + + // many thanks to https://github.com/thomaspark/scoper/ + function scoper(css, prefix) { + prefix = '[' + prefix.toLowerCase() + ']'; + // https://www.w3.org/TR/css-syntax-3/#lexical + css = css.replace(/\/\*[^*]*\*+([^/][^*]*\*+)*\//g, ''); + // eslint-disable-next-line + var re = new RegExp('([^\r\n,{}:]+)(:[^\r\n,{}]+)?(,(?=[^{}]*{)|\s*{)', 'g'); + /** + * Example: + * + * .classname::pesudo { color:red } + * + * g1 is normal selector `.classname` + * g2 is pesudo class or pesudo element + * g3 is the suffix + */ + css = css.replace(re, function (g0, g1, g2, g3) { + if (typeof g2 === 'undefined') { + g2 = ''; + } + + /* eslint-ignore-next-line */ + if (g1.match(/^\s*(@media|\d+%?|@-webkit-keyframes|@keyframes|to|from|@font-face)/)) { + return g1 + g2 + g3; + } + + var appendClass = g1.replace(/(\s*)$/, '') + prefix + g2; + //let prependClass = prefix + ' ' + g1.trim() + g2; + + return appendClass + g3; + //return appendClass + ',' + prependClass + g3; + }); + + return css; + } + + function addStyle(cssText, id) { + id = id.toLowerCase(); + var ele = document.getElementById(id); + var head = document.getElementsByTagName('head')[0]; + if (ele && ele.parentNode === head) { + head.removeChild(ele); + } + + var someThingStyles = document.createElement('style'); + head.appendChild(someThingStyles); + someThingStyles.setAttribute('type', 'text/css'); + someThingStyles.setAttribute('id', id); + if (window.ActiveXObject) { + someThingStyles.styleSheet.cssText = cssText; + } else { + someThingStyles.textContent = cssText; + } + } + + function addStyleWithoutId(cssText) { + var head = document.getElementsByTagName('head')[0]; + var someThingStyles = document.createElement('style'); + head.appendChild(someThingStyles); + someThingStyles.setAttribute('type', 'text/css'); + + if (window.ActiveXObject) { + someThingStyles.styleSheet.cssText = cssText; + } else { + someThingStyles.textContent = cssText; + } + } + + function addScopedAttrStatic(vdom, attr) { + if (options.scopedStyle) { + scopeVdom(attr, vdom); + } + } + + function addStyleToHead(style, attr) { + if (options.scopedStyle) { + if (!options.staticStyleMapping[attr]) { + addStyle(scoper(style, attr), attr); + options.staticStyleMapping[attr] = true; + } + } else if (!options.staticStyleMapping[attr]) { + addStyleWithoutId(style); + options.staticStyleMapping[attr] = true; + } + } + + function scopeVdom(attr, vdom) { + if (typeof vdom === 'object') { + vdom.attributes = vdom.attributes || {}; + vdom.attributes[attr] = ''; + vdom.css = vdom.css || {}; + vdom.css[attr] = ''; + vdom.children.forEach(function (child) { + return scopeVdom(attr, child); + }); + } + } + + function scopeHost(vdom, css) { + if (typeof vdom === 'object' && css) { + vdom.attributes = vdom.attributes || {}; + for (var key in css) { + vdom.attributes[key] = ''; + } + } + } + + /** Queue of components that have been mounted and are awaiting componentDidMount */ + var mounts = []; + + /** Diff recursion count, used to track the end of the diff cycle. */ + var diffLevel = 0; + + /** Global flag indicating if the diff is currently within an SVG */ + var isSvgMode = false; + + /** Global flag indicating if the diff is performing hydration */ + var hydrating = false; + + /** Invoke queued componentDidMount lifecycle methods */ + function flushMounts() { + var c = void 0; + while (c = mounts.pop()) { + if (options.afterMount) options.afterMount(c); + if (c.installed) c.installed(); + if (c.constructor.css || c.css) { + addStyleToHead(c.constructor.css ? c.constructor.css : typeof c.css === 'function' ? c.css() : c.css, '_s' + getCtorName(c.constructor)); + } + } + } + + /** Apply differences in a given vnode (and it's deep children) to a real DOM Node. + * @param {Element} [dom=null] A DOM node to mutate into the shape of the `vnode` + * @param {VNode} vnode A VNode (with descendants forming a tree) representing the desired DOM structure + * @returns {Element} dom The created/mutated element + * @private + */ + function diff(dom, vnode, context, mountAll, parent, componentRoot) { + // diffLevel having been 0 here indicates initial entry into the diff (not a subdiff) + if (!diffLevel++) { + // when first starting the diff, check if we're diffing an SVG or within an SVG + isSvgMode = parent != null && parent.ownerSVGElement !== undefined; + + // hydration is indicated by the existing element to be diffed not having a prop cache + hydrating = dom != null && !(ATTR_KEY in dom); + } + var ret = void 0; + + if (isArray(vnode)) { + vnode = { + nodeName: 'span', + children: vnode + }; + } + + ret = idiff(dom, vnode, context, mountAll, componentRoot); + // append the element if its a new parent + if (parent && ret.parentNode !== parent) parent.appendChild(ret); + + // diffLevel being reduced to 0 means we're exiting the diff + if (! --diffLevel) { + hydrating = false; + // invoke queued componentDidMount lifecycle methods + if (!componentRoot) flushMounts(); + } + + return ret; + } + + /** Internals of `diff()`, separated to allow bypassing diffLevel / mount flushing. */ + function idiff(dom, vnode, context, mountAll, componentRoot) { + var out = dom, + prevSvgMode = isSvgMode; + + // empty values (null, undefined, booleans) render as empty Text nodes + if (vnode == null || typeof vnode === 'boolean') vnode = ''; + + // If the VNode represents a Component, perform a component diff: + var vnodeName = vnode.nodeName; + if (options.mapping[vnodeName]) { + vnode.nodeName = options.mapping[vnodeName]; + return buildComponentFromVNode(dom, vnode, context, mountAll); + } + if (typeof vnodeName == 'function') { + return buildComponentFromVNode(dom, vnode, context, mountAll); + } + + // Fast case: Strings & Numbers create/update Text nodes. + if (typeof vnode === 'string' || typeof vnode === 'number') { + // update if it's already a Text node: + if (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) { + /* istanbul ignore if */ /* Browser quirk that can't be covered: https://github.com/developit/preact/commit/fd4f21f5c45dfd75151bd27b4c217d8003aa5eb9 */ + if (dom.nodeValue != vnode) { + dom.nodeValue = vnode; + } + } else { + // it wasn't a Text node: replace it with one and recycle the old Element + out = document.createTextNode(vnode); + if (dom) { + if (dom.parentNode) dom.parentNode.replaceChild(out, dom); + recollectNodeTree(dom, true); + } + } + + //ie8 error + try { + out[ATTR_KEY] = true; + } catch (e) {} + + return out; + } + + // Tracks entering and exiting SVG namespace when descending through the tree. + isSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode; + + // If there's no existing element or it's the wrong type, create a new one: + vnodeName = String(vnodeName); + if (!dom || !isNamedNode(dom, vnodeName)) { + out = createNode(vnodeName, isSvgMode); + + if (dom) { + // move children into the replacement node + while (dom.firstChild) { + out.appendChild(dom.firstChild); + } // if the previous Element was mounted into the DOM, replace it inline + if (dom.parentNode) dom.parentNode.replaceChild(out, dom); + + // recycle the old element (skips non-Element node types) + recollectNodeTree(dom, true); + } + } + + var fc = out.firstChild, + props = out[ATTR_KEY], + vchildren = vnode.children; + + if (props == null) { + props = out[ATTR_KEY] = {}; + for (var a = out.attributes, i = a.length; i--;) { + props[a[i].name] = a[i].value; + } + } + + // Optimization: fast-path for elements containing a single TextNode: + if (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) { + if (fc.nodeValue != vchildren[0]) { + fc.nodeValue = vchildren[0]; + } + } + // otherwise, if there are existing or new children, diff them: + else if (vchildren && vchildren.length || fc != null) { + innerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null); + } + + // Apply attributes/props from VNode to the DOM Element: + diffAttributes(out, vnode.attributes, props); + + // restore previous SVG mode: (in case we're exiting an SVG namespace) + isSvgMode = prevSvgMode; + + return out; + } + + /** Apply child and attribute changes between a VNode and a DOM Node to the DOM. + * @param {Element} dom Element whose children should be compared & mutated + * @param {Array} vchildren Array of VNodes to compare to `dom.childNodes` + * @param {Object} context Implicitly descendant context object (from most recent `getChildContext()`) + * @param {Boolean} mountAll + * @param {Boolean} isHydrating If `true`, consumes externally created elements similar to hydration + */ + function innerDiffNode(dom, vchildren, context, mountAll, isHydrating) { + var originalChildren = dom.childNodes, + children = [], + keyed = {}, + keyedLen = 0, + min = 0, + len = originalChildren.length, + childrenLen = 0, + vlen = vchildren ? vchildren.length : 0, + j = void 0, + c = void 0, + f = void 0, + vchild = void 0, + child = void 0; + + // Build up a map of keyed children and an Array of unkeyed children: + if (len !== 0) { + for (var i = 0; i < len; i++) { + var _child = originalChildren[i], + props = _child[ATTR_KEY], + key = vlen && props ? _child._component ? _child._component.__key : props.key : null; + if (key != null) { + keyedLen++; + keyed[key] = _child; + } else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) { + children[childrenLen++] = _child; + } + } + } + + if (vlen !== 0) { + for (var _i = 0; _i < vlen; _i++) { + vchild = vchildren[_i]; + child = null; + + // attempt to find a node based on key matching + var _key = vchild.key; + if (_key != null) { + if (keyedLen && keyed[_key] !== undefined) { + child = keyed[_key]; + keyed[_key] = undefined; + keyedLen--; + } + } + // attempt to pluck a node of the same type from the existing children + else if (!child && min < childrenLen) { + for (j = min; j < childrenLen; j++) { + if (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) { + child = c; + children[j] = undefined; + if (j === childrenLen - 1) childrenLen--; + if (j === min) min++; + break; + } + } + } + + // morph the matched/found/created DOM child to match vchild (deep) + child = idiff(child, vchild, context, mountAll); + + f = originalChildren[_i]; + if (child && child !== dom && child !== f) { + if (f == null) { + dom.appendChild(child); + } else if (child === f.nextSibling) { + removeNode(f); + } else { + dom.insertBefore(child, f); + } + } + } + } + + // remove unused keyed children: + if (keyedLen) { + for (var _i2 in keyed) { + if (keyed[_i2] !== undefined) recollectNodeTree(keyed[_i2], false); + } + } + + // remove orphaned unkeyed children: + while (min <= childrenLen) { + if ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false); + } + } + + /** Recursively recycle (or just unmount) a node and its descendants. + * @param {Node} node DOM node to start unmount/removal from + * @param {Boolean} [unmountOnly=false] If `true`, only triggers unmount lifecycle, skips removal + */ + function recollectNodeTree(node, unmountOnly) { + var component = node._component; + if (component) { + // if node is owned by a Component, unmount that component (ends up recursing back here) + unmountComponent(component); + } else { + // If the node's VNode had a ref function, invoke it with null here. + // (this is part of the React spec, and smart for unsetting references) + if (node[ATTR_KEY] != null) applyRef(node[ATTR_KEY].ref, null); + + if (unmountOnly === false || node[ATTR_KEY] == null) { + removeNode(node); + } + + removeChildren(node); + } + } + + /** Recollect/unmount all children. + * - we use .lastChild here because it causes less reflow than .firstChild + * - it's also cheaper than accessing the .childNodes Live NodeList + */ + function removeChildren(node) { + node = node.lastChild; + while (node) { + var next = node.previousSibling; + recollectNodeTree(node, true); + node = next; + } + } + + /** Apply differences in attributes from a VNode to the given DOM Element. + * @param {Element} dom Element with attributes to diff `attrs` against + * @param {Object} attrs The desired end-state key-value attribute pairs + * @param {Object} old Current/previous attributes (from previous VNode or element's prop cache) + */ + function diffAttributes(dom, attrs, old) { + var name = void 0; + + // remove attributes no longer present on the vnode by setting them to undefined + for (name in old) { + if (!(attrs && attrs[name] != null) && old[name] != null) { + setAccessor(dom, name, old[name], old[name] = undefined, isSvgMode); + } + } + + // add new & update changed attributes + for (name in attrs) { + if (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) { + setAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode); + } + } + } + + var OBJECTTYPE = '[object Object]'; + var ARRAYTYPE = '[object Array]'; + + function define(name, ctor) { + options.mapping[name] = ctor; + if (ctor.use) { + ctor.updatePath = getPath(ctor.use); + } else if (ctor.data) { + //Compatible with older versions + ctor.updatePath = getUpdatePath(ctor.data); + } + } + + function getPath(obj) { + if (Object.prototype.toString.call(obj) === '[object Array]') { + var result = {}; + obj.forEach(function (item) { + if (typeof item === 'string') { + result[item] = true; + } else { + var tempPath = item[Object.keys(item)[0]]; + if (typeof tempPath === 'string') { + result[tempPath] = true; + } else { + if (typeof tempPath[0] === 'string') { + result[tempPath[0]] = true; + } else { + tempPath[0].forEach(function (path) { + return result[path] = true; + }); + } + } + } + }); + return result; + } else { + return getUpdatePath(obj); + } + } + + function getUpdatePath(data) { + var result = {}; + dataToPath(data, result); + return result; + } + + function dataToPath(data, result) { + Object.keys(data).forEach(function (key) { + result[key] = true; + var type = Object.prototype.toString.call(data[key]); + if (type === OBJECTTYPE) { + _objToPath(data[key], key, result); + } else if (type === ARRAYTYPE) { + _arrayToPath(data[key], key, result); + } + }); + } + + function _objToPath(data, path, result) { + Object.keys(data).forEach(function (key) { + result[path + '.' + key] = true; + delete result[path]; + var type = Object.prototype.toString.call(data[key]); + if (type === OBJECTTYPE) { + _objToPath(data[key], path + '.' + key, result); + } else if (type === ARRAYTYPE) { + _arrayToPath(data[key], path + '.' + key, result); + } + }); + } + + function _arrayToPath(data, path, result) { + data.forEach(function (item, index) { + result[path + '[' + index + ']'] = true; + delete result[path]; + var type = Object.prototype.toString.call(item); + if (type === OBJECTTYPE) { + _objToPath(item, path + '[' + index + ']', result); + } else if (type === ARRAYTYPE) { + _arrayToPath(item, path + '[' + index + ']', result); + } + }); + } + + /** Retains a pool of Components for re-use, keyed on component name. + * Note: since component names are not unique or even necessarily available, these are primarily a form of sharding. + * @private + */ + var components = {}; + + /** Reclaim a component for later re-use by the recycler. */ + function collectComponent(component) { + var name = component.constructor.name;(components[name] || (components[name] = [])).push(component); + } + + /** Create a component. Normalizes differences between PFC's and classful Components. */ + function createComponent(Ctor, props, context, vnode) { + var list = components[Ctor.name], + inst = void 0; + + if (Ctor.prototype && Ctor.prototype.render) { + inst = new Ctor(props, context); + Component.call(inst, props, context); + } else { + inst = new Component(props, context); + inst.constructor = Ctor; + inst.render = doRender; + } + vnode && (inst.scopedCssAttr = vnode.css); + + if (inst.store && inst.store.data) { + if (inst.constructor.use) { + inst.use = getUse(inst.store.data, inst.constructor.use); + inst.store.instances.push(inst); + } else if (inst.initUse) { + var use = inst.initUse(); + inst._updatePath = getPath(use); + inst.use = getUse(inst.store.data, use); + inst.store.instances.push(inst); + } + } + + if (list) { + for (var i = list.length; i--;) { + if (list[i].constructor === Ctor) { + inst.nextBase = list[i].nextBase; + list.splice(i, 1); + break; + } + } + } + return inst; + } + + /** The `.render()` method for a PFC backing instance. */ + function doRender(props, data, context) { + return this.constructor(props, context); + } + + /* obaa 1.0.0 + * By dntzhang + * Github: https://github.com/Tencent/omi + * MIT Licensed. + */ + + var obaa = function obaa(target, arr, callback) { + var _observe = function _observe(target, arr, callback) { + if (!target.$observer) target.$observer = this; + var $observer = target.$observer; + var eventPropArr = []; + if (obaa.isArray(target)) { + if (target.length === 0) { + target.$observeProps = {}; + target.$observeProps.$observerPath = '#'; + } + $observer.mock(target); + } + for (var prop in target) { + if (target.hasOwnProperty(prop)) { + if (callback) { + if (obaa.isArray(arr) && obaa.isInArray(arr, prop)) { + eventPropArr.push(prop); + $observer.watch(target, prop); + } else if (obaa.isString(arr) && prop == arr) { + eventPropArr.push(prop); + $observer.watch(target, prop); + } + } else { + eventPropArr.push(prop); + $observer.watch(target, prop); + } + } + } + $observer.target = target; + if (!$observer.propertyChangedHandler) $observer.propertyChangedHandler = []; + var propChanged = callback ? callback : arr; + $observer.propertyChangedHandler.push({ + all: !callback, + propChanged: propChanged, + eventPropArr: eventPropArr + }); + }; + _observe.prototype = { + onPropertyChanged: function onPropertyChanged(prop, value, oldValue, target, path) { + if (value !== oldValue && this.propertyChangedHandler) { + var rootName = obaa._getRootName(prop, path); + for (var i = 0, len = this.propertyChangedHandler.length; i < len; i++) { + var handler = this.propertyChangedHandler[i]; + if (handler.all || obaa.isInArray(handler.eventPropArr, rootName) || rootName.indexOf('Array-') === 0) { + handler.propChanged.call(this.target, prop, value, oldValue, path); + } + } + } + if (prop.indexOf('Array-') !== 0 && typeof value === 'object') { + this.watch(target, prop, target.$observeProps.$observerPath); + } + }, + mock: function mock(target) { + var self = this; + obaa.methods.forEach(function (item) { + target[item] = function () { + var old = Array.prototype.slice.call(this, 0); + var result = Array.prototype[item].apply(this, Array.prototype.slice.call(arguments)); + if (new RegExp('\\b' + item + '\\b').test(obaa.triggerStr)) { + for (var cprop in this) { + if (this.hasOwnProperty(cprop) && !obaa.isFunction(this[cprop])) { + self.watch(this, cprop, this.$observeProps.$observerPath); + } + } + //todo + self.onPropertyChanged('Array-' + item, this, old, this, this.$observeProps.$observerPath); + } + return result; + }; + target['pure' + item.substring(0, 1).toUpperCase() + item.substring(1)] = function () { + return Array.prototype[item].apply(this, Array.prototype.slice.call(arguments)); + }; + }); + }, + watch: function watch(target, prop, path) { + if (prop === '$observeProps' || prop === '$observer') return; + if (obaa.isFunction(target[prop])) return; + if (!target.$observeProps) target.$observeProps = {}; + if (path !== undefined) { + target.$observeProps.$observerPath = path; + } else { + target.$observeProps.$observerPath = '#'; + } + var self = this; + var currentValue = target.$observeProps[prop] = target[prop]; + Object.defineProperty(target, prop, { + get: function get() { + return this.$observeProps[prop]; + }, + set: function set(value) { + var old = this.$observeProps[prop]; + this.$observeProps[prop] = value; + self.onPropertyChanged(prop, value, old, this, target.$observeProps.$observerPath); + } + }); + if (typeof currentValue == 'object') { + if (obaa.isArray(currentValue)) { + this.mock(currentValue); + if (currentValue.length === 0) { + if (!currentValue.$observeProps) currentValue.$observeProps = {}; + if (path !== undefined) { + currentValue.$observeProps.$observerPath = path; + } else { + currentValue.$observeProps.$observerPath = '#'; + } + } + } + for (var cprop in currentValue) { + if (currentValue.hasOwnProperty(cprop)) { + this.watch(currentValue, cprop, target.$observeProps.$observerPath + '-' + prop); + } + } + } + } + }; + return new _observe(target, arr, callback); + }; + + obaa.methods = ['concat', 'copyWithin', 'entries', 'every', 'fill', 'filter', 'find', 'findIndex', 'forEach', 'includes', 'indexOf', 'join', 'keys', 'lastIndexOf', 'map', 'pop', 'push', 'reduce', 'reduceRight', 'reverse', 'shift', 'slice', 'some', 'sort', 'splice', 'toLocaleString', 'toString', 'unshift', 'values', 'size']; + obaa.triggerStr = ['concat', 'copyWithin', 'fill', 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'size'].join(','); + + obaa.isArray = function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + obaa.isString = function (obj) { + return typeof obj === 'string'; + }; + + obaa.isInArray = function (arr, item) { + for (var i = arr.length; --i > -1;) { + if (item === arr[i]) return true; + } + return false; + }; + + obaa.isFunction = function (obj) { + return Object.prototype.toString.call(obj) == '[object Function]'; + }; + + obaa._getRootName = function (prop, path) { + if (path === '#') { + return prop; + } + return path.split('-')[1]; + }; + + obaa.add = function (obj, prop) { + var $observer = obj.$observer; + $observer.watch(obj, prop); + }; + + obaa.set = function (obj, prop, value, exec) { + if (!exec) { + obj[prop] = value; + } + var $observer = obj.$observer; + $observer.watch(obj, prop); + if (exec) { + obj[prop] = value; + } + }; + + Array.prototype.size = function (length) { + this.length = length; + }; + + var callbacks = []; + var nextTickCallback = []; + + function fireTick() { + callbacks.forEach(function (item) { + item.fn.call(item.scope); + }); + + nextTickCallback.forEach(function (nextItem) { + nextItem.fn.call(nextItem.scope); + }); + nextTickCallback.length = 0; + } + + function proxyUpdate(ele) { + var timeout = null; + obaa(ele.data, function () { + if (ele._willUpdate) { + return; + } + if (ele.constructor.mergeUpdate) { + clearTimeout(timeout); + + timeout = setTimeout(function () { + ele.update(); + fireTick(); + }, 0); + } else { + ele.update(); + fireTick(); + } + }); + } + + /** Set a component's `props` (generally derived from JSX attributes). + * @param {Object} props + * @param {Object} [opts] + * @param {boolean} [opts.renderSync=false] If `true` and {@link options.syncComponentUpdates} is `true`, triggers synchronous rendering. + * @param {boolean} [opts.render=true] If `false`, no render will be triggered. + */ + function setComponentProps(component, props, opts, context, mountAll) { + if (component._disable) return; + component._disable = true; + + if (component.__ref = props.ref) delete props.ref; + if (component.__key = props.key) delete props.key; + + if (!component.base || mountAll) { + if (component.beforeInstall) component.beforeInstall(); + if (component.install) component.install(); + if (component.constructor.observe) { + proxyUpdate(component); + } + } + + if (context && context !== component.context) { + if (!component.prevContext) component.prevContext = component.context; + component.context = context; + } + + if (!component.prevProps) component.prevProps = component.props; + component.props = props; + + component._disable = false; + + if (opts !== NO_RENDER) { + if (opts === SYNC_RENDER || options.syncComponentUpdates !== false || !component.base) { + renderComponent(component, SYNC_RENDER, mountAll); + } else { + enqueueRender(component); + } + } + + applyRef(component.__ref, component); + } + + function shallowComparison(old, attrs) { + var name = void 0; + + for (name in old) { + if (attrs[name] == null && old[name] != null) { + return true; + } + } + + if (old.children.length > 0 || attrs.children.length > 0) { + return true; + } + + for (name in attrs) { + if (name != 'children') { + var type = typeof attrs[name]; + if (type == 'function' || type == 'object') { + return true; + } else if (attrs[name] != old[name]) { + return true; + } + } + } + } + + /** Render a Component, triggering necessary lifecycle events and taking High-Order Components into account. + * @param {Component} component + * @param {Object} [opts] + * @param {boolean} [opts.build=false] If `true`, component will build and store a DOM node if not already associated with one. + * @private + */ + function renderComponent(component, opts, mountAll, isChild) { + if (component._disable) return; + + var props = component.props, + data = component.data, + context = component.context, + previousProps = component.prevProps || props, + previousState = component.prevState || data, + previousContext = component.prevContext || context, + isUpdate = component.base, + nextBase = component.nextBase, + initialBase = isUpdate || nextBase, + initialChildComponent = component._component, + skip = false, + rendered = void 0, + inst = void 0, + cbase = void 0; + + // if updating + if (isUpdate) { + component.props = previousProps; + component.data = previousState; + component.context = previousContext; + if (component.store || opts == FORCE_RENDER || shallowComparison(previousProps, props)) { + var receiveResult = true; + if (component.receiveProps) { + receiveResult = component.receiveProps(props, previousProps); + } + if (receiveResult !== false) { + skip = false; + if (component.beforeUpdate) { + component.beforeUpdate(props, data, context); + } + } else { + skip = true; + } + } else { + skip = true; + } + component.props = props; + component.data = data; + component.context = context; + } + + component.prevProps = component.prevState = component.prevContext = component.nextBase = null; + + if (!skip) { + component.beforeRender && component.beforeRender(); + rendered = component.render(props, data, context); + + //don't rerender + if (component.constructor.css || component.css) { + addScopedAttrStatic(rendered, '_s' + getCtorName(component.constructor)); + } + + scopeHost(rendered, component.scopedCssAttr); + + // context to pass to the child, can be updated via (grand-)parent component + if (component.getChildContext) { + context = extend(extend({}, context), component.getChildContext()); + } + + var childComponent = rendered && rendered.nodeName, + toUnmount = void 0, + base = void 0, + ctor = options.mapping[childComponent]; + + if (ctor) { + // set up high order component link + + var childProps = getNodeProps(rendered); + inst = initialChildComponent; + + if (inst && inst.constructor === ctor && childProps.key == inst.__key) { + setComponentProps(inst, childProps, SYNC_RENDER, context, false); + } else { + toUnmount = inst; + + component._component = inst = createComponent(ctor, childProps, context); + inst.nextBase = inst.nextBase || nextBase; + inst._parentComponent = component; + setComponentProps(inst, childProps, NO_RENDER, context, false); + renderComponent(inst, SYNC_RENDER, mountAll, true); + } + + base = inst.base; + } else { + cbase = initialBase; + + // destroy high order component link + toUnmount = initialChildComponent; + if (toUnmount) { + cbase = component._component = null; + } + + if (initialBase || opts === SYNC_RENDER) { + if (cbase) cbase._component = null; + base = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true); + } + } + + if (initialBase && base !== initialBase && inst !== initialChildComponent) { + var baseParent = initialBase.parentNode; + if (baseParent && base !== baseParent) { + baseParent.replaceChild(base, initialBase); + + if (!toUnmount) { + initialBase._component = null; + recollectNodeTree(initialBase, false); + } + } + } + + if (toUnmount) { + unmountComponent(toUnmount); + } + + component.base = base; + if (base && !isChild) { + var componentRef = component, + t = component; + while (t = t._parentComponent) { + (componentRef = t).base = base; + } + base._component = componentRef; + base._componentConstructor = componentRef.constructor; + } + } + + if (!isUpdate || mountAll) { + mounts.unshift(component); + } else if (!skip) { + // Ensure that pending componentDidMount() hooks of child components + // are called before the componentDidUpdate() hook in the parent. + // Note: disabled as it causes duplicate hooks, see https://github.com/developit/preact/issues/750 + // flushMounts(); + + if (component.afterUpdate) { + //deprecated + component.afterUpdate(previousProps, previousState, previousContext); + } + if (component.updated) { + component.updated(previousProps, previousState, previousContext); + } + if (options.afterUpdate) options.afterUpdate(component); + } + + if (component._renderCallbacks != null) { + while (component._renderCallbacks.length) { + component._renderCallbacks.pop().call(component); + } + } + + if (!diffLevel && !isChild) flushMounts(); + } + + /** Apply the Component referenced by a VNode to the DOM. + * @param {Element} dom The DOM node to mutate + * @param {VNode} vnode A Component-referencing VNode + * @returns {Element} dom The created/mutated element + * @private + */ + function buildComponentFromVNode(dom, vnode, context, mountAll) { + var c = dom && dom._component, + originalComponent = c, + oldDom = dom, + isDirectOwner = c && dom._componentConstructor === vnode.nodeName, + isOwner = isDirectOwner, + props = getNodeProps(vnode); + while (c && !isOwner && (c = c._parentComponent)) { + isOwner = c.constructor === vnode.nodeName; + } + + if (c && isOwner && (!mountAll || c._component)) { + setComponentProps(c, props, ASYNC_RENDER, context, mountAll); + dom = c.base; + } else { + if (originalComponent && !isDirectOwner) { + unmountComponent(originalComponent); + dom = oldDom = null; + } + + c = createComponent(vnode.nodeName, props, context, vnode); + if (dom && !c.nextBase) { + c.nextBase = dom; + // passing dom/oldDom as nextBase will recycle it if unused, so bypass recycling on L229: + oldDom = null; + } + setComponentProps(c, props, SYNC_RENDER, context, mountAll); + dom = c.base; + + if (oldDom && dom !== oldDom) { + oldDom._component = null; + recollectNodeTree(oldDom, false); + } + } + + return dom; + } + + /** Remove a component from the DOM and recycle it. + * @param {Component} component The Component instance to unmount + * @private + */ + function unmountComponent(component) { + if (options.beforeUnmount) options.beforeUnmount(component); + + var base = component.base; + + component._disable = true; + + if (component.uninstall) component.uninstall(); + + if (component.store && component.store.instances) { + for (var i = 0, len = component.store.instances.length; i < len; i++) { + if (component.store.instances[i] === component) { + component.store.instances.splice(i, 1); + break; + } + } + } + + component.base = null; + + // recursively tear down & recollect high-order component children: + var inner = component._component; + if (inner) { + unmountComponent(inner); + } else if (base) { + if (base[ATTR_KEY] != null) applyRef(base[ATTR_KEY].ref, null); + + component.nextBase = base; + + removeNode(base); + collectComponent(component); + + removeChildren(base); + } + + applyRef(component.__ref, null); + } + + var _class, _temp; + + function _classCallCheck$3(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var id = 0; + + var Component = (_temp = _class = function () { + function Component(props, store) { + _classCallCheck$3(this, Component); + + this.props = assign(nProps(this.constructor.props), this.constructor.defaultProps, props); + this.elementId = id++; + this.data = this.constructor.data || this.data || {}; + + this._preCss = null; + + this.store = store; + } + + Component.prototype.update = function update(callback) { + this._willUpdate = true; + if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback); + renderComponent(this, FORCE_RENDER); + if (options.componentChange) options.componentChange(this, this.base); + this._willUpdate = false; + }; + + Component.prototype.fire = function fire(type, data) { + var _this = this; + + Object.keys(this.props).every(function (key) { + if ('on' + type.toLowerCase() === key.toLowerCase()) { + _this.props[key]({ detail: data }); + return false; + } + return true; + }); + }; + + Component.prototype.render = function render() {}; + + return Component; + }(), _class.is = 'WeElement', _temp); + + /** Render JSX into a `parent` Element. + * @param {VNode} vnode A (JSX) VNode to render + * @param {Element} parent DOM element to render into + * @param {object} [store] + * @public + */ + function render(vnode, parent, store, empty, merge) { + parent = typeof parent === 'string' ? document.querySelector(parent) : parent; + obsStore(store); + + if (empty) { + while (parent.firstChild) { + parent.removeChild(parent.firstChild); + } + } + + if (merge) { + merge = typeof merge === 'string' ? document.querySelector(merge) : merge; + } + + return diff(merge, vnode, store, false, parent, false); + } + + function obsStore(store) { + if (store && store.data) { + store.instances = []; + extendStoreUpate(store); + + obaa(store.data, function (prop, val, old, path) { + var patchs = {}; + var key = fixPath(path + '-' + prop); + patchs[key] = true; + store.update(patchs); + }); + } + } + + function merge(vnode, merge, store) { + obsStore(store); + + merge = typeof merge === 'string' ? document.querySelector(merge) : merge; + + return diff(merge, vnode, store); + } + + function extendStoreUpate(store) { + store.update = function (patch) { + var _this = this; + + var updateAll = matchGlobalData(this.globalData, patch); + if (Object.keys(patch).length > 0) { + this.instances.forEach(function (instance) { + if (updateAll || _this.updateAll || instance.constructor.updatePath && needUpdate(patch, instance.constructor.updatePath) || instance._updatePath && needUpdate(patch, instance._updatePath)) { + //update this.use + if (instance.constructor.use) { + instance.use = getUse(store.data, instance.constructor.use); + } else if (instance.initUse) { + instance.use = getUse(store.data, instance.initUse()); + } + + instance.update(); + } + }); + this.onChange && this.onChange(patch); + } + }; + } + + function matchGlobalData(globalData, diffResult) { + if (!globalData) return false; + for (var keyA in diffResult) { + if (globalData.indexOf(keyA) > -1) { + return true; + } + for (var i = 0, len = globalData.length; i < len; i++) { + if (includePath(keyA, globalData[i])) { + return true; + } + } + } + return false; + } + + function needUpdate(diffResult, updatePath) { + for (var keyA in diffResult) { + if (updatePath[keyA]) { + return true; + } + for (var keyB in updatePath) { + if (includePath(keyA, keyB)) { + return true; + } + } + } + return false; + } + + function includePath(pathA, pathB) { + if (pathA.indexOf(pathB) === 0) { + var next = pathA.substr(pathB.length, 1); + if (next === '[' || next === '.') { + return true; + } + } + return false; + } + + function fixPath(path) { + var mpPath = ''; + var arr = path.replace('#-', '').split('-'); + arr.forEach(function (item, index) { + if (index) { + if (isNaN(Number(item))) { + mpPath += '.' + item; + } else { + mpPath += '[' + item + ']'; + } + } else { + mpPath += item; + } + }); + return mpPath; + } + + function rpx(str) { + return str.replace(/([1-9]\d*|0)(\.\d*)*rpx/g, function (a, b) { + return window.innerWidth * Number(b) / 750 + 'px'; + }); + } + + function tag(name) { + return function (target) { + define(name, target); + }; + } + + var _class$1, _temp$1; + + function _classCallCheck$4(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 ModelView = (_temp$1 = _class$1 = function (_Component) { + _inherits(ModelView, _Component); + + function ModelView() { + _classCallCheck$4(this, ModelView); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); + } + + ModelView.prototype.beforeInstall = function beforeInstall() { + this.data = this.vm.data; + }; + + return ModelView; + }(Component), _class$1.observe = true, _class$1.mergeUpdate = true, _temp$1); + + /** + * classNames based on https://github.com/JedWatson/classnames + * by Jed Watson + * Licensed under the MIT License + * https://github.com/JedWatson/classnames/blob/master/LICENSE + * modified by dntzhang + */ + + var hasOwn = {}.hasOwnProperty; + + function classNames() { + var classes = []; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!arg) continue; + + var argType = typeof arg; + + if (argType === 'string' || argType === 'number') { + classes.push(arg); + } else if (Array.isArray(arg) && arg.length) { + var inner = classNames.apply(null, arg); + if (inner) { + classes.push(inner); + } + } else if (argType === 'object') { + for (var key in arg) { + if (hasOwn.call(arg, key) && arg[key]) { + classes.push(key); + } + } + } + } + + return classes.join(' '); + } + + function extractClass() { + var _Array$prototype$slic = Array.prototype.slice.call(arguments, 0), + props = _Array$prototype$slic[0], + args = _Array$prototype$slic.slice(1); + + if (props) { + if (props['class']) { + args.unshift(props['class']); + delete props['class']; + } else if (props.className) { + args.unshift(props.className); + delete props.className; + } + } + if (args.length > 0) { + return { 'class': classNames.apply(null, args) }; + } + } + + function getHost(component) { + var base = component.base; + if (base) { + while (base.parentNode) { + if (base.parentNode._component) { + return base.parentNode._component; + } else { + base = base.parentNode; + } + } + } + } + + /** + * preact-render-to-string based on preact-render-to-string + * by Jason Miller + * Licensed under the MIT License + * https://github.com/developit/preact-render-to-string + * + * modified by dntzhang + */ + + var encodeEntities = function encodeEntities(s) { + return String(s).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); + }; + + var indent = function indent(s, char) { + return String(s).replace(/(\n+)/g, '$1' + (char || '\t')); + }; + + var mapping$1 = options.mapping; + + var VOID_ELEMENTS = /^(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/; + + var isLargeString = function isLargeString(s, length, ignoreLines) { + return String(s).length > (length || 40) || !ignoreLines && String(s).indexOf('\n') !== -1 || String(s).indexOf('<') !== -1; + }; + + var JS_TO_CSS = {}; + + // Convert an Object style to a CSSText string + function styleObjToCss(s) { + var str = ''; + for (var prop in s) { + var val = s[prop]; + if (val != null) { + if (str) str += ' '; + // str += jsToCss(prop); + str += JS_TO_CSS[prop] || (JS_TO_CSS[prop] = prop.replace(/([A-Z])/g, '-$1').toLowerCase()); + str += ': '; + str += val; + if (typeof val === 'number' && IS_NON_DIMENSIONAL.test(prop) === false) { + str += 'px'; + } + str += ';'; + } + } + return str || undefined; + } + + function renderToString(vnode, opts, store, isSvgMode) { + store = store || {}; + opts = Object.assign({ + scopedCSS: true + }, opts); + var css = {}; + var html = _renderToString(vnode, opts, store, isSvgMode, css); + return { + css: Object.values(css), + html: html + }; + } + + /** The default export is an alias of `render()`. */ + function _renderToString(vnode, opts, store, isSvgMode, css) { + if (vnode == null || typeof vnode === 'boolean') { + return ''; + } + + var nodeName = vnode.nodeName, + attributes = vnode.attributes, + isComponent = false; + + var pretty = true && opts.pretty, + indentChar = pretty && typeof pretty === 'string' ? pretty : '\t'; + + // #text nodes + if (typeof vnode !== 'object' && !nodeName) { + return encodeEntities(vnode); + } + + // components + var ctor = mapping$1[nodeName]; + if (ctor) { + isComponent = true; + + var props = getNodeProps$1(vnode), + rendered = void 0; + // class-based components + var c = new ctor(props, store); + // turn off stateful re-rendering: + c._disable = c.__x = true; + c.props = props; + c.store = store; + if (c.install) c.install(); + if (c.beforeRender) c.beforeRender(); + rendered = c.render(c.props, c.data, c.store); + + if (opts.scopedCSS) { + + if (c.constructor.css || c.css) { + + var cssStr = c.constructor.css ? c.constructor.css : typeof c.css === 'function' ? c.css() : c.css; + var cssAttr = '_s' + getCtorName(c.constructor); + css[cssAttr] = { + id: cssAttr, + css: scoper(cssStr, cssAttr) + }; + addScopedAttrStatic(rendered, cssAttr); + } + + c.scopedCSSAttr = vnode.css; + scopeHost(rendered, c.scopedCSSAttr); + } + + return _renderToString(rendered, opts, store, false, css); + } + + // render JSX to HTML + var s = '', + html = void 0; + + if (attributes) { + var attrs = Object.keys(attributes); + + // allow sorting lexicographically for more determinism (useful for tests, such as via preact-jsx-chai) + if (opts && opts.sortAttributes === true) attrs.sort(); + + for (var i = 0; i < attrs.length; i++) { + var name = attrs[i], + v = attributes[name]; + if (name === 'children') continue; + + if (name.match(/[\s\n\\/='"\0<>]/)) continue; + + if (!(opts && opts.allAttributes) && (name === 'key' || name === 'ref')) continue; + + if (name === 'className') { + if (attributes['class']) continue; + name = 'class'; + } else if (isSvgMode && name.match(/^xlink:?./)) { + name = name.toLowerCase().replace(/^xlink:?/, 'xlink:'); + } + + if (name === 'style' && v && typeof v === 'object') { + v = styleObjToCss(v); + } + + var hooked = opts.attributeHook && opts.attributeHook(name, v, store, opts, isComponent); + if (hooked || hooked === '') { + s += hooked; + continue; + } + + if (name === 'dangerouslySetInnerHTML') { + html = v && v.__html; + } else if ((v || v === 0 || v === '') && typeof v !== 'function') { + if (v === true || v === '') { + v = name; + // in non-xml mode, allow boolean attributes + if (!opts || !opts.xml) { + s += ' ' + name; + continue; + } + } + s += ' ' + name + '="' + encodeEntities(v) + '"'; + } + } + } + + // account for >1 multiline attribute + if (pretty) { + var sub = s.replace(/^\n\s*/, ' '); + if (sub !== s && !~sub.indexOf('\n')) s = sub;else if (pretty && ~s.indexOf('\n')) s += '\n'; + } + + s = '<' + nodeName + s + '>'; + if (String(nodeName).match(/[\s\n\\/='"\0<>]/)) throw s; + + var isVoid = String(nodeName).match(VOID_ELEMENTS); + if (isVoid) s = s.replace(/>$/, ' />'); + + var pieces = []; + if (html) { + // if multiline, indent. + if (pretty && isLargeString(html)) { + html = '\n' + indentChar + indent(html, indentChar); + } + s += html; + } else if (vnode.children) { + var hasLarge = pretty && ~s.indexOf('\n'); + for (var _i = 0; _i < vnode.children.length; _i++) { + var child = vnode.children[_i]; + if (child != null && child !== false) { + var childSvgMode = nodeName === 'svg' ? true : nodeName === 'foreignObject' ? false : isSvgMode, + ret = _renderToString(child, opts, store, childSvgMode, css); + if (pretty && !hasLarge && isLargeString(ret)) hasLarge = true; + if (ret) pieces.push(ret); + } + } + if (pretty && hasLarge) { + for (var _i2 = pieces.length; _i2--;) { + pieces[_i2] = '\n' + indentChar + indent(pieces[_i2], indentChar); + } + } + } + + if (pieces.length) { + s += pieces.join(''); + } else if (opts && opts.xml) { + return s.substring(0, s.length - 1) + ' />'; + } + + if (!isVoid) { + if (pretty && ~s.indexOf('\n')) s += '\n'; + s += ''; + } + + return s; + } + + function assign$1(obj, props) { + for (var i in props) { + obj[i] = props[i]; + }return obj; + } + + function getNodeProps$1(vnode) { + var props = assign$1({}, vnode.attributes); + props.children = vnode.children; + + var defaultProps = vnode.nodeName.defaultProps; + if (defaultProps !== undefined) { + for (var i in defaultProps) { + if (props[i] === undefined) { + props[i] = defaultProps[i]; + } + } + } + + return props; + } + + var n=function(t,r,u,e){for(var p=1;p"===t?(a(), u=1):u&&("="===t?(u=4, r=e, e=""):"/"===t?(a(), 3===u&&(s=s[0]), u=s, (s=s[0]).push(u,4), u=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(a(), u=2):e+=t);}return a(), s},r="function"==typeof Map,u=r?new Map:{},e=r?function(n){var r=u.get(n);return r||u.set(n,r=t(n)), r}:function(n){for(var r="",e=0;e1?r:r[0]} + + var html = htm.bind(h); + + var WeElement = Component; + var defineElement = define; + function createRef() { + return {}; + } + + options.root.Omi = { + h: h, + createElement: h, + cloneElement: cloneElement, + createRef: createRef, + Component: Component, + render: render, + rerender: rerender, + options: options, + WeElement: WeElement, + define: define, + rpx: rpx, + ModelView: ModelView, + defineElement: defineElement, + classNames: classNames, + extractClass: extractClass, + getHost: getHost, + renderToString: renderToString, + tag: tag, + merge: merge, + html: html, + htm: htm + }; + options.root.omi = options.root.Omi; + options.root.Omi.version = 'omio-2.2.2'; + + function _classCallCheck$5(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn$1(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$1(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; } + + define('my-counter', function (_WeElement) { + _inherits$1(_class2, _WeElement); + + function _class2() { + var _temp, _this, _ret; + + _classCallCheck$5(this, _class2); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn$1(this, _WeElement.call.apply(_WeElement, [this].concat(args))), _this), _this.count = 1, _this.sub = function () { + _this.count--; + _this.update(); + }, _this.add = function () { + _this.count++; + _this.update(); + }, _temp), _possibleConstructorReturn$1(_this, _ret); + } + + _class2.prototype.render = function render$$1() { + return Omi.h( + 'div', + null, + Omi.h( + 'button', + { onClick: this.sub }, + '-' + ), + Omi.h( + 'span', + { style: { + color: 'red' + } }, + this.count + ), + Omi.h( + 'button', + { onClick: this.add }, + '+' + ) + ); + }; + + return _class2; + }(WeElement)); + + render(Omi.h('my-counter', null), 'body'); + +}()); +//# sourceMappingURL=b.js.map diff --git a/packages/omiax/examples/simple/b.js.map b/packages/omiax/examples/simple/b.js.map new file mode 100644 index 000000000..faa02e8ef --- /dev/null +++ b/packages/omiax/examples/simple/b.js.map @@ -0,0 +1 @@ +{"version":3,"file":"b.js","sources":["../../src/omi/vnode.js","../../src/omi/mock/util.js","../../src/omi/mock/element.js","../../src/omi/mock/text-node.js","../../src/omi/mock/document.js","../../src/omi/mock/index.js","../../src/omi/options.js","../../src/omi/h.js","../../src/omi/util.js","../../src/omi/clone-element.js","../../src/omi/constants.js","../../src/omi/render-queue.js","../../src/omi/vdom/index.js","../../src/omi/dom/index.js","../../src/omi/style.js","../../src/omi/vdom/diff.js","../../src/omi/define.js","../../src/omi/vdom/component-recycler.js","../../src/omi/obaa.js","../../src/omi/tick.js","../../src/omi/observe.js","../../src/omi/vdom/component.js","../../src/omi/component.js","../../src/omi/render.js","../../src/omi/rpx.js","../../src/omi/tag.js","../../src/omi/model-view.js","../../src/omi/class.js","../../src/omi/get-host.js","../../src/omi/render-to-string.js","../../node_modules/_htm@2.1.1@htm/dist/htm.mjs","../../src/omi/omi.js","main.js"],"sourcesContent":["/** Virtual DOM Node */\nexport function VNode() {}\n","let nodeId = 1\nexport function uniqueId() {\n return nodeId++\n}\n\nlet docMap = {}\n\nexport function addDoc(id, doc) {\n docMap[id] = doc\n}\n\nexport function getDoc(id) {\n return docMap[id]\n}\n\nexport function removeDoc(id) {\n delete docMap[id]\n}\n\nlet sendBridgeFlag = {}\n\nexport function getSendBridgeFlag() {\n return sendBridgeFlag\n}\n\nexport function setSendBridgeFlag(docId, flag) {\n return (sendBridgeFlag[docId] = flag)\n}\n\nexport function insertIndex(target, list, newIndex) {\n if (newIndex < 0) {\n newIndex = 0\n }\n const before = list[newIndex - 1]\n const after = list[newIndex]\n list.splice(newIndex, 0, target)\n\n before && (before.nextSibling = target)\n target.previousSibling = before\n target.nextSibling = after\n after && (after.previousSibling = target)\n\n return newIndex\n}\n\nexport function moveIndex(target, list, newIndex) {\n const index = list.indexOf(target)\n\n if (index < 0) {\n return -1\n }\n\n const before = list[index - 1]\n const after = list[index + 1]\n before && (before.nextSibling = after)\n after && (after.previousSibling = before)\n\n list.splice(index, 1)\n let newIndexAfter = newIndex\n if (index <= newIndex) {\n newIndexAfter = newIndex - 1\n }\n const beforeNew = list[newIndexAfter - 1]\n const afterNew = list[newIndexAfter]\n list.splice(newIndexAfter, 0, target)\n\n beforeNew && (beforeNew.nextSibling = target)\n target.previousSibling = beforeNew\n target.nextSibling = afterNew\n afterNew && (afterNew.previousSibling = target)\n\n if (index === newIndexAfter) {\n return -1\n }\n return newIndex\n}\n\nexport function removeIndex(target, list, changeSibling) {\n const index = list.indexOf(target)\n\n if (index < 0) {\n return\n }\n if (changeSibling) {\n const before = list[index - 1]\n const after = list[index + 1]\n before && (before.nextSibling = after)\n after && (after.previousSibling = before)\n }\n list.splice(index, 1)\n}\n\nexport function remove(target, list) {\n const index = list.indexOf(target)\n\n if (index < 0) {\n return\n }\n\n const before = list[index - 1]\n const after = list[index + 1]\n before && (before.nextSibling = after)\n after && (after.previousSibling = before)\n\n list.splice(index, 1)\n}\n\nexport function linkParent(node, parent) {\n node.parentNode = parent\n if (parent.docId) {\n node.docId = parent.docId\n node.ownerDocument = parent.ownerDocument\n node.ownerDocument.nodeMap[node.nodeId] = node\n node.depth = parent.depth + 1\n\t}\n\n node.childNodes && node.childNodes.forEach(child => {\n linkParent(child, node)\n })\n}\n\nexport function nextElement(node) {\n while (node) {\n if (node.nodeType === 1) {\n return node\n }\n node = node.nextSibling\n }\n}\n\nexport function previousElement(node) {\n while (node) {\n if (node.nodeType === 1) {\n return node\n }\n node = node.previousSibling\n }\n}\n","import {\n\tgetDoc,\n\tuniqueId,\n\tlinkParent,\n\tinsertIndex,\n\tmoveIndex,\n\tremoveIndex\n} from './util'\n\nconst displayMap = {\n\tdiv: 'block',\n\tspan: 'inline-block'\n}\n\nfunction registerNode(docId, node) {\n\tconst doc = getDoc(docId)\n\tdoc.nodeMap[node.nodeId] = node\n}\n\nexport default class Element {\n\tconstructor(type) {\n\t\tthis.nodeType = 1\n\t\tthis.nodeId = uniqueId()\n\t\tthis.ref = this.nodeId\n\t\tthis.type = type\n\t\tthis.attributes = {}\n\t\tthis.style = {\n\t\t\tdisplay: displayMap[type]\n\t\t}\n\t\tthis.classStyle = {}\n\t\tthis.event = {}\n\t\tthis.childNodes = []\n\n\t\tthis.nodeName = this.type\n\n\t\tthis.parentNode = null\n\t\tthis.nextSibling = null\n\t\tthis.previousSibling = null\n\t\tthis.firstChild = null\n\t}\n\n\tappendChild(node) {\n\t\tif (!node.parentNode) {\n\t\t\tlinkParent(node, this)\n\t\t\tinsertIndex(node, this.childNodes, this.childNodes.length, true)\n\n\t\t\tif (this.docId != undefined) {\n\t\t\t\tregisterNode(this.docId, node)\n\t\t\t}\n\n\n\t\t\t//this.ownerDocument.addElement(this.ref, node.toJSON(), -1)\n\n\t\t} else {\n\t\t\tnode.parentNode.removeChild(node)\n\n\t\t\tthis.appendChild(node)\n\n\t\t\treturn\n\t\t}\n\n\t\tthis.firstChild = this.childNodes[0]\n\n\n\t}\n\n\tinsertBefore(node, before) {\n\t\tif (!node.parentNode) {\n\t\t\tlinkParent(node, this)\n\t\t\tconst index = insertIndex(\n\t\t\t\tnode,\n\t\t\t\tthis.childNodes,\n\t\t\t\tthis.childNodes.indexOf(before),\n\t\t\t\ttrue\n\t\t\t)\n\t\t\tif (this.docId != undefined) {\n\t\t\t\tregisterNode(this.docId, node)\n\t\t\t}\n\n\n\t\t\t//this.ownerDocument.addElement(this.ref, node.toJSON(), index)\n\n\t\t} else {\n\t\t\tnode.parentNode.removeChild(node)\n\t\t\tthis.insertBefore(node, before)\n\t\t\treturn\n\t\t}\n\n\t\tthis.firstChild = this.childNodes[0]\n\t}\n\n\tinsertAfter(node, after) {\n\t\tif (node.parentNode && node.parentNode !== this) {\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tnode === after ||\n\t\t\t(node.previousSibling && node.previousSibling === after)\n\t\t) {\n\t\t\treturn\n\t\t}\n\t\tif (!node.parentNode) {\n\t\t\tlinkParent(node, this)\n\t\t\tconst index = insertIndex(\n\t\t\t\tnode,\n\t\t\t\tthis.childNodes,\n\t\t\t\tthis.childNodes.indexOf(after) + 1,\n\t\t\t\ttrue\n\t\t\t)\n\n\t\t\tif (this.docId != undefined) {\n\t\t\t\tregisterNode(this.docId, node)\n\t\t\t}\n\n\t\t\t//this.ownerDocument.addElement(this.ref, node.toJSON(), index)\n\n\t\t} else {\n\t\t\tconst index = moveIndex(\n\t\t\t\tnode,\n\t\t\t\tthis.childNodes,\n\t\t\t\tthis.childNodes.indexOf(after) + 1\n\t\t\t)\n\n\t\t\t//this.ownerDocument.moveElement(node.ref, this.ref, index)\n\n\t\t}\n\n\t\tthis.firstChild = this.childNodes[0]\n\t}\n\n\tremoveChild(node) {\n\t\tif (node.parentNode) {\n\t\t\tremoveIndex(node, this.childNodes, true)\n\n\n\t\t\tthis.ownerDocument.removeElement(node.ref)\n\n\t\t}\n\n\t\tnode.parentNode = null\n\n\n\n\t\tthis.firstChild = this.childNodes[0]\n\t}\n\n\tsetAttribute(key, value, silent) {\n\t\tif (this.attributes[key] === value && silent !== false) {\n\t\t\treturn\n\t\t}\n\t\tthis.attributes[key] = value\n\t\tif (!silent) {\n\t\t\tconst result = {}\n\t\t\tresult[key] = value\n\n\t\t\tthis.ownerDocument.setAttr(this.ref, result)\n\n\t\t}\n\t}\n\n\tremoveAttribute(key) {\n\t\tif (this.attributes[key]) {\n\t\t\tdelete this.attributes[key]\n\t\t}\n\t}\n\n\tsetStyle(key, value, silent) {\n\t\tif (this.style[key] === value && silent !== false) {\n\t\t\treturn\n\t\t}\n\t\tthis.style[key] = value\n\t\tif (!silent && this.ownerDocument) {\n\t\t\tconst result = {}\n\t\t\tresult[key] = value\n\n\t\t\tthis.ownerDocument.setStyles(this.ref, result)\n\n\t\t}\n\t}\n\n\tsetStyles(styles) {\n\t\tObject.assign(this.style, styles)\n\t\tif (this.ownerDocument) {\n\n\t\t\tthis.ownerDocument.setStyles(this.ref, styles)\n\n\t\t}\n\t}\n\n\tsetClassStyle(classStyle) {\n\t\tfor (const key in this.classStyle) {\n\t\t\tthis.classStyle[key] = ''\n\t\t}\n\n\t\tObject.assign(this.classStyle, classStyle)\n\n\n\t\tthis.ownerDocument.setStyles(this.ref, this.toStyle())\n\n\t}\n\n\taddEventListener(type, handler) {\n\t\tif (!this.event[type]) {\n\t\t\tthis.event[type] = handler\n\n\t\t\t//this.ownerDocument.addEvent(this.ref, type)\n\t\t}\n\t}\n\n\tremoveEventListener(type) {\n\t\tif (this.event[type]) {\n\t\t\tdelete this.event[type]\n\t\t\tlet doc = getDoc(this.docId)\n\t\t\tdoc.nodeMap[this.ref] &&\n\t\t\t\tdoc.nodeMap[this.ref].event &&\n\t\t\t\tdoc.nodeMap[this.ref].event[type]\n\t\t\t\t? (doc.nodeMap[this.ref].event[type] = null)\n\t\t\t\t: ''\n\n\t\t\tthis.ownerDocument.removeEvent(this.ref, type)\n\t\t}\n\t}\n\n\tfireEvent(type, e) {\n\t\tconst handler = this.event[type]\n\t\tif (handler) {\n\t\t\treturn handler.call(this, e)\n\t\t}\n\t}\n\n\ttoStyle() {\n\t\treturn Object.assign({}, this.classStyle, this.style)\n\t}\n\n\tgetComputedStyle() { }\n\n\ttoJSON() {\n\t\tlet result = {\n\t\t\tid: this.ref,\n\t\t\ttype: this.type,\n\t\t\tdocId: this.docId || -10000,\n\t\t\tattributes: this.attributes ? this.attributes : {}\n\t\t}\n\t\tresult.attributes.style = this.toStyle()\n\n\t\tconst event = Object.keys(this.event)\n\t\tif (event.length) {\n\t\t\tresult.event = event\n\t\t}\n\n\t\tif (this.childNodes.length) {\n\t\t\tresult.children = this.childNodes.map(child => child.toJSON())\n\t\t}\n\t\treturn result\n\t}\n\n\treplaceChild(newChild, oldChild) {\n\t\tthis.insertBefore(newChild, oldChild)\n\t\tthis.removeChild(oldChild)\n\t}\n\n\tdestroy() {\n\t\tconst doc = getDoc(this.docId)\n\n\t\tif (doc) {\n\t\t\tdelete doc.nodeMap[this.nodeId]\n\t\t}\n\n\t\tthis.parentNode = null\n\t\tthis.childNodes.forEach(child => {\n\t\t\tchild.destroy()\n\t\t})\n\t}\n}\n","import {\n\tgetDoc,\n\tuniqueId\n} from './util'\n\n\nfunction registerNode(docId, node) {\n\tconst doc = getDoc(docId)\n\tdoc.nodeMap[node.nodeId] = node\n}\n\nexport default class TextNode {\n\tconstructor(nodeValue) {\n\t\tthis.nodeType = 3\n\t\tthis.nodeId = uniqueId()\n\t\tthis.ref = this.nodeId\n\t\tthis.attributes = {}\n\t\tthis.style = {\n\t\t\tdisplay: 'inline'\n\t\t}\n\t\tthis.classStyle = {}\n\t\tthis.event = {}\n\t\tthis.nodeValue = nodeValue\n\t\tthis.parentNode = null\n\t\tthis.nextSibling = null\n\t\tthis.previousSibling = null\n\t\tthis.firstChild = null\n\t\tthis.type = 'text'\n\t}\n\n\tsetAttribute(key, value, silent) {\n\t\tif (this.attributes[key] === value && silent !== false) {\n\t\t\treturn\n\t\t}\n\t\tthis.attributes[key] = value\n\t\tif (!silent) {\n\t\t\tconst result = {}\n\t\t\tresult[key] = value\n\n\t\t\tthis.ownerDocument.setAttr(this.ref, result)\n\n\t\t}\n\t}\n\n\tremoveAttribute(key) {\n\t\tif (this.attributes[key]) {\n\t\t\tdelete this.attributes[key]\n\t\t}\n\t}\n\n\ttoStyle() {\n\t\treturn Object.assign({}, this.classStyle, this.style)\n\t}\n\n\tsplitText() {\n\n\t}\n\n\tgetComputedStyle() { }\n\n\ttoJSON() {\n\t\tlet result = {\n\t\t\tid: this.ref,\n\t\t\ttype: this.type,\n\t\t\tdocId: this.docId || -10000,\n\t\t\tattributes: this.attributes ? this.attributes : {}\n\t\t}\n\t\tresult.attributes.style = this.toStyle()\n\n\t\tconst event = Object.keys(this.event)\n\t\tif (event.length) {\n\t\t\tresult.event = event\n\t\t}\n\n\t\treturn result\n\t}\n\n\tdestroy() {\n\t\tconst doc = getDoc(this.docId)\n\n\t\tif (doc) {\n\t\t\tdelete doc.nodeMap[this.nodeId]\n\t\t}\n\n\t\tthis.parentNode = null\n\n\t}\n}\n","import Element from './element'\nimport TextNode from './text-node'\nimport { addDoc, removeDoc } from './util'\n\n\nexport default class Document {\n constructor(id) {\n this.id = id\n addDoc(id, this)\n this.nodeMap = {}\n this._isMockDocument = true\n }\n\n // createBody(type, props) {\n // if (!this.body) {\n // const el = new Element(type, props)\n // el.didMount = true\n // el.ownerDocument = this\n // el.docId = this.id\n // el.style.alignItems = 'flex-start'\n // this.body = el\n // }\n\n // return this.body\n // }\n\n createElement(tagName, props) {\n let el = new Element(tagName, props)\n el.ownerDocument = this\n el.docId = this.id\n return el\n\t}\n\n\tcreateTextNode(txt){\n\t\tconst node = new TextNode(txt)\n\t\tnode.docId = this.id\n\t\treturn node\n\t}\n\n destroy() {\n delete this.listener\n delete this.nodeMap\n removeDoc(this.id)\n }\n\n addEventListener(ref, type) {\n //document.addEvent(this.id, ref, type)\n }\n\n removeEventListener(ref, type) {\n //document.removeEvent(this.id, ref, type)\n }\n\n\n scrollTo(ref, x, y, animated) {\n document.scrollTo(this.id, ref, x, y, animated)\n }\n\n}\n","import Document from './document'\n\n\nexport default {\n\tdocument: new Document(0)\n}\n","import mock from './mock/index'\n\nfunction getGlobal() {\n if (\n typeof global !== 'object' ||\n !global ||\n global.Math !== Math ||\n global.Array !== Array\n ) {\n if (typeof self !== 'undefined') {\n return self\n } else if (typeof window !== 'undefined') {\n return window\n } else if (typeof global !== 'undefined') {\n return global\n }\n return (function() {\n return this\n })()\n }\n return global\n}\n\n/** Global options\n *\t@public\n *\t@namespace options {Object}\n */\nexport default {\n scopedStyle: true,\n mapping: {},\n isWeb: true,\n\tstaticStyleMapping: {},\n\tdoc: mock.document,\n //doc: typeof document === 'object' ? document : null,\n root: getGlobal(),\n //styleCache :[{ctor:ctor,ctorName:ctorName,style:style}]\n styleCache: []\n //componentChange(component, element) { },\n /** If `true`, `prop` changes trigger synchronous component updates.\n *\t@name syncComponentUpdates\n *\t@type Boolean\n *\t@default true\n */\n //syncComponentUpdates: true,\n\n /** Processes all created VNodes.\n *\t@param {VNode} vnode\tA newly-created VNode to normalize/process\n */\n //vnode(vnode) { }\n\n /** Hook invoked after a component is mounted. */\n //afterMount(component) { },\n\n /** Hook invoked after the DOM is updated with a component's latest render. */\n //afterUpdate(component) { }\n\n /** Hook invoked immediately before a component is unmounted. */\n // beforeUnmount(component) { }\n}\n","import { VNode } from './vnode'\nimport options from './options'\n\nconst stack = []\n\n/**\n * JSX/hyperscript reviver.\n * @see http://jasonformat.com/wtf-is-jsx\n * Benchmarks: https://esbench.com/bench/57ee8f8e330ab09900a1a1a0\n *\n * Note: this is exported as both `h()` and `createElement()` for compatibility reasons.\n *\n * Creates a VNode (virtual DOM element). A tree of VNodes can be used as a lightweight representation\n * of the structure of a DOM tree. This structure can be realized by recursively comparing it against\n * the current _actual_ DOM structure, and applying only the differences.\n *\n * `h()`/`createElement()` accepts an element name, a list of attributes/props,\n * and optionally children to append to the element.\n *\n * @example The following DOM tree\n *\n * `
Hello!
`\n *\n * can be constructed using this function as:\n *\n * `h('div', { id: 'foo', name : 'bar' }, 'Hello!');`\n *\n * @param {string} nodeName\tAn element name. Ex: `div`, `a`, `span`, etc.\n * @param {Object} attributes\tAny attributes/props to set on the created element.\n * @param rest\t\t\tAdditional arguments are taken to be children to append. Can be infinitely nested Arrays.\n *\n * @public\n */\nexport function h(nodeName, attributes) {\n let children = [],\n lastSimple,\n child,\n simple,\n i\n for (i = arguments.length; i-- > 2; ) {\n stack.push(arguments[i])\n }\n if (attributes && attributes.children != null) {\n if (!stack.length) stack.push(attributes.children)\n delete attributes.children\n }\n while (stack.length) {\n if ((child = stack.pop()) && child.pop !== undefined) {\n for (i = child.length; i--; ) stack.push(child[i])\n } else {\n if (typeof child === 'boolean') child = null\n\n if ((simple = typeof nodeName !== 'function')) {\n if (child == null) child = ''\n else if (typeof child === 'number') child = String(child)\n else if (typeof child !== 'string') simple = false\n }\n\n if (simple && lastSimple) {\n children[children.length - 1] += child\n } else if (children.length === 0) {\n children = [child]\n } else {\n children.push(child)\n }\n\n lastSimple = simple\n }\n }\n\n let p = new VNode()\n p.nodeName = nodeName\n p.children = children\n\tp.attributes = attributes == null ? undefined : attributes\n p.key = attributes == null ? undefined : attributes.key\n\n // if a \"vnode hook\" is defined, pass every created VNode to it\n if (options.vnode !== undefined) options.vnode(p)\n\n return p\n}\n","'use strict'\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols\nvar hasOwnProperty = Object.prototype.hasOwnProperty\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable\n\nfunction toObject(val) {\n if (val === null || val === undefined) {\n throw new TypeError('Object.assign cannot be called with null or undefined')\n }\n\n return Object(val)\n}\n\nexport function assign(target, source) {\n var from\n var to = toObject(target)\n var symbols\n\n for (var s = 1; s < arguments.length; s++) {\n from = Object(arguments[s])\n\n for (var key in from) {\n if (hasOwnProperty.call(from, key)) {\n to[key] = from[key]\n }\n }\n\n if (getOwnPropertySymbols) {\n symbols = getOwnPropertySymbols(from)\n for (var i = 0; i < symbols.length; i++) {\n if (propIsEnumerable.call(from, symbols[i])) {\n to[symbols[i]] = from[symbols[i]]\n }\n }\n }\n }\n\n return to\n}\n\nif (typeof Element !== 'undefined' && !Element.prototype.addEventListener) {\n var oListeners = {};\n function runListeners(oEvent) {\n if (!oEvent) { oEvent = window.event; }\n for (var iLstId = 0, iElId = 0, oEvtListeners = oListeners[oEvent.type]; iElId < oEvtListeners.aEls.length; iElId++) {\n if (oEvtListeners.aEls[iElId] === this) {\n for (iLstId; iLstId < oEvtListeners.aEvts[iElId].length; iLstId++) { oEvtListeners.aEvts[iElId][iLstId].call(this, oEvent); }\n break;\n }\n }\n }\n Element.prototype.addEventListener = function (sEventType, fListener /*, useCapture (will be ignored!) */) {\n if (oListeners.hasOwnProperty(sEventType)) {\n var oEvtListeners = oListeners[sEventType];\n for (var nElIdx = -1, iElId = 0; iElId < oEvtListeners.aEls.length; iElId++) {\n if (oEvtListeners.aEls[iElId] === this) { nElIdx = iElId; break; }\n }\n if (nElIdx === -1) {\n oEvtListeners.aEls.push(this);\n oEvtListeners.aEvts.push([fListener]);\n this[\"on\" + sEventType] = runListeners;\n } else {\n var aElListeners = oEvtListeners.aEvts[nElIdx];\n if (this[\"on\" + sEventType] !== runListeners) {\n aElListeners.splice(0);\n this[\"on\" + sEventType] = runListeners;\n }\n for (var iLstId = 0; iLstId < aElListeners.length; iLstId++) {\n if (aElListeners[iLstId] === fListener) { return; }\n }\n aElListeners.push(fListener);\n }\n } else {\n oListeners[sEventType] = { aEls: [this], aEvts: [[fListener]] };\n this[\"on\" + sEventType] = runListeners;\n }\n };\n Element.prototype.removeEventListener = function (sEventType, fListener /*, useCapture (will be ignored!) */) {\n if (!oListeners.hasOwnProperty(sEventType)) { return; }\n var oEvtListeners = oListeners[sEventType];\n for (var nElIdx = -1, iElId = 0; iElId < oEvtListeners.aEls.length; iElId++) {\n if (oEvtListeners.aEls[iElId] === this) { nElIdx = iElId; break; }\n }\n if (nElIdx === -1) { return; }\n for (var iLstId = 0, aElListeners = oEvtListeners.aEvts[nElIdx]; iLstId < aElListeners.length; iLstId++) {\n if (aElListeners[iLstId] === fListener) { aElListeners.splice(iLstId, 1); }\n }\n };\n}\n\n\nif (typeof Object.create !== 'function') {\n Object.create = function(proto, propertiesObject) {\n if (typeof proto !== 'object' && typeof proto !== 'function') {\n throw new TypeError('Object prototype may only be an Object: ' + proto)\n } else if (proto === null) {\n throw new Error(\n \"This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.\"\n )\n }\n\n // if (typeof propertiesObject != 'undefined') {\n // throw new Error(\"This browser's implementation of Object.create is a shim and doesn't support a second argument.\");\n // }\n\n function F() {}\n F.prototype = proto\n\n return new F()\n }\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '')\n }\n}\n\n/**\n * Copy all properties from `props` onto `obj`.\n * @param {Object} obj\t\tObject onto which properties should be copied.\n * @param {Object} props\tObject from which to copy properties.\n * @returns obj\n * @private\n */\nexport function extend(obj, props) {\n for (let i in props) obj[i] = props[i]\n return obj\n}\n\n/** Invoke or update a ref, depending on whether it is a function or object ref.\n * @param {object|function} [ref=null]\n * @param {any} [value]\n */\nexport function applyRef(ref, value) {\n if (ref) {\n if (typeof ref == 'function') ref(value)\n else ref.current = value\n }\n}\n\n/**\n * Call a function asynchronously, as soon as possible. Makes\n * use of HTML Promise to schedule the callback if available,\n * otherwise falling back to `setTimeout` (mainly for IE<11).\n *\n * @param {Function} callback\n */\n\nlet usePromise = typeof Promise == 'function'\n\n// for native\nif (\n typeof document !== 'object' &&\n typeof global !== 'undefined' &&\n global.__config__\n) {\n if (global.__config__.platform === 'android') {\n usePromise = true\n } else {\n let systemVersion =\n (global.__config__.systemVersion &&\n global.__config__.systemVersion.split('.')[0]) ||\n 0\n if (systemVersion > 8) {\n usePromise = true\n }\n }\n}\n\nexport const defer = usePromise\n ? Promise.resolve().then.bind(Promise.resolve())\n : setTimeout\n\nexport function isArray(obj) {\n return Object.prototype.toString.call(obj) === '[object Array]'\n}\n\nexport function nProps(props) {\n if (!props || isArray(props)) return {}\n const result = {}\n Object.keys(props).forEach(key => {\n result[key] = props[key].value\n })\n return result\n}\n\nexport function getUse(data, paths) {\n const obj = []\n paths.forEach((path, index) => {\n const isPath = typeof path === 'string'\n if (isPath) {\n obj[index] = getTargetByPath(data, path)\n } else {\n const key = Object.keys(path)[0]\n const value = path[key]\n if (typeof value === 'string') {\n obj[index] = getTargetByPath(data, value)\n } else {\n const tempPath = value[0]\n if (typeof tempPath === 'string') {\n const tempVal = getTargetByPath(data, tempPath)\n obj[index] = value[1] ? value[1](tempVal) : tempVal\n } else {\n const args = []\n tempPath.forEach(path =>{\n args.push(getTargetByPath(data, path))\n })\n obj[index] = value[1].apply(null, args)\n }\n }\n obj[key] = obj[index]\n }\n })\n return obj\n}\n\nexport function getTargetByPath(origin, path) {\n const arr = path.replace(/]/g, '').replace(/\\[/g, '.').split('.')\n let current = origin\n for (let i = 0, len = arr.length; i < len; i++) {\n current = current[arr[i]]\n }\n return current\n}\n","import { extend } from './util'\nimport { h } from './h'\n\n/**\n * Clones the given VNode, optionally adding attributes/props and replacing its children.\n * @param {VNode} vnode\t\tThe virtual DOM element to clone\n * @param {Object} props\tAttributes/props to add when cloning\n * @param {VNode} rest\t\tAny additional arguments will be used as replacement children.\n */\nexport function cloneElement(vnode, props) {\n return h(\n vnode.nodeName,\n extend(extend({}, vnode.attributes), props),\n arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children\n )\n}\n","// render modes\n\nexport const NO_RENDER = 0\nexport const SYNC_RENDER = 1\nexport const FORCE_RENDER = 2\nexport const ASYNC_RENDER = 3\n\nexport const ATTR_KEY = '__omiattr_'\n\n// DOM properties that should NOT have \"px\" added when numeric\nexport const IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i\n","import options from './options'\nimport { defer } from './util'\nimport { renderComponent } from './vdom/component'\n\n/** Managed queue of dirty components to be re-rendered */\n\nlet items = []\n\nexport function enqueueRender(component) {\n if (items.push(component) == 1) {\n ;(options.debounceRendering || defer)(rerender)\n }\n}\n\n/** Rerender all enqueued dirty components */\nexport function rerender() {\n\tlet p\n\twhile ( (p = items.pop()) ) {\n renderComponent(p)\n\t}\n}","import { extend } from '../util'\nimport options from '../options'\n\nconst mapping = options.mapping\n/**\n * Check if two nodes are equivalent.\n *\n * @param {Node} node\t\t\tDOM Node to compare\n * @param {VNode} vnode\t\t\tVirtual DOM node to compare\n * @param {boolean} [hydrating=false]\tIf true, ignores component constructors when comparing.\n * @private\n */\nexport function isSameNodeType(node, vnode, hydrating) {\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n return node.splitText !== undefined\n }\n if (typeof vnode.nodeName === 'string') {\n var ctor = mapping[vnode.nodeName]\n if (ctor) {\n return hydrating || node._componentConstructor === ctor\n }\n return !node._componentConstructor && isNamedNode(node, vnode.nodeName)\n }\n return hydrating || node._componentConstructor === vnode.nodeName\n}\n\n/**\n * Check if an Element has a given nodeName, case-insensitively.\n *\n * @param {Element} node\tA DOM Element to inspect the name of.\n * @param {String} nodeName\tUnnormalized name to compare against.\n */\nexport function isNamedNode(node, nodeName) {\n return (\n node.normalizedNodeName === nodeName ||\n node.nodeName.toLowerCase() === nodeName.toLowerCase()\n )\n}\n\n/**\n * Reconstruct Component-style `props` from a VNode.\n * Ensures default/fallback values from `defaultProps`:\n * Own-properties of `defaultProps` not present in `vnode.attributes` are added.\n *\n * @param {VNode} vnode\n * @returns {Object} props\n */\nexport function getNodeProps(vnode) {\n let props = extend({}, vnode.attributes)\n props.children = vnode.children\n\n let defaultProps = vnode.nodeName.defaultProps\n if (defaultProps !== undefined) {\n for (let i in defaultProps) {\n if (props[i] === undefined) {\n props[i] = defaultProps[i]\n }\n }\n }\n\n return props\n}\n","import { IS_NON_DIMENSIONAL } from '../constants'\nimport { applyRef } from '../util'\nimport options from '../options'\n\n/** Create an element with the given nodeName.\n *\t@param {String} nodeName\n *\t@param {Boolean} [isSvg=false]\tIf `true`, creates an element within the SVG namespace.\n *\t@returns {Element} node\n */\nexport function createNode(nodeName, isSvg) {\n let node = isSvg\n ? options.doc.createElementNS('http://www.w3.org/2000/svg', nodeName)\n : options.doc.createElement(nodeName)\n node.normalizedNodeName = nodeName\n return node\n}\n\nfunction parseCSSText(cssText) {\n let cssTxt = cssText.replace(/\\/\\*(.|\\s)*?\\*\\//g, ' ').replace(/\\s+/g, ' ')\n let style = {},\n [a, b, rule] = cssTxt.match(/ ?(.*?) ?{([^}]*)}/) || [a, b, cssTxt]\n let cssToJs = s => s.replace(/\\W+\\w/g, match => match.slice(-1).toUpperCase())\n let properties = rule\n .split(';')\n .map(o => o.split(':').map(x => x && x.trim()))\n for (let [property, value] of properties) style[cssToJs(property)] = value\n return style\n}\n\n/** Remove a child node from its parent if attached.\n *\t@param {Element} node\t\tThe node to remove\n */\nexport function removeNode(node) {\n let parentNode = node.parentNode\n if (parentNode) parentNode.removeChild(node)\n}\n\n/** Set a named attribute on the given Node, with special behavior for some names and event handlers.\n *\tIf `value` is `null`, the attribute/handler will be removed.\n *\t@param {Element} node\tAn element to mutate\n *\t@param {string} name\tThe name/key to set, such as an event or attribute name\n *\t@param {any} old\tThe last value that was set for this name/node pair\n *\t@param {any} value\tAn attribute value, such as a function to be used as an event handler\n *\t@param {Boolean} isSvg\tAre we currently diffing inside an svg?\n *\t@private\n */\nexport function setAccessor(node, name, old, value, isSvg) {\n if (name === 'className') name = 'class'\n\n if (name === 'key') {\n // ignore\n } else if (name === 'ref') {\n applyRef(old, null)\n applyRef(value, node)\n } else if (name === 'class' && !isSvg) {\n node.className = value || ''\n } else if (name === 'style') {\n if (options.isWeb) {\n if (!value || typeof value === 'string' || typeof old === 'string') {\n node.style.cssText = value || ''\n }\n if (value && typeof value === 'object') {\n if (typeof old !== 'string') {\n for (let i in old) if (!(i in value)) node.style[i] = ''\n }\n for (let i in value) {\n node.style[i] =\n typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false\n ? value[i] + 'px'\n : value[i]\n }\n }\n } else {\n let oldJson = old,\n currentJson = value\n if (typeof old === 'string') {\n oldJson = parseCSSText(old)\n }\n if (typeof value == 'string') {\n currentJson = parseCSSText(value)\n }\n\n let result = {},\n changed = false\n\n if (oldJson) {\n for (let key in oldJson) {\n if (typeof currentJson == 'object' && !(key in currentJson)) {\n result[key] = ''\n changed = true\n }\n }\n\n for (let ckey in currentJson) {\n if (currentJson[ckey] !== oldJson[ckey]) {\n result[ckey] = currentJson[ckey]\n changed = true\n }\n }\n\n if (changed) {\n node.setStyles(result)\n }\n } else {\n node.setStyles(currentJson)\n }\n }\n } else if (name === 'dangerouslySetInnerHTML') {\n if (value) node.innerHTML = value.__html || ''\n } else if (name[0] == 'o' && name[1] == 'n') {\n let useCapture = name !== (name = name.replace(/Capture$/, ''))\n name = name.toLowerCase().substring(2)\n if (value) {\n if (!old) {\n node.addEventListener(name, eventProxy, useCapture)\n if (name == 'tap') {\n node.addEventListener('touchstart', touchStart, useCapture)\n node.addEventListener('touchend', touchEnd, useCapture)\n }\n }\n } else {\n node.removeEventListener(name, eventProxy, useCapture)\n if (name == 'tap') {\n node.removeEventListener('touchstart', touchStart, useCapture)\n node.removeEventListener('touchend', touchEnd, useCapture)\n }\n }\n ;(node._listeners || (node._listeners = {}))[name] = value\n } else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {\n setProperty(node, name, value == null ? '' : value)\n if (value == null || value === false) node.removeAttribute(name)\n } else {\n let ns = isSvg && name !== (name = name.replace(/^xlink:?/, ''))\n if (value == null || value === false) {\n if (ns)\n node.removeAttributeNS(\n 'http://www.w3.org/1999/xlink',\n name.toLowerCase()\n )\n else node.removeAttribute(name)\n } else if (typeof value !== 'function') {\n if (ns)\n node.setAttributeNS(\n 'http://www.w3.org/1999/xlink',\n name.toLowerCase(),\n value\n )\n else node.setAttribute(name, value)\n }\n }\n}\n\n/** Attempt to set a DOM property to the given value.\n *\tIE & FF throw for certain property-value combinations.\n */\nfunction setProperty(node, name, value) {\n try {\n node[name] = value\n } catch (e) {}\n}\n\n/** Proxy an event to hooked event handlers\n *\t@private\n */\nfunction eventProxy(e) {\n return this._listeners[e.type]((options.event && options.event(e)) || e)\n}\n\nfunction touchStart(e) {\n this.___touchX = e.touches[0].pageX\n this.___touchY = e.touches[0].pageY\n this.___scrollTop = document.body.scrollTop\n}\n\nfunction touchEnd(e) {\n if (\n Math.abs(e.changedTouches[0].pageX - this.___touchX) < 30 &&\n Math.abs(e.changedTouches[0].pageY - this.___touchY) < 30 &&\n Math.abs(document.body.scrollTop - this.___scrollTop) < 30\n ) {\n this.dispatchEvent(new CustomEvent('tap', { detail: e }))\n }\n}","import options from './options'\n\nlet styleId = 0\n\nexport function getCtorName(ctor) {\n for (let i = 0, len = options.styleCache.length; i < len; i++) {\n let item = options.styleCache[i]\n\n if (item.ctor === ctor) {\n return item.attrName\n }\n }\n\n let attrName = 's' + styleId\n options.styleCache.push({ ctor, attrName })\n styleId++\n\n return attrName\n}\n\n// many thanks to https://github.com/thomaspark/scoper/\nexport function scoper(css, prefix) {\n prefix = '[' + prefix.toLowerCase() + ']'\n // https://www.w3.org/TR/css-syntax-3/#lexical\n css = css.replace(/\\/\\*[^*]*\\*+([^/][^*]*\\*+)*\\//g, '')\n // eslint-disable-next-line\n let re = new RegExp('([^\\r\\n,{}:]+)(:[^\\r\\n,{}]+)?(,(?=[^{}]*{)|\\s*{)', 'g')\n /**\n * Example:\n *\n * .classname::pesudo { color:red }\n *\n * g1 is normal selector `.classname`\n * g2 is pesudo class or pesudo element\n * g3 is the suffix\n */\n css = css.replace(re, (g0, g1, g2, g3) => {\n if (typeof g2 === 'undefined') {\n g2 = ''\n }\n\n /* eslint-ignore-next-line */\n if (\n g1.match(\n /^\\s*(@media|\\d+%?|@-webkit-keyframes|@keyframes|to|from|@font-face)/\n )\n ) {\n return g1 + g2 + g3\n }\n\n let appendClass = g1.replace(/(\\s*)$/, '') + prefix + g2\n //let prependClass = prefix + ' ' + g1.trim() + g2;\n\n return appendClass + g3\n //return appendClass + ',' + prependClass + g3;\n })\n\n return css\n}\n\nexport function addStyle(cssText, id) {\n id = id.toLowerCase()\n let ele = document.getElementById(id)\n let head = document.getElementsByTagName('head')[0]\n if (ele && ele.parentNode === head) {\n head.removeChild(ele)\n }\n\n let someThingStyles = document.createElement('style')\n head.appendChild(someThingStyles)\n someThingStyles.setAttribute('type', 'text/css')\n someThingStyles.setAttribute('id', id)\n if (window.ActiveXObject) {\n someThingStyles.styleSheet.cssText = cssText\n } else {\n someThingStyles.textContent = cssText\n }\n}\n\nexport function addStyleWithoutId(cssText) {\n let head = document.getElementsByTagName('head')[0]\n let someThingStyles = document.createElement('style')\n head.appendChild(someThingStyles)\n someThingStyles.setAttribute('type', 'text/css')\n\n if (window.ActiveXObject) {\n someThingStyles.styleSheet.cssText = cssText\n } else {\n someThingStyles.textContent = cssText\n }\n}\n\nexport function addScopedAttrStatic(vdom, attr) {\n if (options.scopedStyle) {\n scopeVdom(attr, vdom)\n } \n}\n\nexport function addStyleToHead(style, attr) {\n if (options.scopedStyle) {\n if (!options.staticStyleMapping[attr]) {\n addStyle(scoper(style, attr), attr)\n options.staticStyleMapping[attr] = true\n }\n } else if (!options.staticStyleMapping[attr]) {\n addStyleWithoutId(style)\n options.staticStyleMapping[attr] = true\n }\n}\n\nexport function scopeVdom(attr, vdom) {\n if (typeof vdom === 'object') {\n vdom.attributes = vdom.attributes || {}\n vdom.attributes[attr] = ''\n vdom.css = vdom.css || {}\n vdom.css[attr] = ''\n vdom.children.forEach(child => scopeVdom(attr, child))\n }\n}\n\nexport function scopeHost(vdom, css) {\n if (typeof vdom === 'object' && css) {\n vdom.attributes = vdom.attributes || {}\n for (let key in css) {\n vdom.attributes[key] = ''\n }\n }\n}\n","import { ATTR_KEY } from '../constants'\nimport { isSameNodeType, isNamedNode } from './index'\nimport { buildComponentFromVNode } from './component'\nimport { createNode, setAccessor } from '../dom/index'\nimport { unmountComponent } from './component'\nimport options from '../options'\nimport { applyRef } from '../util'\nimport { removeNode } from '../dom/index'\nimport { isArray } from '../util'\nimport { addStyleToHead, getCtorName } from '../style'\n/** Queue of components that have been mounted and are awaiting componentDidMount */\nexport const mounts = []\n\n/** Diff recursion count, used to track the end of the diff cycle. */\nexport let diffLevel = 0\n\n/** Global flag indicating if the diff is currently within an SVG */\nlet isSvgMode = false\n\n/** Global flag indicating if the diff is performing hydration */\nlet hydrating = false\n\n/** Invoke queued componentDidMount lifecycle methods */\nexport function flushMounts() {\n let c\n while ((c = mounts.pop())) {\n if (options.afterMount) options.afterMount(c)\n if (c.installed) c.installed()\n if (c.constructor.css || c.css) {\n addStyleToHead(c.constructor.css ? c.constructor.css : (typeof c.css === 'function' ? c.css() : c.css), '_s' + getCtorName(c.constructor))\n }\n }\n}\n\n/** Apply differences in a given vnode (and it's deep children) to a real DOM Node.\n *\t@param {Element} [dom=null]\t\tA DOM node to mutate into the shape of the `vnode`\n *\t@param {VNode} vnode\t\t\tA VNode (with descendants forming a tree) representing the desired DOM structure\n *\t@returns {Element} dom\t\t\tThe created/mutated element\n *\t@private\n */\nexport function diff(dom, vnode, context, mountAll, parent, componentRoot) {\n // diffLevel having been 0 here indicates initial entry into the diff (not a subdiff)\n if (!diffLevel++) {\n // when first starting the diff, check if we're diffing an SVG or within an SVG\n isSvgMode = parent != null && parent.ownerSVGElement !== undefined\n\n // hydration is indicated by the existing element to be diffed not having a prop cache\n hydrating = dom != null && !(ATTR_KEY in dom)\n }\n let ret\n\n if (isArray(vnode)) {\n vnode = {\n nodeName: 'span',\n children: vnode\n }\n }\n\n ret = idiff(dom, vnode, context, mountAll, componentRoot)\n // append the element if its a new parent\n if (parent && ret.parentNode !== parent) parent.appendChild(ret)\n\n // diffLevel being reduced to 0 means we're exiting the diff\n if (!--diffLevel) {\n hydrating = false\n // invoke queued componentDidMount lifecycle methods\n if (!componentRoot) flushMounts()\n }\n\n return ret\n}\n\n/** Internals of `diff()`, separated to allow bypassing diffLevel / mount flushing. */\nfunction idiff(dom, vnode, context, mountAll, componentRoot) {\n let out = dom,\n prevSvgMode = isSvgMode\n\n // empty values (null, undefined, booleans) render as empty Text nodes\n if (vnode == null || typeof vnode === 'boolean') vnode = ''\n\n // If the VNode represents a Component, perform a component diff:\n let vnodeName = vnode.nodeName\n if (options.mapping[vnodeName]) {\n vnode.nodeName = options.mapping[vnodeName]\n return buildComponentFromVNode(dom, vnode, context, mountAll)\n }\n if (typeof vnodeName == 'function') {\n return buildComponentFromVNode(dom, vnode, context, mountAll)\n }\n\n // Fast case: Strings & Numbers create/update Text nodes.\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n // update if it's already a Text node:\n if (\n dom &&\n dom.splitText !== undefined &&\n dom.parentNode &&\n (!dom._component || componentRoot)\n ) {\n /* istanbul ignore if */ /* Browser quirk that can't be covered: https://github.com/developit/preact/commit/fd4f21f5c45dfd75151bd27b4c217d8003aa5eb9 */\n if (dom.nodeValue != vnode) {\n dom.nodeValue = vnode\n }\n } else {\n // it wasn't a Text node: replace it with one and recycle the old Element\n out = document.createTextNode(vnode)\n if (dom) {\n if (dom.parentNode) dom.parentNode.replaceChild(out, dom)\n recollectNodeTree(dom, true)\n }\n }\n\n //ie8 error\n try {\n out[ATTR_KEY] = true\n } catch (e) {}\n\n return out\n }\n\n // Tracks entering and exiting SVG namespace when descending through the tree.\n isSvgMode =\n vnodeName === 'svg'\n ? true\n : vnodeName === 'foreignObject'\n ? false\n : isSvgMode\n\n // If there's no existing element or it's the wrong type, create a new one:\n vnodeName = String(vnodeName)\n if (!dom || !isNamedNode(dom, vnodeName)) {\n out = createNode(vnodeName, isSvgMode)\n\n if (dom) {\n // move children into the replacement node\n while (dom.firstChild) out.appendChild(dom.firstChild)\n\n // if the previous Element was mounted into the DOM, replace it inline\n if (dom.parentNode) dom.parentNode.replaceChild(out, dom)\n\n // recycle the old element (skips non-Element node types)\n recollectNodeTree(dom, true)\n }\n }\n\n let fc = out.firstChild,\n props = out[ATTR_KEY],\n vchildren = vnode.children\n\n if (props == null) {\n props = out[ATTR_KEY] = {}\n for (let a = out.attributes, i = a.length; i--; )\n props[a[i].name] = a[i].value\n }\n\n // Optimization: fast-path for elements containing a single TextNode:\n if (\n !hydrating &&\n vchildren &&\n vchildren.length === 1 &&\n typeof vchildren[0] === 'string' &&\n fc != null &&\n fc.splitText !== undefined &&\n fc.nextSibling == null\n ) {\n if (fc.nodeValue != vchildren[0]) {\n fc.nodeValue = vchildren[0]\n }\n }\n // otherwise, if there are existing or new children, diff them:\n else if ((vchildren && vchildren.length) || fc != null) {\n innerDiffNode(\n out,\n vchildren,\n context,\n mountAll,\n hydrating || props.dangerouslySetInnerHTML != null\n )\n }\n\n // Apply attributes/props from VNode to the DOM Element:\n diffAttributes(out, vnode.attributes, props)\n\n // restore previous SVG mode: (in case we're exiting an SVG namespace)\n isSvgMode = prevSvgMode\n\n return out\n}\n\n/** Apply child and attribute changes between a VNode and a DOM Node to the DOM.\n *\t@param {Element} dom\t\t\tElement whose children should be compared & mutated\n *\t@param {Array} vchildren\t\tArray of VNodes to compare to `dom.childNodes`\n *\t@param {Object} context\t\t\tImplicitly descendant context object (from most recent `getChildContext()`)\n *\t@param {Boolean} mountAll\n *\t@param {Boolean} isHydrating\tIf `true`, consumes externally created elements similar to hydration\n */\nfunction innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {\n let originalChildren = dom.childNodes,\n children = [],\n keyed = {},\n keyedLen = 0,\n min = 0,\n len = originalChildren.length,\n childrenLen = 0,\n vlen = vchildren ? vchildren.length : 0,\n j,\n c,\n f,\n vchild,\n child\n\n // Build up a map of keyed children and an Array of unkeyed children:\n if (len !== 0) {\n for (let i = 0; i < len; i++) {\n let child = originalChildren[i],\n props = child[ATTR_KEY],\n key =\n vlen && props\n ? child._component\n ? child._component.__key\n : props.key\n : null\n if (key != null) {\n keyedLen++\n keyed[key] = child\n } else if (\n props ||\n (child.splitText !== undefined\n ? isHydrating\n ? child.nodeValue.trim()\n : true\n : isHydrating)\n ) {\n children[childrenLen++] = child\n }\n }\n }\n\n if (vlen !== 0) {\n for (let i = 0; i < vlen; i++) {\n vchild = vchildren[i]\n child = null\n\n // attempt to find a node based on key matching\n let key = vchild.key\n if (key != null) {\n if (keyedLen && keyed[key] !== undefined) {\n child = keyed[key]\n keyed[key] = undefined\n keyedLen--\n }\n }\n // attempt to pluck a node of the same type from the existing children\n else if (!child && min < childrenLen) {\n for (j = min; j < childrenLen; j++) {\n if (\n children[j] !== undefined &&\n isSameNodeType((c = children[j]), vchild, isHydrating)\n ) {\n child = c\n children[j] = undefined\n if (j === childrenLen - 1) childrenLen--\n if (j === min) min++\n break\n }\n }\n }\n\n // morph the matched/found/created DOM child to match vchild (deep)\n child = idiff(child, vchild, context, mountAll)\n\n f = originalChildren[i]\n if (child && child !== dom && child !== f) {\n if (f == null) {\n dom.appendChild(child)\n } else if (child === f.nextSibling) {\n removeNode(f)\n } else {\n dom.insertBefore(child, f)\n }\n }\n }\n }\n\n // remove unused keyed children:\n if (keyedLen) {\n for (let i in keyed)\n if (keyed[i] !== undefined) recollectNodeTree(keyed[i], false)\n }\n\n // remove orphaned unkeyed children:\n while (min <= childrenLen) {\n if ((child = children[childrenLen--]) !== undefined)\n recollectNodeTree(child, false)\n }\n}\n\n/** Recursively recycle (or just unmount) a node and its descendants.\n *\t@param {Node} node\t\t\t\t\t\tDOM node to start unmount/removal from\n *\t@param {Boolean} [unmountOnly=false]\tIf `true`, only triggers unmount lifecycle, skips removal\n */\nexport function recollectNodeTree(node, unmountOnly) {\n let component = node._component\n if (component) {\n // if node is owned by a Component, unmount that component (ends up recursing back here)\n unmountComponent(component)\n } else {\n // If the node's VNode had a ref function, invoke it with null here.\n // (this is part of the React spec, and smart for unsetting references)\n if (node[ATTR_KEY] != null) applyRef(node[ATTR_KEY].ref, null)\n\n if (unmountOnly === false || node[ATTR_KEY] == null) {\n removeNode(node)\n }\n\n removeChildren(node)\n }\n}\n\n/** Recollect/unmount all children.\n *\t- we use .lastChild here because it causes less reflow than .firstChild\n *\t- it's also cheaper than accessing the .childNodes Live NodeList\n */\nexport function removeChildren(node) {\n node = node.lastChild\n while (node) {\n let next = node.previousSibling\n recollectNodeTree(node, true)\n node = next\n }\n}\n\n/** Apply differences in attributes from a VNode to the given DOM Element.\n *\t@param {Element} dom\t\tElement with attributes to diff `attrs` against\n *\t@param {Object} attrs\t\tThe desired end-state key-value attribute pairs\n *\t@param {Object} old\t\t\tCurrent/previous attributes (from previous VNode or element's prop cache)\n */\nfunction diffAttributes(dom, attrs, old) {\n let name\n\n // remove attributes no longer present on the vnode by setting them to undefined\n for (name in old) {\n if (!(attrs && attrs[name] != null) && old[name] != null) {\n setAccessor(dom, name, old[name], (old[name] = undefined), isSvgMode)\n }\n }\n\n // add new & update changed attributes\n for (name in attrs) {\n if (\n name !== 'children' &&\n name !== 'innerHTML' &&\n (!(name in old) ||\n attrs[name] !==\n (name === 'value' || name === 'checked' ? dom[name] : old[name]))\n ) {\n setAccessor(dom, name, old[name], (old[name] = attrs[name]), isSvgMode)\n }\n }\n}\n","import options from './options'\n\nconst OBJECTTYPE = '[object Object]'\nconst ARRAYTYPE = '[object Array]'\n\nexport function define(name, ctor) {\n options.mapping[name] = ctor\n if (ctor.use) {\n ctor.updatePath = getPath(ctor.use)\n } else if (ctor.data) { //Compatible with older versions\n ctor.updatePath = getUpdatePath(ctor.data)\n }\n}\n\nexport function getPath(obj) {\n if (Object.prototype.toString.call(obj) === '[object Array]') {\n const result = {}\n obj.forEach(item => {\n if (typeof item === 'string') {\n result[item] = true\n } else {\n const tempPath = item[Object.keys(item)[0]]\n if (typeof tempPath === 'string') {\n result[tempPath] = true\n } else {\n if(typeof tempPath[0] === 'string'){\n result[tempPath[0]] = true\n }else{\n tempPath[0].forEach(path => result[path] = true)\n }\n }\n }\n })\n return result\n } else {\n return getUpdatePath(obj)\n }\n}\n\nexport function getUpdatePath(data) {\n const result = {}\n dataToPath(data, result)\n return result\n}\n\nfunction dataToPath(data, result) {\n Object.keys(data).forEach(key => {\n result[key] = true\n const type = Object.prototype.toString.call(data[key])\n if (type === OBJECTTYPE) {\n _objToPath(data[key], key, result)\n } else if (type === ARRAYTYPE) {\n _arrayToPath(data[key], key, result)\n }\n })\n}\n\nfunction _objToPath(data, path, result) {\n Object.keys(data).forEach(key => {\n result[path + '.' + key] = true\n delete result[path]\n const type = Object.prototype.toString.call(data[key])\n if (type === OBJECTTYPE) {\n _objToPath(data[key], path + '.' + key, result)\n } else if (type === ARRAYTYPE) {\n _arrayToPath(data[key], path + '.' + key, result)\n }\n })\n}\n\nfunction _arrayToPath(data, path, result) {\n data.forEach((item, index) => {\n result[path + '[' + index + ']'] = true\n delete result[path]\n const type = Object.prototype.toString.call(item)\n if (type === OBJECTTYPE) {\n _objToPath(item, path + '[' + index + ']', result)\n } else if (type === ARRAYTYPE) {\n _arrayToPath(item, path + '[' + index + ']', result)\n }\n })\n}\n","import Component from '../component'\nimport { getUse } from '../util'\nimport { getPath } from '../define'\n/** Retains a pool of Components for re-use, keyed on component name.\n *\tNote: since component names are not unique or even necessarily available, these are primarily a form of sharding.\n *\t@private\n */\nconst components = {}\n\n/** Reclaim a component for later re-use by the recycler. */\nexport function collectComponent(component) {\n let name = component.constructor.name\n ;(components[name] || (components[name] = [])).push(component)\n}\n\n/** Create a component. Normalizes differences between PFC's and classful Components. */\nexport function createComponent(Ctor, props, context, vnode) {\n let list = components[Ctor.name],\n inst\n\n if (Ctor.prototype && Ctor.prototype.render) {\n inst = new Ctor(props, context)\n Component.call(inst, props, context)\n } else {\n inst = new Component(props, context)\n inst.constructor = Ctor\n inst.render = doRender\n }\n vnode && (inst.scopedCssAttr = vnode.css)\n\n if ( inst.store && inst.store.data) {\n\t\tif(inst.constructor.use){\n\t\t\tinst.use = getUse(inst.store.data, inst.constructor.use)\n\t\t\tinst.store.instances.push(inst)\n\t\t} else if(inst.initUse){\n\t\t\tconst use = inst.initUse()\n\t\t\tinst._updatePath = getPath(use)\n\t\t\tinst.use = getUse(inst.store.data, use)\n\t\t\tinst.store.instances.push(inst)\n\t\t}\n\n\n }\n\n if (list) {\n for (let i = list.length; i--; ) {\n if (list[i].constructor === Ctor) {\n inst.nextBase = list[i].nextBase\n list.splice(i, 1)\n break\n }\n }\n }\n return inst\n}\n\n/** The `.render()` method for a PFC backing instance. */\nfunction doRender(props, data, context) {\n return this.constructor(props, context)\n}\n","/* obaa 1.0.0\n * By dntzhang\n * Github: https://github.com/Tencent/omi\n * MIT Licensed.\n */\n\nvar obaa = function(target, arr, callback) {\n var _observe = function(target, arr, callback) {\n if (!target.$observer) target.$observer = this\n var $observer = target.$observer\n var eventPropArr = []\n if (obaa.isArray(target)) {\n if (target.length === 0) {\n target.$observeProps = {}\n target.$observeProps.$observerPath = '#'\n }\n $observer.mock(target)\n }\n for (var prop in target) {\n if (target.hasOwnProperty(prop)) {\n if (callback) {\n if (obaa.isArray(arr) && obaa.isInArray(arr, prop)) {\n eventPropArr.push(prop)\n $observer.watch(target, prop)\n } else if (obaa.isString(arr) && prop == arr) {\n eventPropArr.push(prop)\n $observer.watch(target, prop)\n }\n } else {\n eventPropArr.push(prop)\n $observer.watch(target, prop)\n }\n }\n }\n $observer.target = target\n if (!$observer.propertyChangedHandler) $observer.propertyChangedHandler = []\n var propChanged = callback ? callback : arr\n $observer.propertyChangedHandler.push({\n all: !callback,\n propChanged: propChanged,\n eventPropArr: eventPropArr\n })\n }\n _observe.prototype = {\n onPropertyChanged: function(prop, value, oldValue, target, path) {\n if (value !== oldValue && this.propertyChangedHandler) {\n var rootName = obaa._getRootName(prop, path)\n for (\n var i = 0, len = this.propertyChangedHandler.length;\n i < len;\n i++\n ) {\n var handler = this.propertyChangedHandler[i]\n if (\n handler.all ||\n obaa.isInArray(handler.eventPropArr, rootName) ||\n rootName.indexOf('Array-') === 0\n ) {\n handler.propChanged.call(this.target, prop, value, oldValue, path)\n }\n }\n }\n if (prop.indexOf('Array-') !== 0 && typeof value === 'object') {\n this.watch(target, prop, target.$observeProps.$observerPath)\n }\n },\n mock: function(target) {\n var self = this\n obaa.methods.forEach(function(item) {\n target[item] = function() {\n var old = Array.prototype.slice.call(this, 0)\n var result = Array.prototype[item].apply(\n this,\n Array.prototype.slice.call(arguments)\n )\n if (new RegExp('\\\\b' + item + '\\\\b').test(obaa.triggerStr)) {\n for (var cprop in this) {\n if (this.hasOwnProperty(cprop) && !obaa.isFunction(this[cprop])) {\n self.watch(this, cprop, this.$observeProps.$observerPath)\n }\n }\n //todo\n self.onPropertyChanged(\n 'Array-' + item,\n this,\n old,\n this,\n this.$observeProps.$observerPath\n )\n }\n return result\n }\n target[\n 'pure' + item.substring(0, 1).toUpperCase() + item.substring(1)\n ] = function() {\n return Array.prototype[item].apply(\n this,\n Array.prototype.slice.call(arguments)\n )\n }\n })\n },\n watch: function(target, prop, path) {\n if (prop === '$observeProps' || prop === '$observer') return\n if (obaa.isFunction(target[prop])) return\n if (!target.$observeProps) target.$observeProps = {}\n if (path !== undefined) {\n target.$observeProps.$observerPath = path\n } else {\n target.$observeProps.$observerPath = '#'\n }\n var self = this\n var currentValue = (target.$observeProps[prop] = target[prop])\n Object.defineProperty(target, prop, {\n get: function() {\n return this.$observeProps[prop]\n },\n set: function(value) {\n var old = this.$observeProps[prop]\n this.$observeProps[prop] = value\n self.onPropertyChanged(\n prop,\n value,\n old,\n this,\n target.$observeProps.$observerPath\n )\n }\n })\n if (typeof currentValue == 'object') {\n if (obaa.isArray(currentValue)) {\n this.mock(currentValue)\n if (currentValue.length === 0) {\n if (!currentValue.$observeProps) currentValue.$observeProps = {}\n if (path !== undefined) {\n currentValue.$observeProps.$observerPath = path\n } else {\n currentValue.$observeProps.$observerPath = '#'\n }\n }\n }\n for (var cprop in currentValue) {\n if (currentValue.hasOwnProperty(cprop)) {\n this.watch(\n currentValue,\n cprop,\n target.$observeProps.$observerPath + '-' + prop\n )\n }\n }\n }\n }\n }\n return new _observe(target, arr, callback)\n}\n\nobaa.methods = [\n 'concat',\n 'copyWithin',\n 'entries',\n 'every',\n 'fill',\n 'filter',\n 'find',\n 'findIndex',\n 'forEach',\n 'includes',\n 'indexOf',\n 'join',\n 'keys',\n 'lastIndexOf',\n 'map',\n 'pop',\n 'push',\n 'reduce',\n 'reduceRight',\n 'reverse',\n 'shift',\n 'slice',\n 'some',\n 'sort',\n 'splice',\n 'toLocaleString',\n 'toString',\n 'unshift',\n 'values',\n 'size'\n]\nobaa.triggerStr = [\n 'concat',\n 'copyWithin',\n 'fill',\n 'pop',\n 'push',\n 'reverse',\n 'shift',\n 'sort',\n 'splice',\n 'unshift',\n 'size'\n].join(',')\n\nobaa.isArray = function(obj) {\n return Object.prototype.toString.call(obj) === '[object Array]'\n}\n\nobaa.isString = function(obj) {\n return typeof obj === 'string'\n}\n\nobaa.isInArray = function(arr, item) {\n for (var i = arr.length; --i > -1; ) {\n if (item === arr[i]) return true\n }\n return false\n}\n\nobaa.isFunction = function(obj) {\n return Object.prototype.toString.call(obj) == '[object Function]'\n}\n\nobaa._getRootName = function(prop, path) {\n if (path === '#') {\n return prop\n }\n return path.split('-')[1]\n}\n\nobaa.add = function(obj, prop) {\n var $observer = obj.$observer\n $observer.watch(obj, prop)\n}\n\nobaa.set = function(obj, prop, value, exec) {\n if (!exec) {\n obj[prop] = value\n }\n var $observer = obj.$observer\n $observer.watch(obj, prop)\n if (exec) {\n obj[prop] = value\n }\n}\n\nArray.prototype.size = function(length) {\n this.length = length\n}\n\nexport default obaa\n","const callbacks = []\nconst nextTickCallback = []\n\nexport function tick(fn, scope) {\n callbacks.push({ fn, scope })\n}\n\nexport function fireTick() {\n callbacks.forEach(item => {\n item.fn.call(item.scope)\n })\n\n nextTickCallback.forEach(nextItem => {\n nextItem.fn.call(nextItem.scope)\n })\n nextTickCallback.length = 0\n}\n\nexport function nextTick(fn, scope) {\n nextTickCallback.push({ fn, scope })\n}\n","import obaa from './obaa'\nimport { fireTick } from './tick'\n\nexport function proxyUpdate(ele) {\n let timeout = null\n obaa(ele.data, () => {\n if (ele._willUpdate) {\n return\n }\n if (ele.constructor.mergeUpdate) {\n clearTimeout(timeout)\n\n timeout = setTimeout(() => {\n ele.update()\n fireTick()\n }, 0)\n } else {\n ele.update()\n fireTick()\n }\n })\n}\n","import {\n SYNC_RENDER,\n NO_RENDER,\n FORCE_RENDER,\n ASYNC_RENDER,\n ATTR_KEY\n} from '../constants'\nimport options from '../options'\nimport { extend, applyRef } from '../util'\nimport { enqueueRender } from '../render-queue'\nimport { getNodeProps } from './index'\nimport {\n diff,\n mounts,\n diffLevel,\n flushMounts,\n recollectNodeTree,\n removeChildren\n} from './diff'\nimport { createComponent, collectComponent } from './component-recycler'\nimport { removeNode } from '../dom/index'\nimport {\n addScopedAttrStatic,\n getCtorName,\n scopeHost\n} from '../style'\nimport { proxyUpdate } from '../observe'\n\n/** Set a component's `props` (generally derived from JSX attributes).\n *\t@param {Object} props\n *\t@param {Object} [opts]\n *\t@param {boolean} [opts.renderSync=false]\tIf `true` and {@link options.syncComponentUpdates} is `true`, triggers synchronous rendering.\n *\t@param {boolean} [opts.render=true]\t\t\tIf `false`, no render will be triggered.\n */\nexport function setComponentProps(component, props, opts, context, mountAll) {\n if (component._disable) return\n component._disable = true\n\n if ((component.__ref = props.ref)) delete props.ref\n if ((component.__key = props.key)) delete props.key\n\n if (!component.base || mountAll) {\n if (component.beforeInstall) component.beforeInstall()\n if (component.install) component.install()\n if (component.constructor.observe) {\n proxyUpdate(component)\n }\n }\n\n if (context && context !== component.context) {\n if (!component.prevContext) component.prevContext = component.context\n component.context = context\n }\n\n if (!component.prevProps) component.prevProps = component.props\n component.props = props\n\n component._disable = false\n\n if (opts !== NO_RENDER) {\n if (\n opts === SYNC_RENDER ||\n options.syncComponentUpdates !== false ||\n !component.base\n ) {\n renderComponent(component, SYNC_RENDER, mountAll)\n } else {\n enqueueRender(component)\n }\n }\n\n applyRef(component.__ref, component)\n}\n\nfunction shallowComparison(old, attrs) {\n let name\n\n for (name in old) {\n if (attrs[name] == null && old[name] != null) {\n return true\n }\n }\n\n if (old.children.length > 0 || attrs.children.length > 0) {\n return true\n }\n\n for (name in attrs) {\n if (name != 'children') {\n let type = typeof attrs[name]\n if (type == 'function' || type == 'object') {\n return true\n } else if (attrs[name] != old[name]) {\n return true\n }\n }\n }\n}\n\n/** Render a Component, triggering necessary lifecycle events and taking High-Order Components into account.\n *\t@param {Component} component\n *\t@param {Object} [opts]\n *\t@param {boolean} [opts.build=false]\t\tIf `true`, component will build and store a DOM node if not already associated with one.\n *\t@private\n */\nexport function renderComponent(component, opts, mountAll, isChild) {\n if (component._disable) return\n\n let props = component.props,\n data = component.data,\n context = component.context,\n previousProps = component.prevProps || props,\n previousState = component.prevState || data,\n previousContext = component.prevContext || context,\n isUpdate = component.base,\n nextBase = component.nextBase,\n initialBase = isUpdate || nextBase,\n initialChildComponent = component._component,\n skip = false,\n rendered,\n inst,\n cbase\n\n // if updating\n if (isUpdate) {\n component.props = previousProps\n component.data = previousState\n component.context = previousContext\n if (component.store || opts == FORCE_RENDER || shallowComparison(previousProps, props)) {\n let receiveResult = true\n if (component.receiveProps) {\n receiveResult = component.receiveProps(props, previousProps)\n }\n if (receiveResult !== false) {\n skip = false\n if (component.beforeUpdate) {\n component.beforeUpdate(props, data, context)\n }\n } else {\n skip = true\n }\n } else {\n skip = true\n }\n component.props = props\n component.data = data\n component.context = context\n }\n\n component.prevProps = component.prevState = component.prevContext = component.nextBase = null\n\n if (!skip) {\n component.beforeRender && component.beforeRender()\n rendered = component.render(props, data, context)\n\n //don't rerender\n if (component.constructor.css || component.css) {\n addScopedAttrStatic(\n rendered,\n '_s' + getCtorName(component.constructor)\n )\n }\n\n scopeHost(rendered, component.scopedCssAttr)\n\n // context to pass to the child, can be updated via (grand-)parent component\n if (component.getChildContext) {\n context = extend(extend({}, context), component.getChildContext())\n }\n\n let childComponent = rendered && rendered.nodeName,\n toUnmount,\n base,\n ctor = options.mapping[childComponent]\n\n if (ctor) {\n // set up high order component link\n\n let childProps = getNodeProps(rendered)\n inst = initialChildComponent\n\n if (inst && inst.constructor === ctor && childProps.key == inst.__key) {\n setComponentProps(inst, childProps, SYNC_RENDER, context, false)\n } else {\n toUnmount = inst\n\n component._component = inst = createComponent(ctor, childProps, context)\n inst.nextBase = inst.nextBase || nextBase\n inst._parentComponent = component\n setComponentProps(inst, childProps, NO_RENDER, context, false)\n renderComponent(inst, SYNC_RENDER, mountAll, true)\n }\n\n base = inst.base\n } else {\n cbase = initialBase\n\n // destroy high order component link\n toUnmount = initialChildComponent\n if (toUnmount) {\n cbase = component._component = null\n }\n\n if (initialBase || opts === SYNC_RENDER) {\n if (cbase) cbase._component = null\n base = diff(\n cbase,\n rendered,\n context,\n mountAll || !isUpdate,\n initialBase && initialBase.parentNode,\n true\n )\n }\n }\n\n if (initialBase && base !== initialBase && inst !== initialChildComponent) {\n let baseParent = initialBase.parentNode\n if (baseParent && base !== baseParent) {\n baseParent.replaceChild(base, initialBase)\n\n if (!toUnmount) {\n initialBase._component = null\n recollectNodeTree(initialBase, false)\n }\n }\n }\n\n if (toUnmount) {\n unmountComponent(toUnmount)\n }\n\n component.base = base\n if (base && !isChild) {\n let componentRef = component,\n t = component\n while ((t = t._parentComponent)) {\n ;(componentRef = t).base = base\n }\n base._component = componentRef\n base._componentConstructor = componentRef.constructor\n }\n }\n\n if (!isUpdate || mountAll) {\n mounts.unshift(component)\n } else if (!skip) {\n // Ensure that pending componentDidMount() hooks of child components\n // are called before the componentDidUpdate() hook in the parent.\n // Note: disabled as it causes duplicate hooks, see https://github.com/developit/preact/issues/750\n // flushMounts();\n\n if (component.afterUpdate) {\n //deprecated\n component.afterUpdate(previousProps, previousState, previousContext)\n }\n if (component.updated) {\n component.updated(previousProps, previousState, previousContext)\n }\n if (options.afterUpdate) options.afterUpdate(component)\n }\n\n if (component._renderCallbacks != null) {\n while (component._renderCallbacks.length)\n component._renderCallbacks.pop().call(component)\n }\n\n if (!diffLevel && !isChild) flushMounts()\n}\n\n/** Apply the Component referenced by a VNode to the DOM.\n *\t@param {Element} dom\tThe DOM node to mutate\n *\t@param {VNode} vnode\tA Component-referencing VNode\n *\t@returns {Element} dom\tThe created/mutated element\n *\t@private\n */\nexport function buildComponentFromVNode(dom, vnode, context, mountAll) {\n let c = dom && dom._component,\n originalComponent = c,\n oldDom = dom,\n isDirectOwner = c && dom._componentConstructor === vnode.nodeName,\n isOwner = isDirectOwner,\n props = getNodeProps(vnode)\n while (c && !isOwner && (c = c._parentComponent)) {\n isOwner = c.constructor === vnode.nodeName\n }\n\n if (c && isOwner && (!mountAll || c._component)) {\n setComponentProps(c, props, ASYNC_RENDER, context, mountAll)\n dom = c.base\n } else {\n if (originalComponent && !isDirectOwner) {\n unmountComponent(originalComponent)\n dom = oldDom = null\n }\n\n c = createComponent(vnode.nodeName, props, context, vnode)\n if (dom && !c.nextBase) {\n c.nextBase = dom\n // passing dom/oldDom as nextBase will recycle it if unused, so bypass recycling on L229:\n oldDom = null\n }\n setComponentProps(c, props, SYNC_RENDER, context, mountAll)\n dom = c.base\n\n if (oldDom && dom !== oldDom) {\n oldDom._component = null\n recollectNodeTree(oldDom, false)\n }\n }\n\n return dom\n}\n\n/** Remove a component from the DOM and recycle it.\n *\t@param {Component} component\tThe Component instance to unmount\n *\t@private\n */\nexport function unmountComponent(component) {\n if (options.beforeUnmount) options.beforeUnmount(component)\n\n let base = component.base\n\n component._disable = true\n\n\tif (component.uninstall) component.uninstall()\n\n\tif (component.store && component.store.instances) {\n\t\tfor (let i = 0, len = component.store.instances.length; i < len; i++) {\n\t\t\tif (component.store.instances[i] === component) {\n\t\t\t\tcomponent.store.instances.splice(i, 1)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n component.base = null\n\n // recursively tear down & recollect high-order component children:\n let inner = component._component\n if (inner) {\n unmountComponent(inner)\n } else if (base) {\n if (base[ATTR_KEY] != null) applyRef(base[ATTR_KEY].ref, null)\n\n component.nextBase = base\n\n removeNode(base)\n collectComponent(component)\n\n removeChildren(base)\n }\n\n applyRef(component.__ref, null)\n}\n","import { FORCE_RENDER } from './constants'\nimport { renderComponent } from './vdom/component'\nimport options from './options'\nimport { nProps, assign } from './util'\n\nlet id = 0\n\nexport default class Component {\n static is = 'WeElement'\n\n constructor(props, store) {\n this.props = assign(\n nProps(this.constructor.props),\n this.constructor.defaultProps,\n props\n )\n this.elementId = id++\n this.data = this.constructor.data || this.data || {}\n\n this._preCss = null\n\n this.store = store\n }\n\n update(callback) {\n this._willUpdate = true\n if (callback)\n (this._renderCallbacks = this._renderCallbacks || []).push(callback)\n renderComponent(this, FORCE_RENDER)\n if (options.componentChange) options.componentChange(this, this.base)\n this._willUpdate = false\n }\n\n fire(type, data) {\n Object.keys(this.props).every(key => {\n if ('on' + type.toLowerCase() === key.toLowerCase()) {\n this.props[key]({ detail: data })\n return false\n }\n return true\n })\n }\n\n render() {}\n}\n","import { diff } from './vdom/diff'\nimport obaa from './obaa'\nimport { getUse } from './util'\n\n/** Render JSX into a `parent` Element.\n *\t@param {VNode} vnode\t\tA (JSX) VNode to render\n *\t@param {Element} parent\t\tDOM element to render into\n *\t@param {object} [store]\n *\t@public\n */\nexport function render(vnode, parent, store, empty, merge) {\n parent = typeof parent === 'string' ? document.querySelector(parent) : parent\n obsStore(store)\n\n if (empty) {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild)\n }\n }\n\n if (merge) {\n merge =\n typeof merge === 'string'\n ? document.querySelector(merge)\n : merge\n }\n\n return diff(merge, vnode, store, false, parent, false)\n}\n\nfunction obsStore(store){\n if (store && store.data) {\n store.instances = []\n extendStoreUpate(store)\n\n obaa(store.data, (prop, val, old, path) => {\n\t\t\tconst patchs = {}\n const key = fixPath(path + '-' + prop)\n patchs[key] = true\n\t\t\tstore.update(patchs)\n })\n }\n}\n\nexport function merge(vnode, merge, store) {\n obsStore(store)\n\n merge =\n typeof merge === 'string'\n ? document.querySelector(merge)\n : merge\n\n return diff(merge, vnode, store)\n}\n\nfunction extendStoreUpate(store) {\n store.update = function(patch) {\n const updateAll = matchGlobalData(this.globalData, patch)\n if (Object.keys(patch).length > 0) {\n this.instances.forEach(instance => {\n if (\n updateAll ||\n this.updateAll ||\n (instance.constructor.updatePath &&\n\t\t\t\t\t\tneedUpdate(patch, instance.constructor.updatePath)) ||\n\t\t\t\t\t\t(instance._updatePath &&\n\t\t\t\t\t\t\tneedUpdate(patch, instance._updatePath))\n ) {\n\t\t\t\t\t//update this.use\n\t\t\t\t\tif(instance.constructor.use){\n\t\t\t\t\t\tinstance.use = getUse(store.data, instance.constructor.use)\n\t\t\t\t\t} else if(instance.initUse){\n\t\t\t\t\t\tinstance.use = getUse(store.data, instance.initUse())\n\t\t\t\t\t}\n\n instance.update()\n }\n })\n this.onChange && this.onChange(patch)\n }\n }\n}\n\nexport function matchGlobalData(globalData, diffResult) {\n if (!globalData) return false\n for (let keyA in diffResult) {\n if (globalData.indexOf(keyA) > -1) {\n return true\n }\n for (let i = 0, len = globalData.length; i < len; i++) {\n if (includePath(keyA, globalData[i])) {\n return true\n }\n }\n }\n return false\n}\n\nexport function needUpdate(diffResult, updatePath) {\n for (let keyA in diffResult) {\n if (updatePath[keyA]) {\n return true\n }\n for (let keyB in updatePath) {\n if (includePath(keyA, keyB)) {\n return true\n }\n }\n }\n return false\n}\n\nfunction includePath(pathA, pathB) {\n if (pathA.indexOf(pathB) === 0) {\n const next = pathA.substr(pathB.length, 1)\n if (next === '[' || next === '.') {\n return true\n }\n }\n return false\n}\n\nexport function fixPath(path) {\n let mpPath = ''\n const arr = path.replace('#-', '').split('-')\n arr.forEach((item, index) => {\n if (index) {\n if (isNaN(Number(item))) {\n mpPath += '.' + item\n } else {\n mpPath += '[' + item + ']'\n }\n } else {\n mpPath += item\n }\n })\n return mpPath\n}\n\nfunction getArrayPatch(path, store) {\n const arr = path.replace('/', '').split('/')\n let current = store.data[arr[0]]\n for (let i = 1, len = arr.length; i < len - 1; i++) {\n current = current[arr[i]]\n }\n return { k: fixArrPath(path), v: current }\n}\n\nfunction fixArrPath(path) {\n let mpPath = ''\n const arr = path.replace('/', '').split('/')\n const len = arr.length\n arr.forEach((item, index) => {\n if (index < len - 1) {\n if (index) {\n if (isNaN(Number(item))) {\n mpPath += '.' + item\n } else {\n mpPath += '[' + item + ']'\n }\n } else {\n mpPath += item\n }\n }\n })\n return mpPath\n}\n","export function rpx(str) {\n return str.replace(/([1-9]\\d*|0)(\\.\\d*)*rpx/g, (a, b) => {\n return (window.innerWidth * Number(b)) / 750 + 'px'\n })\n}\n","import { define } from './define'\n\nexport function tag(name) {\n return function(target) {\n define(name, target)\n }\n}\n","import Component from './component'\n\nexport default class ModelView extends Component {\n static observe = true\n\n static mergeUpdate = true\n\n beforeInstall() {\n this.data = this.vm.data\n }\n}\n","/**\n * classNames based on https://github.com/JedWatson/classnames\n * by Jed Watson\n * Licensed under the MIT License\n * https://github.com/JedWatson/classnames/blob/master/LICENSE\n * modified by dntzhang\n */\n\nvar hasOwn = {}.hasOwnProperty\n\nexport function classNames() {\n var classes = []\n\n for (var i = 0; i < arguments.length; i++) {\n var arg = arguments[i]\n if (!arg) continue\n\n var argType = typeof arg\n\n if (argType === 'string' || argType === 'number') {\n classes.push(arg)\n } else if (Array.isArray(arg) && arg.length) {\n var inner = classNames.apply(null, arg)\n if (inner) {\n classes.push(inner)\n }\n } else if (argType === 'object') {\n for (var key in arg) {\n if (hasOwn.call(arg, key) && arg[key]) {\n classes.push(key)\n }\n }\n }\n }\n\n return classes.join(' ')\n}\n\nexport function extractClass() {\n const [props, ...args] = Array.prototype.slice.call(arguments, 0)\n if (props) {\n if (props['class']) {\n args.unshift(props['class'])\n delete props['class']\n } else if (props.className) {\n args.unshift(props.className)\n delete props.className\n }\n }\n if (args.length > 0) {\n return { 'class': classNames.apply(null, args) }\n }\n}\n","export function getHost(component) {\n let base = component.base\n if (base) {\n while (base.parentNode) {\n if (base.parentNode._component) {\n return base.parentNode._component\n } else {\n base = base.parentNode\n }\n }\n }\n}","/**\n * preact-render-to-string based on preact-render-to-string\n * by Jason Miller\n * Licensed under the MIT License\n * https://github.com/developit/preact-render-to-string\n *\n * modified by dntzhang\n */\n\nimport options from './options'\n\nimport {\n addScopedAttrStatic,\n getCtorName,\n scopeHost,\n scoper\n} from './style'\n\n\nconst encodeEntities = s => String(s)\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"');\n\nconst indent = (s, char) => String(s).replace(/(\\n+)/g, '$1' + (char || '\\t'));\n\nconst mapping = options.mapping\n\nconst VOID_ELEMENTS = /^(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)$/;\n\nconst isLargeString = (s, length, ignoreLines) => (String(s).length > (length || 40) || (!ignoreLines && String(s).indexOf('\\n') !== -1) || String(s).indexOf('<') !== -1);\n\nconst JS_TO_CSS = {};\n\n// Convert an Object style to a CSSText string\nfunction styleObjToCss(s) {\n let str = '';\n for (let prop in s) {\n let val = s[prop];\n if (val != null) {\n if (str) str += ' ';\n // str += jsToCss(prop);\n str += JS_TO_CSS[prop] || (JS_TO_CSS[prop] = prop.replace(/([A-Z])/g, '-$1').toLowerCase());\n str += ': ';\n str += val;\n if (typeof val === 'number' && IS_NON_DIMENSIONAL.test(prop) === false) {\n str += 'px';\n }\n str += ';';\n }\n }\n return str || undefined;\n}\n\nexport function renderToString(vnode, opts, store, isSvgMode){\n store = store || {};\n opts = Object.assign({\n scopedCSS: true\n },opts)\n const css = {}\n const html = _renderToString(vnode, opts, store, isSvgMode, css)\n return {\n css: Object.values(css),\n html: html\n }\n}\n\n/** The default export is an alias of `render()`. */\nfunction _renderToString(vnode, opts, store, isSvgMode, css) {\n if (vnode == null || typeof vnode === 'boolean') {\n return '';\n }\n\n let nodeName = vnode.nodeName,\n attributes = vnode.attributes,\n isComponent = false;\n \n\n let pretty = true && opts.pretty,\n indentChar = pretty && typeof pretty === 'string' ? pretty : '\\t';\n\n // #text nodes\n if (typeof vnode !== 'object' && !nodeName) {\n return encodeEntities(vnode);\n }\n\n // components\n const ctor = mapping[nodeName]\n if (ctor) {\n isComponent = true;\n\n let props = getNodeProps(vnode),\n rendered;\n // class-based components\n let c = new ctor(props, store);\n // turn off stateful re-rendering:\n c._disable = c.__x = true;\n c.props = props;\n c.store = store;\n if (c.install) c.install();\n if (c.beforeRender) c.beforeRender();\n rendered = c.render(c.props, c.data, c.store);\n\n if(opts.scopedCSS){\n\n if (c.constructor.css || c.css) {\n\n const cssStr = c.constructor.css ? c.constructor.css : (typeof c.css === 'function' ? c.css() : c.css)\n const cssAttr = '_s' + getCtorName(c.constructor)\n css[cssAttr] = {\n id: cssAttr,\n css: scoper(cssStr, cssAttr)\n }\n addScopedAttrStatic(\n rendered,\n cssAttr\n )\n }\n \n c.scopedCSSAttr = vnode.css\n scopeHost(rendered, c.scopedCSSAttr)\n }\n\n return _renderToString(rendered, opts, store, false, css);\n }\n\n\n // render JSX to HTML\n let s = '', html;\n\n if (attributes) {\n let attrs = Object.keys(attributes);\n\n // allow sorting lexicographically for more determinism (useful for tests, such as via preact-jsx-chai)\n if (opts && opts.sortAttributes === true) attrs.sort();\n\n for (let i = 0; i < attrs.length; i++) {\n let name = attrs[i],\n v = attributes[name];\n if (name === 'children') continue;\n\n if (name.match(/[\\s\\n\\\\/='\"\\0<>]/)) continue;\n\n if (!(opts && opts.allAttributes) && (name === 'key' || name === 'ref')) continue;\n\n if (name === 'className') {\n if (attributes['class']) continue;\n name = 'class';\n }\n else if (isSvgMode && name.match(/^xlink:?./)) {\n name = name.toLowerCase().replace(/^xlink:?/, 'xlink:');\n }\n\n if (name === 'style' && v && typeof v === 'object') {\n v = styleObjToCss(v);\n }\n\n let hooked = opts.attributeHook && opts.attributeHook(name, v, store, opts, isComponent);\n if (hooked || hooked === '') {\n s += hooked;\n continue;\n }\n\n if (name === 'dangerouslySetInnerHTML') {\n html = v && v.__html;\n }\n else if ((v || v === 0 || v === '') && typeof v !== 'function') {\n if (v === true || v === '') {\n v = name;\n // in non-xml mode, allow boolean attributes\n if (!opts || !opts.xml) {\n s += ' ' + name;\n continue;\n }\n }\n s += ` ${name}=\"${encodeEntities(v)}\"`;\n }\n }\n }\n\n // account for >1 multiline attribute\n if (pretty) {\n let sub = s.replace(/^\\n\\s*/, ' ');\n if (sub !== s && !~sub.indexOf('\\n')) s = sub;\n else if (pretty && ~s.indexOf('\\n')) s += '\\n';\n }\n\n s = `<${nodeName}${s}>`;\n if (String(nodeName).match(/[\\s\\n\\\\/='\"\\0<>]/)) throw s;\n\n let isVoid = String(nodeName).match(VOID_ELEMENTS);\n if (isVoid) s = s.replace(/>$/, ' />');\n\n let pieces = [];\n if (html) {\n // if multiline, indent.\n if (pretty && isLargeString(html)) {\n html = '\\n' + indentChar + indent(html, indentChar);\n }\n s += html;\n }\n else if (vnode.children) {\n let hasLarge = pretty && ~s.indexOf('\\n');\n for (let i = 0; i < vnode.children.length; i++) {\n let child = vnode.children[i];\n if (child != null && child !== false) {\n let childSvgMode = nodeName === 'svg' ? true : nodeName === 'foreignObject' ? false : isSvgMode,\n ret = _renderToString(child, opts, store, childSvgMode, css);\n if (pretty && !hasLarge && isLargeString(ret)) hasLarge = true;\n if (ret) pieces.push(ret);\n }\n }\n if (pretty && hasLarge) {\n for (let i = pieces.length; i--;) {\n pieces[i] = '\\n' + indentChar + indent(pieces[i], indentChar);\n }\n }\n }\n\n if (pieces.length) {\n s += pieces.join('');\n }\n else if (opts && opts.xml) {\n return s.substring(0, s.length - 1) + ' />';\n }\n\n if (!isVoid) {\n if (pretty && ~s.indexOf('\\n')) s += '\\n';\n s += ``;\n }\n\n return s\n}\n\nfunction assign(obj, props) {\n for (let i in props) obj[i] = props[i];\n return obj;\n}\n\nfunction getNodeProps(vnode) {\n let props = assign({}, vnode.attributes);\n props.children = vnode.children;\n\n let defaultProps = vnode.nodeName.defaultProps;\n if (defaultProps !== undefined) {\n for (let i in defaultProps) {\n if (props[i] === undefined) {\n props[i] = defaultProps[i];\n }\n }\n }\n\n return props;\n}","var n=function(t,r,u,e){for(var p=1;p\"===t?(a(),u=1):u&&(\"=\"===t?(u=4,r=e,e=\"\"):\"/\"===t?(a(),3===u&&(s=s[0]),u=s,(s=s[0]).push(u,4),u=0):\" \"===t||\"\\t\"===t||\"\\n\"===t||\"\\r\"===t?(a(),u=2):e+=t)}return a(),s},r=\"function\"==typeof Map,u=r?new Map:{},e=r?function(n){var r=u.get(n);return r||u.set(n,r=t(n)),r}:function(n){for(var r=\"\",e=0;e1?r:r[0]}\n","import { h, h as createElement } from './h'\nimport { cloneElement } from './clone-element'\nimport Component from './component'\nimport { render, merge } from './render'\nimport { rerender } from './render-queue'\nimport options from './options'\nimport { define } from './define'\nimport { rpx } from './rpx'\nimport { tag } from './tag'\nimport ModelView from './model-view'\nimport { classNames, extractClass } from './class'\nimport { getHost } from './get-host'\nimport { renderToString } from './render-to-string'\nimport htm from 'htm'\n\nconst html = htm.bind(h)\n\nconst WeElement = Component\nconst defineElement = define\nfunction createRef() {\n return {}\n}\n\noptions.root.Omi = {\n h,\n createElement,\n cloneElement,\n createRef,\n Component,\n render,\n rerender,\n options,\n WeElement,\n define,\n rpx,\n ModelView,\n defineElement,\n classNames,\n extractClass,\n getHost,\n renderToString,\n tag,\n merge,\n html,\n htm\n}\noptions.root.omi = options.root.Omi\noptions.root.Omi.version = 'omio-2.2.2'\n\nexport default {\n h,\n createElement,\n cloneElement,\n createRef,\n Component,\n render,\n rerender,\n options,\n WeElement,\n define,\n rpx,\n ModelView,\n defineElement,\n classNames,\n extractClass,\n getHost,\n renderToString,\n tag,\n merge,\n html,\n htm\n}\n\nexport {\n h,\n createElement,\n cloneElement,\n createRef,\n Component,\n render,\n rerender,\n options,\n WeElement,\n define,\n rpx,\n ModelView,\n defineElement,\n classNames,\n extractClass,\n getHost,\n renderToString,\n tag,\n merge,\n html,\n htm\n}\n","import { define, WeElement, render } from '../../src/index'\n\ndefine('my-counter', class extends WeElement {\n count = 1\n\n sub = () => {\n this.count--\n this.update()\n }\n\n add = () => {\n this.count++\n this.update()\n }\n\n render() {\n return (\n
\n \n {this.count}\n \n
\n )\n }\n})\n\nrender(, 'body')"],"names":["VNode","nodeId","uniqueId","docMap","addDoc","id","doc","getDoc","removeDoc","insertIndex","target","list","newIndex","before","after","splice","nextSibling","previousSibling","moveIndex","index","indexOf","newIndexAfter","beforeNew","afterNew","removeIndex","changeSibling","linkParent","node","parent","parentNode","docId","ownerDocument","nodeMap","depth","childNodes","forEach","child","displayMap","div","span","registerNode","Element","type","nodeType","ref","attributes","style","display","classStyle","event","nodeName","firstChild","appendChild","length","undefined","removeChild","insertBefore","insertAfter","removeElement","setAttribute","key","value","silent","result","setAttr","removeAttribute","setStyle","setStyles","styles","Object","assign","setClassStyle","toStyle","addEventListener","handler","removeEventListener","removeEvent","fireEvent","e","call","getComputedStyle","toJSON","keys","children","map","replaceChild","newChild","oldChild","destroy","TextNode","nodeValue","splitText","Document","_isMockDocument","createElement","tagName","props","el","createTextNode","txt","listener","scrollTo","x","y","animated","document","getGlobal","global","Math","Array","self","window","scopedStyle","mapping","isWeb","staticStyleMapping","mock","root","styleCache","stack","h","lastSimple","simple","i","arguments","push","pop","String","p","options","vnode","getOwnPropertySymbols","hasOwnProperty","prototype","propIsEnumerable","propertyIsEnumerable","toObject","val","TypeError","source","from","to","symbols","s","runListeners","oEvent","iLstId","iElId","oEvtListeners","oListeners","aEls","aEvts","sEventType","fListener","nElIdx","aElListeners","create","proto","propertiesObject","Error","F","trim","replace","extend","obj","applyRef","current","usePromise","Promise","__config__","platform","systemVersion","split","defer","resolve","then","bind","setTimeout","isArray","toString","nProps","getUse","data","paths","path","isPath","getTargetByPath","tempPath","tempVal","args","apply","origin","arr","len","cloneElement","slice","NO_RENDER","SYNC_RENDER","FORCE_RENDER","ASYNC_RENDER","ATTR_KEY","IS_NON_DIMENSIONAL","items","enqueueRender","component","debounceRendering","rerender","renderComponent","isSameNodeType","hydrating","ctor","_componentConstructor","isNamedNode","normalizedNodeName","toLowerCase","getNodeProps","defaultProps","createNode","isSvg","createElementNS","parseCSSText","cssText","cssTxt","match","a","b","rule","cssToJs","toUpperCase","properties","o","property","removeNode","setAccessor","name","old","className","test","oldJson","currentJson","changed","ckey","innerHTML","__html","useCapture","substring","eventProxy","touchStart","touchEnd","_listeners","setProperty","ns","removeAttributeNS","setAttributeNS","___touchX","touches","pageX","___touchY","pageY","___scrollTop","body","scrollTop","abs","changedTouches","dispatchEvent","CustomEvent","detail","styleId","getCtorName","item","attrName","scoper","css","prefix","re","RegExp","g0","g1","g2","g3","appendClass","addStyle","ele","getElementById","head","getElementsByTagName","someThingStyles","ActiveXObject","styleSheet","textContent","addStyleWithoutId","addScopedAttrStatic","vdom","attr","scopeVdom","addStyleToHead","scopeHost","mounts","diffLevel","isSvgMode","flushMounts","c","afterMount","installed","constructor","diff","dom","context","mountAll","componentRoot","ownerSVGElement","ret","idiff","out","prevSvgMode","vnodeName","buildComponentFromVNode","_component","recollectNodeTree","fc","vchildren","innerDiffNode","dangerouslySetInnerHTML","diffAttributes","isHydrating","originalChildren","keyed","keyedLen","min","childrenLen","vlen","j","f","vchild","__key","unmountOnly","unmountComponent","removeChildren","lastChild","next","attrs","OBJECTTYPE","ARRAYTYPE","define","use","updatePath","getPath","getUpdatePath","dataToPath","_objToPath","_arrayToPath","components","collectComponent","createComponent","Ctor","inst","render","Component","doRender","scopedCssAttr","store","instances","initUse","_updatePath","nextBase","obaa","callback","_observe","$observer","eventPropArr","$observeProps","$observerPath","prop","isInArray","watch","isString","propertyChangedHandler","propChanged","all","onPropertyChanged","oldValue","rootName","_getRootName","methods","triggerStr","cprop","isFunction","currentValue","defineProperty","get","set","join","add","exec","size","callbacks","nextTickCallback","fireTick","fn","scope","nextItem","proxyUpdate","timeout","_willUpdate","mergeUpdate","clearTimeout","update","setComponentProps","opts","_disable","__ref","base","beforeInstall","install","observe","prevContext","prevProps","syncComponentUpdates","shallowComparison","isChild","previousProps","previousState","prevState","previousContext","isUpdate","initialBase","initialChildComponent","skip","rendered","cbase","receiveResult","receiveProps","beforeUpdate","beforeRender","getChildContext","childComponent","toUnmount","childProps","_parentComponent","baseParent","componentRef","t","unshift","afterUpdate","updated","_renderCallbacks","originalComponent","oldDom","isDirectOwner","isOwner","beforeUnmount","uninstall","inner","elementId","_preCss","componentChange","fire","every","is","empty","merge","querySelector","obsStore","extendStoreUpate","patchs","fixPath","patch","updateAll","matchGlobalData","globalData","instance","needUpdate","onChange","diffResult","keyA","includePath","keyB","pathA","pathB","substr","mpPath","isNaN","Number","rpx","str","innerWidth","tag","ModelView","vm","hasOwn","classNames","classes","arg","argType","extractClass","getHost","encodeEntities","indent","char","VOID_ELEMENTS","isLargeString","ignoreLines","JS_TO_CSS","styleObjToCss","renderToString","scopedCSS","html","_renderToString","values","isComponent","pretty","indentChar","__x","cssStr","cssAttr","scopedCSSAttr","sortAttributes","sort","v","allAttributes","hooked","attributeHook","xml","sub","isVoid","pieces","hasLarge","childSvgMode","htm","WeElement","defineElement","createRef","Omi","omi","version","count","color"],"mappings":"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C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,OAAO,CAAC,EAAE,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,AAAe,YAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;ECeplC,IAAM0Z,OAAOsB,IAAIhW,IAAJ,CAASxD,CAAT,CAAb;;EAEA,IAAMyZ,YAAY5K,SAAlB;EACA,IAAM6K,gBAAgB3L,MAAtB;EACA,SAAS4L,SAAT,GAAqB;EACnB,SAAO,EAAP;EACD;;EAEDlZ,QAAQZ,IAAR,CAAa+Z,GAAb,GAAmB;EACjB5Z,MADiB;EAEjB1B,kBAFiB;EAGjBoG,4BAHiB;EAIjBiV,sBAJiB;EAKjB9K,sBALiB;EAMjBD,gBANiB;EAOjBtJ,oBAPiB;EAQjB7E,kBARiB;EASjBgZ,sBATiB;EAUjB1L,gBAViB;EAWjB4I,UAXiB;EAYjBI,sBAZiB;EAajB2C,8BAbiB;EAcjBxC,wBAdiB;EAejBI,4BAfiB;EAgBjBC,kBAhBiB;EAiBjBS,gCAjBiB;EAkBjBlB,UAlBiB;EAmBjB1B,cAnBiB;EAoBjB8C,YApBiB;EAqBjBsB;EArBiB,CAAnB;EAuBA/Y,QAAQZ,IAAR,CAAaga,GAAb,GAAmBpZ,QAAQZ,IAAR,CAAa+Z,GAAhC;EACAnZ,QAAQZ,IAAR,CAAa+Z,GAAb,CAAiBE,OAAjB,GAA2B,YAA3B;;;;;;;;EC7CA/L,OAAO,YAAP;EAAA;;EAAA;EAAA;;EAAA;;EAAA;EAAA;EAAA;;EAAA,8IACEgM,KADF,GACU,CADV,QAGEZ,GAHF,GAGQ,YAAM;EACV,YAAKY,KAAL;EACA,YAAKjI,MAAL;EACD,KANH,QAQEd,GARF,GAQQ,YAAM;EACV,YAAK+I,KAAL;EACA,YAAKjI,MAAL;EACD,KAXH;EAAA;;EAAA,oBAaElD,MAbF,wBAaW;EACP,WACE;EAAA;EAAA;EACE;EAAA;EAAA,UAAQ,SAAS,KAAKuK,GAAtB;EAAA;EAAA,OADF;EAEE;EAAA;EAAA,UAAM,OAAO;EACXa,mBAAO;EADI,WAAb;EAEI,aAAKD;EAFT,OAFF;EAKE;EAAA;EAAA,UAAQ,SAAS,KAAK/I,GAAtB;EAAA;EAAA;EALF,KADF;EASD,GAvBH;;EAAA;EAAA,EAAmCyI,SAAnC;;EA0BA7K,OAAO,yBAAP,EAAuB,MAAvB;;;;"} \ No newline at end of file diff --git a/packages/omiax/examples/simple/index.html b/packages/omiax/examples/simple/index.html new file mode 100644 index 000000000..46bbb4d59 --- /dev/null +++ b/packages/omiax/examples/simple/index.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/omiax/examples/simple/main.js b/packages/omiax/examples/simple/main.js new file mode 100644 index 000000000..2ce5da16b --- /dev/null +++ b/packages/omiax/examples/simple/main.js @@ -0,0 +1,29 @@ +import { define, WeElement, render } from '../../src/index' + +define('my-counter', class extends WeElement { + count = 1 + + sub = () => { + this.count-- + this.update() + } + + add = () => { + this.count++ + this.update() + } + + render() { + return ( +
+ + {this.count} + +
+ ) + } +}) + +render(, 'body') \ No newline at end of file diff --git a/packages/omiax/package.json b/packages/omiax/package.json index b5d7d2825..a511fad73 100644 --- a/packages/omiax/package.json +++ b/packages/omiax/package.json @@ -4,13 +4,77 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "simple": "rollup -c config/rollup.example.js --watch" }, "keywords": [ "omi", "cax", "omiax" ], + "devDependencies": { + "@types/chai": "^4.1.2", + "@types/mocha": "^5.0.0", + "@types/node": "^9.4.7", + "babel-cli": "^6.24.1", + "babel-core": "^6.24.1", + "babel-eslint": "^8.2.2", + "babel-loader": "^7.0.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators-legacy": "^1.3.5", + "babel-plugin-transform-object-rest-spread": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-preset-env": "^1.6.1", + "bundlesize": "^0.17.0", + "chai": "^4.1.2", + "copyfiles": "^2.0.0", + "core-js": "^2.4.1", + "coveralls": "^3.0.0", + "cross-env": "^5.1.4", + "diff": "^3.0.0", + "eslint": "^4.18.2", + "eslint-config-prettier": "^3.1.0", + "eslint-plugin-prettier": "^3.0.0", + "eslint-plugin-react": "^7.7.0", + "flow-bin": "^0.67.1", + "gzip-size-cli": "^2.0.0", + "htm": "^2.1.1", + "istanbul-instrumenter-loader": "^3.0.0", + "jest": "^23.6.0", + "jscodeshift": "^0.5.0", + "karma": "^2.0.0", + "karma-babel-preprocessor": "^7.0.0", + "karma-chai-sinon": "^0.1.5", + "karma-chrome-launcher": "^2.0.0", + "karma-coverage": "^1.0.0", + "karma-mocha": "^1.1.1", + "karma-mocha-reporter": "^2.0.4", + "karma-sauce-launcher": "^1.2.0", + "karma-sinon": "^1.0.5", + "karma-source-map-support": "^1.2.0", + "karma-sourcemap-loader": "^0.3.6", + "karma-webpack": "^3.0.0", + "mappingjs": "latest", + "mobx": "^4.5.1", + "mocha": "^5.0.4", + "npm-run-all": "^4.0.0", + "omi-mobx": "^0.2.2", + "omi-tap": "^2.0.2", + "omi-transform": "^2.0.2", + "prettier": "^1.14.3", + "rimraf": "^2.5.3", + "rollup": "^0.57.1", + "rollup-plugin-babel": "^3.0.2", + "rollup-plugin-commonjs": "^9.2.0", + "rollup-plugin-license": "^0.6.0", + "rollup-plugin-memory": "^3.0.0", + "rollup-plugin-node-resolve": "^3.0.0", + "sinon": "^4.4.2", + "sinon-chai": "^3.0.0", + "typescript": "^2.8.1", + "to2to": "^1.0.2", + "uglify-js": "^2.7.5", + "webpack": "^4.3.0" + }, "author": "dntzhang", "license": "MIT" } diff --git a/packages/omiax/src/index.js b/packages/omiax/src/index.js new file mode 100644 index 000000000..560cd5cfd --- /dev/null +++ b/packages/omiax/src/index.js @@ -0,0 +1,5 @@ +import { define, WeElement, tag, render} from './omi/omi.js' + +export { + define, WeElement, tag, render +} \ No newline at end of file diff --git a/packages/omiax/src/omi/native/README.md b/packages/omiax/src/omi/mock/README.md similarity index 100% rename from packages/omiax/src/omi/native/README.md rename to packages/omiax/src/omi/mock/README.md diff --git a/packages/omiax/src/omi/mock/document.js b/packages/omiax/src/omi/mock/document.js new file mode 100755 index 000000000..49cecb96a --- /dev/null +++ b/packages/omiax/src/omi/mock/document.js @@ -0,0 +1,59 @@ +import Element from './element' +import TextNode from './text-node' +import { addDoc, removeDoc } from './util' + + +export default class Document { + constructor(id) { + this.id = id + addDoc(id, this) + this.nodeMap = {} + this._isMockDocument = true + } + + // createBody(type, props) { + // if (!this.body) { + // const el = new Element(type, props) + // el.didMount = true + // el.ownerDocument = this + // el.docId = this.id + // el.style.alignItems = 'flex-start' + // this.body = el + // } + + // return this.body + // } + + createElement(tagName, props) { + let el = new Element(tagName, props) + el.ownerDocument = this + el.docId = this.id + return el + } + + createTextNode(txt){ + const node = new TextNode(txt) + node.docId = this.id + return node + } + + destroy() { + delete this.listener + delete this.nodeMap + removeDoc(this.id) + } + + addEventListener(ref, type) { + //document.addEvent(this.id, ref, type) + } + + removeEventListener(ref, type) { + //document.removeEvent(this.id, ref, type) + } + + + scrollTo(ref, x, y, animated) { + document.scrollTo(this.id, ref, x, y, animated) + } + +} diff --git a/packages/omiax/src/omi/mock/element.js b/packages/omiax/src/omi/mock/element.js new file mode 100755 index 000000000..02ffcf6d4 --- /dev/null +++ b/packages/omiax/src/omi/mock/element.js @@ -0,0 +1,274 @@ +import { + getDoc, + uniqueId, + linkParent, + insertIndex, + moveIndex, + removeIndex +} from './util' + +const displayMap = { + div: 'block', + span: 'inline-block' +} + +function registerNode(docId, node) { + const doc = getDoc(docId) + doc.nodeMap[node.nodeId] = node +} + +export default class Element { + constructor(type) { + this.nodeType = 1 + this.nodeId = uniqueId() + this.ref = this.nodeId + this.type = type + this.attributes = {} + this.style = { + display: displayMap[type] + } + this.classStyle = {} + this.event = {} + this.childNodes = [] + + this.nodeName = this.type + + this.parentNode = null + this.nextSibling = null + this.previousSibling = null + this.firstChild = null + } + + appendChild(node) { + if (!node.parentNode) { + linkParent(node, this) + insertIndex(node, this.childNodes, this.childNodes.length, true) + + if (this.docId != undefined) { + registerNode(this.docId, node) + } + + + //this.ownerDocument.addElement(this.ref, node.toJSON(), -1) + + } else { + node.parentNode.removeChild(node) + + this.appendChild(node) + + return + } + + this.firstChild = this.childNodes[0] + + + } + + insertBefore(node, before) { + if (!node.parentNode) { + linkParent(node, this) + const index = insertIndex( + node, + this.childNodes, + this.childNodes.indexOf(before), + true + ) + if (this.docId != undefined) { + registerNode(this.docId, node) + } + + + //this.ownerDocument.addElement(this.ref, node.toJSON(), index) + + } else { + node.parentNode.removeChild(node) + this.insertBefore(node, before) + return + } + + this.firstChild = this.childNodes[0] + } + + insertAfter(node, after) { + if (node.parentNode && node.parentNode !== this) { + return + } + if ( + node === after || + (node.previousSibling && node.previousSibling === after) + ) { + return + } + if (!node.parentNode) { + linkParent(node, this) + const index = insertIndex( + node, + this.childNodes, + this.childNodes.indexOf(after) + 1, + true + ) + + if (this.docId != undefined) { + registerNode(this.docId, node) + } + + //this.ownerDocument.addElement(this.ref, node.toJSON(), index) + + } else { + const index = moveIndex( + node, + this.childNodes, + this.childNodes.indexOf(after) + 1 + ) + + //this.ownerDocument.moveElement(node.ref, this.ref, index) + + } + + this.firstChild = this.childNodes[0] + } + + removeChild(node) { + if (node.parentNode) { + removeIndex(node, this.childNodes, true) + + + this.ownerDocument.removeElement(node.ref) + + } + + node.parentNode = null + + + + this.firstChild = this.childNodes[0] + } + + setAttribute(key, value, silent) { + if (this.attributes[key] === value && silent !== false) { + return + } + this.attributes[key] = value + if (!silent) { + const result = {} + result[key] = value + + this.ownerDocument.setAttr(this.ref, result) + + } + } + + removeAttribute(key) { + if (this.attributes[key]) { + delete this.attributes[key] + } + } + + setStyle(key, value, silent) { + if (this.style[key] === value && silent !== false) { + return + } + this.style[key] = value + if (!silent && this.ownerDocument) { + const result = {} + result[key] = value + + this.ownerDocument.setStyles(this.ref, result) + + } + } + + setStyles(styles) { + Object.assign(this.style, styles) + if (this.ownerDocument) { + + this.ownerDocument.setStyles(this.ref, styles) + + } + } + + setClassStyle(classStyle) { + for (const key in this.classStyle) { + this.classStyle[key] = '' + } + + Object.assign(this.classStyle, classStyle) + + + this.ownerDocument.setStyles(this.ref, this.toStyle()) + + } + + addEventListener(type, handler) { + if (!this.event[type]) { + this.event[type] = handler + + //this.ownerDocument.addEvent(this.ref, type) + } + } + + removeEventListener(type) { + if (this.event[type]) { + delete this.event[type] + let doc = getDoc(this.docId) + doc.nodeMap[this.ref] && + doc.nodeMap[this.ref].event && + doc.nodeMap[this.ref].event[type] + ? (doc.nodeMap[this.ref].event[type] = null) + : '' + + this.ownerDocument.removeEvent(this.ref, type) + } + } + + fireEvent(type, e) { + const handler = this.event[type] + if (handler) { + return handler.call(this, e) + } + } + + toStyle() { + return Object.assign({}, this.classStyle, this.style) + } + + getComputedStyle() { } + + toJSON() { + let result = { + id: this.ref, + type: this.type, + docId: this.docId || -10000, + attributes: this.attributes ? this.attributes : {} + } + result.attributes.style = this.toStyle() + + const event = Object.keys(this.event) + if (event.length) { + result.event = event + } + + if (this.childNodes.length) { + result.children = this.childNodes.map(child => child.toJSON()) + } + return result + } + + replaceChild(newChild, oldChild) { + this.insertBefore(newChild, oldChild) + this.removeChild(oldChild) + } + + destroy() { + const doc = getDoc(this.docId) + + if (doc) { + delete doc.nodeMap[this.nodeId] + } + + this.parentNode = null + this.childNodes.forEach(child => { + child.destroy() + }) + } +} diff --git a/packages/omiax/src/omi/mock/index.js b/packages/omiax/src/omi/mock/index.js new file mode 100644 index 000000000..02dd95f84 --- /dev/null +++ b/packages/omiax/src/omi/mock/index.js @@ -0,0 +1,6 @@ +import Document from './document' + + +export default { + document: new Document(0) +} diff --git a/packages/omiax/src/omi/mock/text-node.js b/packages/omiax/src/omi/mock/text-node.js new file mode 100755 index 000000000..8f76d4005 --- /dev/null +++ b/packages/omiax/src/omi/mock/text-node.js @@ -0,0 +1,88 @@ +import { + getDoc, + uniqueId +} from './util' + + +function registerNode(docId, node) { + const doc = getDoc(docId) + doc.nodeMap[node.nodeId] = node +} + +export default class TextNode { + constructor(nodeValue) { + this.nodeType = 3 + this.nodeId = uniqueId() + this.ref = this.nodeId + this.attributes = {} + this.style = { + display: 'inline' + } + this.classStyle = {} + this.event = {} + this.nodeValue = nodeValue + this.parentNode = null + this.nextSibling = null + this.previousSibling = null + this.firstChild = null + this.type = 'text' + } + + setAttribute(key, value, silent) { + if (this.attributes[key] === value && silent !== false) { + return + } + this.attributes[key] = value + if (!silent) { + const result = {} + result[key] = value + + this.ownerDocument.setAttr(this.ref, result) + + } + } + + removeAttribute(key) { + if (this.attributes[key]) { + delete this.attributes[key] + } + } + + toStyle() { + return Object.assign({}, this.classStyle, this.style) + } + + splitText() { + + } + + getComputedStyle() { } + + toJSON() { + let result = { + id: this.ref, + type: this.type, + docId: this.docId || -10000, + attributes: this.attributes ? this.attributes : {} + } + result.attributes.style = this.toStyle() + + const event = Object.keys(this.event) + if (event.length) { + result.event = event + } + + return result + } + + destroy() { + const doc = getDoc(this.docId) + + if (doc) { + delete doc.nodeMap[this.nodeId] + } + + this.parentNode = null + + } +} diff --git a/packages/omiax/src/omi/native/util.js b/packages/omiax/src/omi/mock/util.js similarity index 97% rename from packages/omiax/src/omi/native/util.js rename to packages/omiax/src/omi/mock/util.js index f34435858..99db2ce96 100755 --- a/packages/omiax/src/omi/native/util.js +++ b/packages/omiax/src/omi/mock/util.js @@ -112,8 +112,9 @@ export function linkParent(node, parent) { node.ownerDocument = parent.ownerDocument node.ownerDocument.nodeMap[node.nodeId] = node node.depth = parent.depth + 1 - } - node.childNodes.forEach(child => { + } + + node.childNodes && node.childNodes.forEach(child => { linkParent(child, node) }) } diff --git a/packages/omiax/src/omi/native/document.js b/packages/omiax/src/omi/native/document.js deleted file mode 100755 index 4c2a27d14..000000000 --- a/packages/omiax/src/omi/native/document.js +++ /dev/null @@ -1,97 +0,0 @@ -import Element from './element' -import { addDoc, removeDoc } from './util' - -//get document module from global bridge -const { document } = global.bridge - -export default class Document { - constructor(id) { - this.id = id - addDoc(id, this) - this.nodeMap = {} - this._isMockDocument = true - this.keyframes = {} - } - - createBody(type, props) { - if (!this.body) { - const el = new Element(type, props) - el.didMount = true - el.ownerDocument = this - el.docId = this.id - el.style.alignItems = 'flex-start' - this.body = el - } - - return this.body - } - - createElement(tagName, props) { - let el = new Element(tagName, props) - el.ownerDocument = this - el.docId = this.id - return el - } - - destroy() { - delete this.listener - delete this.nodeMap - removeDoc(this.id) - } - - createFinish() { - document.createFinish(this.id, this.body.toJSON()) - } - - updateFinish() { - document.updateFinish(this.id) - } - - addElement(ref, element, index) { - document.addElement(this.id, ref, element, index) - } - - moveElement(ref, parentRef, index) { - document.moveElement(this.id, ref, parentRef, index) - } - - removeElement(ref) { - document.removeElement(this.id, ref) - } - - setStyles(ref, result) { - document.setStyles(this.id, ref, result) - } - - setAttr(ref, result) { - document.setAttr(this.id, ref, result) - } - - removeAttr(ref, key) { - document.removeAttr(this.id, ref, key) - } - - addEvent(ref, type) { - document.addEvent(this.id, ref, type) - } - - removeEvent(ref, type) { - document.removeEvent(this.id, ref, type) - } - - addKeyframe(frame) { - document.addKeyframe(this.id, frame) - } - - addKeyframeMap(frames) { - document.addKeyframeMap(this.id, frames) - } - - scrollTo(ref, x, y, animated) { - document.scrollTo(this.id, ref, x, y, animated) - } - - getComputedStyle(ref, func) { - document.getComputedStyle(this.id, ref, func) - } -} diff --git a/packages/omiax/src/omi/native/element.js b/packages/omiax/src/omi/native/element.js deleted file mode 100755 index cf2dd98dd..000000000 --- a/packages/omiax/src/omi/native/element.js +++ /dev/null @@ -1,289 +0,0 @@ -import { - getDoc, - uniqueId, - linkParent, - insertIndex, - moveIndex, - removeIndex -} from './util' - -import { getSendBridgeFlag } from './util' - -const sendBridgeFlag = getSendBridgeFlag() - -function registerNode(docId, node) { - const doc = getDoc(docId) - doc.nodeMap[node.nodeId] = node -} - -export default class Element { - constructor(type) { - this.nodeType = 1 - this.nodeId = uniqueId() - this.ref = this.nodeId - this.type = type - this.attributes = {} - this.style = {} - this.classStyle = {} - this.event = {} - this.childNodes = [] - - this.nodeName = this.type - this.didMount = false - this.parentNode = null - this.nextSibling = null - this.previousSibling = null - this.firstChild = null - } - - appendChild(node) { - if (!node.parentNode) { - linkParent(node, this) - insertIndex(node, this.childNodes, this.childNodes.length, true) - - if (this.docId != undefined) { - registerNode(this.docId, node) - } - - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.addElement(this.ref, node.toJSON(), -1) - } - } else { - node.parentNode.removeChild(node) - - this.appendChild(node) - - return - } - - this.firstChild = this.childNodes[0] - - if (this.didMount) { - this._setDidMount(node, true) - } - } - - _setDidMount(node, mount) { - node.didMount = mount - node.childNodes.forEach(child => { - this._setDidMount(child, mount) - }) - } - - insertBefore(node, before) { - if (!node.parentNode) { - linkParent(node, this) - const index = insertIndex( - node, - this.childNodes, - this.childNodes.indexOf(before), - true - ) - if (this.docId != undefined) { - registerNode(this.docId, node) - } - - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.addElement(this.ref, node.toJSON(), index) - } - } else { - node.parentNode.removeChild(node) - this.insertBefore(node, before) - return - } - if (this.didMount) { - this._setDidMount(node, true) - } - this.firstChild = this.childNodes[0] - } - - insertAfter(node, after) { - if (node.parentNode && node.parentNode !== this) { - return - } - if ( - node === after || - (node.previousSibling && node.previousSibling === after) - ) { - return - } - if (!node.parentNode) { - linkParent(node, this) - const index = insertIndex( - node, - this.childNodes, - this.childNodes.indexOf(after) + 1, - true - ) - - if (this.docId != undefined) { - registerNode(this.docId, node) - } - - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.addElement(this.ref, node.toJSON(), index) - } - } else { - const index = moveIndex( - node, - this.childNodes, - this.childNodes.indexOf(after) + 1 - ) - - if (this.didMount) { - this.ownerDocument.moveElement(node.ref, this.ref, index) - } - } - if (this.didMount) { - this._setDidMount(node, true) - } - this.firstChild = this.childNodes[0] - } - - removeChild(node) { - if (node.parentNode) { - removeIndex(node, this.childNodes, true) - - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.removeElement(node.ref) - } - } - - node.parentNode = null - - this._setDidMount(node, false) - - this.firstChild = this.childNodes[0] - } - - setAttribute(key, value, silent) { - if (this.attributes[key] === value && silent !== false) { - return - } - this.attributes[key] = value - if (!silent) { - const result = {} - result[key] = value - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.setAttr(this.ref, result) - } - } - } - - removeAttribute(key) { - if (this.attributes[key]) { - delete this.attributes[key] - } - } - - setStyle(key, value, silent) { - if (this.style[key] === value && silent !== false) { - return - } - this.style[key] = value - if (!silent && this.ownerDocument) { - const result = {} - result[key] = value - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.setStyles(this.ref, result) - } - } - } - - setStyles(styles) { - Object.assign(this.style, styles) - if (this.ownerDocument) { - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.setStyles(this.ref, styles) - } - } - } - - setClassStyle(classStyle) { - for (const key in this.classStyle) { - this.classStyle[key] = '' - } - - Object.assign(this.classStyle, classStyle) - - if (this.didMount && sendBridgeFlag[this.docId]) { - this.ownerDocument.setStyles(this.ref, this.toStyle()) - } - } - - addEventListener(type, handler) { - if (!this.event[type]) { - this.event[type] = handler - - sendBridgeFlag[this.docId] && - this.didMount && - this.ownerDocument.addEvent(this.ref, type) - } - } - - removeEventListener(type) { - if (this.event[type]) { - delete this.event[type] - let doc = getDoc(this.docId) - doc.nodeMap[this.ref] && - doc.nodeMap[this.ref].event && - doc.nodeMap[this.ref].event[type] - ? (doc.nodeMap[this.ref].event[type] = null) - : '' - sendBridgeFlag[this.docId] && - this.didMount && - this.ownerDocument.removeEvent(this.ref, type) - } - } - - fireEvent(type, e) { - const handler = this.event[type] - if (handler) { - return handler.call(this, e) - } - } - - toStyle() { - return Object.assign({}, this.classStyle, this.style) - } - - getComputedStyle() {} - - toJSON() { - let result = { - id: this.ref, - type: this.type, - docId: this.docId || -10000, - attributes: this.attributes ? this.attributes : {} - } - result.attributes.style = this.toStyle() - - const event = Object.keys(this.event) - if (event.length) { - result.event = event - } - - if (this.childNodes.length) { - result.children = this.childNodes.map(child => child.toJSON()) - } - return result - } - - replaceChild(newChild, oldChild) { - this.insertBefore(newChild, oldChild) - this.removeChild(oldChild) - } - - destroy() { - const doc = getDoc(this.docId) - - if (doc) { - delete doc.nodeMap[this.nodeId] - } - - this.parentNode = null - this.childNodes.forEach(child => { - child.destroy() - }) - } -} diff --git a/packages/omiax/src/omi/options.js b/packages/omiax/src/omi/options.js index 71ff691c1..e10b3ed1d 100755 --- a/packages/omiax/src/omi/options.js +++ b/packages/omiax/src/omi/options.js @@ -1,3 +1,5 @@ +import mock from './mock/index' + function getGlobal() { if ( typeof global !== 'object' || @@ -27,8 +29,9 @@ export default { scopedStyle: true, mapping: {}, isWeb: true, - staticStyleMapping: {}, - doc: typeof document === 'object' ? document : null, + staticStyleMapping: {}, + doc: mock.document, + //doc: typeof document === 'object' ? document : null, root: getGlobal(), //styleCache :[{ctor:ctor,ctorName:ctorName,style:style}] styleCache: []