├── .babelrc ├── .travis.yml ├── LICENSE ├── README.md ├── dist ├── aoy.es.js ├── aoy.es.js.map ├── aoy.js ├── aoy.js.map └── aoy.min.js ├── example ├── input.html └── tableSort.html ├── gulpfile.js ├── index.js ├── package.json ├── rollup.config.js ├── src ├── component │ ├── Component.js │ ├── createComponent.js │ └── index.js ├── index.js ├── instance │ ├── Aoy.js │ └── baseInit.js ├── render │ ├── index.js │ └── mount.js ├── store │ ├── Store.js │ ├── connect.js │ ├── dependent.js │ ├── index.js │ ├── initStore.js │ └── injectStore.js ├── util │ ├── api.js │ ├── console.js │ ├── help.js │ ├── index.js │ └── is.js └── vdom │ ├── createEle.js │ ├── createVdom.js │ ├── diff.js │ ├── el.js │ ├── index.js │ └── vnode.js └── test ├── component.test.js ├── diff.test.js ├── mocha.opts ├── store.test.js └── vdom.test.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ "es2015" ] 3 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: required 3 | node_js: 4 | - "6" 5 | install: 6 | - npm install 7 | script: 8 | - npm test 9 | - npm run cover 10 | - npm run build 11 | after_script: 12 | - "cat coverage/lcov.info | node_modules/coveralls/bin/coveralls.js" 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 yang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aoy [![Build Status](https://travis-ci.org/aooy/aoy.svg?branch=master)](https://travis-ci.org/aooy/aoy) [![Coverage Status](https://coveralls.io/repos/github/aooy/aoy/badge.svg?branch=master)](https://coveralls.io/github/aooy/aoy?branch=master) [![NPM version](https://badge.fury.io/js/npm.svg)](https://github.com/aooy/aoy) [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://github.com/aooy/aoy) 2 | A tiny JavaScript MVVM library with Virtual DOM. It has only ~600 lines of code. 3 | 4 | ## Introduction 5 | [一个轻量级的MVVM框架-aoy](https://github.com/aooy/blog/issues/1) 6 | 7 | ## Install 8 | 9 | npm: 10 | 11 | $ npm install aoy --save 12 | 13 | ## Usage 14 | 15 | ### ES2015 16 | ```js 17 | import { init, el } from 'aoy'; 18 | 19 | //1. init aoy. 20 | const myAoy = init(); 21 | conse store = myAoy.store; 22 | 23 | //2. add a store to aoy instance. 24 | store.add('firstStore',{txt: 'this is a P'}); 25 | 26 | //3. create a component. 27 | const myP = aoy.createComponent({ 28 | el: document.body, 29 | render: function(){ 30 | return el('p', this.firstStore.txt); 31 | } 32 | }); 33 | 34 | //4. component connect to a store, view will be render immediately. 35 | myAoy.connect(myP, 'firstStore'); 36 | 37 | //5. when u update this component's store, view will be render again. 38 | store.get('firstStore').txt = 'change view'; 39 | ``` 40 | ### CommonJS 41 | ```js 42 | var myAoy = require('aoy').init(); 43 | var el = myAoy.el; 44 | ``` 45 | ### Browser globals 46 | The dist folder contains aoy.js and aoy.min.js. 47 | ```js 48 | 49 | 54 | ``` 55 | ## Examples 56 | 57 | * [simple data-binding input](https://aooy.github.io/aoy/input) 58 | * [table sort](https://aooy.github.io/aoy/tableSort) 59 | 60 | ## Api 61 | 62 | ### aoy.init 63 | init function returns a aoy instance. 64 | 65 | ### aoy.el(selectors, props, children]) 66 | return a Virtual DOM. 67 | ```js 68 | var span = el('span','this is p') // render this is p 69 | var p = el('div',[ span ]) // render

this is p

70 | var div = el('div#mydiv.classA.classB') // render
71 | ``` 72 | 73 | ### aoy.createComponent(descriptor) 74 | descriptor is Object 75 | 76 | #### descriptor.el: 77 | it is a HTMLElement for component's parentNode. 78 | 79 | #### descriptor.render: 80 | render functon returns vnode. 81 | 82 | ```js 83 | var inputStore = store.get('inputStore'); 84 | var myinput = aoy.createComponent({ 85 | inputFn: function(){ 86 | 87 | }, 88 | render: function(){ 89 | return el('Input', { 90 | oninput: this.inputFn, 91 | placeholder: this.inputStore.value, 92 | type: 'text' 93 | }); 94 | } 95 | }); 96 | ``` 97 | 98 | ### aoy.connect(component[,stores]) 99 | when connect function is called, Virtual DOM will be rendered immediately. 100 | ```js 101 | var aoy.connect(mycomponent, 'a') // mycomponent denpend on a. 102 | var aoy.connect(mycomponent, ['a', 'b']) // mycomponent denpend on a and b. 103 | ``` 104 | 105 | ### store 106 | aoy instance provides a store. 107 | ```js 108 | var aoy = Aoy.init(); 109 | var store = aoy.store; 110 | ``` 111 | 112 | ### store.add([key ,] data) 113 | function add is used to save data. 114 | if no key, this data's key is _DEFAULT. 115 | ```js 116 | aoy.store.add('a',{b:1}) // a:{b:1} 117 | aoy.store.add({b:1}) // _DEFAULT:{b:1} 118 | ``` 119 | 120 | ### store.get(key) 121 | Return to the corresponding store's data 122 | ```js 123 | aoy.store.add('a',{b:1}) 124 | aoy.store.get('a') // return {b: 1} 125 | ``` 126 | 127 | ### sotre.set(newData) 128 | update data. 129 | ```js 130 | aoy.store.add('a',{b:1}) 131 | 132 | aoy.store.get('a').set({a:1, b:2}) //same: aoy.store.get('a') = {a:1, b:2} 133 | 134 | aoy.store.get('a') // return {a:1, b:2} 135 | ``` 136 | ### Note 137 | * support IE 10 and up + all modern browsers. 138 | * aoy only data-binding one-level key, if data has deep structure, suggest to cooperate [immutable-js](https://github.com/facebook/immutable-js/) . 139 | 140 | ## License 141 | [MIT](https://github.com/pakastin/redom/blob/master/LICENSE) 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | -------------------------------------------------------------------------------- /dist/aoy.es.js: -------------------------------------------------------------------------------- 1 | function error (info) { 2 | if (typeof console !== 'undeifine') { 3 | console.error(info); 4 | } 5 | } 6 | function warn (info) { 7 | if (typeof console !== 'undeifine') { 8 | console.warn(info); 9 | } 10 | } 11 | 12 | function judge (o) { 13 | return Object.prototype.toString.call(o) 14 | } 15 | 16 | function isArray (arr) { 17 | return judge(arr) === '[object Array]' 18 | } 19 | 20 | function isObject (o) { 21 | return judge(o) === '[object Object]' 22 | } 23 | 24 | 25 | 26 | function isString (s) { 27 | return typeof s === 'string' 28 | } 29 | 30 | function isNumber (n) { 31 | return typeof n === 'number' 32 | } 33 | 34 | function toArray (arr) { 35 | return [].slice.call(arr) 36 | } 37 | 38 | function Vdom () { 39 | this.tagName = null; 40 | this.sel = null; 41 | this.id = null; 42 | this.className = []; 43 | this.children = null; 44 | this.el = null; 45 | this.data = null; 46 | this.key = null; 47 | this.text = null; 48 | this.attr = []; 49 | this.store = null; 50 | } 51 | 52 | function sameVnode(oldVnode, vnode){ 53 | return vnode.key === oldVnode.key && vnode.sel === oldVnode.sel 54 | } 55 | function createKeyToOldIdx (children, beginIdx, endIdx) { 56 | var i, map = {}, key, ch; 57 | for (i = beginIdx; i <= endIdx; ++i) { 58 | ch = children[i]; 59 | if (ch != null) { 60 | key = ch.key; 61 | if (key !== null) 62 | { map[key] = i; } 63 | } 64 | } 65 | return map 66 | } 67 | function removeVnodes (parentElm, vnodes, startIdx, endIdx) { 68 | for ( ;startIdx <= endIdx; ++startIdx) { 69 | var ch = vnodes[startIdx]; 70 | if (ch != null) { 71 | api$$1.removeChild(parentElm, ch.el); 72 | } 73 | } 74 | } 75 | function addVnodes (parentElm, before, vnodes, startIdx, endIdx) { 76 | for ( ;startIdx <= endIdx; ++startIdx) { 77 | var ch = vnodes[startIdx]; 78 | if (ch != null) { 79 | api$$1.insertBefore(parentElm, createEle(ch).el, before); 80 | } 81 | } 82 | } 83 | function patchVnode (oldVnode, vnode) { 84 | var el$$1 = vnode.el = oldVnode.el; 85 | var i, oldCh = oldVnode.children, ch = vnode.children; 86 | if (oldVnode === vnode) { return } 87 | 88 | if (oldVnode.text !== null && vnode.text !== null && oldVnode.text !== vnode.text) { 89 | api$$1.setTextContent(el$$1, vnode.text); 90 | }else { 91 | updateEle(el$$1, vnode, oldVnode); 92 | if (oldCh && ch && oldCh !== ch) { 93 | updateChildren(el$$1, oldCh, ch); 94 | }else if (ch){ 95 | createEle(vnode); //create el's children dom 96 | }else if (oldCh){ 97 | api$$1.removeChildren(el$$1); 98 | } 99 | } 100 | } 101 | 102 | function updateChildren (parentElm, oldCh, newCh) { 103 | var oldStartIdx = 0, newStartIdx = 0; 104 | var oldEndIdx = oldCh.length - 1; 105 | var oldStartVnode = oldCh[0]; 106 | var oldEndVnode = oldCh[oldEndIdx]; 107 | var newEndIdx = newCh.length - 1; 108 | var newStartVnode = newCh[0]; 109 | var newEndVnode = newCh[newEndIdx]; 110 | var oldKeyToIdx; 111 | var idxInOld; 112 | var elmToMove; 113 | var before; 114 | while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { 115 | if (oldStartVnode == null) { 116 | oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left 117 | }else if (oldEndVnode == null) { 118 | oldEndVnode = oldCh[--oldEndIdx]; 119 | }else if (newStartVnode == null) { 120 | newStartVnode = newCh[++newStartIdx]; 121 | }else if (newEndVnode == null) { 122 | newEndVnode = newCh[--newEndIdx]; 123 | }else if (sameVnode(oldStartVnode, newStartVnode)) { 124 | patchVnode(oldStartVnode, newStartVnode); 125 | oldStartVnode = oldCh[++oldStartIdx]; 126 | newStartVnode = newCh[++newStartIdx]; 127 | }else if (sameVnode(oldEndVnode, newEndVnode)) { 128 | patchVnode(oldEndVnode, newEndVnode); 129 | oldEndVnode = oldCh[--oldEndIdx]; 130 | newEndVnode = newCh[--newEndIdx]; 131 | }else if (sameVnode(oldStartVnode, newEndVnode)) { 132 | patchVnode(oldStartVnode, newEndVnode); 133 | api$$1.insertBefore(parentElm, oldStartVnode.el, api$$1.nextSibling(oldEndVnode.el)); 134 | oldStartVnode = oldCh[++oldStartIdx]; 135 | newEndVnode = newCh[--newEndIdx]; 136 | }else if (sameVnode(oldEndVnode, newStartVnode)) { 137 | patchVnode(oldEndVnode, newStartVnode); 138 | api$$1.insertBefore(parentElm, oldEndVnode.el, oldStartVnode.el); 139 | oldEndVnode = oldCh[--oldEndIdx]; 140 | newStartVnode = newCh[++newStartIdx]; 141 | }else { 142 | if (oldKeyToIdx === undefined) { 143 | oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); 144 | } 145 | idxInOld = oldKeyToIdx[newStartVnode.key]; 146 | if (!idxInOld) { 147 | api$$1.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el); 148 | newStartVnode = newCh[++newStartIdx]; 149 | } 150 | else { 151 | elmToMove = oldCh[idxInOld]; 152 | if (elmToMove.sel !== newStartVnode.sel) { 153 | api$$1.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el); 154 | }else { 155 | patchVnode(elmToMove, newStartVnode); 156 | oldCh[idxInOld] = null; 157 | api$$1.insertBefore(parentElm, elmToMove.el, oldStartVnode.el); 158 | } 159 | newStartVnode = newCh[++newStartIdx]; 160 | } 161 | } 162 | } 163 | if (oldStartIdx > oldEndIdx) { 164 | before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].el; 165 | addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx); 166 | }else if (newStartIdx > newEndIdx) { 167 | removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); 168 | } 169 | } 170 | 171 | function patch$$1 (oldVnode, vnode) { 172 | if (sameVnode(oldVnode, vnode)) { 173 | patchVnode(oldVnode, vnode); 174 | } else { 175 | var oEl = oldVnode.el; 176 | var parentEle = api$$1.parentNode(oEl); 177 | createEle(vnode); 178 | if (parentEle !== null) { 179 | api$$1.insertBefore(parentEle, vnode.el, api$$1.nextSibling(oEl)); 180 | api$$1.removeChild(parentEle, oldVnode.el); 181 | oldVnode = null; 182 | } 183 | } 184 | return vnode 185 | } 186 | 187 | function parseQuery (vdom, query) { 188 | var k,state = 0,j = 0; 189 | vdom.sel = query; 190 | 191 | for(var i = 0, len = query.length; i < len; i++) { 192 | var char = query[i]; 193 | if (char === '.' || char === '#' || (k = i === len-1)) { 194 | if (state === 0) { 195 | vdom.tagName = query.substring(j, !k ? i : len).toUpperCase(); 196 | }else if (state === 1) { 197 | vdom.className.push(query.substring(j, !k ? i : len)); 198 | }else if (state === 2) { 199 | vdom.id = query.substring(j, !k ? i : len); 200 | } 201 | state = (char === '.') ? 1 : (char === '#')? 2 : 3; 202 | j = i+1; 203 | } 204 | 205 | } 206 | 207 | } 208 | 209 | function parseData (vdom, v) { 210 | for(var k in v) { 211 | if (k === 'class'){ 212 | var i = v[k].split(' '); 213 | for(var j = 0; j < i.length; j++) { 214 | vdom.className.push(i[j]); 215 | } 216 | }else if (k === 'key') { 217 | vdom.key = v[k]; 218 | }else if (k !== 'style') { 219 | vdom.attr.push(k); 220 | } 221 | } 222 | vdom.data = v; 223 | } 224 | 225 | function parseChindren (vdom, v) { 226 | var a = []; 227 | if (isString(v) || isNumber(v)) { v = [v]; } 228 | for (var i = 0; i < v.length; i++) { 229 | if (!(v[i] instanceof Vdom)) { 230 | a.push(createVdomTxt$$1(v[i])); 231 | }else { 232 | a.push(v[i]); 233 | } 234 | } 235 | vdom.children = a; 236 | } 237 | function createVdomTxt$$1 (str) { 238 | var vd = new Vdom(); 239 | if(isString(str) || isNumber(str)) { 240 | vd.text = str; 241 | } 242 | return vd 243 | } 244 | function createVdom$$1 (arg) { 245 | var i=0, 246 | vd = new Vdom(); 247 | 248 | while(i < arg.length) { 249 | var v = arg[i]; 250 | if (i === 0 && isString(v)) { 251 | // div#id.classA 252 | parseQuery(vd, v); 253 | }else if (i != 0){ 254 | if(isObject(v)) { 255 | // class style clickEvent .ect 256 | parseData(vd, v); 257 | }else if (isArray(v) || isString(v) || isNumber(v)) { 258 | // childern 259 | parseChindren(vd, v); 260 | } 261 | } 262 | i++; 263 | } 264 | return vd 265 | } 266 | 267 | function createEle (vdom) { 268 | var i, e; 269 | if( !vdom.el && (i = vdom.text)) { 270 | e = vdom.el = api$$1.createTextNode(i); 271 | return vdom 272 | } 273 | if ( (i = vdom.tagName) && vdom.el === null) { 274 | e = vdom.el = api$$1.createElement(i); 275 | }else if (vdom.el.nodeType === 1) { 276 | e = vdom.el; 277 | } 278 | updateEle(e, vdom); 279 | return vdom 280 | } 281 | 282 | function updateEle (e ,vdom, oldVdom) { 283 | var i; 284 | if( (i = vdom.className).length > 0 ) { api$$1.setClass(e, i); } 285 | if( (i = vdom.data) !== null ) { api$$1.setAttrs(e, i); } 286 | if( (i = vdom.id) !== null ) { api$$1.setId(e, i); } 287 | if( (i = vdom.children) !== null && !oldVdom) { api$$1.appendChildren(e, i); } 288 | } 289 | 290 | function el$$1 () { 291 | var arg = toArray(arguments); 292 | 293 | if (arg.length === 0) { 294 | error('Parameter cannot be empty'); 295 | return false 296 | } 297 | if (isArray(arg) && arg.length > 0) { 298 | return createVdom$$1.call(this, arg) 299 | } 300 | } 301 | 302 | var api$$1 = Object.create(null); 303 | 304 | api$$1.createElement = function (tag) { 305 | return document.createElement(tag) 306 | }; 307 | api$$1.createTextNode = function (txt) { 308 | return document.createTextNode(txt) 309 | }; 310 | api$$1.appendChild = function (parent, child) { 311 | return parent.appendChild(child) 312 | }; 313 | api$$1.parentNode = function (node) { 314 | return node.parentNode 315 | }; 316 | api$$1.insertBefore = function (parent, newNode, rf) { 317 | return parent.insertBefore(newNode, rf) 318 | }; 319 | api$$1.nextSibling = function (el$$1) { 320 | return el$$1.nextSibling 321 | }; 322 | api$$1.removeChild = function (parent, rc) { 323 | return parent.removeChild(rc) 324 | }; 325 | api$$1.setTextContent = function (ele, txt) { 326 | ele.textContent = txt; 327 | }; 328 | api$$1.setId = function (ele, id) { 329 | ele.id = id; 330 | }; 331 | api$$1.defineProperty = function (obj, prop, descriptor) { 332 | Object.defineProperty(obj, prop, descriptor); 333 | }; 334 | api$$1.appendChildren = function (ele, children) { 335 | var this$1 = this; 336 | 337 | if(ele && isArray(children)) { 338 | for(var i = 0; i < children.length; i++) { 339 | var c = (void 0); 340 | if (children[i] instanceof Vdom) { 341 | c = children[i].el || createEle(children[i]).el; 342 | } 343 | this$1.appendChild(ele, c); 344 | } 345 | } 346 | }; 347 | api$$1.setClass = function (ele, c) { 348 | if(ele && isArray(c)) { 349 | var k = ''; 350 | for(var i = 0; i < c.length; i++) { 351 | //ele.classList.add(c[i]) 352 | if(i !== c.length-1){ 353 | k += c[i] + ' '; 354 | }else{ 355 | k += c[i]; 356 | } 357 | } 358 | ele.className = k; 359 | } 360 | }; 361 | api$$1.setAttrs = function (ele, a) { 362 | if(ele && isObject(a)) { 363 | for(var k in a) { 364 | if (k === 'class') { continue } 365 | var s = a[k]; 366 | if (k === 'style' && isObject(s)) { 367 | for(var j in s) { 368 | ele.style[j] = s[j]; 369 | } 370 | }else { 371 | ele[k] = s; 372 | } 373 | } 374 | } 375 | }; 376 | api$$1.removeChildren = function (ele) { 377 | var this$1 = this; 378 | 379 | var i, ch = ele.childNodes; 380 | while(ch[0]) { 381 | this$1.removeChild(ele, ch[0]); 382 | } 383 | }; 384 | 385 | function injectStore (store, key, data, context) { 386 | var archiver; 387 | if(isObject(data)){ 388 | store[key] = data; 389 | archiver = new Archiver(data,key,context); 390 | for(var k in data) { 391 | archiver(k); 392 | } 393 | } 394 | return data 395 | } 396 | 397 | function Archiver (data, sname, context) { 398 | var c; 399 | var storage = {}; 400 | var cm = context.componentManage; 401 | var devc = function (c) { 402 | c.forEach( function(v, i) { 403 | var newVn = v.render(); 404 | patch$$1(v.vdom, newVn); 405 | v.vdom = newVn; 406 | }); 407 | }; 408 | var des = function(key) { 409 | return { 410 | get: function() { 411 | return storage[key] 412 | }, 413 | set: function(value) { 414 | storage[key] = value; 415 | if (c = cm[sname]) { 416 | devc(c); 417 | } 418 | } 419 | } 420 | }; 421 | api$$1.defineProperty(data, 'set', { 422 | value: function () { 423 | var o; 424 | if (isObject(o = arguments[0])) { 425 | for(var k in o){ 426 | if(!storage.hasOwnProperty(k)) { 427 | api$$1.defineProperty(data, k, des(k)); 428 | } 429 | storage[k] = o[k]; 430 | } 431 | if(c = cm[sname]) { 432 | devc(c); 433 | } 434 | }else{ 435 | error("set function's parameter must be a object"); 436 | } 437 | } 438 | }); 439 | return function (key) { 440 | storage[key] = data[key]; 441 | api$$1.defineProperty(data, key, des(key)); 442 | } 443 | } 444 | 445 | function initStore$$1 () { 446 | var STORE = new Store$$1(); 447 | var archiver; 448 | if (this instanceof AoyC && !this._FINALSTORE) { 449 | Object.defineProperty(this, 'store', { 450 | set: function (value) { 451 | warn('Not allowed to modify store'); 452 | }, 453 | get: function () { 454 | return STORE 455 | } 456 | }); 457 | Object.defineProperty(this, '_FINALSTORE', { 458 | value: true 459 | }); 460 | }else{ 461 | warn('Not Aoy instance or Already init store'); 462 | } 463 | //return STORE 464 | return this 465 | } 466 | 467 | function Store$$1 () { 468 | var mainStore = {}; 469 | this.componentManage = {}; 470 | this.add = function () { 471 | var arg = toArray(arguments); 472 | var subStore; 473 | if(arg.length > 0) { 474 | var iskey = isString(arg[0]); 475 | var isdata = isObject(arg[1]); 476 | var iskeyobj = isObject(arg[0]); 477 | 478 | if(iskey && isdata) { 479 | subStore = injectStore(mainStore, arg[0], arg[1], this); 480 | }else if (iskeyobj) { 481 | subStore = injectStore(mainStore, '_DEFAULT', arg[0], this); 482 | }else { 483 | error('Missing key or data parameter'); 484 | } 485 | } 486 | return subStore 487 | }; 488 | 489 | this.get = function (key) { 490 | if (key === undefined) { 491 | key = '_DEFAULT'; 492 | } 493 | return mainStore[key] 494 | }; 495 | 496 | this.getMainStore = function () { 497 | return mainStore 498 | }; 499 | 500 | this.remove = function (key) { 501 | if(key === undefined){ 502 | key = '_DEFAULT'; 503 | } 504 | delete mainStore[key]; 505 | }; 506 | } 507 | 508 | var uid = 0; 509 | 510 | function createComponent$$1 (cp) { 511 | var c; 512 | var _this = this; 513 | var cid = uid++; 514 | return (function () { 515 | if (isObject(cp)) { 516 | c = new Component(cp); 517 | api$$1.defineProperty(c, 'aoy', { 518 | value: _this 519 | }); 520 | api$$1.defineProperty(c, '_UID', { 521 | value: cid 522 | }); 523 | } 524 | return c 525 | }()) 526 | } 527 | 528 | function Component (op) { 529 | var this$1 = this; 530 | 531 | if (isObject(op)) { 532 | for (var k in op) { 533 | this$1[k] = op[k]; 534 | } 535 | } 536 | } 537 | 538 | function connect (component, storeName) { 539 | var store = this.store; 540 | var c = store.componentManage; 541 | 542 | var getStore = store.get; 543 | var cid = component._UID; 544 | 545 | var _this = this; 546 | var depfn = function(com, key) { 547 | if ( c[key]) { 548 | c[key].push(component); 549 | }else { 550 | c[key] = [component]; 551 | } 552 | _this._dependent(cid, key); 553 | api$$1.defineProperty(com, key, { 554 | get: function() { 555 | return getStore(key) 556 | } 557 | }); 558 | }; 559 | 560 | if (component instanceof Component) { 561 | if(isString(storeName)){ 562 | depfn(component, storeName); 563 | }else if (isArray(storeName)){ 564 | for(var i =0; i < storeName.length; i++ ) { 565 | depfn(component, storeName[i]); 566 | } 567 | } 568 | //render vdom 569 | this.mount(component.el, component); 570 | } 571 | } 572 | 573 | function dependent (cid, sname) { 574 | var i = this.dependManage[cid]; 575 | 576 | if (i && i.length>0) { 577 | i.push(sname); 578 | }else { 579 | this.dependManage[cid] = [sname]; 580 | } 581 | } 582 | 583 | function mount (parent,component) { 584 | var vnode = component.render(); 585 | var d = createEle(vnode); 586 | component.vdom = vnode; 587 | api$$1.appendChild(parent, d.el); 588 | } 589 | 590 | function baseInit (Aoy) { 591 | Aoy.prototype._init = function(arg) { 592 | 593 | this.dependManage = Object.create(null); 594 | this._initStore(); 595 | }; 596 | 597 | Aoy.prototype._initStore = initStore$$1; 598 | 599 | Aoy.prototype.createComponent = createComponent$$1; 600 | 601 | Aoy.prototype.connect = connect; 602 | 603 | Aoy.prototype._dependent = dependent; 604 | 605 | Aoy.prototype.mount = mount; 606 | 607 | Aoy.prototype.el = el$$1; 608 | 609 | Aoy.prototype.patch = patch$$1; 610 | 611 | } 612 | 613 | function AoyC () { 614 | if (this instanceof AoyC) { 615 | this._init(); 616 | } 617 | } 618 | 619 | function init () { 620 | baseInit(AoyC); 621 | return new AoyC() 622 | } 623 | 624 | export { init, el$$1 as el }; 625 | //# sourceMappingURL=aoy.es.js.map 626 | -------------------------------------------------------------------------------- /dist/aoy.es.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"aoy.es.js","sources":["../src/util/console.js","../src/util/is.js","../src/util/help.js","../src/vdom/vnode.js","../src/vdom/diff.js","../src/vdom/createVdom.js","../src/vdom/createEle.js","../src/vdom/el.js","../src/util/api.js","../src/store/injectStore.js","../src/store/initStore.js","../src/store/Store.js","../src/component/createComponent.js","../src/component/Component.js","../src/store/connect.js","../src/store/dependent.js","../src/render/mount.js","../src/instance/baseInit.js","../src/instance/Aoy.js"],"sourcesContent":["export function error (info) {\n\tif (typeof console !== 'undeifine') {\n\t\tconsole.error(info)\n\t}\n}\nexport function warn (info) {\n\tif (typeof console !== 'undeifine') {\n\t\tconsole.warn(info)\n\t}\n}","function judge (o) {\n\treturn Object.prototype.toString.call(o)\n}\n\nexport function isArray (arr) {\n\treturn judge(arr) === '[object Array]'\n}\n\nexport function isObject (o) {\n\treturn judge(o) === '[object Object]'\n}\n\nexport function isFunction (f) {\n\treturn typeof f === 'function'\n}\t\n\nexport function isString (s) {\n\treturn typeof s === 'string'\n}\n\nexport function isNumber (n) {\n\treturn typeof n === 'number'\n}\n\n\n\n\n\n\n","export function toArray (arr) {\n\treturn [].slice.call(arr)\n}\n","export function Vdom () {\n\tthis.tagName = null\n\tthis.sel = null\n\tthis.id = null\n\tthis.className = []\n\tthis.children = null\n\tthis.el = null\n\tthis.data = null\n\tthis.key = null\n\tthis.text = null\n\tthis.attr = []\n\tthis.store = null\n}\n","import { api, isArray} from '../util/index'\nimport { createEle, updateEle } from './index'\n\nfunction sameVnode(oldVnode, vnode){\n\treturn vnode.key === oldVnode.key && vnode.sel === oldVnode.sel\n}\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\n var i, map = {}, key, ch\n for (i = beginIdx; i <= endIdx; ++i) {\n ch = children[i]\n if (ch != null) {\n key = ch.key\n if (key !== null)\n map[key] = i\n }\n }\n return map\n}\nfunction removeVnodes (parentElm, vnodes, startIdx, endIdx) {\n for ( ;startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx]\n if (ch != null) {\n api.removeChild(parentElm, ch.el)\n }\n }\n }\nfunction addVnodes (parentElm, before, vnodes, startIdx, endIdx) {\n for ( ;startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx]\n if (ch != null) {\n api.insertBefore(parentElm, createEle(ch).el, before)\n }\n }\n } \nfunction patchVnode (oldVnode, vnode) {\n\tconst el = vnode.el = oldVnode.el\n let i, oldCh = oldVnode.children, ch = vnode.children\n if (oldVnode === vnode) return\n \n if (oldVnode.text !== null && vnode.text !== null && oldVnode.text !== vnode.text) {\n api.setTextContent(el, vnode.text)\n }else {\n updateEle(el, vnode, oldVnode)\n \tif (oldCh && ch && oldCh !== ch) {\n\t \tupdateChildren(el, oldCh, ch)\n\t }else if (ch){\n\t \tcreateEle(vnode) //create el's children dom\n\t }else if (oldCh){\n\t \tapi.removeChildren(el)\n\t }\n }\n}\n\nfunction updateChildren (parentElm, oldCh, newCh) {\n\tlet oldStartIdx = 0, newStartIdx = 0\n let oldEndIdx = oldCh.length - 1\n let oldStartVnode = oldCh[0]\n let oldEndVnode = oldCh[oldEndIdx]\n let newEndIdx = newCh.length - 1\n let newStartVnode = newCh[0]\n let newEndVnode = newCh[newEndIdx]\n let oldKeyToIdx\n let idxInOld\n let elmToMove\n let before\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (oldStartVnode == null) {\n oldStartVnode = oldCh[++oldStartIdx] // Vnode might have been moved left\n }else if (oldEndVnode == null) {\n oldEndVnode = oldCh[--oldEndIdx]\n }else if (newStartVnode == null) {\n newStartVnode = newCh[++newStartIdx]\n }else if (newEndVnode == null) {\n newEndVnode = newCh[--newEndIdx]\n }else if (sameVnode(oldStartVnode, newStartVnode)) {\n patchVnode(oldStartVnode, newStartVnode)\n oldStartVnode = oldCh[++oldStartIdx]\n newStartVnode = newCh[++newStartIdx]\n }else if (sameVnode(oldEndVnode, newEndVnode)) {\n patchVnode(oldEndVnode, newEndVnode)\n oldEndVnode = oldCh[--oldEndIdx]\n newEndVnode = newCh[--newEndIdx]\n }else if (sameVnode(oldStartVnode, newEndVnode)) {\n patchVnode(oldStartVnode, newEndVnode)\n api.insertBefore(parentElm, oldStartVnode.el, api.nextSibling(oldEndVnode.el))\n oldStartVnode = oldCh[++oldStartIdx]\n newEndVnode = newCh[--newEndIdx]\n }else if (sameVnode(oldEndVnode, newStartVnode)) {\n patchVnode(oldEndVnode, newStartVnode)\n api.insertBefore(parentElm, oldEndVnode.el, oldStartVnode.el)\n oldEndVnode = oldCh[--oldEndIdx]\n newStartVnode = newCh[++newStartIdx]\n }else {\n if (oldKeyToIdx === undefined) {\n oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)\n }\n idxInOld = oldKeyToIdx[newStartVnode.key]\n if (!idxInOld) {\n api.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el)\n newStartVnode = newCh[++newStartIdx]\n }\n else {\n elmToMove = oldCh[idxInOld]\n if (elmToMove.sel !== newStartVnode.sel) {\n api.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el)\n }else {\n patchVnode(elmToMove, newStartVnode)\n oldCh[idxInOld] = null\n api.insertBefore(parentElm, elmToMove.el, oldStartVnode.el)\n }\n newStartVnode = newCh[++newStartIdx]\n }\n }\n }\n if (oldStartIdx > oldEndIdx) {\n before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].el\n addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx)\n }else if (newStartIdx > newEndIdx) {\n removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx)\n }\n}\n\nexport function patch (oldVnode, vnode) {\n\tif (sameVnode(oldVnode, vnode)) {\n\t\tpatchVnode(oldVnode, vnode)\n\t} else {\n\t\tconst oEl = oldVnode.el\n\t\tlet parentEle = api.parentNode(oEl)\n\t\tcreateEle(vnode)\n\t\tif (parentEle !== null) {\n\t\t\tapi.insertBefore(parentEle, vnode.el, api.nextSibling(oEl))\n\t\t\tapi.removeChild(parentEle, oldVnode.el)\n\t\t\toldVnode = null\n\t\t}\n\t}\n\treturn vnode\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","import { isString, isObject, isArray, isNumber, api } from '../util/index'\nimport { Vdom, createEle } from './index'\n\nfunction parseQuery (vdom, query) {\n\tlet k,state = 0,j = 0\n\tvdom.sel = query\n\n\tfor(let i = 0, len = query.length; i < len; i++) {\n\t\tlet char = query[i]\n\t\t\tif (char === '.' || char === '#' || (k = i === len-1)) {\n\t\t\t\tif (state === 0) {\n\t\t\t\t\tvdom.tagName = query.substring(j, !k ? i : len).toUpperCase()\n\t\t\t\t}else if (state === 1) {\n\t\t\t\t\tvdom.className.push(query.substring(j, !k ? i : len))\n\t\t\t\t}else if (state === 2) {\n\t\t\t\t\tvdom.id = query.substring(j, !k ? i : len)\n\t\t\t\t}\n\t\t\t\tstate = (char === '.') ? 1 : (char === '#')? 2 : 3\n\t\t\t\tj = i+1\n\t\t\t}\t\t\n\n\t}\n\t\n}\n\nfunction parseData (vdom, v) {\n\tfor(let k in v) {\n\t\tif (k === 'class'){\n\t\t\tlet i = v[k].split(' ')\n\t\t\tfor(let j = 0; j < i.length; j++) {\n\t\t\t\tvdom.className.push(i[j])\n\t\t\t}\n\t\t}else if (k === 'key') {\n\t\t\tvdom.key = v[k]\n\t\t}else if (k !== 'style') {\n\t\t\tvdom.attr.push(k)\t\n\t\t}\n\t}\n\tvdom.data = v\n}\n\nfunction parseChindren (vdom, v) {\n\tlet a = []\n\tif (isString(v) || isNumber(v)) v = [v]\n\tfor (let i = 0; i < v.length; i++) {\n\t\tif (!(v[i] instanceof Vdom)) {\n\t\t\ta.push(createVdomTxt(v[i]))\n\t\t}else {\n\t\t\ta.push(v[i])\n\t\t}\n\t}\n\tvdom.children = a\n}\nexport function createVdomTxt (str) {\n\tlet vd = new Vdom()\n\tif(isString(str) || isNumber(str)) {\n\t\tvd.text = str\n\t}\n\treturn vd\n}\nexport function createVdom (arg) {\n\tlet i=0,\n\t\tvd = new Vdom()\n\n\twhile(i < arg.length) {\n\t\tlet v = arg[i]\n\t\tif (i === 0 && isString(v)) {\n\t\t\t// div#id.classA\n\t\t\tparseQuery(vd, v)\n\t\t}else if (i != 0){\n\t\t\tif(isObject(v)) {\n\t\t\t\t// class style clickEvent .ect\n\t\t\t\tparseData(vd, v)\n\t\t\t}else if (isArray(v) || isString(v) || isNumber(v)) {\n\t\t\t\t// childern\n\t\t\t\tparseChindren(vd, v)\n\t\t\t}\n\t\t}\n\t\ti++\n\t}\n\treturn vd\n}","import { api, isObject, isString } from '../util/index'\n\nexport function createEle (vdom) {\n\tlet i, e \n\tif( !vdom.el && (i = vdom.text)) {\n\t\te = vdom.el = api.createTextNode(i)\n\t\treturn vdom\n\t} \n\tif ( (i = vdom.tagName) && vdom.el === null) {\n\t\te = vdom.el = api.createElement(i)\n\t}else if (vdom.el.nodeType === 1) {\n\t\te = vdom.el\n\t}\n\tupdateEle(e, vdom)\n\treturn vdom\n}\n\nexport function updateEle (e ,vdom, oldVdom) {\n\tlet i\n\tif( (i = vdom.className).length > 0 ) api.setClass(e, i)\n\tif( (i = vdom.data) !== null ) api.setAttrs(e, i)\n\tif( (i = vdom.id) !== null ) api.setId(e, i)\n\tif( (i = vdom.children) !== null && !oldVdom) api.appendChildren(e, i)\n}\n","import { toArray, isArray, error } from '../util/index'\nimport { createVdom } from './index'\n\nexport function el () {\n\t\tconst arg = toArray(arguments)\n\n\t\tif (arg.length === 0) {\n\t\t\terror('Parameter cannot be empty')\n\t\t\treturn false\n\t\t}\n\t\tif (isArray(arg) && arg.length > 0) {\n\t\t\treturn createVdom.call(this, arg)\n\t\t}\t\n\t}\n\t","import { error, isArray, isObject, isString } from './index'\nimport { Vdom, createEle } from '../vdom/index'\n\nexport let api = Object.create(null)\n\n\tapi.createElement = function (tag) {\n\t\treturn document.createElement(tag)\n\t} \n\tapi.createTextNode = function (txt) {\n\t\treturn document.createTextNode(txt)\n\t}\n\tapi.appendChild = function (parent, child) {\n\t\treturn parent.appendChild(child)\n\t}\n\tapi.parentNode = function (node) {\n\t\treturn node.parentNode\n\t}\n\tapi.insertBefore = function (parent, newNode, rf) {\n\t\treturn parent.insertBefore(newNode, rf)\n\t}\n\tapi.nextSibling = function (el) {\n\t\treturn el.nextSibling\n\t}\n\tapi.removeChild = function (parent, rc) {\n\t\treturn parent.removeChild(rc)\n\t}\n\tapi.setTextContent = function (ele, txt) {\n\t\tele.textContent = txt\n\t}\n\tapi.setId = function (ele, id) {\n\t\tele.id = id\n\t}\n\tapi.defineProperty = function (obj, prop, descriptor) {\n\t\tObject.defineProperty(obj, prop, descriptor)\n\t}\n\tapi.appendChildren = function (ele, children) {\n\t\tif(ele && isArray(children)) {\n\t\t\tfor(let i = 0; i < children.length; i++) {\n\t\t\t\tlet c\n\t\t\t\tif (children[i] instanceof Vdom) {\n\t\t\t\t\tc = children[i].el || createEle(children[i]).el\n\t\t\t\t}\n\t\t\t\tthis.appendChild(ele, c)\n\t\t\t}\n\t\t}\n\t}\n\tapi.setClass = function (ele, c) {\n\t\tif(ele && isArray(c)) {\n\t\t\tlet k = ''\n\t\t\tfor(let i = 0; i < c.length; i++) {\n\t\t\t\t//ele.classList.add(c[i])\n\t\t\t\tif(i !== c.length-1){\n\t\t\t\t\tk += c[i] + ' '\n\t\t\t\t}else{\n\t\t\t\t\tk += c[i]\n\t\t\t\t}\n\t\t\t}\n\t\t\tele.className = k\n\t\t}\n\t}\n\tapi.setAttrs = function (ele, a) {\n\t\tif(ele && isObject(a)) {\n\t\t\tfor(let k in a) {\n\t\t\t\tif (k === 'class') continue\n\t\t\t\tlet s = a[k]\n\t\t\t\tif (k === 'style' && isObject(s)) {\n\t\t\t\t\tfor(let j in s) {\n\t\t\t\t\t\tele.style[j] = s[j]\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tele[k] = s\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tapi.removeChildren = function (ele) {\n\t\tlet i, ch = ele.childNodes\n\t\twhile(ch[0]) {\n\t\t\tthis.removeChild(ele, ch[0])\n\t\t}\n\t}\n\n\n\n\n\n\n\n\n\n\n\n\n\n","import { isObject, error, api, warn } from '../util/index'\nimport { patch } from '../vdom/index'\n\nexport function injectStore (store, key, data, context) {\n\tlet archiver\n\tif(isObject(data)){\n\t\tstore[key] = data\n\t\tarchiver = new Archiver(data,key,context)\n\t\tfor(let k in data) {\n\t\t\tarchiver(k)\n\t\t}\n\t}\n\treturn data\n}\n\nfunction Archiver (data, sname, context) {\n let c\n let storage = {}\n let cm = context.componentManage\n let devc = function (c) {\n\t\tc.forEach( function(v, i) {\n\t\t\tlet newVn = v.render()\n\t\t\tpatch(v.vdom, newVn)\n\t\t\tv.vdom = newVn\n\t\t})\n }\n let des = function(key) {\n\t return {\n\t \t\t get: function() {\n\t\t\t return storage[key]\n\t\t\t },\n\t\t\t set: function(value) {\n\t\t\t storage[key] = value\n\t\t\t if (c = cm[sname]) {\n\t\t\t \t\t devc(c)\n\t\t\t }\n\t\t\t }\n\t \t\t}\n }\n api.defineProperty(data, 'set', {\n \tvalue: function () {\n \t\tlet o\n \t\tif (isObject(o = arguments[0])) {\n \t\t\tfor(let k in o){\n \t\t\t\tif(!storage.hasOwnProperty(k)) {\n \t\t\t\t\tapi.defineProperty(data, k, des(k))\n \t\t\t\t}\n \t\t\t\tstorage[k] = o[k]\n \t\t\t}\n \t\t\tif(c = cm[sname]) {\n\t\t\t \t\t devc(c)\n\t\t\t \t}\n \t\t}else{\n \t\t\terror(\"set function's parameter must be a object\")\n \t\t}\n \t}\n })\n return function (key) {\n \t\tstorage[key] = data[key]\n\t \tapi.defineProperty(data, key, des(key))\n\t}\n}\n\n\n\n\n\n\n\n\n\n","import { isObject, warn } from '../util/index'\nimport { injectStore, Store } from './index'\nimport { AoyC } from '../instance/Aoy'\n\nexport function initStore () {\n\tlet STORE = new Store()\n\tlet archiver\n\tif (this instanceof AoyC && !this._FINALSTORE) {\n\t\tObject.defineProperty(this, 'store', {\n\t\t\tset: function (value) {\n\t\t\t\twarn('Not allowed to modify store')\n\t\t\t},\n\t\t\tget: function () {\n\t\t\t\treturn STORE\n\t\t\t}\n\t\t})\n\t\tObject.defineProperty(this, '_FINALSTORE', {\n\t\t\tvalue: true\n\t\t})\n\t}else{\n\t\twarn('Not Aoy instance or Already init store')\n\t}\n\t//return STORE\n\treturn this\n}\n\n\n\n\n\n\n","import { toArray, isString, isObject, error, api } from '../util/index'\nimport { injectStore } from './index'\n\n\nexport function Store () {\n\tlet mainStore = {}\n\tthis.componentManage = {}\n\tthis.add = function () {\n\t\tconst arg = toArray(arguments)\n\t\tlet subStore\n\t\tif(arg.length > 0) {\n\t\t const iskey = isString(arg[0])\n\t\t const isdata = isObject(arg[1])\n\t\t const iskeyobj = isObject(arg[0])\n\n\t\t if(iskey && isdata) {\n\t\t \t\tsubStore = injectStore(mainStore, arg[0], arg[1], this)\n\t\t\t}else if (iskeyobj) {\t\n\t\t\t\tsubStore = injectStore(mainStore, '_DEFAULT', arg[0], this)\n\t\t\t}else {\n\t\t\t\terror('Missing key or data parameter')\n\t\t\t}\n\t\t}\n\t\treturn subStore\n\t}\n\n\tthis.get = function (key) {\n\t\tif (key === undefined) {\n\t\t\tkey = '_DEFAULT'\n\t\t}\n\t\treturn mainStore[key]\n\t}\n\n\tthis.getMainStore = function () {\n\t\treturn mainStore\n\t}\n\n\tthis.remove = function (key) {\n\t\tif(key === undefined){\n\t\t\tkey = '_DEFAULT'\n\t\t}\n\t\tdelete mainStore[key]\n\t}\n}\n\n\n\n\n\n\n\n\n\n\n","import { isObject, api } from '../util/index'\nimport { Component } from './index'\nlet uid = 0\n\nexport function createComponent (cp) {\n let c\n let _this = this\n let cid = uid++\n return (function () {\n if (isObject(cp)) {\n\t\tc = new Component(cp)\n\t\tapi.defineProperty(c, 'aoy', {\n\t\t\tvalue: _this\n\t\t})\n\t\tapi.defineProperty(c, '_UID', {\n\t\t\tvalue: cid\n\t\t})\n\t}\n\treturn c\n }())\n}\n","import { isObject } from '../util/index'\n\nexport function Component (op) {\n if (isObject(op)) {\n for (let k in op) {\n this[k] = op[k]\n }\n }\n}\n","import { isArray, isString, api } from '../util/index'\nimport { Component } from '../component/index'\n\nexport function connect (component, storeName) {\n\tlet store = this.store\n\tlet c = store.componentManage\n\n\tlet getStore = store.get\n\tlet cid = component._UID\n\n\tlet _this = this\n\tlet depfn = function(com, key) {\n\t\tif ( c[key]) {\n\t\t\tc[key].push(component)\n\t\t}else {\n\t\t\tc[key] = [component]\n\t\t}\n\t\t_this._dependent(cid, key)\n\t\tapi.defineProperty(com, key, {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn getStore(key)\n\t\t\t\t} \n\t\t\t})\n\t}\n\n\tif (component instanceof Component) {\n\t\tif(isString(storeName)){\n\t\t\tdepfn(component, storeName)\n\t\t}else if (isArray(storeName)){\n\t\t\tfor(let i =0; i < storeName.length; i++ ) {\n\t\t\t\tdepfn(component, storeName[i])\n\t\t\t}\n\t\t}\n\t\t//render vdom\n\t\tthis.mount(component.el, component)\n\t}\n}","export function dependent (cid, sname) {\n\tlet i = this.dependManage[cid]\n\t\n\tif (i && i.length>0) {\n\t\ti.push(sname)\n\t}else {\n\t\tthis.dependManage[cid] = [sname]\n\t}\n}","import { createVdom, createEle, patch } from '../vdom/index'\nimport { api, isFunction } from '../util/index'\nexport function mount (parent,component) {\n\tconst vnode = component.render()\n\tconst d = createEle(vnode)\n\tcomponent.vdom = vnode\n\tapi.appendChild(parent, d.el)\n}\n","import { isArray, error, toArray, api, warn } from '../util/index'\nimport { createVdom, createEle, patch, el } from '../vdom/index'\nimport { injectStore, initStore, connect, dependent } from '../store/index'\nimport { createComponent } from '../component/index'\nimport { mount } from '../render/index'\n\nexport function baseInit (Aoy) {\n\tAoy.prototype._init = function(arg) {\n\n\t\tthis.dependManage = Object.create(null)\n\t\tthis._initStore()\n\t}\n\t\n\tAoy.prototype._initStore = initStore\n\n\tAoy.prototype.createComponent = createComponent\n\n\tAoy.prototype.connect = connect\n\n\tAoy.prototype._dependent = dependent\n\n\tAoy.prototype.mount = mount\n\n\tAoy.prototype.el = el\n\n\tAoy.prototype.patch = patch\n\n}\n\n\n\n\n","import { baseInit } from './baseInit'\nimport { toArray} from '../util/index'\n\nexport function AoyC () {\n\tif (this instanceof AoyC) {\n\t\tthis._init()\n\t}\t\n}\n\nexport function init () {\n\tbaseInit(AoyC)\n\treturn new AoyC()\n}\n"],"names":["api","const","el","let","patch","createVdomTxt","createVdom","this","initStore","Store","createComponent"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/aoy.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : 3 | typeof define === 'function' && define.amd ? define(['exports'], factory) : 4 | (factory((global.Aoy = global.Aoy || {}))); 5 | }(this, (function (exports) { 'use strict'; 6 | 7 | function error (info) { 8 | if (typeof console !== 'undeifine') { 9 | console.error(info); 10 | } 11 | } 12 | function warn (info) { 13 | if (typeof console !== 'undeifine') { 14 | console.warn(info); 15 | } 16 | } 17 | 18 | function judge (o) { 19 | return Object.prototype.toString.call(o) 20 | } 21 | 22 | function isArray (arr) { 23 | return judge(arr) === '[object Array]' 24 | } 25 | 26 | function isObject (o) { 27 | return judge(o) === '[object Object]' 28 | } 29 | 30 | 31 | 32 | function isString (s) { 33 | return typeof s === 'string' 34 | } 35 | 36 | function isNumber (n) { 37 | return typeof n === 'number' 38 | } 39 | 40 | function toArray (arr) { 41 | return [].slice.call(arr) 42 | } 43 | 44 | function Vdom () { 45 | this.tagName = null; 46 | this.sel = null; 47 | this.id = null; 48 | this.className = []; 49 | this.children = null; 50 | this.el = null; 51 | this.data = null; 52 | this.key = null; 53 | this.text = null; 54 | this.attr = []; 55 | this.store = null; 56 | } 57 | 58 | function sameVnode(oldVnode, vnode){ 59 | return vnode.key === oldVnode.key && vnode.sel === oldVnode.sel 60 | } 61 | function createKeyToOldIdx (children, beginIdx, endIdx) { 62 | var i, map = {}, key, ch; 63 | for (i = beginIdx; i <= endIdx; ++i) { 64 | ch = children[i]; 65 | if (ch != null) { 66 | key = ch.key; 67 | if (key !== null) 68 | { map[key] = i; } 69 | } 70 | } 71 | return map 72 | } 73 | function removeVnodes (parentElm, vnodes, startIdx, endIdx) { 74 | for ( ;startIdx <= endIdx; ++startIdx) { 75 | var ch = vnodes[startIdx]; 76 | if (ch != null) { 77 | api$$1.removeChild(parentElm, ch.el); 78 | } 79 | } 80 | } 81 | function addVnodes (parentElm, before, vnodes, startIdx, endIdx) { 82 | for ( ;startIdx <= endIdx; ++startIdx) { 83 | var ch = vnodes[startIdx]; 84 | if (ch != null) { 85 | api$$1.insertBefore(parentElm, createEle(ch).el, before); 86 | } 87 | } 88 | } 89 | function patchVnode (oldVnode, vnode) { 90 | var el$$1 = vnode.el = oldVnode.el; 91 | var i, oldCh = oldVnode.children, ch = vnode.children; 92 | if (oldVnode === vnode) { return } 93 | 94 | if (oldVnode.text !== null && vnode.text !== null && oldVnode.text !== vnode.text) { 95 | api$$1.setTextContent(el$$1, vnode.text); 96 | }else { 97 | updateEle(el$$1, vnode, oldVnode); 98 | if (oldCh && ch && oldCh !== ch) { 99 | updateChildren(el$$1, oldCh, ch); 100 | }else if (ch){ 101 | createEle(vnode); //create el's children dom 102 | }else if (oldCh){ 103 | api$$1.removeChildren(el$$1); 104 | } 105 | } 106 | } 107 | 108 | function updateChildren (parentElm, oldCh, newCh) { 109 | var oldStartIdx = 0, newStartIdx = 0; 110 | var oldEndIdx = oldCh.length - 1; 111 | var oldStartVnode = oldCh[0]; 112 | var oldEndVnode = oldCh[oldEndIdx]; 113 | var newEndIdx = newCh.length - 1; 114 | var newStartVnode = newCh[0]; 115 | var newEndVnode = newCh[newEndIdx]; 116 | var oldKeyToIdx; 117 | var idxInOld; 118 | var elmToMove; 119 | var before; 120 | while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { 121 | if (oldStartVnode == null) { 122 | oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left 123 | }else if (oldEndVnode == null) { 124 | oldEndVnode = oldCh[--oldEndIdx]; 125 | }else if (newStartVnode == null) { 126 | newStartVnode = newCh[++newStartIdx]; 127 | }else if (newEndVnode == null) { 128 | newEndVnode = newCh[--newEndIdx]; 129 | }else if (sameVnode(oldStartVnode, newStartVnode)) { 130 | patchVnode(oldStartVnode, newStartVnode); 131 | oldStartVnode = oldCh[++oldStartIdx]; 132 | newStartVnode = newCh[++newStartIdx]; 133 | }else if (sameVnode(oldEndVnode, newEndVnode)) { 134 | patchVnode(oldEndVnode, newEndVnode); 135 | oldEndVnode = oldCh[--oldEndIdx]; 136 | newEndVnode = newCh[--newEndIdx]; 137 | }else if (sameVnode(oldStartVnode, newEndVnode)) { 138 | patchVnode(oldStartVnode, newEndVnode); 139 | api$$1.insertBefore(parentElm, oldStartVnode.el, api$$1.nextSibling(oldEndVnode.el)); 140 | oldStartVnode = oldCh[++oldStartIdx]; 141 | newEndVnode = newCh[--newEndIdx]; 142 | }else if (sameVnode(oldEndVnode, newStartVnode)) { 143 | patchVnode(oldEndVnode, newStartVnode); 144 | api$$1.insertBefore(parentElm, oldEndVnode.el, oldStartVnode.el); 145 | oldEndVnode = oldCh[--oldEndIdx]; 146 | newStartVnode = newCh[++newStartIdx]; 147 | }else { 148 | if (oldKeyToIdx === undefined) { 149 | oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); 150 | } 151 | idxInOld = oldKeyToIdx[newStartVnode.key]; 152 | if (!idxInOld) { 153 | api$$1.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el); 154 | newStartVnode = newCh[++newStartIdx]; 155 | } 156 | else { 157 | elmToMove = oldCh[idxInOld]; 158 | if (elmToMove.sel !== newStartVnode.sel) { 159 | api$$1.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el); 160 | }else { 161 | patchVnode(elmToMove, newStartVnode); 162 | oldCh[idxInOld] = null; 163 | api$$1.insertBefore(parentElm, elmToMove.el, oldStartVnode.el); 164 | } 165 | newStartVnode = newCh[++newStartIdx]; 166 | } 167 | } 168 | } 169 | if (oldStartIdx > oldEndIdx) { 170 | before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].el; 171 | addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx); 172 | }else if (newStartIdx > newEndIdx) { 173 | removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); 174 | } 175 | } 176 | 177 | function patch$$1 (oldVnode, vnode) { 178 | if (sameVnode(oldVnode, vnode)) { 179 | patchVnode(oldVnode, vnode); 180 | } else { 181 | var oEl = oldVnode.el; 182 | var parentEle = api$$1.parentNode(oEl); 183 | createEle(vnode); 184 | if (parentEle !== null) { 185 | api$$1.insertBefore(parentEle, vnode.el, api$$1.nextSibling(oEl)); 186 | api$$1.removeChild(parentEle, oldVnode.el); 187 | oldVnode = null; 188 | } 189 | } 190 | return vnode 191 | } 192 | 193 | function parseQuery (vdom, query) { 194 | var k,state = 0,j = 0; 195 | vdom.sel = query; 196 | 197 | for(var i = 0, len = query.length; i < len; i++) { 198 | var char = query[i]; 199 | if (char === '.' || char === '#' || (k = i === len-1)) { 200 | if (state === 0) { 201 | vdom.tagName = query.substring(j, !k ? i : len).toUpperCase(); 202 | }else if (state === 1) { 203 | vdom.className.push(query.substring(j, !k ? i : len)); 204 | }else if (state === 2) { 205 | vdom.id = query.substring(j, !k ? i : len); 206 | } 207 | state = (char === '.') ? 1 : (char === '#')? 2 : 3; 208 | j = i+1; 209 | } 210 | 211 | } 212 | 213 | } 214 | 215 | function parseData (vdom, v) { 216 | for(var k in v) { 217 | if (k === 'class'){ 218 | var i = v[k].split(' '); 219 | for(var j = 0; j < i.length; j++) { 220 | vdom.className.push(i[j]); 221 | } 222 | }else if (k === 'key') { 223 | vdom.key = v[k]; 224 | }else if (k !== 'style') { 225 | vdom.attr.push(k); 226 | } 227 | } 228 | vdom.data = v; 229 | } 230 | 231 | function parseChindren (vdom, v) { 232 | var a = []; 233 | if (isString(v) || isNumber(v)) { v = [v]; } 234 | for (var i = 0; i < v.length; i++) { 235 | if (!(v[i] instanceof Vdom)) { 236 | a.push(createVdomTxt$$1(v[i])); 237 | }else { 238 | a.push(v[i]); 239 | } 240 | } 241 | vdom.children = a; 242 | } 243 | function createVdomTxt$$1 (str) { 244 | var vd = new Vdom(); 245 | if(isString(str) || isNumber(str)) { 246 | vd.text = str; 247 | } 248 | return vd 249 | } 250 | function createVdom$$1 (arg) { 251 | var i=0, 252 | vd = new Vdom(); 253 | 254 | while(i < arg.length) { 255 | var v = arg[i]; 256 | if (i === 0 && isString(v)) { 257 | // div#id.classA 258 | parseQuery(vd, v); 259 | }else if (i != 0){ 260 | if(isObject(v)) { 261 | // class style clickEvent .ect 262 | parseData(vd, v); 263 | }else if (isArray(v) || isString(v) || isNumber(v)) { 264 | // childern 265 | parseChindren(vd, v); 266 | } 267 | } 268 | i++; 269 | } 270 | return vd 271 | } 272 | 273 | function createEle (vdom) { 274 | var i, e; 275 | if( !vdom.el && (i = vdom.text)) { 276 | e = vdom.el = api$$1.createTextNode(i); 277 | return vdom 278 | } 279 | if ( (i = vdom.tagName) && vdom.el === null) { 280 | e = vdom.el = api$$1.createElement(i); 281 | }else if (vdom.el.nodeType === 1) { 282 | e = vdom.el; 283 | } 284 | updateEle(e, vdom); 285 | return vdom 286 | } 287 | 288 | function updateEle (e ,vdom, oldVdom) { 289 | var i; 290 | if( (i = vdom.className).length > 0 ) { api$$1.setClass(e, i); } 291 | if( (i = vdom.data) !== null ) { api$$1.setAttrs(e, i); } 292 | if( (i = vdom.id) !== null ) { api$$1.setId(e, i); } 293 | if( (i = vdom.children) !== null && !oldVdom) { api$$1.appendChildren(e, i); } 294 | } 295 | 296 | function el$$1 () { 297 | var arg = toArray(arguments); 298 | 299 | if (arg.length === 0) { 300 | error('Parameter cannot be empty'); 301 | return false 302 | } 303 | if (isArray(arg) && arg.length > 0) { 304 | return createVdom$$1.call(this, arg) 305 | } 306 | } 307 | 308 | var api$$1 = Object.create(null); 309 | 310 | api$$1.createElement = function (tag) { 311 | return document.createElement(tag) 312 | }; 313 | api$$1.createTextNode = function (txt) { 314 | return document.createTextNode(txt) 315 | }; 316 | api$$1.appendChild = function (parent, child) { 317 | return parent.appendChild(child) 318 | }; 319 | api$$1.parentNode = function (node) { 320 | return node.parentNode 321 | }; 322 | api$$1.insertBefore = function (parent, newNode, rf) { 323 | return parent.insertBefore(newNode, rf) 324 | }; 325 | api$$1.nextSibling = function (el$$1) { 326 | return el$$1.nextSibling 327 | }; 328 | api$$1.removeChild = function (parent, rc) { 329 | return parent.removeChild(rc) 330 | }; 331 | api$$1.setTextContent = function (ele, txt) { 332 | ele.textContent = txt; 333 | }; 334 | api$$1.setId = function (ele, id) { 335 | ele.id = id; 336 | }; 337 | api$$1.defineProperty = function (obj, prop, descriptor) { 338 | Object.defineProperty(obj, prop, descriptor); 339 | }; 340 | api$$1.appendChildren = function (ele, children) { 341 | var this$1 = this; 342 | 343 | if(ele && isArray(children)) { 344 | for(var i = 0; i < children.length; i++) { 345 | var c = (void 0); 346 | if (children[i] instanceof Vdom) { 347 | c = children[i].el || createEle(children[i]).el; 348 | } 349 | this$1.appendChild(ele, c); 350 | } 351 | } 352 | }; 353 | api$$1.setClass = function (ele, c) { 354 | if(ele && isArray(c)) { 355 | var k = ''; 356 | for(var i = 0; i < c.length; i++) { 357 | //ele.classList.add(c[i]) 358 | if(i !== c.length-1){ 359 | k += c[i] + ' '; 360 | }else{ 361 | k += c[i]; 362 | } 363 | } 364 | ele.className = k; 365 | } 366 | }; 367 | api$$1.setAttrs = function (ele, a) { 368 | if(ele && isObject(a)) { 369 | for(var k in a) { 370 | if (k === 'class') { continue } 371 | var s = a[k]; 372 | if (k === 'style' && isObject(s)) { 373 | for(var j in s) { 374 | ele.style[j] = s[j]; 375 | } 376 | }else { 377 | ele[k] = s; 378 | } 379 | } 380 | } 381 | }; 382 | api$$1.removeChildren = function (ele) { 383 | var this$1 = this; 384 | 385 | var i, ch = ele.childNodes; 386 | while(ch[0]) { 387 | this$1.removeChild(ele, ch[0]); 388 | } 389 | }; 390 | 391 | function injectStore (store, key, data, context) { 392 | var archiver; 393 | if(isObject(data)){ 394 | store[key] = data; 395 | archiver = new Archiver(data,key,context); 396 | for(var k in data) { 397 | archiver(k); 398 | } 399 | } 400 | return data 401 | } 402 | 403 | function Archiver (data, sname, context) { 404 | var c; 405 | var storage = {}; 406 | var cm = context.componentManage; 407 | var devc = function (c) { 408 | c.forEach( function(v, i) { 409 | var newVn = v.render(); 410 | patch$$1(v.vdom, newVn); 411 | v.vdom = newVn; 412 | }); 413 | }; 414 | var des = function(key) { 415 | return { 416 | get: function() { 417 | return storage[key] 418 | }, 419 | set: function(value) { 420 | storage[key] = value; 421 | if (c = cm[sname]) { 422 | devc(c); 423 | } 424 | } 425 | } 426 | }; 427 | api$$1.defineProperty(data, 'set', { 428 | value: function () { 429 | var o; 430 | if (isObject(o = arguments[0])) { 431 | for(var k in o){ 432 | if(!storage.hasOwnProperty(k)) { 433 | api$$1.defineProperty(data, k, des(k)); 434 | } 435 | storage[k] = o[k]; 436 | } 437 | if(c = cm[sname]) { 438 | devc(c); 439 | } 440 | }else{ 441 | error("set function's parameter must be a object"); 442 | } 443 | } 444 | }); 445 | return function (key) { 446 | storage[key] = data[key]; 447 | api$$1.defineProperty(data, key, des(key)); 448 | } 449 | } 450 | 451 | function initStore$$1 () { 452 | var STORE = new Store$$1(); 453 | var archiver; 454 | if (this instanceof AoyC && !this._FINALSTORE) { 455 | Object.defineProperty(this, 'store', { 456 | set: function (value) { 457 | warn('Not allowed to modify store'); 458 | }, 459 | get: function () { 460 | return STORE 461 | } 462 | }); 463 | Object.defineProperty(this, '_FINALSTORE', { 464 | value: true 465 | }); 466 | }else{ 467 | warn('Not Aoy instance or Already init store'); 468 | } 469 | //return STORE 470 | return this 471 | } 472 | 473 | function Store$$1 () { 474 | var mainStore = {}; 475 | this.componentManage = {}; 476 | this.add = function () { 477 | var arg = toArray(arguments); 478 | var subStore; 479 | if(arg.length > 0) { 480 | var iskey = isString(arg[0]); 481 | var isdata = isObject(arg[1]); 482 | var iskeyobj = isObject(arg[0]); 483 | 484 | if(iskey && isdata) { 485 | subStore = injectStore(mainStore, arg[0], arg[1], this); 486 | }else if (iskeyobj) { 487 | subStore = injectStore(mainStore, '_DEFAULT', arg[0], this); 488 | }else { 489 | error('Missing key or data parameter'); 490 | } 491 | } 492 | return subStore 493 | }; 494 | 495 | this.get = function (key) { 496 | if (key === undefined) { 497 | key = '_DEFAULT'; 498 | } 499 | return mainStore[key] 500 | }; 501 | 502 | this.getMainStore = function () { 503 | return mainStore 504 | }; 505 | 506 | this.remove = function (key) { 507 | if(key === undefined){ 508 | key = '_DEFAULT'; 509 | } 510 | delete mainStore[key]; 511 | }; 512 | } 513 | 514 | var uid = 0; 515 | 516 | function createComponent$$1 (cp) { 517 | var c; 518 | var _this = this; 519 | var cid = uid++; 520 | return (function () { 521 | if (isObject(cp)) { 522 | c = new Component(cp); 523 | api$$1.defineProperty(c, 'aoy', { 524 | value: _this 525 | }); 526 | api$$1.defineProperty(c, '_UID', { 527 | value: cid 528 | }); 529 | } 530 | return c 531 | }()) 532 | } 533 | 534 | function Component (op) { 535 | var this$1 = this; 536 | 537 | if (isObject(op)) { 538 | for (var k in op) { 539 | this$1[k] = op[k]; 540 | } 541 | } 542 | } 543 | 544 | function connect (component, storeName) { 545 | var store = this.store; 546 | var c = store.componentManage; 547 | 548 | var getStore = store.get; 549 | var cid = component._UID; 550 | 551 | var _this = this; 552 | var depfn = function(com, key) { 553 | if ( c[key]) { 554 | c[key].push(component); 555 | }else { 556 | c[key] = [component]; 557 | } 558 | _this._dependent(cid, key); 559 | api$$1.defineProperty(com, key, { 560 | get: function() { 561 | return getStore(key) 562 | } 563 | }); 564 | }; 565 | 566 | if (component instanceof Component) { 567 | if(isString(storeName)){ 568 | depfn(component, storeName); 569 | }else if (isArray(storeName)){ 570 | for(var i =0; i < storeName.length; i++ ) { 571 | depfn(component, storeName[i]); 572 | } 573 | } 574 | //render vdom 575 | this.mount(component.el, component); 576 | } 577 | } 578 | 579 | function dependent (cid, sname) { 580 | var i = this.dependManage[cid]; 581 | 582 | if (i && i.length>0) { 583 | i.push(sname); 584 | }else { 585 | this.dependManage[cid] = [sname]; 586 | } 587 | } 588 | 589 | function mount (parent,component) { 590 | var vnode = component.render(); 591 | var d = createEle(vnode); 592 | component.vdom = vnode; 593 | api$$1.appendChild(parent, d.el); 594 | } 595 | 596 | function baseInit (Aoy) { 597 | Aoy.prototype._init = function(arg) { 598 | 599 | this.dependManage = Object.create(null); 600 | this._initStore(); 601 | }; 602 | 603 | Aoy.prototype._initStore = initStore$$1; 604 | 605 | Aoy.prototype.createComponent = createComponent$$1; 606 | 607 | Aoy.prototype.connect = connect; 608 | 609 | Aoy.prototype._dependent = dependent; 610 | 611 | Aoy.prototype.mount = mount; 612 | 613 | Aoy.prototype.el = el$$1; 614 | 615 | Aoy.prototype.patch = patch$$1; 616 | 617 | } 618 | 619 | function AoyC () { 620 | if (this instanceof AoyC) { 621 | this._init(); 622 | } 623 | } 624 | 625 | function init () { 626 | baseInit(AoyC); 627 | return new AoyC() 628 | } 629 | 630 | exports.init = init; 631 | exports.el = el$$1; 632 | 633 | Object.defineProperty(exports, '__esModule', { value: true }); 634 | 635 | }))); 636 | //# sourceMappingURL=aoy.js.map 637 | -------------------------------------------------------------------------------- /dist/aoy.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"aoy.js","sources":["../src/util/console.js","../src/util/is.js","../src/util/help.js","../src/vdom/vnode.js","../src/vdom/diff.js","../src/vdom/createVdom.js","../src/vdom/createEle.js","../src/vdom/el.js","../src/util/api.js","../src/store/injectStore.js","../src/store/initStore.js","../src/store/Store.js","../src/component/createComponent.js","../src/component/Component.js","../src/store/connect.js","../src/store/dependent.js","../src/render/mount.js","../src/instance/baseInit.js","../src/instance/Aoy.js"],"sourcesContent":["export function error (info) {\n\tif (typeof console !== 'undeifine') {\n\t\tconsole.error(info)\n\t}\n}\nexport function warn (info) {\n\tif (typeof console !== 'undeifine') {\n\t\tconsole.warn(info)\n\t}\n}","function judge (o) {\n\treturn Object.prototype.toString.call(o)\n}\n\nexport function isArray (arr) {\n\treturn judge(arr) === '[object Array]'\n}\n\nexport function isObject (o) {\n\treturn judge(o) === '[object Object]'\n}\n\nexport function isFunction (f) {\n\treturn typeof f === 'function'\n}\t\n\nexport function isString (s) {\n\treturn typeof s === 'string'\n}\n\nexport function isNumber (n) {\n\treturn typeof n === 'number'\n}\n\n\n\n\n\n\n","export function toArray (arr) {\n\treturn [].slice.call(arr)\n}\n","export function Vdom () {\n\tthis.tagName = null\n\tthis.sel = null\n\tthis.id = null\n\tthis.className = []\n\tthis.children = null\n\tthis.el = null\n\tthis.data = null\n\tthis.key = null\n\tthis.text = null\n\tthis.attr = []\n\tthis.store = null\n}\n","import { api, isArray} from '../util/index'\nimport { createEle, updateEle } from './index'\n\nfunction sameVnode(oldVnode, vnode){\n\treturn vnode.key === oldVnode.key && vnode.sel === oldVnode.sel\n}\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\n var i, map = {}, key, ch\n for (i = beginIdx; i <= endIdx; ++i) {\n ch = children[i]\n if (ch != null) {\n key = ch.key\n if (key !== null)\n map[key] = i\n }\n }\n return map\n}\nfunction removeVnodes (parentElm, vnodes, startIdx, endIdx) {\n for ( ;startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx]\n if (ch != null) {\n api.removeChild(parentElm, ch.el)\n }\n }\n }\nfunction addVnodes (parentElm, before, vnodes, startIdx, endIdx) {\n for ( ;startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx]\n if (ch != null) {\n api.insertBefore(parentElm, createEle(ch).el, before)\n }\n }\n } \nfunction patchVnode (oldVnode, vnode) {\n\tconst el = vnode.el = oldVnode.el\n let i, oldCh = oldVnode.children, ch = vnode.children\n if (oldVnode === vnode) return\n \n if (oldVnode.text !== null && vnode.text !== null && oldVnode.text !== vnode.text) {\n api.setTextContent(el, vnode.text)\n }else {\n updateEle(el, vnode, oldVnode)\n \tif (oldCh && ch && oldCh !== ch) {\n\t \tupdateChildren(el, oldCh, ch)\n\t }else if (ch){\n\t \tcreateEle(vnode) //create el's children dom\n\t }else if (oldCh){\n\t \tapi.removeChildren(el)\n\t }\n }\n}\n\nfunction updateChildren (parentElm, oldCh, newCh) {\n\tlet oldStartIdx = 0, newStartIdx = 0\n let oldEndIdx = oldCh.length - 1\n let oldStartVnode = oldCh[0]\n let oldEndVnode = oldCh[oldEndIdx]\n let newEndIdx = newCh.length - 1\n let newStartVnode = newCh[0]\n let newEndVnode = newCh[newEndIdx]\n let oldKeyToIdx\n let idxInOld\n let elmToMove\n let before\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (oldStartVnode == null) {\n oldStartVnode = oldCh[++oldStartIdx] // Vnode might have been moved left\n }else if (oldEndVnode == null) {\n oldEndVnode = oldCh[--oldEndIdx]\n }else if (newStartVnode == null) {\n newStartVnode = newCh[++newStartIdx]\n }else if (newEndVnode == null) {\n newEndVnode = newCh[--newEndIdx]\n }else if (sameVnode(oldStartVnode, newStartVnode)) {\n patchVnode(oldStartVnode, newStartVnode)\n oldStartVnode = oldCh[++oldStartIdx]\n newStartVnode = newCh[++newStartIdx]\n }else if (sameVnode(oldEndVnode, newEndVnode)) {\n patchVnode(oldEndVnode, newEndVnode)\n oldEndVnode = oldCh[--oldEndIdx]\n newEndVnode = newCh[--newEndIdx]\n }else if (sameVnode(oldStartVnode, newEndVnode)) {\n patchVnode(oldStartVnode, newEndVnode)\n api.insertBefore(parentElm, oldStartVnode.el, api.nextSibling(oldEndVnode.el))\n oldStartVnode = oldCh[++oldStartIdx]\n newEndVnode = newCh[--newEndIdx]\n }else if (sameVnode(oldEndVnode, newStartVnode)) {\n patchVnode(oldEndVnode, newStartVnode)\n api.insertBefore(parentElm, oldEndVnode.el, oldStartVnode.el)\n oldEndVnode = oldCh[--oldEndIdx]\n newStartVnode = newCh[++newStartIdx]\n }else {\n if (oldKeyToIdx === undefined) {\n oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)\n }\n idxInOld = oldKeyToIdx[newStartVnode.key]\n if (!idxInOld) {\n api.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el)\n newStartVnode = newCh[++newStartIdx]\n }\n else {\n elmToMove = oldCh[idxInOld]\n if (elmToMove.sel !== newStartVnode.sel) {\n api.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el)\n }else {\n patchVnode(elmToMove, newStartVnode)\n oldCh[idxInOld] = null\n api.insertBefore(parentElm, elmToMove.el, oldStartVnode.el)\n }\n newStartVnode = newCh[++newStartIdx]\n }\n }\n }\n if (oldStartIdx > oldEndIdx) {\n before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].el\n addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx)\n }else if (newStartIdx > newEndIdx) {\n removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx)\n }\n}\n\nexport function patch (oldVnode, vnode) {\n\tif (sameVnode(oldVnode, vnode)) {\n\t\tpatchVnode(oldVnode, vnode)\n\t} else {\n\t\tconst oEl = oldVnode.el\n\t\tlet parentEle = api.parentNode(oEl)\n\t\tcreateEle(vnode)\n\t\tif (parentEle !== null) {\n\t\t\tapi.insertBefore(parentEle, vnode.el, api.nextSibling(oEl))\n\t\t\tapi.removeChild(parentEle, oldVnode.el)\n\t\t\toldVnode = null\n\t\t}\n\t}\n\treturn vnode\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","import { isString, isObject, isArray, isNumber, api } from '../util/index'\nimport { Vdom, createEle } from './index'\n\nfunction parseQuery (vdom, query) {\n\tlet k,state = 0,j = 0\n\tvdom.sel = query\n\n\tfor(let i = 0, len = query.length; i < len; i++) {\n\t\tlet char = query[i]\n\t\t\tif (char === '.' || char === '#' || (k = i === len-1)) {\n\t\t\t\tif (state === 0) {\n\t\t\t\t\tvdom.tagName = query.substring(j, !k ? i : len).toUpperCase()\n\t\t\t\t}else if (state === 1) {\n\t\t\t\t\tvdom.className.push(query.substring(j, !k ? i : len))\n\t\t\t\t}else if (state === 2) {\n\t\t\t\t\tvdom.id = query.substring(j, !k ? i : len)\n\t\t\t\t}\n\t\t\t\tstate = (char === '.') ? 1 : (char === '#')? 2 : 3\n\t\t\t\tj = i+1\n\t\t\t}\t\t\n\n\t}\n\t\n}\n\nfunction parseData (vdom, v) {\n\tfor(let k in v) {\n\t\tif (k === 'class'){\n\t\t\tlet i = v[k].split(' ')\n\t\t\tfor(let j = 0; j < i.length; j++) {\n\t\t\t\tvdom.className.push(i[j])\n\t\t\t}\n\t\t}else if (k === 'key') {\n\t\t\tvdom.key = v[k]\n\t\t}else if (k !== 'style') {\n\t\t\tvdom.attr.push(k)\t\n\t\t}\n\t}\n\tvdom.data = v\n}\n\nfunction parseChindren (vdom, v) {\n\tlet a = []\n\tif (isString(v) || isNumber(v)) v = [v]\n\tfor (let i = 0; i < v.length; i++) {\n\t\tif (!(v[i] instanceof Vdom)) {\n\t\t\ta.push(createVdomTxt(v[i]))\n\t\t}else {\n\t\t\ta.push(v[i])\n\t\t}\n\t}\n\tvdom.children = a\n}\nexport function createVdomTxt (str) {\n\tlet vd = new Vdom()\n\tif(isString(str) || isNumber(str)) {\n\t\tvd.text = str\n\t}\n\treturn vd\n}\nexport function createVdom (arg) {\n\tlet i=0,\n\t\tvd = new Vdom()\n\n\twhile(i < arg.length) {\n\t\tlet v = arg[i]\n\t\tif (i === 0 && isString(v)) {\n\t\t\t// div#id.classA\n\t\t\tparseQuery(vd, v)\n\t\t}else if (i != 0){\n\t\t\tif(isObject(v)) {\n\t\t\t\t// class style clickEvent .ect\n\t\t\t\tparseData(vd, v)\n\t\t\t}else if (isArray(v) || isString(v) || isNumber(v)) {\n\t\t\t\t// childern\n\t\t\t\tparseChindren(vd, v)\n\t\t\t}\n\t\t}\n\t\ti++\n\t}\n\treturn vd\n}","import { api, isObject, isString } from '../util/index'\n\nexport function createEle (vdom) {\n\tlet i, e \n\tif( !vdom.el && (i = vdom.text)) {\n\t\te = vdom.el = api.createTextNode(i)\n\t\treturn vdom\n\t} \n\tif ( (i = vdom.tagName) && vdom.el === null) {\n\t\te = vdom.el = api.createElement(i)\n\t}else if (vdom.el.nodeType === 1) {\n\t\te = vdom.el\n\t}\n\tupdateEle(e, vdom)\n\treturn vdom\n}\n\nexport function updateEle (e ,vdom, oldVdom) {\n\tlet i\n\tif( (i = vdom.className).length > 0 ) api.setClass(e, i)\n\tif( (i = vdom.data) !== null ) api.setAttrs(e, i)\n\tif( (i = vdom.id) !== null ) api.setId(e, i)\n\tif( (i = vdom.children) !== null && !oldVdom) api.appendChildren(e, i)\n}\n","import { toArray, isArray, error } from '../util/index'\nimport { createVdom } from './index'\n\nexport function el () {\n\t\tconst arg = toArray(arguments)\n\n\t\tif (arg.length === 0) {\n\t\t\terror('Parameter cannot be empty')\n\t\t\treturn false\n\t\t}\n\t\tif (isArray(arg) && arg.length > 0) {\n\t\t\treturn createVdom.call(this, arg)\n\t\t}\t\n\t}\n\t","import { error, isArray, isObject, isString } from './index'\nimport { Vdom, createEle } from '../vdom/index'\n\nexport let api = Object.create(null)\n\n\tapi.createElement = function (tag) {\n\t\treturn document.createElement(tag)\n\t} \n\tapi.createTextNode = function (txt) {\n\t\treturn document.createTextNode(txt)\n\t}\n\tapi.appendChild = function (parent, child) {\n\t\treturn parent.appendChild(child)\n\t}\n\tapi.parentNode = function (node) {\n\t\treturn node.parentNode\n\t}\n\tapi.insertBefore = function (parent, newNode, rf) {\n\t\treturn parent.insertBefore(newNode, rf)\n\t}\n\tapi.nextSibling = function (el) {\n\t\treturn el.nextSibling\n\t}\n\tapi.removeChild = function (parent, rc) {\n\t\treturn parent.removeChild(rc)\n\t}\n\tapi.setTextContent = function (ele, txt) {\n\t\tele.textContent = txt\n\t}\n\tapi.setId = function (ele, id) {\n\t\tele.id = id\n\t}\n\tapi.defineProperty = function (obj, prop, descriptor) {\n\t\tObject.defineProperty(obj, prop, descriptor)\n\t}\n\tapi.appendChildren = function (ele, children) {\n\t\tif(ele && isArray(children)) {\n\t\t\tfor(let i = 0; i < children.length; i++) {\n\t\t\t\tlet c\n\t\t\t\tif (children[i] instanceof Vdom) {\n\t\t\t\t\tc = children[i].el || createEle(children[i]).el\n\t\t\t\t}\n\t\t\t\tthis.appendChild(ele, c)\n\t\t\t}\n\t\t}\n\t}\n\tapi.setClass = function (ele, c) {\n\t\tif(ele && isArray(c)) {\n\t\t\tlet k = ''\n\t\t\tfor(let i = 0; i < c.length; i++) {\n\t\t\t\t//ele.classList.add(c[i])\n\t\t\t\tif(i !== c.length-1){\n\t\t\t\t\tk += c[i] + ' '\n\t\t\t\t}else{\n\t\t\t\t\tk += c[i]\n\t\t\t\t}\n\t\t\t}\n\t\t\tele.className = k\n\t\t}\n\t}\n\tapi.setAttrs = function (ele, a) {\n\t\tif(ele && isObject(a)) {\n\t\t\tfor(let k in a) {\n\t\t\t\tif (k === 'class') continue\n\t\t\t\tlet s = a[k]\n\t\t\t\tif (k === 'style' && isObject(s)) {\n\t\t\t\t\tfor(let j in s) {\n\t\t\t\t\t\tele.style[j] = s[j]\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tele[k] = s\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tapi.removeChildren = function (ele) {\n\t\tlet i, ch = ele.childNodes\n\t\twhile(ch[0]) {\n\t\t\tthis.removeChild(ele, ch[0])\n\t\t}\n\t}\n\n\n\n\n\n\n\n\n\n\n\n\n\n","import { isObject, error, api, warn } from '../util/index'\nimport { patch } from '../vdom/index'\n\nexport function injectStore (store, key, data, context) {\n\tlet archiver\n\tif(isObject(data)){\n\t\tstore[key] = data\n\t\tarchiver = new Archiver(data,key,context)\n\t\tfor(let k in data) {\n\t\t\tarchiver(k)\n\t\t}\n\t}\n\treturn data\n}\n\nfunction Archiver (data, sname, context) {\n let c\n let storage = {}\n let cm = context.componentManage\n let devc = function (c) {\n\t\tc.forEach( function(v, i) {\n\t\t\tlet newVn = v.render()\n\t\t\tpatch(v.vdom, newVn)\n\t\t\tv.vdom = newVn\n\t\t})\n }\n let des = function(key) {\n\t return {\n\t \t\t get: function() {\n\t\t\t return storage[key]\n\t\t\t },\n\t\t\t set: function(value) {\n\t\t\t storage[key] = value\n\t\t\t if (c = cm[sname]) {\n\t\t\t \t\t devc(c)\n\t\t\t }\n\t\t\t }\n\t \t\t}\n }\n api.defineProperty(data, 'set', {\n \tvalue: function () {\n \t\tlet o\n \t\tif (isObject(o = arguments[0])) {\n \t\t\tfor(let k in o){\n \t\t\t\tif(!storage.hasOwnProperty(k)) {\n \t\t\t\t\tapi.defineProperty(data, k, des(k))\n \t\t\t\t}\n \t\t\t\tstorage[k] = o[k]\n \t\t\t}\n \t\t\tif(c = cm[sname]) {\n\t\t\t \t\t devc(c)\n\t\t\t \t}\n \t\t}else{\n \t\t\terror(\"set function's parameter must be a object\")\n \t\t}\n \t}\n })\n return function (key) {\n \t\tstorage[key] = data[key]\n\t \tapi.defineProperty(data, key, des(key))\n\t}\n}\n\n\n\n\n\n\n\n\n\n","import { isObject, warn } from '../util/index'\nimport { injectStore, Store } from './index'\nimport { AoyC } from '../instance/Aoy'\n\nexport function initStore () {\n\tlet STORE = new Store()\n\tlet archiver\n\tif (this instanceof AoyC && !this._FINALSTORE) {\n\t\tObject.defineProperty(this, 'store', {\n\t\t\tset: function (value) {\n\t\t\t\twarn('Not allowed to modify store')\n\t\t\t},\n\t\t\tget: function () {\n\t\t\t\treturn STORE\n\t\t\t}\n\t\t})\n\t\tObject.defineProperty(this, '_FINALSTORE', {\n\t\t\tvalue: true\n\t\t})\n\t}else{\n\t\twarn('Not Aoy instance or Already init store')\n\t}\n\t//return STORE\n\treturn this\n}\n\n\n\n\n\n\n","import { toArray, isString, isObject, error, api } from '../util/index'\nimport { injectStore } from './index'\n\n\nexport function Store () {\n\tlet mainStore = {}\n\tthis.componentManage = {}\n\tthis.add = function () {\n\t\tconst arg = toArray(arguments)\n\t\tlet subStore\n\t\tif(arg.length > 0) {\n\t\t const iskey = isString(arg[0])\n\t\t const isdata = isObject(arg[1])\n\t\t const iskeyobj = isObject(arg[0])\n\n\t\t if(iskey && isdata) {\n\t\t \t\tsubStore = injectStore(mainStore, arg[0], arg[1], this)\n\t\t\t}else if (iskeyobj) {\t\n\t\t\t\tsubStore = injectStore(mainStore, '_DEFAULT', arg[0], this)\n\t\t\t}else {\n\t\t\t\terror('Missing key or data parameter')\n\t\t\t}\n\t\t}\n\t\treturn subStore\n\t}\n\n\tthis.get = function (key) {\n\t\tif (key === undefined) {\n\t\t\tkey = '_DEFAULT'\n\t\t}\n\t\treturn mainStore[key]\n\t}\n\n\tthis.getMainStore = function () {\n\t\treturn mainStore\n\t}\n\n\tthis.remove = function (key) {\n\t\tif(key === undefined){\n\t\t\tkey = '_DEFAULT'\n\t\t}\n\t\tdelete mainStore[key]\n\t}\n}\n\n\n\n\n\n\n\n\n\n\n","import { isObject, api } from '../util/index'\nimport { Component } from './index'\nlet uid = 0\n\nexport function createComponent (cp) {\n let c\n let _this = this\n let cid = uid++\n return (function () {\n if (isObject(cp)) {\n\t\tc = new Component(cp)\n\t\tapi.defineProperty(c, 'aoy', {\n\t\t\tvalue: _this\n\t\t})\n\t\tapi.defineProperty(c, '_UID', {\n\t\t\tvalue: cid\n\t\t})\n\t}\n\treturn c\n }())\n}\n","import { isObject } from '../util/index'\n\nexport function Component (op) {\n if (isObject(op)) {\n for (let k in op) {\n this[k] = op[k]\n }\n }\n}\n","import { isArray, isString, api } from '../util/index'\nimport { Component } from '../component/index'\n\nexport function connect (component, storeName) {\n\tlet store = this.store\n\tlet c = store.componentManage\n\n\tlet getStore = store.get\n\tlet cid = component._UID\n\n\tlet _this = this\n\tlet depfn = function(com, key) {\n\t\tif ( c[key]) {\n\t\t\tc[key].push(component)\n\t\t}else {\n\t\t\tc[key] = [component]\n\t\t}\n\t\t_this._dependent(cid, key)\n\t\tapi.defineProperty(com, key, {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn getStore(key)\n\t\t\t\t} \n\t\t\t})\n\t}\n\n\tif (component instanceof Component) {\n\t\tif(isString(storeName)){\n\t\t\tdepfn(component, storeName)\n\t\t}else if (isArray(storeName)){\n\t\t\tfor(let i =0; i < storeName.length; i++ ) {\n\t\t\t\tdepfn(component, storeName[i])\n\t\t\t}\n\t\t}\n\t\t//render vdom\n\t\tthis.mount(component.el, component)\n\t}\n}","export function dependent (cid, sname) {\n\tlet i = this.dependManage[cid]\n\t\n\tif (i && i.length>0) {\n\t\ti.push(sname)\n\t}else {\n\t\tthis.dependManage[cid] = [sname]\n\t}\n}","import { createVdom, createEle, patch } from '../vdom/index'\nimport { api, isFunction } from '../util/index'\nexport function mount (parent,component) {\n\tconst vnode = component.render()\n\tconst d = createEle(vnode)\n\tcomponent.vdom = vnode\n\tapi.appendChild(parent, d.el)\n}\n","import { isArray, error, toArray, api, warn } from '../util/index'\nimport { createVdom, createEle, patch, el } from '../vdom/index'\nimport { injectStore, initStore, connect, dependent } from '../store/index'\nimport { createComponent } from '../component/index'\nimport { mount } from '../render/index'\n\nexport function baseInit (Aoy) {\n\tAoy.prototype._init = function(arg) {\n\n\t\tthis.dependManage = Object.create(null)\n\t\tthis._initStore()\n\t}\n\t\n\tAoy.prototype._initStore = initStore\n\n\tAoy.prototype.createComponent = createComponent\n\n\tAoy.prototype.connect = connect\n\n\tAoy.prototype._dependent = dependent\n\n\tAoy.prototype.mount = mount\n\n\tAoy.prototype.el = el\n\n\tAoy.prototype.patch = patch\n\n}\n\n\n\n\n","import { baseInit } from './baseInit'\nimport { toArray} from '../util/index'\n\nexport function AoyC () {\n\tif (this instanceof AoyC) {\n\t\tthis._init()\n\t}\t\n}\n\nexport function init () {\n\tbaseInit(AoyC)\n\treturn new AoyC()\n}\n"],"names":["api","const","el","let","patch","createVdomTxt","createVdom","this","initStore","Store","createComponent"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/aoy.min.js: -------------------------------------------------------------------------------- 1 | !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(e.Aoy=e.Aoy||{})}(this,function(e){"use strict";function n(e){"undeifine"!=typeof console&&console.error(e)}function t(e){"undeifine"!=typeof console&&console.warn(e)}function r(e){return Object.prototype.toString.call(e)}function i(e){return"[object Array]"===r(e)}function o(e){return"[object Object]"===r(e)}function l(e){return"string"==typeof e}function u(e){return"number"==typeof e}function f(e){return[].slice.call(e)}function a(){this.tagName=null,this.sel=null,this.id=null,this.className=[],this.children=null,this.el=null,this.data=null,this.key=null,this.text=null,this.attr=[],this.store=null}function s(e,n){return n.key===e.key&&n.sel===e.sel}function c(e,n,t){var r,i,o,l={};for(r=n;r<=t;++r)null!=(o=e[r])&&null!==(i=o.key)&&(l[i]=r);return l}function d(e,n,t,r){for(;t<=r;++t){var i=n[t];null!=i&&D.removeChild(e,i.el)}}function h(e,n,t,r,i){for(;r<=i;++r){var o=t[r];null!=o&&D.insertBefore(e,N(o).el,n)}}function p(e,n){var t=n.el=e.el,r=e.children,i=n.children;e!==n&&(null!==e.text&&null!==n.text&&e.text!==n.text?D.setTextContent(t,n.text):(_(t,n,e),r&&i&&r!==i?v(t,r,i):i?N(n):r&&D.removeChildren(t)))}function v(e,n,t){for(var r,i,o,l,u=0,f=0,a=n.length-1,v=n[0],y=n[a],g=t.length-1,m=t[0],b=t[g];u<=a&&f<=g;)null==v?v=n[++u]:null==y?y=n[--a]:null==m?m=t[++f]:null==b?b=t[--g]:s(v,m)?(p(v,m),v=n[++u],m=t[++f]):s(y,b)?(p(y,b),y=n[--a],b=t[--g]):s(v,b)?(p(v,b),D.insertBefore(e,v.el,D.nextSibling(y.el)),v=n[++u],b=t[--g]):s(y,m)?(p(y,m),D.insertBefore(e,y.el,v.el),y=n[--a],m=t[++f]):(void 0===r&&(r=c(n,u,a)),i=r[m.key],i?(o=n[i],o.sel!==m.sel?D.insertBefore(e,N(m).el,v.el):(p(o,m),n[i]=null,D.insertBefore(e,o.el,v.el)),m=t[++f]):(D.insertBefore(e,N(m).el,v.el),m=t[++f]));u>a?(l=null==t[g+1]?null:t[g+1].el,h(e,l,t,f,g)):f>g&&d(e,n,u,a)}function y(e,n){if(s(e,n))p(e,n);else{var t=e.el,r=D.parentNode(t);N(n),null!==r&&(D.insertBefore(r,n.el,D.nextSibling(t)),D.removeChild(r,e.el),e=null)}return n}function g(e,n){var t,r=0,i=0;e.sel=n;for(var o=0,l=n.length;o0&&D.setClass(e,r),null!==(r=n.data)&&D.setAttrs(e,r),null!==(r=n.id)&&D.setId(e,r),null===(r=n.children)||t||D.appendChildren(e,r)}function P(){var e=f(arguments);return 0===e.length?(n("Parameter cannot be empty"),!1):i(e)&&e.length>0?C.call(this,e):void 0}function j(e,n,t,r){var i;if(o(t)){e[n]=t,i=new A(t,n,r);for(var l in t)i(l)}return t}function A(e,t,r){var i,l={},u=r.componentManage,f=function(e){e.forEach(function(e,n){var t=e.render();y(e.vdom,t),e.vdom=t})},a=function(e){return{get:function(){return l[e]},set:function(n){l[e]=n,(i=u[t])&&f(i)}}};return D.defineProperty(e,"set",{value:function(){var r;if(o(r=arguments[0])){for(var s in r)l.hasOwnProperty(s)||D.defineProperty(e,s,a(s)),l[s]=r[s];(i=u[t])&&f(i)}else n("set function's parameter must be a object")}}),function(n){l[n]=e[n],D.defineProperty(e,n,a(n))}}function O(){var e=new T;return this instanceof I&&!this._FINALSTORE?(Object.defineProperty(this,"store",{set:function(e){t("Not allowed to modify store")},get:function(){return e}}),Object.defineProperty(this,"_FINALSTORE",{value:!0})):t("Not Aoy instance or Already init store"),this}function T(){var e={};this.componentManage={},this.add=function(){var t,r=f(arguments);if(r.length>0){var i=l(r[0]),u=o(r[1]),a=o(r[0]);i&&u?t=j(e,r[0],r[1],this):a?t=j(e,"_DEFAULT",r[0],this):n("Missing key or data parameter")}return t},this.get=function(n){return void 0===n&&(n="_DEFAULT"),e[n]},this.getMainStore=function(){return e},this.remove=function(n){void 0===n&&(n="_DEFAULT"),delete e[n]}}function S(e){var n,t=this,r=F++;return function(){return o(e)&&(n=new w(e),D.defineProperty(n,"aoy",{value:t}),D.defineProperty(n,"_UID",{value:r})),n}()}function w(e){var n=this;if(o(e))for(var t in e)n[t]=e[t]}function B(e,n){var t=this.store,r=t.componentManage,o=t.get,u=e._UID,f=this,a=function(n,t){r[t]?r[t].push(e):r[t]=[e],f._dependent(u,t),D.defineProperty(n,t,{get:function(){return o(t)}})};if(e instanceof w){if(l(n))a(e,n);else if(i(n))for(var s=0;s0?t.push(n):this.dependManage[e]=[n]}function M(e,n){var t=n.render(),r=N(t);n.vdom=t,D.appendChild(e,r.el)}function k(e){e.prototype._init=function(e){this.dependManage=Object.create(null),this._initStore()},e.prototype._initStore=O,e.prototype.createComponent=S,e.prototype.connect=B,e.prototype._dependent=E,e.prototype.mount=M,e.prototype.el=P,e.prototype.patch=y}function I(){this instanceof I&&this._init()}function U(){return k(I),new I}var D=Object.create(null);D.createElement=function(e){return document.createElement(e)},D.createTextNode=function(e){return document.createTextNode(e)},D.appendChild=function(e,n){return e.appendChild(n)},D.parentNode=function(e){return e.parentNode},D.insertBefore=function(e,n,t){return e.insertBefore(n,t)},D.nextSibling=function(e){return e.nextSibling},D.removeChild=function(e,n){return e.removeChild(n)},D.setTextContent=function(e,n){e.textContent=n},D.setId=function(e,n){e.id=n},D.defineProperty=function(e,n,t){Object.defineProperty(e,n,t)},D.appendChildren=function(e,n){var t=this;if(e&&i(n))for(var r=0;r 2 | 3 | 4 | input demo 5 | 6 | 7 | 8 | 9 | 10 | 51 | -------------------------------------------------------------------------------- /example/tableSort.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | table sort demo 5 | 6 | 20 | 21 | 22 | 23 | 24 | 90 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'), 2 | uglify = require('gulp-uglify'), 3 | rename = rename = require('gulp-rename'); 4 | gulp.task('jsmin', function () { 5 | gulp.src('dist/aoy.js') 6 | .pipe(uglify()) 7 | .pipe(rename({ suffix: '.min' })) 8 | .pipe(gulp.dest('./dist')); 9 | }); -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = require('./dist/aoy.js'); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aoy", 3 | "version": "1.0.5", 4 | "description": "Tiny JavaScript MVVM library with Virtual DOM. It has only ~600 lines of code.", 5 | "main": "index.js", 6 | "scripts": { 7 | "build-es": "rollup -c -n Aoy -f es -i src/index.js -o dist/aoy.es.js", 8 | "build": "npm run build-es && rollup -c -n Aoy -f umd -i src/index.js -o dist/aoy.js && gulp jsmin", 9 | "test": "node_modules/.bin/mocha --compilers js:babel-core/register --reporter spec --slow 50 --timeout 60000", 10 | "cover": "node_modules/.bin/istanbul cover node_modules/.bin/_mocha -- -u exports --compilers js:babel-register --timeout 60000" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/aooy/aoy.git" 15 | }, 16 | "keywords": [ 17 | "virtual-dom", 18 | "mvvm", 19 | "tiny library" 20 | ], 21 | "author": "YangJingZhuo", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/aooy/aoy/issues" 25 | }, 26 | "dependencies": {}, 27 | "devDependencies": { 28 | "babel-core": "^6.24.0", 29 | "babel-preset-es2015": "^6.22.0", 30 | "chai": "^3.4.1", 31 | "coveralls": "^2.11.9", 32 | "gulp": "^3.9.1", 33 | "gulp-rename": "^1.2.2", 34 | "gulp-uglify": "^2.1.0", 35 | "istanbul": "^1.0.0-alpha.2", 36 | "jsdom": "^9.12.0", 37 | "mocha": "*", 38 | "rollup": "^0.41.5", 39 | "rollup-plugin-buble": "~0.15.0", 40 | "rollup-watch": "^3.2.2", 41 | "sinon": "^2.0.0-pre.6", 42 | "sinon-chai": "^2.8.0" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | 2 | import buble from 'rollup-plugin-buble'; 3 | 4 | export default { 5 | plugins: [ 6 | buble() 7 | ], 8 | entry: 'src/index.js', 9 | dest: 'dist/aoy.js', 10 | format: 'umd', 11 | moduleName: 'index', 12 | sourceMap: true 13 | }; -------------------------------------------------------------------------------- /src/component/Component.js: -------------------------------------------------------------------------------- 1 | import { isObject } from '../util/index' 2 | 3 | export function Component (op) { 4 | if (isObject(op)) { 5 | for (let k in op) { 6 | this[k] = op[k] 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/component/createComponent.js: -------------------------------------------------------------------------------- 1 | import { isObject, api } from '../util/index' 2 | import { Component } from './index' 3 | let uid = 0 4 | 5 | export function createComponent (cp) { 6 | let c 7 | let _this = this 8 | let cid = uid++ 9 | return (function () { 10 | if (isObject(cp)) { 11 | c = new Component(cp) 12 | api.defineProperty(c, 'aoy', { 13 | value: _this 14 | }) 15 | api.defineProperty(c, '_UID', { 16 | value: cid 17 | }) 18 | } 19 | return c 20 | }()) 21 | } 22 | -------------------------------------------------------------------------------- /src/component/index.js: -------------------------------------------------------------------------------- 1 | export * from './createComponent' 2 | export * from './Component' -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | export { init } from './instance/Aoy' 2 | export { el } from './vdom/index' 3 | -------------------------------------------------------------------------------- /src/instance/Aoy.js: -------------------------------------------------------------------------------- 1 | import { baseInit } from './baseInit' 2 | import { toArray} from '../util/index' 3 | 4 | export function AoyC () { 5 | if (this instanceof AoyC) { 6 | this._init() 7 | } 8 | } 9 | 10 | export function init () { 11 | baseInit(AoyC) 12 | return new AoyC() 13 | } 14 | -------------------------------------------------------------------------------- /src/instance/baseInit.js: -------------------------------------------------------------------------------- 1 | import { isArray, error, toArray, api, warn } from '../util/index' 2 | import { createVdom, createEle, patch, el } from '../vdom/index' 3 | import { injectStore, initStore, connect, dependent } from '../store/index' 4 | import { createComponent } from '../component/index' 5 | import { mount } from '../render/index' 6 | 7 | export function baseInit (Aoy) { 8 | Aoy.prototype._init = function(arg) { 9 | 10 | this.dependManage = Object.create(null) 11 | this._initStore() 12 | } 13 | 14 | Aoy.prototype._initStore = initStore 15 | 16 | Aoy.prototype.createComponent = createComponent 17 | 18 | Aoy.prototype.connect = connect 19 | 20 | Aoy.prototype._dependent = dependent 21 | 22 | Aoy.prototype.mount = mount 23 | 24 | Aoy.prototype.el = el 25 | 26 | Aoy.prototype.patch = patch 27 | 28 | } 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/render/index.js: -------------------------------------------------------------------------------- 1 | export * from './mount.js' 2 | -------------------------------------------------------------------------------- /src/render/mount.js: -------------------------------------------------------------------------------- 1 | import { createVdom, createEle, patch } from '../vdom/index' 2 | import { api, isFunction } from '../util/index' 3 | export function mount (parent,component) { 4 | const vnode = component.render() 5 | const d = createEle(vnode) 6 | component.vdom = vnode 7 | api.appendChild(parent, d.el) 8 | } 9 | -------------------------------------------------------------------------------- /src/store/Store.js: -------------------------------------------------------------------------------- 1 | import { toArray, isString, isObject, error, api } from '../util/index' 2 | import { injectStore } from './index' 3 | 4 | 5 | export function Store () { 6 | let mainStore = {} 7 | this.componentManage = {} 8 | this.add = function () { 9 | const arg = toArray(arguments) 10 | let subStore 11 | if(arg.length > 0) { 12 | const iskey = isString(arg[0]) 13 | const isdata = isObject(arg[1]) 14 | const iskeyobj = isObject(arg[0]) 15 | 16 | if(iskey && isdata) { 17 | subStore = injectStore(mainStore, arg[0], arg[1], this) 18 | }else if (iskeyobj) { 19 | subStore = injectStore(mainStore, '_DEFAULT', arg[0], this) 20 | }else { 21 | error('Missing key or data parameter') 22 | } 23 | } 24 | return subStore 25 | } 26 | 27 | this.get = function (key) { 28 | if (key === undefined) { 29 | key = '_DEFAULT' 30 | } 31 | return mainStore[key] 32 | } 33 | 34 | this.getMainStore = function () { 35 | return mainStore 36 | } 37 | 38 | this.remove = function (key) { 39 | if(key === undefined){ 40 | key = '_DEFAULT' 41 | } 42 | delete mainStore[key] 43 | } 44 | } 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/store/connect.js: -------------------------------------------------------------------------------- 1 | import { isArray, isString, api } from '../util/index' 2 | import { Component } from '../component/index' 3 | 4 | export function connect (component, storeName) { 5 | let store = this.store 6 | let c = store.componentManage 7 | 8 | let getStore = store.get 9 | let cid = component._UID 10 | 11 | let _this = this 12 | let depfn = function(com, key) { 13 | if ( c[key]) { 14 | c[key].push(component) 15 | }else { 16 | c[key] = [component] 17 | } 18 | _this._dependent(cid, key) 19 | api.defineProperty(com, key, { 20 | get: function() { 21 | return getStore(key) 22 | } 23 | }) 24 | } 25 | 26 | if (component instanceof Component) { 27 | if(isString(storeName)){ 28 | depfn(component, storeName) 29 | }else if (isArray(storeName)){ 30 | for(let i =0; i < storeName.length; i++ ) { 31 | depfn(component, storeName[i]) 32 | } 33 | } 34 | //render vdom 35 | this.mount(component.el, component) 36 | } 37 | } -------------------------------------------------------------------------------- /src/store/dependent.js: -------------------------------------------------------------------------------- 1 | export function dependent (cid, sname) { 2 | let i = this.dependManage[cid] 3 | 4 | if (i && i.length>0) { 5 | i.push(sname) 6 | }else { 7 | this.dependManage[cid] = [sname] 8 | } 9 | } -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | export * from './injectStore' 2 | export * from './initStore' 3 | export * from './Store' 4 | export * from './connect' 5 | export * from './dependent' 6 | -------------------------------------------------------------------------------- /src/store/initStore.js: -------------------------------------------------------------------------------- 1 | import { isObject, warn } from '../util/index' 2 | import { injectStore, Store } from './index' 3 | import { AoyC } from '../instance/Aoy' 4 | 5 | export function initStore () { 6 | let STORE = new Store() 7 | let archiver 8 | if (this instanceof AoyC && !this._FINALSTORE) { 9 | Object.defineProperty(this, 'store', { 10 | set: function (value) { 11 | warn('Not allowed to modify store') 12 | }, 13 | get: function () { 14 | return STORE 15 | } 16 | }) 17 | Object.defineProperty(this, '_FINALSTORE', { 18 | value: true 19 | }) 20 | }else{ 21 | warn('Not Aoy instance or Already init store') 22 | } 23 | //return STORE 24 | return this 25 | } 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/store/injectStore.js: -------------------------------------------------------------------------------- 1 | import { isObject, error, api, warn } from '../util/index' 2 | import { patch } from '../vdom/index' 3 | 4 | export function injectStore (store, key, data, context) { 5 | let archiver 6 | if(isObject(data)){ 7 | store[key] = data 8 | archiver = new Archiver(data,key,context) 9 | for(let k in data) { 10 | archiver(k) 11 | } 12 | } 13 | return data 14 | } 15 | 16 | function Archiver (data, sname, context) { 17 | let c 18 | let storage = {} 19 | let cm = context.componentManage 20 | let devc = function (c) { 21 | c.forEach( function(v, i) { 22 | let newVn = v.render() 23 | patch(v.vdom, newVn) 24 | v.vdom = newVn 25 | }) 26 | } 27 | let des = function(key) { 28 | return { 29 | get: function() { 30 | return storage[key] 31 | }, 32 | set: function(value) { 33 | storage[key] = value 34 | if (c = cm[sname]) { 35 | devc(c) 36 | } 37 | } 38 | } 39 | } 40 | api.defineProperty(data, 'set', { 41 | value: function () { 42 | let o 43 | if (isObject(o = arguments[0])) { 44 | for(let k in o){ 45 | if(!storage.hasOwnProperty(k)) { 46 | api.defineProperty(data, k, des(k)) 47 | } 48 | storage[k] = o[k] 49 | } 50 | if(c = cm[sname]) { 51 | devc(c) 52 | } 53 | }else{ 54 | error("set function's parameter must be a object") 55 | } 56 | } 57 | }) 58 | return function (key) { 59 | storage[key] = data[key] 60 | api.defineProperty(data, key, des(key)) 61 | } 62 | } 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /src/util/api.js: -------------------------------------------------------------------------------- 1 | import { error, isArray, isObject, isString } from './index' 2 | import { Vdom, createEle } from '../vdom/index' 3 | 4 | export let api = Object.create(null) 5 | 6 | api.createElement = function (tag) { 7 | return document.createElement(tag) 8 | } 9 | api.createTextNode = function (txt) { 10 | return document.createTextNode(txt) 11 | } 12 | api.appendChild = function (parent, child) { 13 | return parent.appendChild(child) 14 | } 15 | api.parentNode = function (node) { 16 | return node.parentNode 17 | } 18 | api.insertBefore = function (parent, newNode, rf) { 19 | return parent.insertBefore(newNode, rf) 20 | } 21 | api.nextSibling = function (el) { 22 | return el.nextSibling 23 | } 24 | api.removeChild = function (parent, rc) { 25 | return parent.removeChild(rc) 26 | } 27 | api.setTextContent = function (ele, txt) { 28 | ele.textContent = txt 29 | } 30 | api.setId = function (ele, id) { 31 | ele.id = id 32 | } 33 | api.defineProperty = function (obj, prop, descriptor) { 34 | Object.defineProperty(obj, prop, descriptor) 35 | } 36 | api.appendChildren = function (ele, children) { 37 | if(ele && isArray(children)) { 38 | for(let i = 0; i < children.length; i++) { 39 | let c 40 | if (children[i] instanceof Vdom) { 41 | c = children[i].el || createEle(children[i]).el 42 | } 43 | this.appendChild(ele, c) 44 | } 45 | } 46 | } 47 | api.setClass = function (ele, c) { 48 | if(ele && isArray(c)) { 49 | let k = '' 50 | for(let i = 0; i < c.length; i++) { 51 | //ele.classList.add(c[i]) 52 | if(i !== c.length-1){ 53 | k += c[i] + ' ' 54 | }else{ 55 | k += c[i] 56 | } 57 | } 58 | ele.className = k 59 | } 60 | } 61 | api.setAttrs = function (ele, a) { 62 | if(ele && isObject(a)) { 63 | for(let k in a) { 64 | if (k === 'class') continue 65 | let s = a[k] 66 | if (k === 'style' && isObject(s)) { 67 | for(let j in s) { 68 | ele.style[j] = s[j] 69 | } 70 | }else { 71 | ele[k] = s 72 | } 73 | } 74 | } 75 | } 76 | api.removeChildren = function (ele) { 77 | let i, ch = ele.childNodes 78 | while(ch[0]) { 79 | this.removeChild(ele, ch[0]) 80 | } 81 | } 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /src/util/console.js: -------------------------------------------------------------------------------- 1 | export function error (info) { 2 | if (typeof console !== 'undeifine') { 3 | console.error(info) 4 | } 5 | } 6 | export function warn (info) { 7 | if (typeof console !== 'undeifine') { 8 | console.warn(info) 9 | } 10 | } -------------------------------------------------------------------------------- /src/util/help.js: -------------------------------------------------------------------------------- 1 | export function toArray (arr) { 2 | return [].slice.call(arr) 3 | } 4 | -------------------------------------------------------------------------------- /src/util/index.js: -------------------------------------------------------------------------------- 1 | export * from './console' 2 | export * from './is' 3 | export * from './help' 4 | export * from './api' 5 | -------------------------------------------------------------------------------- /src/util/is.js: -------------------------------------------------------------------------------- 1 | function judge (o) { 2 | return Object.prototype.toString.call(o) 3 | } 4 | 5 | export function isArray (arr) { 6 | return judge(arr) === '[object Array]' 7 | } 8 | 9 | export function isObject (o) { 10 | return judge(o) === '[object Object]' 11 | } 12 | 13 | export function isFunction (f) { 14 | return typeof f === 'function' 15 | } 16 | 17 | export function isString (s) { 18 | return typeof s === 'string' 19 | } 20 | 21 | export function isNumber (n) { 22 | return typeof n === 'number' 23 | } 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/vdom/createEle.js: -------------------------------------------------------------------------------- 1 | import { api, isObject, isString } from '../util/index' 2 | 3 | export function createEle (vdom) { 4 | let i, e 5 | if( !vdom.el && (i = vdom.text)) { 6 | e = vdom.el = api.createTextNode(i) 7 | return vdom 8 | } 9 | if ( (i = vdom.tagName) && vdom.el === null) { 10 | e = vdom.el = api.createElement(i) 11 | }else if (vdom.el.nodeType === 1) { 12 | e = vdom.el 13 | } 14 | updateEle(e, vdom) 15 | return vdom 16 | } 17 | 18 | export function updateEle (e ,vdom, oldVdom) { 19 | let i 20 | if( (i = vdom.className).length > 0 ) api.setClass(e, i) 21 | if( (i = vdom.data) !== null ) api.setAttrs(e, i) 22 | if( (i = vdom.id) !== null ) api.setId(e, i) 23 | if( (i = vdom.children) !== null && !oldVdom) api.appendChildren(e, i) 24 | } 25 | -------------------------------------------------------------------------------- /src/vdom/createVdom.js: -------------------------------------------------------------------------------- 1 | import { isString, isObject, isArray, isNumber, api } from '../util/index' 2 | import { Vdom, createEle } from './index' 3 | 4 | function parseQuery (vdom, query) { 5 | let k,state = 0,j = 0 6 | vdom.sel = query 7 | 8 | for(let i = 0, len = query.length; i < len; i++) { 9 | let char = query[i] 10 | if (char === '.' || char === '#' || (k = i === len-1)) { 11 | if (state === 0) { 12 | vdom.tagName = query.substring(j, !k ? i : len).toUpperCase() 13 | }else if (state === 1) { 14 | vdom.className.push(query.substring(j, !k ? i : len)) 15 | }else if (state === 2) { 16 | vdom.id = query.substring(j, !k ? i : len) 17 | } 18 | state = (char === '.') ? 1 : (char === '#')? 2 : 3 19 | j = i+1 20 | } 21 | 22 | } 23 | 24 | } 25 | 26 | function parseData (vdom, v) { 27 | for(let k in v) { 28 | if (k === 'class'){ 29 | let i = v[k].split(' ') 30 | for(let j = 0; j < i.length; j++) { 31 | vdom.className.push(i[j]) 32 | } 33 | }else if (k === 'key') { 34 | vdom.key = v[k] 35 | }else if (k !== 'style') { 36 | vdom.attr.push(k) 37 | } 38 | } 39 | vdom.data = v 40 | } 41 | 42 | function parseChindren (vdom, v) { 43 | let a = [] 44 | if (isString(v) || isNumber(v)) v = [v] 45 | for (let i = 0; i < v.length; i++) { 46 | if (!(v[i] instanceof Vdom)) { 47 | a.push(createVdomTxt(v[i])) 48 | }else { 49 | a.push(v[i]) 50 | } 51 | } 52 | vdom.children = a 53 | } 54 | export function createVdomTxt (str) { 55 | let vd = new Vdom() 56 | if(isString(str) || isNumber(str)) { 57 | vd.text = str 58 | } 59 | return vd 60 | } 61 | export function createVdom (arg) { 62 | let i=0, 63 | vd = new Vdom() 64 | 65 | while(i < arg.length) { 66 | let v = arg[i] 67 | if (i === 0 && isString(v)) { 68 | // div#id.classA 69 | parseQuery(vd, v) 70 | }else if (i != 0){ 71 | if(isObject(v)) { 72 | // class style clickEvent .ect 73 | parseData(vd, v) 74 | }else if (isArray(v) || isString(v) || isNumber(v)) { 75 | // childern 76 | parseChindren(vd, v) 77 | } 78 | } 79 | i++ 80 | } 81 | return vd 82 | } -------------------------------------------------------------------------------- /src/vdom/diff.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Virtual DOM patching algorithm based on Snabbdom by 3 | * Simon Friis Vindum (@paldepind) 4 | * Licensed under the MIT License 5 | * https://github.com/paldepind/snabbdom/blob/master/LICENSE 6 | * 7 | * modified by Yangjingzhuo 8 | * 9 | */ 10 | import { api, isArray} from '../util/index' 11 | import { createEle, updateEle } from './index' 12 | 13 | function sameVnode(oldVnode, vnode){ 14 | return vnode.key === oldVnode.key && vnode.sel === oldVnode.sel 15 | } 16 | function createKeyToOldIdx (children, beginIdx, endIdx) { 17 | var i, map = {}, key, ch 18 | for (i = beginIdx; i <= endIdx; ++i) { 19 | ch = children[i] 20 | if (ch != null) { 21 | key = ch.key 22 | if (key !== null) 23 | map[key] = i 24 | } 25 | } 26 | return map 27 | } 28 | function removeVnodes (parentElm, vnodes, startIdx, endIdx) { 29 | for ( ;startIdx <= endIdx; ++startIdx) { 30 | var ch = vnodes[startIdx] 31 | if (ch != null) { 32 | api.removeChild(parentElm, ch.el) 33 | } 34 | } 35 | } 36 | function addVnodes (parentElm, before, vnodes, startIdx, endIdx) { 37 | for ( ;startIdx <= endIdx; ++startIdx) { 38 | var ch = vnodes[startIdx] 39 | if (ch != null) { 40 | api.insertBefore(parentElm, createEle(ch).el, before) 41 | } 42 | } 43 | } 44 | function patchVnode (oldVnode, vnode) { 45 | const el = vnode.el = oldVnode.el 46 | let i, oldCh = oldVnode.children, ch = vnode.children 47 | if (oldVnode === vnode) return 48 | if (oldVnode.text !== null && vnode.text !== null && oldVnode.text !== vnode.text) { 49 | api.setTextContent(el, vnode.text) 50 | }else { 51 | updateEle(el, vnode, oldVnode) 52 | if (oldCh && ch && oldCh !== ch) { 53 | updateChildren(el, oldCh, ch) 54 | }else if (ch){ 55 | createEle(vnode) //create el's children dom 56 | }else if (oldCh){ 57 | api.removeChildren(el) 58 | } 59 | } 60 | } 61 | 62 | function updateChildren (parentElm, oldCh, newCh) { 63 | let oldStartIdx = 0, newStartIdx = 0 64 | let oldEndIdx = oldCh.length - 1 65 | let oldStartVnode = oldCh[0] 66 | let oldEndVnode = oldCh[oldEndIdx] 67 | let newEndIdx = newCh.length - 1 68 | let newStartVnode = newCh[0] 69 | let newEndVnode = newCh[newEndIdx] 70 | let oldKeyToIdx 71 | let idxInOld 72 | let elmToMove 73 | let before 74 | while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { 75 | if (oldStartVnode == null) { 76 | oldStartVnode = oldCh[++oldStartIdx] // Vnode might have been moved left 77 | }else if (oldEndVnode == null) { 78 | oldEndVnode = oldCh[--oldEndIdx] 79 | }else if (newStartVnode == null) { 80 | newStartVnode = newCh[++newStartIdx] 81 | }else if (newEndVnode == null) { 82 | newEndVnode = newCh[--newEndIdx] 83 | }else if (sameVnode(oldStartVnode, newStartVnode)) { 84 | patchVnode(oldStartVnode, newStartVnode) 85 | oldStartVnode = oldCh[++oldStartIdx] 86 | newStartVnode = newCh[++newStartIdx] 87 | }else if (sameVnode(oldEndVnode, newEndVnode)) { 88 | patchVnode(oldEndVnode, newEndVnode) 89 | oldEndVnode = oldCh[--oldEndIdx] 90 | newEndVnode = newCh[--newEndIdx] 91 | }else if (sameVnode(oldStartVnode, newEndVnode)) { 92 | patchVnode(oldStartVnode, newEndVnode) 93 | api.insertBefore(parentElm, oldStartVnode.el, api.nextSibling(oldEndVnode.el)) 94 | oldStartVnode = oldCh[++oldStartIdx] 95 | newEndVnode = newCh[--newEndIdx] 96 | }else if (sameVnode(oldEndVnode, newStartVnode)) { 97 | patchVnode(oldEndVnode, newStartVnode) 98 | api.insertBefore(parentElm, oldEndVnode.el, oldStartVnode.el) 99 | oldEndVnode = oldCh[--oldEndIdx] 100 | newStartVnode = newCh[++newStartIdx] 101 | }else { 102 | if (oldKeyToIdx === undefined) { 103 | oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx) 104 | } 105 | idxInOld = oldKeyToIdx[newStartVnode.key] 106 | if (!idxInOld) { 107 | api.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el) 108 | newStartVnode = newCh[++newStartIdx] 109 | } 110 | else { 111 | elmToMove = oldCh[idxInOld] 112 | if (elmToMove.sel !== newStartVnode.sel) { 113 | api.insertBefore(parentElm, createEle(newStartVnode).el, oldStartVnode.el) 114 | }else { 115 | patchVnode(elmToMove, newStartVnode) 116 | oldCh[idxInOld] = null 117 | api.insertBefore(parentElm, elmToMove.el, oldStartVnode.el) 118 | } 119 | newStartVnode = newCh[++newStartIdx] 120 | } 121 | } 122 | } 123 | if (oldStartIdx > oldEndIdx) { 124 | before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].el 125 | addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx) 126 | }else if (newStartIdx > newEndIdx) { 127 | removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx) 128 | } 129 | } 130 | 131 | export function patch (oldVnode, vnode) { 132 | if (sameVnode(oldVnode, vnode)) { 133 | patchVnode(oldVnode, vnode) 134 | } else { 135 | const oEl = oldVnode.el 136 | let parentEle = api.parentNode(oEl) 137 | createEle(vnode) 138 | if (parentEle !== null) { 139 | api.insertBefore(parentEle, vnode.el, api.nextSibling(oEl)) 140 | api.removeChild(parentEle, oldVnode.el) 141 | oldVnode = null 142 | } 143 | } 144 | return vnode 145 | } 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /src/vdom/el.js: -------------------------------------------------------------------------------- 1 | import { toArray, isArray, error } from '../util/index' 2 | import { createVdom } from './index' 3 | 4 | export function el () { 5 | const arg = toArray(arguments) 6 | 7 | if (arg.length === 0) { 8 | error('Parameter cannot be empty') 9 | return false 10 | } 11 | if (isArray(arg) && arg.length > 0) { 12 | return createVdom.call(this, arg) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/vdom/index.js: -------------------------------------------------------------------------------- 1 | export * from './vnode' 2 | export * from './diff' 3 | export * from './createVdom' 4 | export * from './createEle' 5 | export * from './el' 6 | -------------------------------------------------------------------------------- /src/vdom/vnode.js: -------------------------------------------------------------------------------- 1 | export function Vdom () { 2 | this.tagName = null 3 | this.sel = null 4 | this.id = null 5 | this.className = [] 6 | this.children = null 7 | this.el = null 8 | this.data = null 9 | this.key = null 10 | this.text = null 11 | this.attr = [] 12 | this.store = null 13 | } 14 | -------------------------------------------------------------------------------- /test/component.test.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import jsdom from 'jsdom' 3 | import { init } from '../src/index' 4 | import { api, warn, error, isFunction, isString, isNumber } from '../src/util/index' 5 | import { createVdom, Vdom, el, createVdomTxt, createEle, updateEle, patch } from '../src/vdom/index' 6 | import { mount } from '../src/render/index' 7 | import { Component } from '../src/component' 8 | 9 | let doc = jsdom.jsdom(''); 10 | let window = doc.defaultView; 11 | let document = window.document; 12 | 13 | describe('test createComponent fn: ', function() { 14 | let aoy = init(); 15 | let store = aoy.store; 16 | let el = aoy.el; 17 | it('createComponent', function(){ 18 | let c = aoy.createComponent({ 19 | myfn: function(){ 20 | return 'myfn'; 21 | }, 22 | mynum: 123, 23 | el: document.body, 24 | render:function(){ 25 | return el('div',['open']); 26 | } 27 | }); 28 | expect(c).to.be.instanceof(Component); 29 | expect(c._UID).to.be.equal(0); 30 | expect(c.mynum).to.be.equal(123); 31 | expect(c.myfn()).to.be.equal('myfn'); 32 | }) 33 | }); 34 | 35 | describe('component connect store: ', function() { 36 | let aoy = init(); 37 | let store = aoy.store; 38 | let el = aoy.el; 39 | 40 | api.createElement = function(tag){ 41 | return document.createElement(tag); 42 | }; 43 | api.createTextNode = function(tag){ 44 | return document.createTextNode(tag); 45 | }; 46 | it('connect a store', function(){ 47 | document.body.innerHTML = ''; 48 | store.add('a',{c: 2}); 49 | let c = aoy.createComponent({ 50 | el: document.body, 51 | fn: function(){ 52 | return this.a.c; 53 | }, 54 | render:function(){ 55 | return el('div',this.a.c); 56 | } 57 | }); 58 | aoy.connect(c, 'a'); 59 | expect(c.fn()).to.be.equal(2); 60 | expect(document.body.innerHTML).to.be.equal('
2
'); 61 | }) 62 | it('connect many store', function(){ 63 | document.body.innerHTML = ''; 64 | store.add('a',{c: 2}); 65 | store.add('b',{d: 3}); 66 | let c = aoy.createComponent({ 67 | el: document.body, 68 | fn: function(){ 69 | return this.a.c; 70 | }, 71 | render:function(){ 72 | return el('div',[this.a.c,el('div',this.b.d)]); 73 | } 74 | }); 75 | aoy.connect(c, ['a','b']); 76 | expect(c.fn()).to.be.equal(2); 77 | expect(document.body.innerHTML).to.be.equal('
2
3
'); 78 | }) 79 | }); 80 | 81 | describe('basics lib use: ', function() { 82 | 83 | let aoy = init(); 84 | let store = aoy.store; 85 | 86 | api.createElement = function(tag){ 87 | return document.createElement(tag); 88 | }; 89 | api.createTextNode = function(tag){ 90 | return document.createTextNode(tag); 91 | }; 92 | 93 | it('basic render use store',function(){ 94 | document.body.innerHTML = ''; 95 | store.add('a',{ 96 | txt: 1111 97 | }); 98 | 99 | let mycp = aoy.createComponent({ 100 | el: document.body, 101 | render:function(){ 102 | return aoy.el('div',this.a.txt); 103 | } 104 | }); 105 | 106 | aoy.connect(mycp, 'a') 107 | expect(document.body.innerHTML).to.be.equal('
1111
') 108 | 109 | }) 110 | 111 | it('test data style class',function(){ 112 | document.body.innerHTML = ''; 113 | let mycp = aoy.createComponent({ 114 | el: document.body, 115 | render:function(){ 116 | return aoy.el('div',{style:{width:'100px'}, class:'a b'}); 117 | } 118 | }); 119 | aoy.connect(mycp); 120 | expect(document.body.innerHTML).to.be.equal('
') 121 | }); 122 | 123 | it('oldnode\'s children is empty, newnode\' length greater than 0',function(){ 124 | document.body.innerHTML = ''; 125 | store.add('r',{ 126 | txt1: 111, 127 | txt2: 222 128 | }); 129 | 130 | let mycp = aoy.createComponent({ 131 | el: document.body, 132 | render:function(){ 133 | return el('div',[this.r.txt1, el('div',this.r.txt2)]); 134 | } 135 | }); 136 | 137 | aoy.connect(mycp, 'r') 138 | expect(document.body.innerHTML).to.be.equal('
111
222
'); 139 | store.get('r').set({ 140 | txt1: 222, 141 | txt2: 333 142 | }); 143 | expect(document.body.innerHTML).to.be.equal('
222
333
'); 144 | }); 145 | 146 | it('a component relies on store',function(){ 147 | document.body.innerHTML = ''; 148 | store.add('r',{ 149 | txt1: 111, 150 | txt2: 222 151 | }); 152 | store.add('r2',{ 153 | txt3: 333, 154 | txt4: 444 155 | }); 156 | 157 | let mycp = aoy.createComponent({ 158 | el: document.body, 159 | render:function(){ 160 | return el('div',[this.r.txt1, el('div',this.r2.txt4)]); 161 | } 162 | }); 163 | 164 | aoy.connect(mycp, ['r','r2']) 165 | expect(document.body.innerHTML).to.be.equal('
111
444
'); 166 | 167 | store.get('r2').txt4 = 555; 168 | 169 | expect(document.body.innerHTML).to.be.equal('
111
555
'); 170 | store.get('r').set({ 171 | txt1: 666, 172 | txt2: 222 173 | }); 174 | 175 | store.get('r2').set({ 176 | txt1: 777, 177 | txt4: 777 178 | }); 179 | 180 | expect(document.body.innerHTML).to.be.equal('
666
777
'); 181 | }); 182 | }) 183 | 184 | describe('test console:', function() { 185 | it('hope not error',function(){ 186 | warn('warn'); 187 | error('error'); 188 | }); 189 | }); 190 | 191 | describe('test is:', function() { 192 | it('isFunction',function(){ 193 | let fn = function(){}; 194 | expect(isFunction(fn)).to.be.ok; 195 | let fn2 = '222'; 196 | expect(isFunction(fn2)).to.be.not.ok; 197 | }); 198 | it('isNumber',function(){ 199 | let n = 123; 200 | expect(isNumber(n)).to.be.ok; 201 | let n2 = '222'; 202 | expect(isNumber(n2)).to.be.not.ok; 203 | }); 204 | }); 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /test/diff.test.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import sinon from 'sinon'; 3 | import jsdom from 'jsdom' 4 | 5 | import { init } from '../src/index' 6 | import { createEle, patch, updateChildren, patchVnode } from '../src/vdom/index' 7 | import { mount } from '../src/render/index' 8 | import { api } from '../src/util/index' 9 | 10 | let doc = jsdom.jsdom(''); 11 | let window = doc.defaultView; 12 | let document = window.document; 13 | 14 | describe('patch function test: ', function() { 15 | let aoy = init(); 16 | let store = aoy.store; 17 | let el = aoy.el; 18 | 19 | api.createElement = function(tag){ 20 | return document.createElement(tag); 21 | }; 22 | api.createTextNode = function(tag){ 23 | return document.createTextNode(tag); 24 | }; 25 | function autoPatch(oldnode, newnode, ecpStr){ 26 | document.body.innerHTML = ''; 27 | createEle(oldnode); 28 | document.body.appendChild(oldnode.el); 29 | patch(oldnode, newnode); 30 | expect(document.body.innerHTML).to.be.equal(ecpStr); 31 | } 32 | it('oldnode\'s children is empty, newnode\' length greater than 0',function(){ 33 | let oldnode = el('div.a'); 34 | let newnode = el('div.a',[el('div.b')]); 35 | autoPatch(oldnode,newnode,'
') 36 | }) 37 | 38 | it('newnode\'s children is empty, oldnode\' length greater than 0', function(){ 39 | let oldnode = el('div#a',['1111',el('span','im span'),el('p','im p')]); 40 | let newnode = el('div#a',{'data-e':2}); 41 | autoPatch(oldnode,newnode,'
'); 42 | expect(newnode.el['data-e']).to.be.equal(2); 43 | }); 44 | 45 | it('Node is not worth comparing',function(){ 46 | let oldnode = el('div.a',{'data-e':1}); 47 | let newnode = el('div#b',{'data-e':1},[el('div.b')]); 48 | autoPatch(oldnode,newnode,'
') 49 | oldnode = el('p.a'); 50 | newnode = el('div#b',[el('div.b')]); 51 | autoPatch(oldnode,newnode,'
') 52 | }); 53 | 54 | it('The new node has only one text node',function(){ 55 | let oldnode = el('div#a',{'data-e':1},222); 56 | let newnode = el('div#b',{'data-e':1},[111]); 57 | autoPatch(oldnode,newnode,'
111
'); 58 | oldnode = el('div#a',{'data-e':1},'222'); 59 | newnode = el('div#b',{'data-e':1},333); 60 | autoPatch(oldnode,newnode,'
333
'); 61 | oldnode = el('div#a',{'data-e':1},['222']); 62 | newnode = el('div#b',{'data-e':1},444); 63 | autoPatch(oldnode,newnode,'
444
'); 64 | oldnode = el('div#a',{'data-e':1},[111,el('div',222)]); 65 | newnode = el('div#b',{'data-e':1},[111,el('div',444)]); 66 | autoPatch(oldnode,newnode,'
111
444
'); 67 | }); 68 | 69 | it('a: The new node child node confusion sort', function(){ 70 | let oldnode = el('div#a',{'data-e':1},[el('p','im p'),el('span','im span'),el('a','im a')]); 71 | let newnode = el('div#a',{'data-e':2},[111]); 72 | autoPatch(oldnode,newnode,'
111
'); 73 | }); 74 | 75 | it('b: The new node child node confusion sort', function(){ 76 | let oldnode = el('div#a',{'data-e':1},[el('p','im p'),el('span','im span'),el('a','im a')]); 77 | let newnode = el('div#a',{'data-e':2},['1111',el('span','im span'),el('p','im p')]); 78 | autoPatch(oldnode,newnode,'
1111im span

im p

'); 79 | }); 80 | 81 | it('c: The new node child node confusion sort', function(){ 82 | let oldnode = el('div#a',['2222',el('span','im span'),el('p','im p')]); 83 | let newnode = el('div#a',{'data-e':2},['1111',el('span','im span'),el('b','im b')]); 84 | autoPatch(oldnode,newnode,'
1111im spanim b
'); 85 | }); 86 | 87 | it('Deep level comparison', function(){ 88 | let oldnode = el('div#b1',[el('div#b2',[el('div#b3',[el('div',['lv4old',el('p','im p'),el('span','im span')]), 'lv2'])]),el('p','im p')]); 89 | let newnode = el('div#b1',['lv1',el('div#b2',[el('div#b3',[el('div',['lv4new',el('p','im p'),el('span','im span')])])])]); 90 | autoPatch(oldnode,newnode,'
lv1
lv4new

im p

im span
'); 91 | }); 92 | it('Check if key is correct', function(){ 93 | doc = jsdom.jsdom(''); 94 | window = doc.defaultView; 95 | document = window.document; 96 | let oldnode = el('ul', [ 97 | el('li',{key: 'c'},'c'), 98 | el('li',{key: 'b'},'b'), 99 | el('li',{key: 'a'},'a'), 100 | el('li','nokey'), 101 | el('li',{key: 'e'},'e') 102 | ]); 103 | 104 | let newnode = el('ul',[ 105 | el('li',{key: 'f'},'f'), 106 | el('li',{key: 'e'},'e'), 107 | el('li',{key: 'd'},'d'), 108 | el('li',{key: 'b'},'b') 109 | ]); 110 | createEle(oldnode); 111 | let e = oldnode.el.children[4].el; 112 | document.body.appendChild(oldnode.el); 113 | patch(oldnode, newnode); 114 | expect(newnode.el.children[1].el).to.be.equal(e); 115 | }) 116 | 117 | it('a: Comparison of nodes with key', function(){ 118 | let oldnode = el('ul', [ 119 | el('li',{key: 'c'},'c'), 120 | el('li',{key: 'b'},'b'), 121 | el('li',{key: 'a'},'a'), 122 | el('li','nokey'), 123 | el('li',{key: 'e'},'e') 124 | ]); 125 | let newnode = el('ul',{style:{width:'100px'}},[ 126 | el('li','nokey'), 127 | el('li',{key: 'c'},'c'), 128 | el('li',{key: 'b'},'b'), 129 | el('li',{key: 'a'},'a'), 130 | el('li',{key: 'e'},'e') 131 | ]); 132 | autoPatch(oldnode,newnode,'
  • nokey
  • c
  • b
  • a
  • e
'); 133 | }); 134 | it('b: Comparison of nodes with key', function(){ 135 | let oldnode = el('ul', [ 136 | el('li',{key: 'c'},'c'), 137 | el('li',{key: 'b'},'b'), 138 | el('li',{key: 'a'},'a'), 139 | el('li','nokey'), 140 | el('li',{key: 'e'},'e') 141 | ]); 142 | let newnode = el('ul',{style:{width:'100px'}},[ 143 | el('li',{key: 'c'},'c'), 144 | el('li',{key: 'e'},'e'), 145 | el('li',{key: 'a'},'a'), 146 | el('li',{key: 'b'},'b') 147 | ]); 148 | autoPatch(oldnode,newnode,'
  • c
  • e
  • a
  • b
'); 149 | }); 150 | it('c: Comparison of nodes with key', function(){ 151 | let oldnode = el('ul', [ 152 | el('li',{key: 'c'},'c'), 153 | el('li',{key: 'b'},'b'), 154 | el('li',{key: 'a'},'a'), 155 | el('li','nokey'), 156 | el('li',{key: 'e'},'e') 157 | ]); 158 | let newnode = el('ul',[ 159 | el('li',{key: 'f'},'f'), 160 | el('li',{key: 'e'},'e'), 161 | el('li',{key: 'd'},'d'), 162 | el('li',{key: 'b'},'b') 163 | ]); 164 | autoPatch(oldnode,newnode,'
  • f
  • e
  • d
  • b
'); 165 | }); 166 | 167 | it('d: Comparison of nodes with key', function(){ 168 | let oldnode = el('ul', [ 169 | el('li',{key: 'c'},'c'), 170 | el('li',{key: 'b'},'b'), 171 | el('li',{key: 'a'},'a'), 172 | el('li','nokey'), 173 | el('li',{key: 'e'},'e') 174 | ]); 175 | let newnode = el('ul',[ 176 | el('a','f'), 177 | el('span','e'), 178 | el('li','d'), 179 | el('li','b') 180 | ]); 181 | autoPatch(oldnode,newnode,''); 182 | }); 183 | 184 | it('e: Comparison of nodes with key', function(){ 185 | let oldnode = el('ul', [ 186 | el('li',{key: 'c'},'c'), 187 | el('li',{key: 'b'},'b'), 188 | el('li',{key: 'a'},'a'), 189 | el('li','nokey'), 190 | el('li',{key: 'e'},'e') 191 | ]); 192 | let newnode = el('ul',[ 193 | el('a','f'), 194 | el('li',{key: 'b'},'b'), 195 | el('li',{key: 'a'},'a'), 196 | el('li','d') 197 | ]); 198 | autoPatch(oldnode,newnode,''); 199 | }); 200 | 201 | it('diff child\'s tag patch', function(){ 202 | let oldnode = el('div', [ 203 | el('li',[el('span','1')]) 204 | ]); 205 | let newnode = el('div',[ 206 | el('li',[el('div',22)]) 207 | ]); 208 | autoPatch(oldnode,newnode,'
  • 22
  • '); 209 | }); 210 | 211 | it('style change', function(){ 212 | let oldnode = el('div',{'data-a':'b', style: {color: 'red'}}); 213 | let newnode = el('div',{id:'new', 'data-a':'a', style: {color: 'blue'}}); 214 | autoPatch(oldnode,newnode,'
    '); 215 | expect(document.querySelector('#new')['data-a']).to.be.equal('a'); 216 | }); 217 | 218 | it('textNode become null ', function(){ 219 | let oldnode = el('div','123'); 220 | let newnode = el('div',''); 221 | autoPatch(oldnode,newnode,'
    '); 222 | }); 223 | 224 | }) 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --compilers js:babel-core/register --reporter spec --slow 50 --timeout 60000 -------------------------------------------------------------------------------- /test/store.test.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import jsdom from 'jsdom' 3 | import { init } from '../src/index' 4 | import { initStore } from '../src/store/index' 5 | 6 | describe('test store: ', function() { 7 | let aoy = init(); 8 | let store = aoy.store; 9 | 10 | it('check _FINALSTORE param',function(){ 11 | expect(aoy._FINALSTORE).to.be.ok; 12 | }); 13 | 14 | it('test warn',function(){ 15 | store.add(1); 16 | aoy.store = {}; 17 | initStore(); 18 | }); 19 | 20 | it('add _DEFAULT store',function(){ 21 | store.add({ 22 | a:2 23 | }); 24 | expect(store.get().a).to.be.equal(2); 25 | expect(store.get('_DEFAULT').a).to.be.equal(2); 26 | store.remove(); 27 | expect(store.get('_DEFAULT')).to.be.not.ok; 28 | }); 29 | 30 | it('add user-defined store',function(){ 31 | store.add('mystore',{ 32 | a:2 33 | }); 34 | expect(store.get('mystore').a).to.be.equal(2); 35 | }); 36 | 37 | it('remove store',function(){ 38 | store.add('mystore2',{ 39 | a:2 40 | }); 41 | expect(store.get('mystore2').a).to.be.equal(2); 42 | store.remove('mystore2'); 43 | expect(store.get('mystore2')).to.be.not.ok; 44 | }); 45 | 46 | it('remove store',function(){ 47 | store.add('mystore2',{ 48 | a:2 49 | }); 50 | expect(store.get('mystore2').a).to.be.equal(2); 51 | store.remove('mystore2'); 52 | expect(store.get('mystore2')).to.be.not.ok; 53 | }); 54 | 55 | it('getMainStore', function(){ 56 | let i = 0, s = store.getMainStore(); 57 | for(let k in s){ 58 | i++; 59 | } 60 | expect(i===1).to.be.ok; 61 | }); 62 | 63 | it('test set', function(){ 64 | 65 | store.add('forset',{ 66 | b: 'b' 67 | }); 68 | store.get('forset').set({ 69 | a:'a' 70 | }); 71 | store.get('forset').set('11'); 72 | expect(store.get('forset').a).to.be.equal('a'); 73 | 74 | store.get('forset').a = 'new'; 75 | expect(store.get('forset').a).to.be.equal('new'); 76 | }); 77 | 78 | }); -------------------------------------------------------------------------------- /test/vdom.test.js: -------------------------------------------------------------------------------- 1 | 2 | import { expect } from 'chai' 3 | import { api } from '../src/util/index' 4 | import { createVdom, Vdom, el, createVdomTxt, createEle, updateEle } from '../src/vdom/index' 5 | 6 | import sinon from 'sinon'; 7 | import jsdom from 'jsdom' 8 | 9 | 10 | let doc = jsdom.jsdom(''); 11 | let window = doc.defaultView; 12 | let document = window.document; 13 | 14 | describe('createVdom function test: ', function() { 15 | 16 | it('return Vdom instanceof',function(){ 17 | expect(el('div')).to.be.instanceof(Vdom); 18 | }); 19 | 20 | it('Vdom\'s tagName test',function(){ 21 | let vdom = el('div'); 22 | expect(vdom.tagName).to.be.equal("DIV"); 23 | 24 | vdom = el('DIv'); 25 | expect(vdom.tagName).to.be.equal("DIV"); 26 | }); 27 | 28 | it('test Vdom\'s id and class',function(){ 29 | 30 | let vdom = el('div#a'); 31 | expect(vdom.id).to.be.equal('a'); 32 | 33 | vdom = el('div.a.b'); 34 | expect(vdom.className).to.be.an('array'); 35 | expect(vdom.className[0]).to.be.equal('a'); 36 | expect(vdom.className[1]).to.be.equal('b'); 37 | expect(vdom.className).to.have.lengthOf(2); 38 | 39 | 40 | }); 41 | 42 | it('test Vdom\'s data attr',function(){ 43 | 44 | let vdom = el('input',{'data-e': 1, style:{width: '100px'}, value:'123'}); 45 | expect(vdom.data).to.be.an('object'); 46 | expect(vdom.data['data-e']).to.be.equal(1); 47 | expect(vdom.data['style']['width']).to.be.equal('100px'); 48 | 49 | }); 50 | 51 | it('create Vdom\'s children\'param is a string',function(){ 52 | 53 | let vdom = el('div','123'); 54 | expect(vdom.children[0].text).to.be.equal('123'); 55 | 56 | vdom = el('div',['123']); 57 | expect(vdom.children[0].text).to.be.equal('123'); 58 | 59 | }); 60 | 61 | it('create Vdom\'s children\'attr is a array',function(){ 62 | 63 | let vdom = el('div','123'); 64 | expect(vdom.children).to.be.a('array'); 65 | 66 | vdom = el('div',123); 67 | expect(vdom.children).to.be.a('array'); 68 | 69 | vdom = el('div',['123',123]); 70 | expect(vdom.children).to.be.a('array'); 71 | 72 | vdom = el('div',['123',el('a')]); 73 | expect(vdom.children).to.be.a('array'); 74 | 75 | vdom = el('div',['123',el('a',123,el('a',[123]))]); 76 | expect(vdom.children).to.be.a('array'); 77 | 78 | }); 79 | 80 | 81 | it('create Vdom\'s children\'param is a number',function(){ 82 | 83 | let vdom = el('div',123); 84 | expect(vdom.children[0].text).to.be.equal(123); 85 | 86 | vdom = el('div',[123]); 87 | expect(vdom.children[0].text).to.be.equal(123); 88 | }); 89 | 90 | it('create Vdom\'s children\'param are number and string',function(){ 91 | 92 | let vdom = el('div',[123,'456',el('span')]); 93 | expect(vdom.children[0].text).to.be.equal(123); 94 | expect(vdom.children[1].text).to.be.equal('456'); 95 | expect(vdom.children[2].text).to.be.null; 96 | expect(vdom.children[2].tagName).to.be.equal('SPAN'); 97 | expect(vdom.children).to.have.lengthOf(3); 98 | 99 | }); 100 | 101 | it('create Vdom\'s children\'param is a vdom',function(){ 102 | 103 | let vdom = el('div',[el('span'),el('div'),el('a')]); 104 | expect(vdom.children[0].tagName).to.be.equal('SPAN'); 105 | expect(vdom.children).to.have.lengthOf(3); 106 | 107 | }); 108 | 109 | it('create Multi parameter\'s Vdom',function(){ 110 | 111 | let vdom = el('div',{'data-e': 1, style:{width: '100px'}, value:'123'} ,[123,el('div'),el('a')]); 112 | expect(vdom.children[0].tagName).to.be.null; 113 | expect(vdom.data['data-e']).to.be.equal(1); 114 | expect(vdom.children).to.have.lengthOf(3); 115 | 116 | }); 117 | 118 | it('create Multilevel Vdom',function(){ 119 | 120 | let vdom = el('div',[el('p',[el('span',[el('a',{href:'#'})])])]); 121 | expect(vdom.children[0].children[0].children[0].tagName).to.be.equal('A'); 122 | 123 | }); 124 | 125 | }); 126 | 127 | 128 | describe('createVdomTxt function test: ', function() { 129 | it('return Vdom instanceof',function(){ 130 | expect(createVdomTxt('123')).to.be.instanceof(Vdom); 131 | expect(createVdomTxt(123)).to.be.instanceof(Vdom); 132 | }); 133 | it('test Vdom\'text attr',function(){ 134 | expect(createVdomTxt('123').text).to.be.equal('123'); 135 | expect(createVdomTxt(123).text).to.be.equal(123); 136 | }); 137 | }); 138 | 139 | describe('createEle function test: ', function() { 140 | 141 | var doc = jsdom.jsdom(''); 142 | var window = doc.defaultView; 143 | var document = window.document; 144 | 145 | it('use createEle fn to create text dom',function(){ 146 | 147 | let vdom = new Vdom(); 148 | vdom.text = 123; 149 | let spy1 = api.createTextNode = sinon.stub().returns(document.createTextNode(123)); 150 | createEle(vdom); 151 | expect(vdom.el.nodeType).to.be.equal(3); 152 | 153 | }); 154 | 155 | it('use createEle fn with vdom\' tagName create text dom',function(){ 156 | 157 | let vdom = new Vdom(); 158 | vdom.tagName = 'DIV'; 159 | let spy1 = api.createElement = sinon.stub().returns(document.createElement('div')); 160 | createEle(vdom); 161 | expect(vdom.el.tagName).to.be.equal('DIV'); 162 | }) 163 | it('vdom has el attr not\' error',function(){ 164 | let vdom = new Vdom(); 165 | vdom.tagName = 'DIV'; 166 | vdom.el = document.createElement('div'); 167 | createEle(vdom); 168 | }) 169 | it('test updateEle fn',function(){ 170 | let vdom = el('div.a.b#myid', {'data-i': 1}, [111]); 171 | let oldvdom = el('div#a.b', {'data-i': 2}, [221]); 172 | updateEle(document.createElement('div'), vdom , oldvdom); 173 | updateEle(document.createElement('div'), vdom); 174 | }) 175 | 176 | }); 177 | 178 | describe('test el fn: ', function() { 179 | it('no param',function(){ 180 | expect(el()).to.be.not.ok; 181 | }) 182 | it('has param',function(){ 183 | expect(el('div.a#b',{class:'d c',style:{width: '100px'}},[el('div'),'111'])).to.be.an('object'); 184 | }) 185 | }) 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | --------------------------------------------------------------------------------