|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
/* global module, document, Node */
|
|
|
|
|
import {Module} from './modules/module';
|
|
|
|
|
import {Hooks} from './hooks';
|
|
|
|
|
import vnode, {VNode, VNodeData, Key} from './vnode';
|
|
|
|
|
import * as is from './is';
|
|
|
|
@ -21,8 +22,14 @@ function isVnode(vnode: any): vnode is VNode {
|
|
|
|
|
|
|
|
|
|
type KeyToIndexMap = {[key: string]: number};
|
|
|
|
|
|
|
|
|
|
type ArraysOf<T> = {
|
|
|
|
|
[K in keyof T]: (T[K])[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ModuleHooks = ArraysOf<Module>;
|
|
|
|
|
|
|
|
|
|
function createKeyToOldIdx(children: Array<VNode>, beginIdx: number, endIdx: number): KeyToIndexMap {
|
|
|
|
|
let i: number, map: {[s: string]: number} = {}, key: Key;
|
|
|
|
|
let i: number, map: KeyToIndexMap = {}, key: Key;
|
|
|
|
|
for (i = beginIdx; i <= endIdx; ++i) {
|
|
|
|
|
key = children[i].key;
|
|
|
|
|
if (key !== undefined) map[key] = i;
|
|
|
|
@ -30,20 +37,23 @@ function createKeyToOldIdx(children: Array<VNode>, beginIdx: number, endIdx: num
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
|
|
|
|
|
const hooks: (keyof Module)[] = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
|
|
|
|
|
|
|
|
|
|
export {h} from './h';
|
|
|
|
|
export {thunk} from './thunk';
|
|
|
|
|
|
|
|
|
|
export function init(modules: Array<Hooks>, domApi?: DOMAPI) {
|
|
|
|
|
let i: number, j: number, cbs: any = {};
|
|
|
|
|
export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
|
|
|
|
|
let i: number, j: number, cbs = ({} as ModuleHooks);
|
|
|
|
|
|
|
|
|
|
const api: DOMAPI = domApi !== undefined ? domApi : htmlDomApi;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < hooks.length; ++i) {
|
|
|
|
|
cbs[hooks[i]] = [];
|
|
|
|
|
for (j = 0; j < modules.length; ++j) {
|
|
|
|
|
if ((modules[j] as any)[hooks[i]] !== undefined) cbs[hooks[i]].push((modules[j] as any)[hooks[i]]);
|
|
|
|
|
const hook = modules[j][hooks[i]];
|
|
|
|
|
if (hook !== undefined) {
|
|
|
|
|
(cbs[hooks[i]] as Array<any>).push(hook);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -225,26 +235,28 @@ export function init(modules: Array<Hooks>, domApi?: DOMAPI) {
|
|
|
|
|
if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
|
|
|
|
|
i(oldVnode, vnode);
|
|
|
|
|
}
|
|
|
|
|
let elm = vnode.elm = oldVnode.elm, oldCh = oldVnode.children, ch = vnode.children;
|
|
|
|
|
const elm = vnode.elm = (oldVnode.elm as Node);
|
|
|
|
|
let oldCh = oldVnode.children;
|
|
|
|
|
let ch = vnode.children;
|
|
|
|
|
if (oldVnode === vnode) return;
|
|
|
|
|
if (isDef(vnode.data)) {
|
|
|
|
|
if (vnode.data !== undefined) {
|
|
|
|
|
for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);
|
|
|
|
|
i = (vnode.data as VNodeData).hook;
|
|
|
|
|
i = vnode.data.hook;
|
|
|
|
|
if (isDef(i) && isDef(i = i.update)) i(oldVnode, vnode);
|
|
|
|
|
}
|
|
|
|
|
if (isUndef(vnode.text)) {
|
|
|
|
|
if (isDef(oldCh) && isDef(ch)) {
|
|
|
|
|
if (oldCh !== ch) updateChildren(elm as Node, oldCh as Array<VNode>, ch as Array<VNode>, insertedVnodeQueue);
|
|
|
|
|
if (oldCh !== ch) updateChildren(elm, oldCh as Array<VNode>, ch as Array<VNode>, insertedVnodeQueue);
|
|
|
|
|
} else if (isDef(ch)) {
|
|
|
|
|
if (isDef(oldVnode.text)) api.setTextContent(elm as Node, '');
|
|
|
|
|
addVnodes(elm as Node, null, ch as Array<VNode>, 0, (ch as Array<VNode>).length - 1, insertedVnodeQueue);
|
|
|
|
|
if (isDef(oldVnode.text)) api.setTextContent(elm, '');
|
|
|
|
|
addVnodes(elm, null, ch as Array<VNode>, 0, (ch as Array<VNode>).length - 1, insertedVnodeQueue);
|
|
|
|
|
} else if (isDef(oldCh)) {
|
|
|
|
|
removeVnodes(elm as Node, oldCh as Array<VNode>, 0, (oldCh as Array<VNode>).length - 1);
|
|
|
|
|
removeVnodes(elm, oldCh as Array<VNode>, 0, (oldCh as Array<VNode>).length - 1);
|
|
|
|
|
} else if (isDef(oldVnode.text)) {
|
|
|
|
|
api.setTextContent(elm as Node, '');
|
|
|
|
|
api.setTextContent(elm, '');
|
|
|
|
|
}
|
|
|
|
|
} else if (oldVnode.text !== vnode.text) {
|
|
|
|
|
api.setTextContent(elm as Node, vnode.text as string);
|
|
|
|
|
api.setTextContent(elm, vnode.text as string);
|
|
|
|
|
}
|
|
|
|
|
if (isDef(hook) && isDef(i = hook.postpatch)) {
|
|
|
|
|
i(oldVnode, vnode);
|
|
|
|
|