Update TypeScript, refactor

pull/489/head
Simon Friis Vindum 5 years ago
parent 5a3ae5e14b
commit 0881343e01

@ -2,6 +2,7 @@ module.exports = {
extends: 'standard-with-typescript', extends: 'standard-with-typescript',
parserOptions: { project: [ './tsconfig.json', ] }, parserOptions: { project: [ './tsconfig.json', ] },
rules: { rules: {
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/brace-style': 'off', '@typescript-eslint/brace-style': 'off',
'@typescript-eslint/consistent-type-assertions': 'off', '@typescript-eslint/consistent-type-assertions': 'off',
'@typescript-eslint/consistent-type-definitions': 'off', '@typescript-eslint/consistent-type-definitions': 'off',

6
package-lock.json generated

@ -8888,9 +8888,9 @@
"dev": true "dev": true
}, },
"typescript": { "typescript": {
"version": "3.3.4000", "version": "3.7.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.4000.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz",
"integrity": "sha512-jjOcCZvpkl2+z7JFn0yBOoLQyLoIkNZAs/fYJkUG6VKy6zLPHJGfQJYFHzibB6GJaF/8QrcECtlQ5cpvRHSMEA==", "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==",
"dev": true "dev": true
}, },
"uglify-js": { "uglify-js": {

@ -36,7 +36,7 @@
"knuth-shuffle": "^1.0.1", "knuth-shuffle": "^1.0.1",
"mocha": "^5.2.0", "mocha": "^5.2.0",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"typescript": "^3.0.3", "typescript": "^3.7.2",
"xyz": "2.1.0" "xyz": "2.1.0"
}, },
"scripts": { "scripts": {

@ -1,12 +1,13 @@
/* global module, document, Node */ /* global module, document, Node */
import {Module} from './modules/module'; import {Module} from './modules/module';
import {Hooks} from './hooks'; import vnode, {VNode} from './vnode';
import vnode, {VNode, VNodeData, Key} from './vnode';
import * as is from './is'; import * as is from './is';
import htmlDomApi, {DOMAPI} from './htmldomapi'; import htmlDomApi, {DOMAPI} from './htmldomapi';
type NonUndefined<T> = T extends undefined ? never : T;
function isUndef(s: any): boolean { return s === undefined; } function isUndef(s: any): boolean { return s === undefined; }
function isDef(s: any): boolean { return s !== undefined; } function isDef<A>(s: A): s is NonUndefined<A> { return s !== undefined; }
type VNodeQueue = VNode[]; type VNodeQueue = VNode[];
@ -29,12 +30,11 @@ type ArraysOf<T> = {
type ModuleHooks = ArraysOf<Module>; type ModuleHooks = ArraysOf<Module>;
function createKeyToOldIdx(children: VNode[], beginIdx: number, endIdx: number): KeyToIndexMap { function createKeyToOldIdx(children: VNode[], beginIdx: number, endIdx: number): KeyToIndexMap {
let i: number, map: KeyToIndexMap = {}, key: Key | undefined, ch; const map: KeyToIndexMap = {};
for (i = beginIdx; i <= endIdx; ++i) { for (let i = beginIdx; i <= endIdx; ++i) {
ch = children[i]; const key = children[i]?.key;
if (ch != null) { if (key !== undefined) {
key = ch.key; map[key] = i;
if (key !== undefined) map[key] = i;
} }
} }
return map; return map;
@ -78,8 +78,9 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
function createElm(vnode: VNode, insertedVnodeQueue: VNodeQueue): Node { function createElm(vnode: VNode, insertedVnodeQueue: VNodeQueue): Node {
let i: any, data = vnode.data; let i: any, data = vnode.data;
if (data !== undefined) { if (data !== undefined) {
if (isDef(i = data.hook) && isDef(i = i.init)) { const init = data.hook?.init;
i(vnode); if (isDef(init)) {
init(vnode);
data = vnode.data; data = vnode.data;
} }
} }
@ -88,7 +89,7 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
if (isUndef(vnode.text)) { if (isUndef(vnode.text)) {
vnode.text = ''; vnode.text = '';
} }
vnode.elm = api.createComment(vnode.text as string); vnode.elm = api.createComment(vnode.text!);
} else if (sel !== undefined) { } else if (sel !== undefined) {
// Parse selector // Parse selector
const hashIdx = sel.indexOf('#'); const hashIdx = sel.indexOf('#');
@ -96,7 +97,7 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
const hash = hashIdx > 0 ? hashIdx : sel.length; const hash = hashIdx > 0 ? hashIdx : sel.length;
const dot = dotIdx > 0 ? dotIdx : sel.length; const dot = dotIdx > 0 ? dotIdx : sel.length;
const tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel; const tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
const elm = vnode.elm = isDef(data) && isDef(i = (data as VNodeData).ns) const elm = vnode.elm = isDef(data) && isDef(i = data.ns)
? api.createElementNS(i, tag) ? api.createElementNS(i, tag)
: api.createElement(tag); : api.createElement(tag);
if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot)); if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot));
@ -112,13 +113,15 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
} else if (is.primitive(vnode.text)) { } else if (is.primitive(vnode.text)) {
api.appendChild(elm, api.createTextNode(vnode.text)); api.appendChild(elm, api.createTextNode(vnode.text));
} }
i = (vnode.data as VNodeData).hook; // Reuse variable const hook = vnode.data!.hook;
if (isDef(i)) { if (isDef(hook)) {
if (i.create) i.create(emptyNode, vnode); hook.create?.(emptyNode, vnode);
if (i.insert) insertedVnodeQueue.push(vnode); if (hook.insert) {
insertedVnodeQueue.push(vnode);
}
} }
} else { } else {
vnode.elm = api.createTextNode(vnode.text as string); vnode.elm = api.createTextNode(vnode.text!);
} }
return vnode.elm; return vnode.elm;
} }
@ -140,15 +143,15 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
} }
function invokeDestroyHook(vnode: VNode) { function invokeDestroyHook(vnode: VNode) {
let i: any, j: number, data = vnode.data; const data = vnode.data;
if (data !== undefined) { if (data !== undefined) {
if (isDef(i = data.hook) && isDef(i = i.destroy)) i(vnode); data?.hook?.destroy?.(vnode);
for (i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode); for (let i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode);
if (vnode.children !== undefined) { if (vnode.children !== undefined) {
for (j = 0; j < vnode.children.length; ++j) { for (let j = 0; j < vnode.children.length; ++j) {
i = vnode.children[j]; const child = vnode.children[j];
if (i != null && typeof i !== "string") { if (child != null && typeof child !== "string") {
invokeDestroyHook(i); invokeDestroyHook(child);
} }
} }
} }
@ -160,20 +163,21 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
startIdx: number, startIdx: number,
endIdx: number): void { endIdx: number): void {
for (; startIdx <= endIdx; ++startIdx) { for (; startIdx <= endIdx; ++startIdx) {
let i: any, listeners: number, rm: () => void, ch = vnodes[startIdx]; let listeners: number, rm: () => void, ch = vnodes[startIdx];
if (ch != null) { if (ch != null) {
if (isDef(ch.sel)) { if (isDef(ch.sel)) {
invokeDestroyHook(ch); invokeDestroyHook(ch);
listeners = cbs.remove.length + 1; listeners = cbs.remove.length + 1;
rm = createRmCb(ch.elm as Node, listeners); rm = createRmCb(ch.elm!, listeners);
for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm); for (let i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm);
if (isDef(i = ch.data) && isDef(i = i.hook) && isDef(i = i.remove)) { const removeHook = ch?.data?.hook?.remove;
i(ch, rm); if (isDef(removeHook)) {
removeHook(ch, rm);
} else { } else {
rm(); rm();
} }
} else { // Text node } else { // Text node
api.removeChild(parentElm, ch.elm as Node); api.removeChild(parentElm, ch.elm!);
} }
} }
} }
@ -190,7 +194,7 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
let newEndIdx = newCh.length - 1; let newEndIdx = newCh.length - 1;
let newStartVnode = newCh[0]; let newStartVnode = newCh[0];
let newEndVnode = newCh[newEndIdx]; let newEndVnode = newCh[newEndIdx];
let oldKeyToIdx: any; let oldKeyToIdx: KeyToIndexMap | undefined;
let idxInOld: number; let idxInOld: number;
let elmToMove: VNode; let elmToMove: VNode;
let before: any; let before: any;
@ -214,12 +218,12 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
newEndVnode = newCh[--newEndIdx]; newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue); patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
api.insertBefore(parentElm, oldStartVnode.elm as Node, api.nextSibling(oldEndVnode.elm as Node)); api.insertBefore(parentElm, oldStartVnode.elm!, api.nextSibling(oldEndVnode.elm!));
oldStartVnode = oldCh[++oldStartIdx]; oldStartVnode = oldCh[++oldStartIdx];
newEndVnode = newCh[--newEndIdx]; newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue); patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
api.insertBefore(parentElm, oldEndVnode.elm as Node, oldStartVnode.elm as Node); api.insertBefore(parentElm, oldEndVnode.elm!, oldStartVnode.elm!);
oldEndVnode = oldCh[--oldEndIdx]; oldEndVnode = oldCh[--oldEndIdx];
newStartVnode = newCh[++newStartIdx]; newStartVnode = newCh[++newStartIdx];
} else { } else {
@ -228,16 +232,16 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
} }
idxInOld = oldKeyToIdx[newStartVnode.key as string]; idxInOld = oldKeyToIdx[newStartVnode.key as string];
if (isUndef(idxInOld)) { // New element if (isUndef(idxInOld)) { // New element
api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm as Node); api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm!);
newStartVnode = newCh[++newStartIdx]; newStartVnode = newCh[++newStartIdx];
} else { } else {
elmToMove = oldCh[idxInOld]; elmToMove = oldCh[idxInOld];
if (elmToMove.sel !== newStartVnode.sel) { if (elmToMove.sel !== newStartVnode.sel) {
api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm as Node); api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm!);
} else { } else {
patchVnode(elmToMove, newStartVnode, insertedVnodeQueue); patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
oldCh[idxInOld] = undefined as any; oldCh[idxInOld] = undefined as any;
api.insertBefore(parentElm, (elmToMove.elm as Node), oldStartVnode.elm as Node); api.insertBefore(parentElm, elmToMove.elm!, oldStartVnode.elm!);
} }
newStartVnode = newCh[++newStartIdx]; newStartVnode = newCh[++newStartIdx];
} }
@ -254,39 +258,34 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
} }
function patchVnode(oldVnode: VNode, vnode: VNode, insertedVnodeQueue: VNodeQueue) { function patchVnode(oldVnode: VNode, vnode: VNode, insertedVnodeQueue: VNodeQueue) {
let i: any, hook: any; const hook = vnode.data?.hook;
if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) { hook?.prepatch?.(oldVnode, vnode);
i(oldVnode, vnode); const elm = vnode.elm = oldVnode.elm!;
} let oldCh = oldVnode.children as VNode[];
const elm = vnode.elm = (oldVnode.elm as Node); let ch = vnode.children as VNode[];
let oldCh = oldVnode.children;
let ch = vnode.children;
if (oldVnode === vnode) return; if (oldVnode === vnode) return;
if (vnode.data !== undefined) { if (vnode.data !== undefined) {
for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode); for (let i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);
i = vnode.data.hook; vnode.data.hook?.update?.(oldVnode, vnode);
if (isDef(i) && isDef(i = i.update)) i(oldVnode, vnode);
} }
if (isUndef(vnode.text)) { if (isUndef(vnode.text)) {
if (isDef(oldCh) && isDef(ch)) { if (isDef(oldCh) && isDef(ch)) {
if (oldCh !== ch) updateChildren(elm, oldCh as VNode[], ch as VNode[], insertedVnodeQueue); if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);
} else if (isDef(ch)) { } else if (isDef(ch)) {
if (isDef(oldVnode.text)) api.setTextContent(elm, ''); if (isDef(oldVnode.text)) api.setTextContent(elm, '');
addVnodes(elm, null, ch as VNode[], 0, (ch as VNode[]).length - 1, insertedVnodeQueue); addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
} else if (isDef(oldCh)) { } else if (isDef(oldCh)) {
removeVnodes(elm, oldCh as VNode[], 0, (oldCh as VNode[]).length - 1); removeVnodes(elm, oldCh, 0, oldCh.length - 1);
} else if (isDef(oldVnode.text)) { } else if (isDef(oldVnode.text)) {
api.setTextContent(elm, ''); api.setTextContent(elm, '');
} }
} else if (oldVnode.text !== vnode.text) { } else if (oldVnode.text !== vnode.text) {
if (isDef(oldCh)) { if (isDef(oldCh)) {
removeVnodes(elm, oldCh as VNode[], 0, (oldCh as VNode[]).length - 1); removeVnodes(elm, oldCh, 0, oldCh.length - 1);
} }
api.setTextContent(elm, vnode.text as string); api.setTextContent(elm, vnode.text!);
}
if (isDef(hook) && isDef(i = hook.postpatch)) {
i(oldVnode, vnode);
} }
hook?.postpatch?.(oldVnode, vnode);
} }
return function patch(oldVnode: VNode | Element, vnode: VNode): VNode { return function patch(oldVnode: VNode | Element, vnode: VNode): VNode {
@ -301,19 +300,19 @@ export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
if (sameVnode(oldVnode, vnode)) { if (sameVnode(oldVnode, vnode)) {
patchVnode(oldVnode, vnode, insertedVnodeQueue); patchVnode(oldVnode, vnode, insertedVnodeQueue);
} else { } else {
elm = oldVnode.elm as Node; elm = oldVnode.elm!;
parent = api.parentNode(elm); parent = api.parentNode(elm);
createElm(vnode, insertedVnodeQueue); createElm(vnode, insertedVnodeQueue);
if (parent !== null) { if (parent !== null) {
api.insertBefore(parent, vnode.elm as Node, api.nextSibling(elm)); api.insertBefore(parent, vnode.elm!, api.nextSibling(elm));
removeVnodes(parent, [oldVnode], 0, 0); removeVnodes(parent, [oldVnode], 0, 0);
} }
} }
for (i = 0; i < insertedVnodeQueue.length; ++i) { for (i = 0; i < insertedVnodeQueue.length; ++i) {
(((insertedVnodeQueue[i].data as VNodeData).hook as Hooks).insert as any)(insertedVnodeQueue[i]); insertedVnodeQueue[i].data!.hook!.insert!(insertedVnodeQueue[i]);
} }
for (i = 0; i < cbs.post.length; ++i) cbs.post[i](); for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();
return vnode; return vnode;

Loading…
Cancel
Save