1784 lines
64 KiB
JavaScript
1784 lines
64 KiB
JavaScript
var __create = Object.create;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __toESM = (mod, isNodeMode, target) => {
|
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
for (let key of __getOwnPropNames(mod))
|
|
if (!__hasOwnProp.call(to, key))
|
|
__defProp(to, key, {
|
|
get: () => mod[key],
|
|
enumerable: true
|
|
});
|
|
return to;
|
|
};
|
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
|
|
// node_modules/mithril/render/vnode.js
|
|
var require_vnode = __commonJS((exports, module) => {
|
|
function Vnode(tag, key, attrs, children, text, dom) {
|
|
return { tag, key, attrs, children, text, dom, domSize: undefined, state: undefined, events: undefined, instance: undefined };
|
|
}
|
|
Vnode.normalize = function(node) {
|
|
if (Array.isArray(node))
|
|
return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined);
|
|
if (node == null || typeof node === "boolean")
|
|
return null;
|
|
if (typeof node === "object")
|
|
return node;
|
|
return Vnode("#", undefined, undefined, String(node), undefined, undefined);
|
|
};
|
|
Vnode.normalizeChildren = function(input) {
|
|
var children = [];
|
|
if (input.length) {
|
|
var isKeyed = input[0] != null && input[0].key != null;
|
|
for (var i = 1;i < input.length; i++) {
|
|
if ((input[i] != null && input[i].key != null) !== isKeyed) {
|
|
throw new TypeError(isKeyed && (input[i] != null || typeof input[i] === "boolean") ? "In fragments, vnodes must either all have keys or none have keys. You may wish to consider using an explicit keyed empty fragment, m.fragment({key: ...}), instead of a hole." : "In fragments, vnodes must either all have keys or none have keys.");
|
|
}
|
|
}
|
|
for (var i = 0;i < input.length; i++) {
|
|
children[i] = Vnode.normalize(input[i]);
|
|
}
|
|
}
|
|
return children;
|
|
};
|
|
module.exports = Vnode;
|
|
});
|
|
|
|
// node_modules/mithril/render/hyperscriptVnode.js
|
|
var require_hyperscriptVnode = __commonJS((exports, module) => {
|
|
var Vnode = require_vnode();
|
|
module.exports = function() {
|
|
var attrs = arguments[this], start = this + 1, children;
|
|
if (attrs == null) {
|
|
attrs = {};
|
|
} else if (typeof attrs !== "object" || attrs.tag != null || Array.isArray(attrs)) {
|
|
attrs = {};
|
|
start = this;
|
|
}
|
|
if (arguments.length === start + 1) {
|
|
children = arguments[start];
|
|
if (!Array.isArray(children))
|
|
children = [children];
|
|
} else {
|
|
children = [];
|
|
while (start < arguments.length)
|
|
children.push(arguments[start++]);
|
|
}
|
|
return Vnode("", attrs.key, attrs, children);
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/util/hasOwn.js
|
|
var require_hasOwn = __commonJS((exports, module) => {
|
|
module.exports = {}.hasOwnProperty;
|
|
});
|
|
|
|
// node_modules/mithril/render/hyperscript.js
|
|
var require_hyperscript = __commonJS((exports, module) => {
|
|
function isEmpty(object) {
|
|
for (var key in object)
|
|
if (hasOwn.call(object, key))
|
|
return false;
|
|
return true;
|
|
}
|
|
function compileSelector(selector) {
|
|
var match, tag = "div", classes = [], attrs = {};
|
|
while (match = selectorParser.exec(selector)) {
|
|
var type = match[1], value = match[2];
|
|
if (type === "" && value !== "")
|
|
tag = value;
|
|
else if (type === "#")
|
|
attrs.id = value;
|
|
else if (type === ".")
|
|
classes.push(value);
|
|
else if (match[3][0] === "[") {
|
|
var attrValue = match[6];
|
|
if (attrValue)
|
|
attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\");
|
|
if (match[4] === "class")
|
|
classes.push(attrValue);
|
|
else
|
|
attrs[match[4]] = attrValue === "" ? attrValue : attrValue || true;
|
|
}
|
|
}
|
|
if (classes.length > 0)
|
|
attrs.className = classes.join(" ");
|
|
return selectorCache[selector] = { tag, attrs };
|
|
}
|
|
function execSelector(state, vnode) {
|
|
var attrs = vnode.attrs;
|
|
var hasClass = hasOwn.call(attrs, "class");
|
|
var className = hasClass ? attrs.class : attrs.className;
|
|
vnode.tag = state.tag;
|
|
if (!isEmpty(state.attrs)) {
|
|
var newAttrs = {};
|
|
for (var key in attrs) {
|
|
if (hasOwn.call(attrs, key))
|
|
newAttrs[key] = attrs[key];
|
|
}
|
|
attrs = newAttrs;
|
|
}
|
|
for (var key in state.attrs) {
|
|
if (hasOwn.call(state.attrs, key) && key !== "className" && !hasOwn.call(attrs, key)) {
|
|
attrs[key] = state.attrs[key];
|
|
}
|
|
}
|
|
if (className != null || state.attrs.className != null)
|
|
attrs.className = className != null ? state.attrs.className != null ? String(state.attrs.className) + " " + String(className) : className : state.attrs.className != null ? state.attrs.className : null;
|
|
if (hasClass)
|
|
attrs.class = null;
|
|
vnode.attrs = attrs;
|
|
return vnode;
|
|
}
|
|
function hyperscript(selector) {
|
|
if (selector == null || typeof selector !== "string" && typeof selector !== "function" && typeof selector.view !== "function") {
|
|
throw Error("The selector must be either a string or a component.");
|
|
}
|
|
var vnode = hyperscriptVnode.apply(1, arguments);
|
|
if (typeof selector === "string") {
|
|
vnode.children = Vnode.normalizeChildren(vnode.children);
|
|
if (selector !== "[")
|
|
return execSelector(selectorCache[selector] || compileSelector(selector), vnode);
|
|
}
|
|
vnode.tag = selector;
|
|
return vnode;
|
|
}
|
|
var Vnode = require_vnode();
|
|
var hyperscriptVnode = require_hyperscriptVnode();
|
|
var hasOwn = require_hasOwn();
|
|
var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g;
|
|
var selectorCache = {};
|
|
module.exports = hyperscript;
|
|
});
|
|
|
|
// node_modules/mithril/render/trust.js
|
|
var require_trust = __commonJS((exports, module) => {
|
|
var Vnode = require_vnode();
|
|
module.exports = function(html) {
|
|
if (html == null)
|
|
html = "";
|
|
return Vnode("<", undefined, undefined, html, undefined, undefined);
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/render/fragment.js
|
|
var require_fragment = __commonJS((exports, module) => {
|
|
var Vnode = require_vnode();
|
|
var hyperscriptVnode = require_hyperscriptVnode();
|
|
module.exports = function() {
|
|
var vnode = hyperscriptVnode.apply(0, arguments);
|
|
vnode.tag = "[";
|
|
vnode.children = Vnode.normalizeChildren(vnode.children);
|
|
return vnode;
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/hyperscript.js
|
|
var require_hyperscript2 = __commonJS((exports, module) => {
|
|
var hyperscript = require_hyperscript();
|
|
hyperscript.trust = require_trust();
|
|
hyperscript.fragment = require_fragment();
|
|
module.exports = hyperscript;
|
|
});
|
|
|
|
// node_modules/mithril/render/domFor.js
|
|
var require_domFor = __commonJS((exports, module) => {
|
|
function* domFor({ dom, domSize }, { generation } = {}) {
|
|
if (dom != null)
|
|
do {
|
|
const { nextSibling } = dom;
|
|
if (delayedRemoval.get(dom) === generation) {
|
|
yield dom;
|
|
domSize--;
|
|
}
|
|
dom = nextSibling;
|
|
} while (domSize);
|
|
}
|
|
var delayedRemoval = new WeakMap;
|
|
module.exports = {
|
|
delayedRemoval,
|
|
domFor
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/render/render.js
|
|
var require_render = __commonJS((exports, module) => {
|
|
var Vnode = require_vnode();
|
|
var df = require_domFor();
|
|
var delayedRemoval = df.delayedRemoval;
|
|
var domFor = df.domFor;
|
|
module.exports = function() {
|
|
var nameSpace = {
|
|
svg: "http://www.w3.org/2000/svg",
|
|
math: "http://www.w3.org/1998/Math/MathML"
|
|
};
|
|
var currentRedraw;
|
|
var currentRender;
|
|
function getDocument(dom) {
|
|
return dom.ownerDocument;
|
|
}
|
|
function getNameSpace(vnode) {
|
|
return vnode.attrs && vnode.attrs.xmlns || nameSpace[vnode.tag];
|
|
}
|
|
function checkState(vnode, original) {
|
|
if (vnode.state !== original)
|
|
throw new Error("'vnode.state' must not be modified.");
|
|
}
|
|
function callHook(vnode) {
|
|
var original = vnode.state;
|
|
try {
|
|
return this.apply(original, arguments);
|
|
} finally {
|
|
checkState(vnode, original);
|
|
}
|
|
}
|
|
function activeElement(dom) {
|
|
try {
|
|
return getDocument(dom).activeElement;
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) {
|
|
for (var i = start;i < end; i++) {
|
|
var vnode = vnodes[i];
|
|
if (vnode != null) {
|
|
createNode(parent, vnode, hooks, ns, nextSibling);
|
|
}
|
|
}
|
|
}
|
|
function createNode(parent, vnode, hooks, ns, nextSibling) {
|
|
var tag = vnode.tag;
|
|
if (typeof tag === "string") {
|
|
vnode.state = {};
|
|
if (vnode.attrs != null)
|
|
initLifecycle(vnode.attrs, vnode, hooks);
|
|
switch (tag) {
|
|
case "#":
|
|
createText(parent, vnode, nextSibling);
|
|
break;
|
|
case "<":
|
|
createHTML(parent, vnode, ns, nextSibling);
|
|
break;
|
|
case "[":
|
|
createFragment(parent, vnode, hooks, ns, nextSibling);
|
|
break;
|
|
default:
|
|
createElement(parent, vnode, hooks, ns, nextSibling);
|
|
}
|
|
} else
|
|
createComponent(parent, vnode, hooks, ns, nextSibling);
|
|
}
|
|
function createText(parent, vnode, nextSibling) {
|
|
vnode.dom = getDocument(parent).createTextNode(vnode.children);
|
|
insertDOM(parent, vnode.dom, nextSibling);
|
|
}
|
|
var possibleParents = { caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup" };
|
|
function createHTML(parent, vnode, ns, nextSibling) {
|
|
var match = vnode.children.match(/^\s*?<(\w+)/im) || [];
|
|
var temp = getDocument(parent).createElement(possibleParents[match[1]] || "div");
|
|
if (ns === "http://www.w3.org/2000/svg") {
|
|
temp.innerHTML = "<svg xmlns=\"http://www.w3.org/2000/svg\">" + vnode.children + "</svg>";
|
|
temp = temp.firstChild;
|
|
} else {
|
|
temp.innerHTML = vnode.children;
|
|
}
|
|
vnode.dom = temp.firstChild;
|
|
vnode.domSize = temp.childNodes.length;
|
|
var fragment = getDocument(parent).createDocumentFragment();
|
|
var child;
|
|
while (child = temp.firstChild) {
|
|
fragment.appendChild(child);
|
|
}
|
|
insertDOM(parent, fragment, nextSibling);
|
|
}
|
|
function createFragment(parent, vnode, hooks, ns, nextSibling) {
|
|
var fragment = getDocument(parent).createDocumentFragment();
|
|
if (vnode.children != null) {
|
|
var children = vnode.children;
|
|
createNodes(fragment, children, 0, children.length, hooks, null, ns);
|
|
}
|
|
vnode.dom = fragment.firstChild;
|
|
vnode.domSize = fragment.childNodes.length;
|
|
insertDOM(parent, fragment, nextSibling);
|
|
}
|
|
function createElement(parent, vnode, hooks, ns, nextSibling) {
|
|
var tag = vnode.tag;
|
|
var attrs = vnode.attrs;
|
|
var is = attrs && attrs.is;
|
|
ns = getNameSpace(vnode) || ns;
|
|
var element = ns ? is ? getDocument(parent).createElementNS(ns, tag, { is }) : getDocument(parent).createElementNS(ns, tag) : is ? getDocument(parent).createElement(tag, { is }) : getDocument(parent).createElement(tag);
|
|
vnode.dom = element;
|
|
if (attrs != null) {
|
|
setAttrs(vnode, attrs, ns);
|
|
}
|
|
insertDOM(parent, element, nextSibling);
|
|
if (!maybeSetContentEditable(vnode)) {
|
|
if (vnode.children != null) {
|
|
var children = vnode.children;
|
|
createNodes(element, children, 0, children.length, hooks, null, ns);
|
|
if (vnode.tag === "select" && attrs != null)
|
|
setLateSelectAttrs(vnode, attrs);
|
|
}
|
|
}
|
|
}
|
|
function initComponent(vnode, hooks) {
|
|
var sentinel;
|
|
if (typeof vnode.tag.view === "function") {
|
|
vnode.state = Object.create(vnode.tag);
|
|
sentinel = vnode.state.view;
|
|
if (sentinel.$$reentrantLock$$ != null)
|
|
return;
|
|
sentinel.$$reentrantLock$$ = true;
|
|
} else {
|
|
vnode.state = undefined;
|
|
sentinel = vnode.tag;
|
|
if (sentinel.$$reentrantLock$$ != null)
|
|
return;
|
|
sentinel.$$reentrantLock$$ = true;
|
|
vnode.state = vnode.tag.prototype != null && typeof vnode.tag.prototype.view === "function" ? new vnode.tag(vnode) : vnode.tag(vnode);
|
|
}
|
|
initLifecycle(vnode.state, vnode, hooks);
|
|
if (vnode.attrs != null)
|
|
initLifecycle(vnode.attrs, vnode, hooks);
|
|
vnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode));
|
|
if (vnode.instance === vnode)
|
|
throw Error("A view cannot return the vnode it received as argument");
|
|
sentinel.$$reentrantLock$$ = null;
|
|
}
|
|
function createComponent(parent, vnode, hooks, ns, nextSibling) {
|
|
initComponent(vnode, hooks);
|
|
if (vnode.instance != null) {
|
|
createNode(parent, vnode.instance, hooks, ns, nextSibling);
|
|
vnode.dom = vnode.instance.dom;
|
|
vnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0;
|
|
} else {
|
|
vnode.domSize = 0;
|
|
}
|
|
}
|
|
function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) {
|
|
if (old === vnodes || old == null && vnodes == null)
|
|
return;
|
|
else if (old == null || old.length === 0)
|
|
createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns);
|
|
else if (vnodes == null || vnodes.length === 0)
|
|
removeNodes(parent, old, 0, old.length);
|
|
else {
|
|
var isOldKeyed = old[0] != null && old[0].key != null;
|
|
var isKeyed = vnodes[0] != null && vnodes[0].key != null;
|
|
var start = 0, oldStart = 0;
|
|
if (!isOldKeyed)
|
|
while (oldStart < old.length && old[oldStart] == null)
|
|
oldStart++;
|
|
if (!isKeyed)
|
|
while (start < vnodes.length && vnodes[start] == null)
|
|
start++;
|
|
if (isOldKeyed !== isKeyed) {
|
|
removeNodes(parent, old, oldStart, old.length);
|
|
createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns);
|
|
} else if (!isKeyed) {
|
|
var commonLength = old.length < vnodes.length ? old.length : vnodes.length;
|
|
start = start < oldStart ? start : oldStart;
|
|
for (;start < commonLength; start++) {
|
|
o = old[start];
|
|
v = vnodes[start];
|
|
if (o === v || o == null && v == null)
|
|
continue;
|
|
else if (o == null)
|
|
createNode(parent, v, hooks, ns, getNextSibling(old, start + 1, nextSibling));
|
|
else if (v == null)
|
|
removeNode(parent, o);
|
|
else
|
|
updateNode(parent, o, v, hooks, getNextSibling(old, start + 1, nextSibling), ns);
|
|
}
|
|
if (old.length > commonLength)
|
|
removeNodes(parent, old, start, old.length);
|
|
if (vnodes.length > commonLength)
|
|
createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns);
|
|
} else {
|
|
var oldEnd = old.length - 1, end = vnodes.length - 1, map, o, v, oe, ve, topSibling;
|
|
while (oldEnd >= oldStart && end >= start) {
|
|
oe = old[oldEnd];
|
|
ve = vnodes[end];
|
|
if (oe.key !== ve.key)
|
|
break;
|
|
if (oe !== ve)
|
|
updateNode(parent, oe, ve, hooks, nextSibling, ns);
|
|
if (ve.dom != null)
|
|
nextSibling = ve.dom;
|
|
oldEnd--, end--;
|
|
}
|
|
while (oldEnd >= oldStart && end >= start) {
|
|
o = old[oldStart];
|
|
v = vnodes[start];
|
|
if (o.key !== v.key)
|
|
break;
|
|
oldStart++, start++;
|
|
if (o !== v)
|
|
updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), ns);
|
|
}
|
|
while (oldEnd >= oldStart && end >= start) {
|
|
if (start === end)
|
|
break;
|
|
if (o.key !== ve.key || oe.key !== v.key)
|
|
break;
|
|
topSibling = getNextSibling(old, oldStart, nextSibling);
|
|
moveDOM(parent, oe, topSibling);
|
|
if (oe !== v)
|
|
updateNode(parent, oe, v, hooks, topSibling, ns);
|
|
if (++start <= --end)
|
|
moveDOM(parent, o, nextSibling);
|
|
if (o !== ve)
|
|
updateNode(parent, o, ve, hooks, nextSibling, ns);
|
|
if (ve.dom != null)
|
|
nextSibling = ve.dom;
|
|
oldStart++;
|
|
oldEnd--;
|
|
oe = old[oldEnd];
|
|
ve = vnodes[end];
|
|
o = old[oldStart];
|
|
v = vnodes[start];
|
|
}
|
|
while (oldEnd >= oldStart && end >= start) {
|
|
if (oe.key !== ve.key)
|
|
break;
|
|
if (oe !== ve)
|
|
updateNode(parent, oe, ve, hooks, nextSibling, ns);
|
|
if (ve.dom != null)
|
|
nextSibling = ve.dom;
|
|
oldEnd--, end--;
|
|
oe = old[oldEnd];
|
|
ve = vnodes[end];
|
|
}
|
|
if (start > end)
|
|
removeNodes(parent, old, oldStart, oldEnd + 1);
|
|
else if (oldStart > oldEnd)
|
|
createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns);
|
|
else {
|
|
var originalNextSibling = nextSibling, vnodesLength = end - start + 1, oldIndices = new Array(vnodesLength), li = 0, i = 0, pos = 2147483647, matched = 0, map, lisIndices;
|
|
for (i = 0;i < vnodesLength; i++)
|
|
oldIndices[i] = -1;
|
|
for (i = end;i >= start; i--) {
|
|
if (map == null)
|
|
map = getKeyMap(old, oldStart, oldEnd + 1);
|
|
ve = vnodes[i];
|
|
var oldIndex = map[ve.key];
|
|
if (oldIndex != null) {
|
|
pos = oldIndex < pos ? oldIndex : -1;
|
|
oldIndices[i - start] = oldIndex;
|
|
oe = old[oldIndex];
|
|
old[oldIndex] = null;
|
|
if (oe !== ve)
|
|
updateNode(parent, oe, ve, hooks, nextSibling, ns);
|
|
if (ve.dom != null)
|
|
nextSibling = ve.dom;
|
|
matched++;
|
|
}
|
|
}
|
|
nextSibling = originalNextSibling;
|
|
if (matched !== oldEnd - oldStart + 1)
|
|
removeNodes(parent, old, oldStart, oldEnd + 1);
|
|
if (matched === 0)
|
|
createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns);
|
|
else {
|
|
if (pos === -1) {
|
|
lisIndices = makeLisIndices(oldIndices);
|
|
li = lisIndices.length - 1;
|
|
for (i = end;i >= start; i--) {
|
|
v = vnodes[i];
|
|
if (oldIndices[i - start] === -1)
|
|
createNode(parent, v, hooks, ns, nextSibling);
|
|
else {
|
|
if (lisIndices[li] === i - start)
|
|
li--;
|
|
else
|
|
moveDOM(parent, v, nextSibling);
|
|
}
|
|
if (v.dom != null)
|
|
nextSibling = vnodes[i].dom;
|
|
}
|
|
} else {
|
|
for (i = end;i >= start; i--) {
|
|
v = vnodes[i];
|
|
if (oldIndices[i - start] === -1)
|
|
createNode(parent, v, hooks, ns, nextSibling);
|
|
if (v.dom != null)
|
|
nextSibling = vnodes[i].dom;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function updateNode(parent, old, vnode, hooks, nextSibling, ns) {
|
|
var oldTag = old.tag, tag = vnode.tag;
|
|
if (oldTag === tag) {
|
|
vnode.state = old.state;
|
|
vnode.events = old.events;
|
|
if (shouldNotUpdate(vnode, old))
|
|
return;
|
|
if (typeof oldTag === "string") {
|
|
if (vnode.attrs != null) {
|
|
updateLifecycle(vnode.attrs, vnode, hooks);
|
|
}
|
|
switch (oldTag) {
|
|
case "#":
|
|
updateText(old, vnode);
|
|
break;
|
|
case "<":
|
|
updateHTML(parent, old, vnode, ns, nextSibling);
|
|
break;
|
|
case "[":
|
|
updateFragment(parent, old, vnode, hooks, nextSibling, ns);
|
|
break;
|
|
default:
|
|
updateElement(old, vnode, hooks, ns);
|
|
}
|
|
} else
|
|
updateComponent(parent, old, vnode, hooks, nextSibling, ns);
|
|
} else {
|
|
removeNode(parent, old);
|
|
createNode(parent, vnode, hooks, ns, nextSibling);
|
|
}
|
|
}
|
|
function updateText(old, vnode) {
|
|
if (old.children.toString() !== vnode.children.toString()) {
|
|
old.dom.nodeValue = vnode.children;
|
|
}
|
|
vnode.dom = old.dom;
|
|
}
|
|
function updateHTML(parent, old, vnode, ns, nextSibling) {
|
|
if (old.children !== vnode.children) {
|
|
removeDOM(parent, old, undefined);
|
|
createHTML(parent, vnode, ns, nextSibling);
|
|
} else {
|
|
vnode.dom = old.dom;
|
|
vnode.domSize = old.domSize;
|
|
}
|
|
}
|
|
function updateFragment(parent, old, vnode, hooks, nextSibling, ns) {
|
|
updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns);
|
|
var domSize = 0, children = vnode.children;
|
|
vnode.dom = null;
|
|
if (children != null) {
|
|
for (var i = 0;i < children.length; i++) {
|
|
var child = children[i];
|
|
if (child != null && child.dom != null) {
|
|
if (vnode.dom == null)
|
|
vnode.dom = child.dom;
|
|
domSize += child.domSize || 1;
|
|
}
|
|
}
|
|
if (domSize !== 1)
|
|
vnode.domSize = domSize;
|
|
}
|
|
}
|
|
function updateElement(old, vnode, hooks, ns) {
|
|
var element = vnode.dom = old.dom;
|
|
ns = getNameSpace(vnode) || ns;
|
|
updateAttrs(vnode, old.attrs, vnode.attrs, ns);
|
|
if (!maybeSetContentEditable(vnode)) {
|
|
updateNodes(element, old.children, vnode.children, hooks, null, ns);
|
|
}
|
|
}
|
|
function updateComponent(parent, old, vnode, hooks, nextSibling, ns) {
|
|
vnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode));
|
|
if (vnode.instance === vnode)
|
|
throw Error("A view cannot return the vnode it received as argument");
|
|
updateLifecycle(vnode.state, vnode, hooks);
|
|
if (vnode.attrs != null)
|
|
updateLifecycle(vnode.attrs, vnode, hooks);
|
|
if (vnode.instance != null) {
|
|
if (old.instance == null)
|
|
createNode(parent, vnode.instance, hooks, ns, nextSibling);
|
|
else
|
|
updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, ns);
|
|
vnode.dom = vnode.instance.dom;
|
|
vnode.domSize = vnode.instance.domSize;
|
|
} else if (old.instance != null) {
|
|
removeNode(parent, old.instance);
|
|
vnode.dom = undefined;
|
|
vnode.domSize = 0;
|
|
} else {
|
|
vnode.dom = old.dom;
|
|
vnode.domSize = old.domSize;
|
|
}
|
|
}
|
|
function getKeyMap(vnodes, start, end) {
|
|
var map = Object.create(null);
|
|
for (;start < end; start++) {
|
|
var vnode = vnodes[start];
|
|
if (vnode != null) {
|
|
var key = vnode.key;
|
|
if (key != null)
|
|
map[key] = start;
|
|
}
|
|
}
|
|
return map;
|
|
}
|
|
var lisTemp = [];
|
|
function makeLisIndices(a) {
|
|
var result = [0];
|
|
var u = 0, v = 0, i = 0;
|
|
var il = lisTemp.length = a.length;
|
|
for (var i = 0;i < il; i++)
|
|
lisTemp[i] = a[i];
|
|
for (var i = 0;i < il; ++i) {
|
|
if (a[i] === -1)
|
|
continue;
|
|
var j = result[result.length - 1];
|
|
if (a[j] < a[i]) {
|
|
lisTemp[i] = j;
|
|
result.push(i);
|
|
continue;
|
|
}
|
|
u = 0;
|
|
v = result.length - 1;
|
|
while (u < v) {
|
|
var c = (u >>> 1) + (v >>> 1) + (u & v & 1);
|
|
if (a[result[c]] < a[i]) {
|
|
u = c + 1;
|
|
} else {
|
|
v = c;
|
|
}
|
|
}
|
|
if (a[i] < a[result[u]]) {
|
|
if (u > 0)
|
|
lisTemp[i] = result[u - 1];
|
|
result[u] = i;
|
|
}
|
|
}
|
|
u = result.length;
|
|
v = result[u - 1];
|
|
while (u-- > 0) {
|
|
result[u] = v;
|
|
v = lisTemp[v];
|
|
}
|
|
lisTemp.length = 0;
|
|
return result;
|
|
}
|
|
function getNextSibling(vnodes, i, nextSibling) {
|
|
for (;i < vnodes.length; i++) {
|
|
if (vnodes[i] != null && vnodes[i].dom != null)
|
|
return vnodes[i].dom;
|
|
}
|
|
return nextSibling;
|
|
}
|
|
function moveDOM(parent, vnode, nextSibling) {
|
|
if (vnode.dom != null) {
|
|
var target;
|
|
if (vnode.domSize == null) {
|
|
target = vnode.dom;
|
|
} else {
|
|
target = getDocument(parent).createDocumentFragment();
|
|
for (var dom of domFor(vnode))
|
|
target.appendChild(dom);
|
|
}
|
|
insertDOM(parent, target, nextSibling);
|
|
}
|
|
}
|
|
function insertDOM(parent, dom, nextSibling) {
|
|
if (nextSibling != null)
|
|
parent.insertBefore(dom, nextSibling);
|
|
else
|
|
parent.appendChild(dom);
|
|
}
|
|
function maybeSetContentEditable(vnode) {
|
|
if (vnode.attrs == null || vnode.attrs.contenteditable == null && vnode.attrs.contentEditable == null)
|
|
return false;
|
|
var children = vnode.children;
|
|
if (children != null && children.length === 1 && children[0].tag === "<") {
|
|
var content = children[0].children;
|
|
if (vnode.dom.innerHTML !== content)
|
|
vnode.dom.innerHTML = content;
|
|
} else if (children != null && children.length !== 0)
|
|
throw new Error("Child node of a contenteditable must be trusted.");
|
|
return true;
|
|
}
|
|
function removeNodes(parent, vnodes, start, end) {
|
|
for (var i = start;i < end; i++) {
|
|
var vnode = vnodes[i];
|
|
if (vnode != null)
|
|
removeNode(parent, vnode);
|
|
}
|
|
}
|
|
function removeNode(parent, vnode) {
|
|
var mask = 0;
|
|
var original = vnode.state;
|
|
var stateResult, attrsResult;
|
|
if (typeof vnode.tag !== "string" && typeof vnode.state.onbeforeremove === "function") {
|
|
var result = callHook.call(vnode.state.onbeforeremove, vnode);
|
|
if (result != null && typeof result.then === "function") {
|
|
mask = 1;
|
|
stateResult = result;
|
|
}
|
|
}
|
|
if (vnode.attrs && typeof vnode.attrs.onbeforeremove === "function") {
|
|
var result = callHook.call(vnode.attrs.onbeforeremove, vnode);
|
|
if (result != null && typeof result.then === "function") {
|
|
mask |= 2;
|
|
attrsResult = result;
|
|
}
|
|
}
|
|
checkState(vnode, original);
|
|
var generation;
|
|
if (!mask) {
|
|
onremove(vnode);
|
|
removeDOM(parent, vnode, generation);
|
|
} else {
|
|
generation = currentRender;
|
|
for (var dom of domFor(vnode))
|
|
delayedRemoval.set(dom, generation);
|
|
if (stateResult != null) {
|
|
stateResult.finally(function() {
|
|
if (mask & 1) {
|
|
mask &= 2;
|
|
if (!mask) {
|
|
checkState(vnode, original);
|
|
onremove(vnode);
|
|
removeDOM(parent, vnode, generation);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
if (attrsResult != null) {
|
|
attrsResult.finally(function() {
|
|
if (mask & 2) {
|
|
mask &= 1;
|
|
if (!mask) {
|
|
checkState(vnode, original);
|
|
onremove(vnode);
|
|
removeDOM(parent, vnode, generation);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
function removeDOM(parent, vnode, generation) {
|
|
if (vnode.dom == null)
|
|
return;
|
|
if (vnode.domSize == null) {
|
|
if (delayedRemoval.get(vnode.dom) === generation)
|
|
parent.removeChild(vnode.dom);
|
|
} else {
|
|
for (var dom of domFor(vnode, { generation }))
|
|
parent.removeChild(dom);
|
|
}
|
|
}
|
|
function onremove(vnode) {
|
|
if (typeof vnode.tag !== "string" && typeof vnode.state.onremove === "function")
|
|
callHook.call(vnode.state.onremove, vnode);
|
|
if (vnode.attrs && typeof vnode.attrs.onremove === "function")
|
|
callHook.call(vnode.attrs.onremove, vnode);
|
|
if (typeof vnode.tag !== "string") {
|
|
if (vnode.instance != null)
|
|
onremove(vnode.instance);
|
|
} else {
|
|
var children = vnode.children;
|
|
if (Array.isArray(children)) {
|
|
for (var i = 0;i < children.length; i++) {
|
|
var child = children[i];
|
|
if (child != null)
|
|
onremove(child);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function setAttrs(vnode, attrs, ns) {
|
|
if (vnode.tag === "input" && attrs.type != null)
|
|
vnode.dom.setAttribute("type", attrs.type);
|
|
var isFileInput = attrs != null && vnode.tag === "input" && attrs.type === "file";
|
|
for (var key in attrs) {
|
|
setAttr(vnode, key, null, attrs[key], ns, isFileInput);
|
|
}
|
|
}
|
|
function setAttr(vnode, key, old, value, ns, isFileInput) {
|
|
if (key === "key" || key === "is" || value == null || isLifecycleMethod(key) || old === value && !isFormAttribute(vnode, key) && typeof value !== "object" || key === "type" && vnode.tag === "input")
|
|
return;
|
|
if (key[0] === "o" && key[1] === "n")
|
|
return updateEvent(vnode, key, value);
|
|
if (key.slice(0, 6) === "xlink:")
|
|
vnode.dom.setAttributeNS("http://www.w3.org/1999/xlink", key.slice(6), value);
|
|
else if (key === "style")
|
|
updateStyle(vnode.dom, old, value);
|
|
else if (hasPropertyKey(vnode, key, ns)) {
|
|
if (key === "value") {
|
|
if ((vnode.tag === "input" || vnode.tag === "textarea") && vnode.dom.value === "" + value && (isFileInput || vnode.dom === activeElement(vnode.dom)))
|
|
return;
|
|
if (vnode.tag === "select" && old !== null && vnode.dom.value === "" + value)
|
|
return;
|
|
if (vnode.tag === "option" && old !== null && vnode.dom.value === "" + value)
|
|
return;
|
|
if (isFileInput && "" + value !== "") {
|
|
console.error("`value` is read-only on file inputs!");
|
|
return;
|
|
}
|
|
}
|
|
vnode.dom[key] = value;
|
|
} else {
|
|
if (typeof value === "boolean") {
|
|
if (value)
|
|
vnode.dom.setAttribute(key, "");
|
|
else
|
|
vnode.dom.removeAttribute(key);
|
|
} else
|
|
vnode.dom.setAttribute(key === "className" ? "class" : key, value);
|
|
}
|
|
}
|
|
function removeAttr(vnode, key, old, ns) {
|
|
if (key === "key" || key === "is" || old == null || isLifecycleMethod(key))
|
|
return;
|
|
if (key[0] === "o" && key[1] === "n")
|
|
updateEvent(vnode, key, undefined);
|
|
else if (key === "style")
|
|
updateStyle(vnode.dom, old, null);
|
|
else if (hasPropertyKey(vnode, key, ns) && key !== "className" && key !== "title" && !(key === "value" && (vnode.tag === "option" || vnode.tag === "select" && vnode.dom.selectedIndex === -1 && vnode.dom === activeElement(vnode.dom))) && !(vnode.tag === "input" && key === "type")) {
|
|
vnode.dom[key] = null;
|
|
} else {
|
|
var nsLastIndex = key.indexOf(":");
|
|
if (nsLastIndex !== -1)
|
|
key = key.slice(nsLastIndex + 1);
|
|
if (old !== false)
|
|
vnode.dom.removeAttribute(key === "className" ? "class" : key);
|
|
}
|
|
}
|
|
function setLateSelectAttrs(vnode, attrs) {
|
|
if ("value" in attrs) {
|
|
if (attrs.value === null) {
|
|
if (vnode.dom.selectedIndex !== -1)
|
|
vnode.dom.value = null;
|
|
} else {
|
|
var normalized = "" + attrs.value;
|
|
if (vnode.dom.value !== normalized || vnode.dom.selectedIndex === -1) {
|
|
vnode.dom.value = normalized;
|
|
}
|
|
}
|
|
}
|
|
if ("selectedIndex" in attrs)
|
|
setAttr(vnode, "selectedIndex", null, attrs.selectedIndex, undefined);
|
|
}
|
|
function updateAttrs(vnode, old, attrs, ns) {
|
|
if (old && old === attrs) {
|
|
console.warn("Don't reuse attrs object, use new object for every redraw, this will throw in next major");
|
|
}
|
|
if (attrs != null) {
|
|
if (vnode.tag === "input" && attrs.type != null)
|
|
vnode.dom.setAttribute("type", attrs.type);
|
|
var isFileInput = vnode.tag === "input" && attrs.type === "file";
|
|
for (var key in attrs) {
|
|
setAttr(vnode, key, old && old[key], attrs[key], ns, isFileInput);
|
|
}
|
|
}
|
|
var val;
|
|
if (old != null) {
|
|
for (var key in old) {
|
|
if ((val = old[key]) != null && (attrs == null || attrs[key] == null)) {
|
|
removeAttr(vnode, key, val, ns);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function isFormAttribute(vnode, attr) {
|
|
return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode.dom === activeElement(vnode.dom) || vnode.tag === "option" && vnode.dom.parentNode === activeElement(vnode.dom);
|
|
}
|
|
function isLifecycleMethod(attr) {
|
|
return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate";
|
|
}
|
|
function hasPropertyKey(vnode, key, ns) {
|
|
return ns === undefined && (vnode.tag.indexOf("-") > -1 || vnode.attrs != null && vnode.attrs.is || key !== "href" && key !== "list" && key !== "form" && key !== "width" && key !== "height") && key in vnode.dom;
|
|
}
|
|
var uppercaseRegex = /[A-Z]/g;
|
|
function toLowerCase(capital) {
|
|
return "-" + capital.toLowerCase();
|
|
}
|
|
function normalizeKey(key) {
|
|
return key[0] === "-" && key[1] === "-" ? key : key === "cssFloat" ? "float" : key.replace(uppercaseRegex, toLowerCase);
|
|
}
|
|
function updateStyle(element, old, style) {
|
|
if (old === style) {
|
|
} else if (style == null) {
|
|
element.style = "";
|
|
} else if (typeof style !== "object") {
|
|
element.style = style;
|
|
} else if (old == null || typeof old !== "object") {
|
|
element.style.cssText = "";
|
|
for (var key in style) {
|
|
var value = style[key];
|
|
if (value != null)
|
|
element.style.setProperty(normalizeKey(key), String(value));
|
|
}
|
|
} else {
|
|
for (var key in style) {
|
|
var value = style[key];
|
|
if (value != null && (value = String(value)) !== String(old[key])) {
|
|
element.style.setProperty(normalizeKey(key), value);
|
|
}
|
|
}
|
|
for (var key in old) {
|
|
if (old[key] != null && style[key] == null) {
|
|
element.style.removeProperty(normalizeKey(key));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function EventDict() {
|
|
this._ = currentRedraw;
|
|
}
|
|
EventDict.prototype = Object.create(null);
|
|
EventDict.prototype.handleEvent = function(ev) {
|
|
var handler = this["on" + ev.type];
|
|
var result;
|
|
if (typeof handler === "function")
|
|
result = handler.call(ev.currentTarget, ev);
|
|
else if (typeof handler.handleEvent === "function")
|
|
handler.handleEvent(ev);
|
|
if (this._ && ev.redraw !== false)
|
|
(0, this._)();
|
|
if (result === false) {
|
|
ev.preventDefault();
|
|
ev.stopPropagation();
|
|
}
|
|
};
|
|
function updateEvent(vnode, key, value) {
|
|
if (vnode.events != null) {
|
|
vnode.events._ = currentRedraw;
|
|
if (vnode.events[key] === value)
|
|
return;
|
|
if (value != null && (typeof value === "function" || typeof value === "object")) {
|
|
if (vnode.events[key] == null)
|
|
vnode.dom.addEventListener(key.slice(2), vnode.events, false);
|
|
vnode.events[key] = value;
|
|
} else {
|
|
if (vnode.events[key] != null)
|
|
vnode.dom.removeEventListener(key.slice(2), vnode.events, false);
|
|
vnode.events[key] = undefined;
|
|
}
|
|
} else if (value != null && (typeof value === "function" || typeof value === "object")) {
|
|
vnode.events = new EventDict;
|
|
vnode.dom.addEventListener(key.slice(2), vnode.events, false);
|
|
vnode.events[key] = value;
|
|
}
|
|
}
|
|
function initLifecycle(source, vnode, hooks) {
|
|
if (typeof source.oninit === "function")
|
|
callHook.call(source.oninit, vnode);
|
|
if (typeof source.oncreate === "function")
|
|
hooks.push(callHook.bind(source.oncreate, vnode));
|
|
}
|
|
function updateLifecycle(source, vnode, hooks) {
|
|
if (typeof source.onupdate === "function")
|
|
hooks.push(callHook.bind(source.onupdate, vnode));
|
|
}
|
|
function shouldNotUpdate(vnode, old) {
|
|
do {
|
|
if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") {
|
|
var force = callHook.call(vnode.attrs.onbeforeupdate, vnode, old);
|
|
if (force !== undefined && !force)
|
|
break;
|
|
}
|
|
if (typeof vnode.tag !== "string" && typeof vnode.state.onbeforeupdate === "function") {
|
|
var force = callHook.call(vnode.state.onbeforeupdate, vnode, old);
|
|
if (force !== undefined && !force)
|
|
break;
|
|
}
|
|
return false;
|
|
} while (false);
|
|
vnode.dom = old.dom;
|
|
vnode.domSize = old.domSize;
|
|
vnode.instance = old.instance;
|
|
vnode.attrs = old.attrs;
|
|
vnode.children = old.children;
|
|
vnode.text = old.text;
|
|
return true;
|
|
}
|
|
var currentDOM;
|
|
return function(dom, vnodes, redraw) {
|
|
if (!dom)
|
|
throw new TypeError("DOM element being rendered to does not exist.");
|
|
if (currentDOM != null && dom.contains(currentDOM)) {
|
|
throw new TypeError("Node is currently being rendered to and thus is locked.");
|
|
}
|
|
var prevRedraw = currentRedraw;
|
|
var prevDOM = currentDOM;
|
|
var hooks = [];
|
|
var active = activeElement(dom);
|
|
var namespace = dom.namespaceURI;
|
|
currentDOM = dom;
|
|
currentRedraw = typeof redraw === "function" ? redraw : undefined;
|
|
currentRender = {};
|
|
try {
|
|
if (dom.vnodes == null)
|
|
dom.textContent = "";
|
|
vnodes = Vnode.normalizeChildren(Array.isArray(vnodes) ? vnodes : [vnodes]);
|
|
updateNodes(dom, dom.vnodes, vnodes, hooks, null, namespace === "http://www.w3.org/1999/xhtml" ? undefined : namespace);
|
|
dom.vnodes = vnodes;
|
|
if (active != null && activeElement(dom) !== active && typeof active.focus === "function")
|
|
active.focus();
|
|
for (var i = 0;i < hooks.length; i++)
|
|
hooks[i]();
|
|
} finally {
|
|
currentRedraw = prevRedraw;
|
|
currentDOM = prevDOM;
|
|
}
|
|
};
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/render.js
|
|
var require_render2 = __commonJS((exports, module) => {
|
|
module.exports = require_render()(typeof window !== "undefined" ? window : null);
|
|
});
|
|
|
|
// node_modules/mithril/api/mount-redraw.js
|
|
var require_mount_redraw = __commonJS((exports, module) => {
|
|
var Vnode = require_vnode();
|
|
module.exports = function(render, schedule, console2) {
|
|
var subscriptions = [];
|
|
var pending = false;
|
|
var offset = -1;
|
|
function sync() {
|
|
for (offset = 0;offset < subscriptions.length; offset += 2) {
|
|
try {
|
|
render(subscriptions[offset], Vnode(subscriptions[offset + 1]), redraw);
|
|
} catch (e) {
|
|
console2.error(e);
|
|
}
|
|
}
|
|
offset = -1;
|
|
}
|
|
function redraw() {
|
|
if (!pending) {
|
|
pending = true;
|
|
schedule(function() {
|
|
pending = false;
|
|
sync();
|
|
});
|
|
}
|
|
}
|
|
redraw.sync = sync;
|
|
function mount(root, component) {
|
|
if (component != null && component.view == null && typeof component !== "function") {
|
|
throw new TypeError("m.mount expects a component, not a vnode.");
|
|
}
|
|
var index = subscriptions.indexOf(root);
|
|
if (index >= 0) {
|
|
subscriptions.splice(index, 2);
|
|
if (index <= offset)
|
|
offset -= 2;
|
|
render(root, []);
|
|
}
|
|
if (component != null) {
|
|
subscriptions.push(root, component);
|
|
render(root, Vnode(component), redraw);
|
|
}
|
|
}
|
|
return { mount, redraw };
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/mount-redraw.js
|
|
var require_mount_redraw2 = __commonJS((exports, module) => {
|
|
var render = require_render2();
|
|
module.exports = require_mount_redraw()(render, typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : null, typeof console !== "undefined" ? console : null);
|
|
});
|
|
|
|
// node_modules/mithril/querystring/build.js
|
|
var require_build = __commonJS((exports, module) => {
|
|
module.exports = function(object) {
|
|
if (Object.prototype.toString.call(object) !== "[object Object]")
|
|
return "";
|
|
var args = [];
|
|
for (var key in object) {
|
|
destructure(key, object[key]);
|
|
}
|
|
return args.join("&");
|
|
function destructure(key2, value) {
|
|
if (Array.isArray(value)) {
|
|
for (var i = 0;i < value.length; i++) {
|
|
destructure(key2 + "[" + i + "]", value[i]);
|
|
}
|
|
} else if (Object.prototype.toString.call(value) === "[object Object]") {
|
|
for (var i in value) {
|
|
destructure(key2 + "[" + i + "]", value[i]);
|
|
}
|
|
} else
|
|
args.push(encodeURIComponent(key2) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : ""));
|
|
}
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/util/assign.js
|
|
var require_assign = __commonJS((exports, module) => {
|
|
var hasOwn = require_hasOwn();
|
|
module.exports = Object.assign || function(target, source) {
|
|
for (var key in source) {
|
|
if (hasOwn.call(source, key))
|
|
target[key] = source[key];
|
|
}
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/pathname/build.js
|
|
var require_build2 = __commonJS((exports, module) => {
|
|
var buildQueryString = require_build();
|
|
var assign = require_assign();
|
|
module.exports = function(template, params) {
|
|
if (/:([^\/\.-]+)(\.{3})?:/.test(template)) {
|
|
throw new SyntaxError("Template parameter names must be separated by either a '/', '-', or '.'.");
|
|
}
|
|
if (params == null)
|
|
return template;
|
|
var queryIndex = template.indexOf("?");
|
|
var hashIndex = template.indexOf("#");
|
|
var queryEnd = hashIndex < 0 ? template.length : hashIndex;
|
|
var pathEnd = queryIndex < 0 ? queryEnd : queryIndex;
|
|
var path = template.slice(0, pathEnd);
|
|
var query = {};
|
|
assign(query, params);
|
|
var resolved = path.replace(/:([^\/\.-]+)(\.{3})?/g, function(m, key, variadic) {
|
|
delete query[key];
|
|
if (params[key] == null)
|
|
return m;
|
|
return variadic ? params[key] : encodeURIComponent(String(params[key]));
|
|
});
|
|
var newQueryIndex = resolved.indexOf("?");
|
|
var newHashIndex = resolved.indexOf("#");
|
|
var newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex;
|
|
var newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex;
|
|
var result = resolved.slice(0, newPathEnd);
|
|
if (queryIndex >= 0)
|
|
result += template.slice(queryIndex, queryEnd);
|
|
if (newQueryIndex >= 0)
|
|
result += (queryIndex < 0 ? "?" : "&") + resolved.slice(newQueryIndex, newQueryEnd);
|
|
var querystring = buildQueryString(query);
|
|
if (querystring)
|
|
result += (queryIndex < 0 && newQueryIndex < 0 ? "?" : "&") + querystring;
|
|
if (hashIndex >= 0)
|
|
result += template.slice(hashIndex);
|
|
if (newHashIndex >= 0)
|
|
result += (hashIndex < 0 ? "" : "&") + resolved.slice(newHashIndex);
|
|
return result;
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/request/request.js
|
|
var require_request = __commonJS((exports, module) => {
|
|
var buildPathname = require_build2();
|
|
var hasOwn = require_hasOwn();
|
|
module.exports = function($window, oncompletion) {
|
|
function PromiseProxy(executor) {
|
|
return new Promise(executor);
|
|
}
|
|
function makeRequest(url, args) {
|
|
return new Promise(function(resolve, reject) {
|
|
url = buildPathname(url, args.params);
|
|
var method = args.method != null ? args.method.toUpperCase() : "GET";
|
|
var body = args.body;
|
|
var assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData || body instanceof $window.URLSearchParams);
|
|
var responseType = args.responseType || (typeof args.extract === "function" ? "" : "json");
|
|
var xhr = new $window.XMLHttpRequest, aborted = false, isTimeout = false;
|
|
var original = xhr, replacedAbort;
|
|
var abort = xhr.abort;
|
|
xhr.abort = function() {
|
|
aborted = true;
|
|
abort.call(this);
|
|
};
|
|
xhr.open(method, url, args.async !== false, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined);
|
|
if (assumeJSON && body != null && !hasHeader(args, "content-type")) {
|
|
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
|
|
}
|
|
if (typeof args.deserialize !== "function" && !hasHeader(args, "accept")) {
|
|
xhr.setRequestHeader("Accept", "application/json, text/*");
|
|
}
|
|
if (args.withCredentials)
|
|
xhr.withCredentials = args.withCredentials;
|
|
if (args.timeout)
|
|
xhr.timeout = args.timeout;
|
|
xhr.responseType = responseType;
|
|
for (var key in args.headers) {
|
|
if (hasOwn.call(args.headers, key)) {
|
|
xhr.setRequestHeader(key, args.headers[key]);
|
|
}
|
|
}
|
|
xhr.onreadystatechange = function(ev) {
|
|
if (aborted)
|
|
return;
|
|
if (ev.target.readyState === 4) {
|
|
try {
|
|
var success = ev.target.status >= 200 && ev.target.status < 300 || ev.target.status === 304 || /^file:\/\//i.test(url);
|
|
var response = ev.target.response, message;
|
|
if (responseType === "json") {
|
|
if (!ev.target.responseType && typeof args.extract !== "function") {
|
|
try {
|
|
response = JSON.parse(ev.target.responseText);
|
|
} catch (e) {
|
|
response = null;
|
|
}
|
|
}
|
|
} else if (!responseType || responseType === "text") {
|
|
if (response == null)
|
|
response = ev.target.responseText;
|
|
}
|
|
if (typeof args.extract === "function") {
|
|
response = args.extract(ev.target, args);
|
|
success = true;
|
|
} else if (typeof args.deserialize === "function") {
|
|
response = args.deserialize(response);
|
|
}
|
|
if (success) {
|
|
if (typeof args.type === "function") {
|
|
if (Array.isArray(response)) {
|
|
for (var i = 0;i < response.length; i++) {
|
|
response[i] = new args.type(response[i]);
|
|
}
|
|
} else
|
|
response = new args.type(response);
|
|
}
|
|
resolve(response);
|
|
} else {
|
|
var completeErrorResponse = function() {
|
|
try {
|
|
message = ev.target.responseText;
|
|
} catch (e) {
|
|
message = response;
|
|
}
|
|
var error = new Error(message);
|
|
error.code = ev.target.status;
|
|
error.response = response;
|
|
reject(error);
|
|
};
|
|
if (xhr.status === 0) {
|
|
setTimeout(function() {
|
|
if (isTimeout)
|
|
return;
|
|
completeErrorResponse();
|
|
});
|
|
} else
|
|
completeErrorResponse();
|
|
}
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
}
|
|
};
|
|
xhr.ontimeout = function(ev) {
|
|
isTimeout = true;
|
|
var error = new Error("Request timed out");
|
|
error.code = ev.target.status;
|
|
reject(error);
|
|
};
|
|
if (typeof args.config === "function") {
|
|
xhr = args.config(xhr, args, url) || xhr;
|
|
if (xhr !== original) {
|
|
replacedAbort = xhr.abort;
|
|
xhr.abort = function() {
|
|
aborted = true;
|
|
replacedAbort.call(this);
|
|
};
|
|
}
|
|
}
|
|
if (body == null)
|
|
xhr.send();
|
|
else if (typeof args.serialize === "function")
|
|
xhr.send(args.serialize(body));
|
|
else if (body instanceof $window.FormData || body instanceof $window.URLSearchParams)
|
|
xhr.send(body);
|
|
else
|
|
xhr.send(JSON.stringify(body));
|
|
});
|
|
}
|
|
PromiseProxy.prototype = Promise.prototype;
|
|
PromiseProxy.__proto__ = Promise;
|
|
function hasHeader(args, name) {
|
|
for (var key in args.headers) {
|
|
if (hasOwn.call(args.headers, key) && key.toLowerCase() === name)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
return {
|
|
request: function(url, args) {
|
|
if (typeof url !== "string") {
|
|
args = url;
|
|
url = url.url;
|
|
} else if (args == null)
|
|
args = {};
|
|
var promise = makeRequest(url, args);
|
|
if (args.background === true)
|
|
return promise;
|
|
var count = 0;
|
|
function complete() {
|
|
if (--count === 0 && typeof oncompletion === "function")
|
|
oncompletion();
|
|
}
|
|
return wrap(promise);
|
|
function wrap(promise2) {
|
|
var then = promise2.then;
|
|
promise2.constructor = PromiseProxy;
|
|
promise2.then = function() {
|
|
count++;
|
|
var next = then.apply(promise2, arguments);
|
|
next.then(complete, function(e) {
|
|
complete();
|
|
if (count === 0)
|
|
throw e;
|
|
});
|
|
return wrap(next);
|
|
};
|
|
return promise2;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/request.js
|
|
var require_request2 = __commonJS((exports, module) => {
|
|
var mountRedraw = require_mount_redraw2();
|
|
module.exports = require_request()(typeof window !== "undefined" ? window : null, mountRedraw.redraw);
|
|
});
|
|
|
|
// node_modules/mithril/querystring/parse.js
|
|
var require_parse = __commonJS((exports, module) => {
|
|
function decodeURIComponentSave(str) {
|
|
try {
|
|
return decodeURIComponent(str);
|
|
} catch (err) {
|
|
return str;
|
|
}
|
|
}
|
|
module.exports = function(string) {
|
|
if (string === "" || string == null)
|
|
return {};
|
|
if (string.charAt(0) === "?")
|
|
string = string.slice(1);
|
|
var entries = string.split("&"), counters = {}, data = {};
|
|
for (var i = 0;i < entries.length; i++) {
|
|
var entry = entries[i].split("=");
|
|
var key = decodeURIComponentSave(entry[0]);
|
|
var value = entry.length === 2 ? decodeURIComponentSave(entry[1]) : "";
|
|
if (value === "true")
|
|
value = true;
|
|
else if (value === "false")
|
|
value = false;
|
|
var levels = key.split(/\]\[?|\[/);
|
|
var cursor = data;
|
|
if (key.indexOf("[") > -1)
|
|
levels.pop();
|
|
for (var j = 0;j < levels.length; j++) {
|
|
var level = levels[j], nextLevel = levels[j + 1];
|
|
var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10));
|
|
if (level === "") {
|
|
var key = levels.slice(0, j).join();
|
|
if (counters[key] == null) {
|
|
counters[key] = Array.isArray(cursor) ? cursor.length : 0;
|
|
}
|
|
level = counters[key]++;
|
|
} else if (level === "__proto__")
|
|
break;
|
|
if (j === levels.length - 1)
|
|
cursor[level] = value;
|
|
else {
|
|
var desc = Object.getOwnPropertyDescriptor(cursor, level);
|
|
if (desc != null)
|
|
desc = desc.value;
|
|
if (desc == null)
|
|
cursor[level] = desc = isNumber ? [] : {};
|
|
cursor = desc;
|
|
}
|
|
}
|
|
}
|
|
return data;
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/pathname/parse.js
|
|
var require_parse2 = __commonJS((exports, module) => {
|
|
var parseQueryString = require_parse();
|
|
module.exports = function(url) {
|
|
var queryIndex = url.indexOf("?");
|
|
var hashIndex = url.indexOf("#");
|
|
var queryEnd = hashIndex < 0 ? url.length : hashIndex;
|
|
var pathEnd = queryIndex < 0 ? queryEnd : queryIndex;
|
|
var path = url.slice(0, pathEnd).replace(/\/{2,}/g, "/");
|
|
if (!path)
|
|
path = "/";
|
|
else {
|
|
if (path[0] !== "/")
|
|
path = "/" + path;
|
|
}
|
|
return {
|
|
path,
|
|
params: queryIndex < 0 ? {} : parseQueryString(url.slice(queryIndex + 1, queryEnd))
|
|
};
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/pathname/compileTemplate.js
|
|
var require_compileTemplate = __commonJS((exports, module) => {
|
|
var parsePathname = require_parse2();
|
|
module.exports = function(template) {
|
|
var templateData = parsePathname(template);
|
|
var templateKeys = Object.keys(templateData.params);
|
|
var keys = [];
|
|
var regexp = new RegExp("^" + templateData.path.replace(/:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, function(m, key, extra) {
|
|
if (key == null)
|
|
return "\\" + m;
|
|
keys.push({ k: key, r: extra === "..." });
|
|
if (extra === "...")
|
|
return "(.*)";
|
|
if (extra === ".")
|
|
return "([^/]+)\\.";
|
|
return "([^/]+)" + (extra || "");
|
|
}) + "$");
|
|
return function(data) {
|
|
for (var i = 0;i < templateKeys.length; i++) {
|
|
if (templateData.params[templateKeys[i]] !== data.params[templateKeys[i]])
|
|
return false;
|
|
}
|
|
if (!keys.length)
|
|
return regexp.test(data.path);
|
|
var values = regexp.exec(data.path);
|
|
if (values == null)
|
|
return false;
|
|
for (var i = 0;i < keys.length; i++) {
|
|
data.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1]);
|
|
}
|
|
return true;
|
|
};
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/util/censor.js
|
|
var require_censor = __commonJS((exports, module) => {
|
|
var hasOwn = require_hasOwn();
|
|
var magic = new RegExp("^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$");
|
|
module.exports = function(attrs, extras) {
|
|
var result = {};
|
|
if (extras != null) {
|
|
for (var key in attrs) {
|
|
if (hasOwn.call(attrs, key) && !magic.test(key) && extras.indexOf(key) < 0) {
|
|
result[key] = attrs[key];
|
|
}
|
|
}
|
|
} else {
|
|
for (var key in attrs) {
|
|
if (hasOwn.call(attrs, key) && !magic.test(key)) {
|
|
result[key] = attrs[key];
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/api/router.js
|
|
var require_router = __commonJS((exports, module) => {
|
|
function decodeURIComponentSave(component) {
|
|
try {
|
|
return decodeURIComponent(component);
|
|
} catch (e) {
|
|
return component;
|
|
}
|
|
}
|
|
var Vnode = require_vnode();
|
|
var m = require_hyperscript();
|
|
var buildPathname = require_build2();
|
|
var parsePathname = require_parse2();
|
|
var compileTemplate = require_compileTemplate();
|
|
var assign = require_assign();
|
|
var censor = require_censor();
|
|
var sentinel = {};
|
|
module.exports = function($window, mountRedraw) {
|
|
var callAsync = $window == null ? null : typeof $window.setImmediate === "function" ? $window.setImmediate : $window.setTimeout;
|
|
var p = Promise.resolve();
|
|
var scheduled = false;
|
|
var ready = false;
|
|
var state = 0;
|
|
var compiled, fallbackRoute;
|
|
var currentResolver = sentinel, component, attrs, currentPath, lastUpdate;
|
|
var RouterRoot = {
|
|
onbeforeupdate: function() {
|
|
state = state ? 2 : 1;
|
|
return !(!state || sentinel === currentResolver);
|
|
},
|
|
onremove: function() {
|
|
$window.removeEventListener("popstate", fireAsync, false);
|
|
$window.removeEventListener("hashchange", resolveRoute, false);
|
|
},
|
|
view: function() {
|
|
if (!state || sentinel === currentResolver)
|
|
return;
|
|
var vnode = [Vnode(component, attrs.key, attrs)];
|
|
if (currentResolver)
|
|
vnode = currentResolver.render(vnode[0]);
|
|
return vnode;
|
|
}
|
|
};
|
|
var SKIP = route.SKIP = {};
|
|
function resolveRoute() {
|
|
scheduled = false;
|
|
var prefix = $window.location.hash;
|
|
if (route.prefix[0] !== "#") {
|
|
prefix = $window.location.search + prefix;
|
|
if (route.prefix[0] !== "?") {
|
|
prefix = $window.location.pathname + prefix;
|
|
if (prefix[0] !== "/")
|
|
prefix = "/" + prefix;
|
|
}
|
|
}
|
|
var path = prefix.concat().replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponentSave).slice(route.prefix.length);
|
|
var data = parsePathname(path);
|
|
assign(data.params, $window.history.state);
|
|
function reject(e) {
|
|
console.error(e);
|
|
setPath(fallbackRoute, null, { replace: true });
|
|
}
|
|
loop(0);
|
|
function loop(i) {
|
|
for (;i < compiled.length; i++) {
|
|
if (compiled[i].check(data)) {
|
|
var payload = compiled[i].component;
|
|
var matchedRoute = compiled[i].route;
|
|
var localComp = payload;
|
|
var update = lastUpdate = function(comp) {
|
|
if (update !== lastUpdate)
|
|
return;
|
|
if (comp === SKIP)
|
|
return loop(i + 1);
|
|
component = comp != null && (typeof comp.view === "function" || typeof comp === "function") ? comp : "div";
|
|
attrs = data.params, currentPath = path, lastUpdate = null;
|
|
currentResolver = payload.render ? payload : null;
|
|
if (state === 2)
|
|
mountRedraw.redraw();
|
|
else {
|
|
state = 2;
|
|
mountRedraw.redraw.sync();
|
|
}
|
|
};
|
|
if (payload.view || typeof payload === "function") {
|
|
payload = {};
|
|
update(localComp);
|
|
} else if (payload.onmatch) {
|
|
p.then(function() {
|
|
return payload.onmatch(data.params, path, matchedRoute);
|
|
}).then(update, path === fallbackRoute ? null : reject);
|
|
} else
|
|
update("div");
|
|
return;
|
|
}
|
|
}
|
|
if (path === fallbackRoute) {
|
|
throw new Error("Could not resolve default route " + fallbackRoute + ".");
|
|
}
|
|
setPath(fallbackRoute, null, { replace: true });
|
|
}
|
|
}
|
|
function fireAsync() {
|
|
if (!scheduled) {
|
|
scheduled = true;
|
|
callAsync(resolveRoute);
|
|
}
|
|
}
|
|
function setPath(path, data, options) {
|
|
path = buildPathname(path, data);
|
|
if (ready) {
|
|
fireAsync();
|
|
var state2 = options ? options.state : null;
|
|
var title = options ? options.title : null;
|
|
if (options && options.replace)
|
|
$window.history.replaceState(state2, title, route.prefix + path);
|
|
else
|
|
$window.history.pushState(state2, title, route.prefix + path);
|
|
} else {
|
|
$window.location.href = route.prefix + path;
|
|
}
|
|
}
|
|
function route(root, defaultRoute, routes) {
|
|
if (!root)
|
|
throw new TypeError("DOM element being rendered to does not exist.");
|
|
compiled = Object.keys(routes).map(function(route2) {
|
|
if (route2[0] !== "/")
|
|
throw new SyntaxError("Routes must start with a '/'.");
|
|
if (/:([^\/\.-]+)(\.{3})?:/.test(route2)) {
|
|
throw new SyntaxError("Route parameter names must be separated with either '/', '.', or '-'.");
|
|
}
|
|
return {
|
|
route: route2,
|
|
component: routes[route2],
|
|
check: compileTemplate(route2)
|
|
};
|
|
});
|
|
fallbackRoute = defaultRoute;
|
|
if (defaultRoute != null) {
|
|
var defaultData = parsePathname(defaultRoute);
|
|
if (!compiled.some(function(i) {
|
|
return i.check(defaultData);
|
|
})) {
|
|
throw new ReferenceError("Default route doesn't match any known routes.");
|
|
}
|
|
}
|
|
if (typeof $window.history.pushState === "function") {
|
|
$window.addEventListener("popstate", fireAsync, false);
|
|
} else if (route.prefix[0] === "#") {
|
|
$window.addEventListener("hashchange", resolveRoute, false);
|
|
}
|
|
ready = true;
|
|
mountRedraw.mount(root, RouterRoot);
|
|
resolveRoute();
|
|
}
|
|
route.set = function(path, data, options) {
|
|
if (lastUpdate != null) {
|
|
options = options || {};
|
|
options.replace = true;
|
|
}
|
|
lastUpdate = null;
|
|
setPath(path, data, options);
|
|
};
|
|
route.get = function() {
|
|
return currentPath;
|
|
};
|
|
route.prefix = "#!";
|
|
route.Link = {
|
|
view: function(vnode) {
|
|
var child = m(vnode.attrs.selector || "a", censor(vnode.attrs, ["options", "params", "selector", "onclick"]), vnode.children);
|
|
var options, onclick, href;
|
|
if (child.attrs.disabled = Boolean(child.attrs.disabled)) {
|
|
child.attrs.href = null;
|
|
child.attrs["aria-disabled"] = "true";
|
|
} else {
|
|
options = vnode.attrs.options;
|
|
onclick = vnode.attrs.onclick;
|
|
href = buildPathname(child.attrs.href, vnode.attrs.params);
|
|
child.attrs.href = route.prefix + href;
|
|
child.attrs.onclick = function(e) {
|
|
var result;
|
|
if (typeof onclick === "function") {
|
|
result = onclick.call(e.currentTarget, e);
|
|
} else if (onclick == null || typeof onclick !== "object") {
|
|
} else if (typeof onclick.handleEvent === "function") {
|
|
onclick.handleEvent(e);
|
|
}
|
|
if (result !== false && !e.defaultPrevented && (e.button === 0 || e.which === 0 || e.which === 1) && (!e.currentTarget.target || e.currentTarget.target === "_self") && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey) {
|
|
e.preventDefault();
|
|
e.redraw = false;
|
|
route.set(href, null, options);
|
|
}
|
|
};
|
|
}
|
|
return child;
|
|
}
|
|
};
|
|
route.param = function(key) {
|
|
return attrs && key != null ? attrs[key] : attrs;
|
|
};
|
|
return route;
|
|
};
|
|
});
|
|
|
|
// node_modules/mithril/route.js
|
|
var require_route = __commonJS((exports, module) => {
|
|
var mountRedraw = require_mount_redraw2();
|
|
module.exports = require_router()(typeof window !== "undefined" ? window : null, mountRedraw);
|
|
});
|
|
|
|
// node_modules/mithril/index.js
|
|
var require_mithril = __commonJS((exports, module) => {
|
|
var hyperscript = require_hyperscript2();
|
|
var request = require_request2();
|
|
var mountRedraw = require_mount_redraw2();
|
|
var domFor = require_domFor();
|
|
var m = function m() {
|
|
return hyperscript.apply(this, arguments);
|
|
};
|
|
m.m = hyperscript;
|
|
m.trust = hyperscript.trust;
|
|
m.fragment = hyperscript.fragment;
|
|
m.Fragment = "[";
|
|
m.mount = mountRedraw.mount;
|
|
m.route = require_route();
|
|
m.render = require_render2();
|
|
m.redraw = mountRedraw.redraw;
|
|
m.request = request.request;
|
|
m.parseQueryString = require_parse();
|
|
m.buildQueryString = require_build();
|
|
m.parsePathname = require_parse2();
|
|
m.buildPathname = require_build2();
|
|
m.vnode = require_vnode();
|
|
m.censor = require_censor();
|
|
m.domFor = domFor.domFor;
|
|
module.exports = m;
|
|
});
|
|
|
|
// frontend/index.js
|
|
var import_mithril = __toESM(require_mithril(), 1);
|
|
|
|
// frontend/websocket.js
|
|
function createWebSocket() {
|
|
return new WebSocket("ws://localhost:3000/chat-service");
|
|
}
|
|
|
|
// frontend/index.js
|
|
function newMessageText(name, message) {
|
|
return [
|
|
import_mithril.default("span.chatter", name + ": "),
|
|
import_mithril.default("span.chatter-message", message)
|
|
];
|
|
}
|
|
function clearMessageBox() {
|
|
const messageBox = document.getElementById("message");
|
|
messageBox.value = "";
|
|
}
|
|
function sendMessage(e) {
|
|
e.preventDefault();
|
|
const form = new FormData(e.target);
|
|
const message = {};
|
|
for (const [key, value] of form.entries()) {
|
|
message[key] = value;
|
|
}
|
|
socket.send(JSON.stringify(message));
|
|
clearMessageBox();
|
|
}
|
|
var messages = [];
|
|
var socket = createWebSocket();
|
|
socket.onmessage = function(event) {
|
|
if (event.type === "message") {
|
|
const message = JSON.parse(event.data);
|
|
messages.push(message);
|
|
import_mithril.default.redraw();
|
|
}
|
|
};
|
|
var MessageBox = {
|
|
view: function() {
|
|
return import_mithril.default(".messages", messages.map(function(message) {
|
|
return import_mithril.default(".message", newMessageText(message.chatter, message.message));
|
|
}));
|
|
}
|
|
};
|
|
var MessageInput = {
|
|
view: function() {
|
|
return import_mithril.default("div.chat-input", [
|
|
import_mithril.default("form", { method: "post", onsubmit: sendMessage }, [
|
|
import_mithril.default("input", { name: "chatter", placeholder: "Name" }),
|
|
import_mithril.default("input", { name: "message", placeholder: "Message", id: "message", required: true }),
|
|
import_mithril.default("input", { type: "submit", value: "Send" })
|
|
])
|
|
]);
|
|
}
|
|
};
|
|
var Chat = {
|
|
view: function(vnode) {
|
|
return import_mithril.default("div", [
|
|
import_mithril.default(MessageBox),
|
|
import_mithril.default(MessageInput)
|
|
]);
|
|
}
|
|
};
|
|
import_mithril.default.mount(document.getElementById("app"), Chat);
|