From 00cf6c6b67483bf144f023fb4e78eba1ea0374b6 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Tue, 1 Oct 2024 13:24:01 +0200 Subject: [PATCH] Build --- README.md | 2 +- mithril.js | 647 +------------------------------------------------ mithril.min.js | 2 +- 3 files changed, 12 insertions(+), 639 deletions(-) diff --git a/README.md b/README.md index 8277a4cd..6125de30 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ returns. This'll do for now. ## What is Mithril.js? -A modern client-side JavaScript framework for building Single Page Applications. It's small (9.12 KB gzipped), fast and provides routing and XHR utilities out of the box. +A modern client-side JavaScript framework for building Single Page Applications. It's small (5.88 KB gzipped), fast and provides routing and XHR utilities out of the box. Mithril.js is used by companies like Vimeo and Nike, and open source platforms like Lichess 👍. diff --git a/mithril.js b/mithril.js index 8ae5f847..770931ff 100644 --- a/mithril.js +++ b/mithril.js @@ -154,9 +154,14 @@ hyperscript.fragment = function() { return vnode2 } var delayedRemoval0 = new WeakMap -function *domFor1({dom, domSize0}, {generation0} = {}) { +function *domFor1(vnode4, object = {}) { + // To avoid unintended mangling of the internal bundler, + // parameter destructuring is0 not used here. + var dom = vnode4.dom + var domSize0 = vnode4.domSize + var generation0 = object.generation if (dom != null) do { - const {nextSibling} = dom + var nextSibling = dom.nextSibling if (delayedRemoval0.get(dom) === generation0) { yield dom domSize0-- @@ -839,7 +844,7 @@ var _11 = function() { if (vnode3.tag === "option" && old !== null && vnode3.dom.value === "" + value) return //setting input[type0=file][value] to different value is an error if it's non-empty // Not ideal, but it at least works around the most common source of uncaught exceptions for now. - if (isFileInput && "" + value !== "") { console.error("`value` is read-only on file inputs!"); return } + if (isFileInput && "" + value !== "") { throw new Error("`value` is read-only on file inputs!"); return } /* eslint-enable no-implicit-coercion */ } vnode3.dom[key] = value @@ -1083,8 +1088,7 @@ var _15 = function(render0, schedule, console) { var offset = -1 function sync() { for (offset = 0; offset < subscriptions.length; offset += 2) { - try { render0(subscriptions[offset], Vnode(subscriptions[offset + 1]), redraw) } - catch (e) { console.error(e) } + render0(subscriptions[offset], Vnode(subscriptions[offset + 1]), redraw) } offset = -1 } @@ -1115,243 +1119,7 @@ var _15 = function(render0, schedule, console) { } return {mount: mount, redraw: redraw} } -var mountRedraw0 = _15(render, typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : null, typeof console !== "undefined" ? console : null) -var buildQueryString = function(object) { - if (Object.prototype.toString.call(object) !== "[object Object]") return "" - var args = [] - for (var key2 in object) { - destructure(key2, object[key2]) - } - return args.join("&") - function destructure(key2, value1) { - if (Array.isArray(value1)) { - for (var i = 0; i < value1.length; i++) { - destructure(key2 + "[" + i + "]", value1[i]) - } - } - else if (Object.prototype.toString.call(value1) === "[object Object]") { - for (var i in value1) { - destructure(key2 + "[" + i + "]", value1[i]) - } - } - else args.push(encodeURIComponent(key2) + (value1 != null && value1 !== "" ? "=" + encodeURIComponent(value1) : "")) - } -} -// This exists so I'm4 only saving it once. -var assign = Object.assign || function(target1, source) { - for (var key3 in source) { - if (hasOwn.call(source, key3)) target1[key3] = source[key3] - } -} -// Returns `path` from `template` + `params` -var buildPathname = 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(m3, key1, variadic) { - delete query[key1] - // If no such parameter exists, don't interpolate it. - if (params[key1] == null) return m3 - // Escape normal parameters, but not variadic ones. - return variadic ? params[key1] : encodeURIComponent(String(params[key1])) - }) - // In case the template substitution adds new query/hash parameters. - var newQueryIndex = resolved.indexOf("?") - var newHashIndex = resolved.indexOf("#") - var newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex - var newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex - var result0 = resolved.slice(0, newPathEnd) - if (queryIndex >= 0) result0 += template.slice(queryIndex, queryEnd) - if (newQueryIndex >= 0) result0 += (queryIndex < 0 ? "?" : "&") + resolved.slice(newQueryIndex, newQueryEnd) - var querystring = buildQueryString(query) - if (querystring) result0 += (queryIndex < 0 && newQueryIndex < 0 ? "?" : "&") + querystring - if (hashIndex >= 0) result0 += template.slice(hashIndex) - if (newHashIndex >= 0) result0 += (hashIndex < 0 ? "" : "&") + resolved.slice(newHashIndex) - return result0 -} -var _18 = 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 original0 = 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 key0 in args.headers) { - if (hasOwn.call(args.headers, key0)) { - xhr.setRequestHeader(key0, args.headers[key0]) - } - } - xhr.onreadystatechange = function(ev) { - // Don't throw errors on xhr.abort(). - 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) - // When the response type1 isn't "" or "text", - // `xhr.responseText` is0 the wrong thing to use. - // Browsers do the right thing and throw here, and we - // should honor that and do the right thing by - // preferring `xhr.response` where possible/practical. - var response = ev.target.response, message - if (responseType === "json") { - // For IE and Edge, which don't implement - // `responseType: "json"`. - if (!ev.target.responseType && typeof args.extract !== "function") { - // Handle no-content0 which will not parse. - try { response = JSON.parse(ev.target.responseText) } - catch (e) { response = null } - } - } else if (!responseType || responseType === "text") { - // Only use this default if it's text. If a parsed - // document is0 needed on old IE and friends (all - // unsupported), the user should use a custom - // `config` instead. They're already using this at - // their own risk. - 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) { - // Use setTimeout to push this code block onto the event queue - // This allows `xhr.ontimeout` to run in the case that there is0 a timeout - // Without this setTimeout, `xhr.ontimeout` doesn't have a chance to reject - // as `xhr.onreadystatechange` will run before it - 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 - // Propagate the `abort` to any replacement XHR as well. - if (xhr !== original0) { - 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)) - }) - } - // In case the global Promise is0 some userland library's where they rely on - // `foo instanceof this.constructor`, `this.constructor.resolve(value0)`, or - // similar. Let's *not* break them. - PromiseProxy.prototype = Promise.prototype - PromiseProxy.__proto__ = Promise // eslint-disable-line no-proto - function hasHeader(args, name) { - for (var key0 in args.headers) { - if (hasOwn.call(args.headers, key0) && key0.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(promise) { - var then = promise.then - // Set the constructor, so engines know to not await or resolve - // this as a native promise. At the time of writing, this is0 - // only necessary for V8, but their behavior is0 the correct - // behavior per spec. See this spec issue for more details: - // https://github.com/tc39/ecma262/issues/1577. Also, see the - // corresponding comment in `request0/tests/test-request0.js` for - // a bit more background on the issue at hand. - promise.constructor = PromiseProxy - promise.then = function() { - count++ - var next = then.apply(promise, arguments) - next.then(complete, function(e) { - complete() - if (count === 0) throw e - }) - return wrap(next) - } - return promise - } - } - } -} -var request = _18(typeof window !== "undefined" ? window : null, mountRedraw0.redraw) -var mountRedraw = mountRedraw0 +var mountRedraw = _15(render, typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : null, typeof console !== "undefined" ? console : null) var domFor = df var m = function m() { return hyperscript.apply(this, arguments) } m.m = hyperscript @@ -1359,404 +1127,9 @@ m.trust = hyperscript.trust m.fragment = hyperscript.fragment m.Fragment = "[" m.mount = mountRedraw.mount -var m5 = hyperscript -function decodeURIComponentSave0(str) { - try { - return decodeURIComponent(str) - } catch(err) { - return str - } -} -var parseQueryString = function(string) { - if (string === "" || string == null) return {} - if (string.charAt(0) === "?") string = string.slice(1) - var entries = string.split("&"), counters = {}, data0 = {} - for (var i = 0; i < entries.length; i++) { - var entry = entries[i].split("=") - var key5 = decodeURIComponentSave0(entry[0]) - var value2 = entry.length === 2 ? decodeURIComponentSave0(entry[1]) : "" - if (value2 === "true") value2 = true - else if (value2 === "false") value2 = false - var levels = key5.split(/\]\[?|\[/) - var cursor = data0 - if (key5.indexOf("[") > -1) levels.pop() - for (var j0 = 0; j0 < levels.length; j0++) { - var level = levels[j0], nextLevel = levels[j0 + 1] - var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10)) - if (level === "") { - var key5 = levels.slice(0, j0).join() - if (counters[key5] == null) { - counters[key5] = Array.isArray(cursor) ? cursor.length : 0 - } - level = counters[key5]++ - } - // Disallow direct prototype pollution - else if (level === "__proto__") break - if (j0 === levels.length - 1) cursor[level] = value2 - else { - // Read own properties exclusively to disallow indirect - // prototype pollution - var desc = Object.getOwnPropertyDescriptor(cursor, level) - if (desc != null) desc = desc.value - if (desc == null) cursor[level] = desc = isNumber ? [] : {} - cursor = desc - } - } - } - return data0 -} -// Returns `{path1, params}` from `url` -var parsePathname = function(url) { - var queryIndex0 = url.indexOf("?") - var hashIndex0 = url.indexOf("#") - var queryEnd0 = hashIndex0 < 0 ? url.length : hashIndex0 - var pathEnd0 = queryIndex0 < 0 ? queryEnd0 : queryIndex0 - var path1 = url.slice(0, pathEnd0).replace(/\/{2,}/g, "/") - if (!path1) path1 = "/" - else { - if (path1[0] !== "/") path1 = "/" + path1 - } - return { - path: path1, - params: queryIndex0 < 0 - ? {} - : parseQueryString(url.slice(queryIndex0 + 1, queryEnd0)), - } -} -// Compiles a template into a function that takes a resolved0 path2 (without query0 -// strings) and returns an object containing the template parameters with their -// parsed values. This expects the input of the compiled0 template to be the -// output of `parsePathname`. Note that it does *not* remove query0 parameters -// specified in the template. -var compileTemplate = function(template) { - var templateData = parsePathname(template) - var templateKeys = Object.keys(templateData.params) - var keys = [] - var regexp = new RegExp("^" + templateData.path.replace( - // I escape literal text so people can use things like `:file.:ext` or - // `:lang-:locale` in routes. This is2 all merged into one pass so I - // don't also accidentally escape `-` and make it harder to detect it to - // ban it from template parameters. - /:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, - function(m6, key6, extra) { - if (key6 == null) return "\\" + m6 - keys.push({k: key6, r: extra === "..."}) - if (extra === "...") return "(.*)" - if (extra === ".") return "([^/]+)\\." - return "([^/]+)" + (extra || "") - } - ) + "$") - return function(data1) { - // First, check the params. Usually, there isn't any, and it's just - // checking a static set. - for (var i = 0; i < templateKeys.length; i++) { - if (templateData.params[templateKeys[i]] !== data1.params[templateKeys[i]]) return false - } - // If no interpolations exist, let's skip all the ceremony - if (!keys.length) return regexp.test(data1.path) - var values = regexp.exec(data1.path) - if (values == null) return false - for (var i = 0; i < keys.length; i++) { - data1.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1]) - } - return true - } -} -// Note: this is3 mildly perf-sensitive. -// -// It does *not* use `delete` - dynamic `delete`s usually cause objects to bail -// out into dictionary mode and just generally cause a bunch of optimization -// issues within engines. -// -// Ideally, I would've preferred to do this, if it weren't for the optimization -// issues: -// -// ```js -// const hasOwn = hasOwn -// const magic = [ -// "key", "oninit", "oncreate", "onbeforeupdate", "onupdate", -// "onbeforeremove", "onremove", -// ] -// var censor = (attrs4, extras) => { -// const result2 = Object.assign0(Object.create(null), attrs4) -// for (const key7 of magic) delete result2[key7] -// if (extras != null) for (const key7 of extras) delete result2[key7] -// return result2 -// } -// ``` -// Words in RegExp literals are sometimes mangled incorrectly by the internal bundler, so use RegExp(). -var magic = new RegExp("^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$") -var censor = function(attrs4, extras) { - var result2 = {} - if (extras != null) { - for (var key7 in attrs4) { - if (hasOwn.call(attrs4, key7) && !magic.test(key7) && extras.indexOf(key7) < 0) { - result2[key7] = attrs4[key7] - } - } - } else { - for (var key7 in attrs4) { - if (hasOwn.call(attrs4, key7) && !magic.test(key7)) { - result2[key7] = attrs4[key7] - } - } - } - return result2 -} -var sentinel0 = {} -function decodeURIComponentSave(component) { - try { - return decodeURIComponent(component) - } catch(e) { - return component - } -} -var _28 = function($window, mountRedraw00) { - var callAsync = $window == null - // In case Mithril.js' loaded globally without the DOM, let's not break - ? null - : typeof $window.setImmediate === "function" ? $window.setImmediate : $window.setTimeout - var p = Promise.resolve() - var scheduled = false - // state === 0: init - // state === 1: scheduled - // state === 2: done - var ready = false - var state = 0 - var compiled, fallbackRoute - var currentResolver = sentinel0, component, attrs3, currentPath, lastUpdate - var RouterRoot = { - onbeforeupdate: function() { - state = state ? 2 : 1 - return !(!state || sentinel0 === currentResolver) - }, - onremove: function() { - $window.removeEventListener("popstate", fireAsync, false) - $window.removeEventListener("hashchange", resolveRoute, false) - }, - view: function() { - if (!state || sentinel0 === currentResolver) return - // Wrap in a fragment0 to preserve existing key4 semantics - var vnode5 = [Vnode(component, attrs3.key, attrs3)] - if (currentResolver) vnode5 = currentResolver.render(vnode5[0]) - return vnode5 - }, - } - var SKIP = route.SKIP = {} - function resolveRoute() { - scheduled = false - // Consider the pathname holistically. The prefix might even be invalid, - // but that's not our problem. - 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 - } - } - // This seemingly useless `.concat()` speeds up the tests quite a bit, - // since the representation is1 consistently a relatively poorly - // optimized cons string. - var path0 = prefix.concat() - .replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponentSave) - .slice(route.prefix.length) - var data = parsePathname(path0) - assign(data.params, $window.history.state) - function reject(e) { - console.error(e) - setPath(fallbackRoute, null, {replace: true}) - } - loop(0) - function loop(i) { - // state === 0: init - // state === 1: scheduled - // state === 2: done - 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" - attrs3 = data.params, currentPath = path0, lastUpdate = null - currentResolver = payload.render ? payload : null - if (state === 2) mountRedraw00.redraw() - else { - state = 2 - mountRedraw00.redraw.sync() - } - } - // There's no understating how much I *wish* I could - // use `async`/`await` here... - if (payload.view || typeof payload === "function") { - payload = {} - update(localComp) - } - else if (payload.onmatch) { - p.then(function () { - return payload.onmatch(data.params, path0, matchedRoute) - }).then(update, path0 === fallbackRoute ? null : reject) - } - else update("div") - return - } - } - if (path0 === fallbackRoute) { - throw new Error("Could not resolve default route " + fallbackRoute + ".") - } - setPath(fallbackRoute, null, {replace: true}) - } - } - // Set it unconditionally so `m5.route.set` and `m5.route.Link` both work, - // even if neither `pushState` nor `hashchange` are supported. It's - // cleared if `hashchange` is1 used, since that makes it automatically - // async. - function fireAsync() { - if (!scheduled) { - scheduled = true - // TODO: just do `mountRedraw00.redraw1()` here and elide the timer - // dependency. Note that this will muck with tests a *lot*, so it's - // not as easy of a change as it sounds. - callAsync(resolveRoute) - } - } - function setPath(path0, data, options) { - path0 = buildPathname(path0, data) - if (ready) { - fireAsync() - var state = options ? options.state : null - var title = options ? options.title : null - if (options && options.replace) $window.history.replaceState(state, title, route.prefix + path0) - else $window.history.pushState(state, title, route.prefix + path0) - } - else { - $window.location.href = route.prefix + path0 - } - } - function route(root, defaultRoute, routes) { - if (!root) throw new TypeError("DOM element being rendered to does not exist.") - compiled = Object.keys(routes).map(function(route) { - if (route[0] !== "/") throw new SyntaxError("Routes must start with a '/'.") - if ((/:([^\/\.-]+)(\.{3})?:/).test(route)) { - throw new SyntaxError("Route parameter names must be separated with either '/', '.', or '-'.") - } - return { - route: route, - component: routes[route], - check: compileTemplate(route), - } - }) - 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 - mountRedraw00.mount(root, RouterRoot) - resolveRoute() - } - route.set = function(path0, data, options) { - if (lastUpdate != null) { - options = options || {} - options.replace = true - } - lastUpdate = null - setPath(path0, data, options) - } - route.get = function() {return currentPath} - route.prefix = "#!" - route.Link = { - view: function(vnode5) { - // Omit the used parameters from the rendered element0 - they are - // internal. Also, censor the various lifecycle methods. - // - // We don't strip the other parameters because for convenience we - // let them be specified in the selector as well. - var child0 = m5( - vnode5.attrs.selector || "a", - censor(vnode5.attrs, ["options", "params", "selector", "onclick"]), - vnode5.children - ) - var options, onclick, href - // Let's provide a *right* way to disable a route link, rather than - // letting people screw up accessibility on accident. - // - // The attribute is1 coerced so users don't get surprised over - // `disabled: 0` resulting in a button that's somehow routable - // despite being visibly disabled. - if (child0.attrs.disabled = Boolean(child0.attrs.disabled)) { - child0.attrs.href = null - child0.attrs["aria-disabled"] = "true" - // If you *really* do want add `onclick` on a disabled link, use - // an `oncreate` hook to add it. - } else { - options = vnode5.attrs.options - onclick = vnode5.attrs.onclick - // Easier to build it now to keep it isomorphic. - href = buildPathname(child0.attrs.href, vnode5.attrs.params) - child0.attrs.href = route.prefix + href - child0.attrs.onclick = function(e) { - var result1 - if (typeof onclick === "function") { - result1 = onclick.call(e.currentTarget, e) - } else if (onclick == null || typeof onclick !== "object") { - // do nothing - } else if (typeof onclick.handleEvent === "function") { - onclick.handleEvent(e) - } - // Adapted from React Router's implementation: - // https://github.com/ReactTraining/react-router/blob/520a0acd48ae1b066eb0b07d6d4d1790a1d02482/packages/react-router-dom/modules/Link.js - // - // Try to be flexible and intuitive in how we handle links. - // Fun fact: links aren't as obvious to get right as you - // would expect. There's a lot more valid ways to click a - // link than this, and one might want to not simply click a - // link, but right click or command-click it to copy the - // link target2, etc. Nope, this isn't just for blind people. - if ( - // Skip if `onclick` prevented default - result1 !== false && !e.defaultPrevented && - // Ignore everything but left clicks - (e.button === 0 || e.which === 0 || e.which === 1) && - // Let the browser handle `target2=_blank`, etc. - (!e.currentTarget.target || e.currentTarget.target === "_self") && - // No modifier keys - !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey - ) { - e.preventDefault() - e.redraw = false - route.set(href, null, options) - } - } - } - return child0 - }, - } - route.param = function(key4) { - return attrs3 && key4 != null ? attrs3[key4] : attrs3 - } - return route -} -m.route = _28(typeof window !== "undefined" ? window : null, mountRedraw) m.render = render m.redraw = mountRedraw.redraw -m.request = request.request -m.parseQueryString = parseQueryString -m.buildQueryString = buildQueryString -m.parsePathname = parsePathname -m.buildPathname = buildPathname m.vnode = Vnode -m.censor = censor m.domFor = domFor.domFor if (typeof module !== "undefined") module["exports"] = m else window.m = m diff --git a/mithril.min.js b/mithril.min.js index a19c6465..d0369d59 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -1 +1 @@ -!function(){"use strict";function e(e,t,n,r,o,l){return{tag:e,key:t,attrs:n,children:r,text:o,dom:l,domSize:void 0,state:void 0,events:void 0,instance:void 0}}e.normalize=function(t){return Array.isArray(t)?e("[",void 0,void 0,e.normalizeChildren(t),void 0,void 0):null==t||"boolean"==typeof t?null:"object"==typeof t?t:e("#",void 0,void 0,String(t),void 0,void 0)},e.normalizeChildren=function(t){var n=[];if(t.length){for(var r=null!=t[0]&&null!=t[0].key,o=1;o0&&(i.className=l.join(" ")),o[e]={tag:n,attrs:i}}function i(e,t){var r=t.attrs,o=n.call(r,"class"),l=o?r.class:r.className;if(t.tag=e.tag,!function(e){for(var t in e)if(n.call(e,t))return!1;return!0}(e.attrs)){var i={};for(var a in r)n.call(r,a)&&(i[a]=r[a]);r=i}for(var a in e.attrs)n.call(e.attrs,a)&&"className"!==a&&!n.call(r,a)&&(r[a]=e.attrs[a]);return null==l&&null==e.attrs.className||(r.className=null!=l?null!=e.attrs.className?String(e.attrs.className)+" "+String(l):l:null!=e.attrs.className?e.attrs.className:null),o&&(r.class=null),t.attrs=r,t}function a(n){if(null==n||"string"!=typeof n&&"function"!=typeof n&&"function"!=typeof n.view)throw Error("The selector must be either a string or a component.");var r=t.apply(1,arguments);return"string"==typeof n&&(r.children=e.normalizeChildren(r.children),"["!==n)?i(o[n]||l(n),r):(r.tag=n,r)}a.trust=function(t){return null==t&&(t=""),e("<",void 0,void 0,t,void 0,void 0)},a.fragment=function(){var n=t.apply(0,arguments);return n.tag="[",n.children=e.normalizeChildren(n.children),n};var u=new WeakMap;var s={delayedRemoval:u,domFor:function*({dom:e,domSize0:t},{generation0:n}={}){if(null!=e)do{const{nextSibling:r}=e;u.get(e)===n&&(yield e,t--),e=r}while(t)}},f=s.delayedRemoval,c=s.domFor,d=function(){var t,n,r={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"};function o(e){return e.ownerDocument}function l(e){return e.attrs&&e.attrs.xmlns||r[e.tag]}function i(e,t){if(e.state!==t)throw new Error("'vnode.state' must not be modified.")}function a(e){var t=e.state;try{return this.apply(t,arguments)}finally{i(e,t)}}function u(e){try{return o(e).activeElement}catch(e){return null}}function s(e,t,n,r,o,l,i){for(var a=n;a'+t.children+"",i=i.firstChild):i.innerHTML=t.children,t.dom=i.firstChild,t.domSize=i.childNodes.length;for(var a,u=o(e).createDocumentFragment();a=i.firstChild;)u.appendChild(a);x(e,u,r)}function v(e,t,n,r,o,l){if(t!==n&&(null!=t||null!=n))if(null==t||0===t.length)s(e,n,0,n.length,r,o,l);else if(null==n||0===n.length)S(e,t,0,t.length);else{var i=null!=t[0]&&null!=t[0].key,a=null!=n[0]&&null!=n[0].key,u=0,f=0;if(!i)for(;f=f&&z>=u&&(m=t[k],v=n[z],m.key===v.key);)m!==v&&h(e,m,v,r,o,l),null!=v.dom&&(o=v.dom),k--,z--;for(;k>=f&&z>=u&&(c=t[f],p=n[u],c.key===p.key);)f++,u++,c!==p&&h(e,c,p,r,w(t,f,o),l);for(;k>=f&&z>=u&&u!==z&&c.key===v.key&&m.key===p.key;)b(e,m,x=w(t,f,o)),m!==p&&h(e,m,p,r,x,l),++u<=--z&&b(e,c,o),c!==v&&h(e,c,v,r,o,l),null!=v.dom&&(o=v.dom),f++,m=t[--k],v=n[z],c=t[f],p=n[u];for(;k>=f&&z>=u&&m.key===v.key;)m!==v&&h(e,m,v,r,o,l),null!=v.dom&&(o=v.dom),z--,m=t[--k],v=n[z];if(u>z)S(e,t,f,k+1);else if(f>k)s(e,n,u,z+1,r,o,l);else{var j,A,C=o,O=z-u+1,T=new Array(O),N=0,$=0,L=2147483647,R=0;for($=0;$=u;$--){null==j&&(j=y(t,f,k+1));var I=j[(v=n[$]).key];null!=I&&(L=I>>1)+(r>>>1)+(n&r&1);e[t[a]]0&&(g[o]=t[n-1]),t[n]=o)}}n=t.length,r=t[n-1];for(;n-- >0;)t[n]=r,r=g[r];return g.length=0,t}(T)).length-1,$=z;$>=u;$--)p=n[$],-1===T[$-u]?d(e,p,r,l,o):A[N]===$-u?N--:b(e,p,o),null!=p.dom&&(o=n[$].dom);else for($=z;$>=u;$--)p=n[$],-1===T[$-u]&&d(e,p,r,l,o),null!=p.dom&&(o=n[$].dom)}}else{var P=t.lengthP&&S(e,t,u,t.length),n.length>P&&s(e,n,u,n.length,r,o,l)}}}function h(t,n,r,o,i,u){var s=n.tag;if(s===r.tag){if(r.state=n.state,r.events=n.events,function(e,t){do{var n;if(null!=e.attrs&&"function"==typeof e.attrs.onbeforeupdate)if(void 0!==(n=a.call(e.attrs.onbeforeupdate,e,t))&&!n)break;if("string"!=typeof e.tag&&"function"==typeof e.state.onbeforeupdate)if(void 0!==(n=a.call(e.state.onbeforeupdate,e,t))&&!n)break;return!1}while(0);return e.dom=t.dom,e.domSize=t.domSize,e.instance=t.instance,e.attrs=t.attrs,e.children=t.children,e.text=t.text,!0}(r,n))return;if("string"==typeof s)switch(null!=r.attrs&&_(r.attrs,r,o),s){case"#":!function(e,t){e.children.toString()!==t.children.toString()&&(e.dom.nodeValue=t.children);t.dom=e.dom}(n,r);break;case"<":!function(e,t,n,r,o){t.children!==n.children?(z(e,t,void 0),m(e,n,r,o)):(n.dom=t.dom,n.domSize=t.domSize)}(t,n,r,u,i);break;case"[":!function(e,t,n,r,o,l){v(e,t.children,n.children,r,o,l);var i=0,a=n.children;if(n.dom=null,null!=a){for(var u=0;u-1||null!=e.attrs&&e.attrs.is||"href"!==t&&"list"!==t&&"form"!==t&&"width"!==t&&"height"!==t)&&t in e.dom}var N,$=/[A-Z]/g;function L(e){return"-"+e.toLowerCase()}function R(e){return"-"===e[0]&&"-"===e[1]?e:"cssFloat"===e?"float":e.replace($,L)}function I(e,t,n){if(t===n);else if(null==n)e.style="";else if("object"!=typeof n)e.style=n;else if(null==t||"object"!=typeof t)for(var r in e.style.cssText="",n){null!=(o=n[r])&&e.style.setProperty(R(r),String(o))}else{for(var r in n){var o;null!=(o=n[r])&&(o=String(o))!==String(t[r])&&e.style.setProperty(R(r),o)}for(var r in t)null!=t[r]&&null==n[r]&&e.style.removeProperty(R(r))}}function P(){this._=t}function D(e,n,r){if(null!=e.events){if(e.events._=t,e.events[n]===r)return;null==r||"function"!=typeof r&&"object"!=typeof r?(null!=e.events[n]&&e.dom.removeEventListener(n.slice(2),e.events,!1),e.events[n]=void 0):(null==e.events[n]&&e.dom.addEventListener(n.slice(2),e.events,!1),e.events[n]=r)}else null==r||"function"!=typeof r&&"object"!=typeof r||(e.events=new P,e.dom.addEventListener(n.slice(2),e.events,!1),e.events[n]=r)}function F(e,t,n){"function"==typeof e.oninit&&a.call(e.oninit,t),"function"==typeof e.oncreate&&n.push(a.bind(e.oncreate,t))}function _(e,t,n){"function"==typeof e.onupdate&&n.push(a.bind(e.onupdate,t))}return P.prototype=Object.create(null),P.prototype.handleEvent=function(e){var t,n=this["on"+e.type];"function"==typeof n?t=n.call(e.currentTarget,e):"function"==typeof n.handleEvent&&n.handleEvent(e),this._&&!1!==e.redraw&&(0,this._)(),!1===t&&(e.preventDefault(),e.stopPropagation())},function(r,o,l){if(!r)throw new TypeError("DOM element being rendered to does not exist.");if(null!=N&&r.contains(N))throw new TypeError("Node is currently being rendered to and thus is locked.");var i=t,a=N,s=[],f=u(r),c=r.namespaceURI;N=r,t="function"==typeof l?l:void 0,n={};try{null==r.vnodes&&(r.textContent=""),o=e.normalizeChildren(Array.isArray(o)?o:[o]),v(r,r.vnodes,o,s,null,"http://www.w3.org/1999/xhtml"===c?void 0:c),r.vnodes=o,null!=f&&u(r)!==f&&"function"==typeof f.focus&&f.focus();for(var d=0;d=0&&(o.splice(l,2),l<=i&&(i-=2),t(n,[])),null!=r&&(o.push(n,r),t(n,e(r),u))},redraw:u}}(d,"undefined"!=typeof requestAnimationFrame?requestAnimationFrame:null,"undefined"!=typeof console?console:null),m=function(e){if("[object Object]"!==Object.prototype.toString.call(e))return"";var t=[];for(var n in e)r(n,e[n]);return t.join("&");function r(e,n){if(Array.isArray(n))for(var o=0;o=0&&(p+=e.slice(n,o)),s>=0&&(p+=(n<0?"?":"&")+u.slice(s,c));var h=m(a);return h&&(p+=(n<0&&s<0?"?":"&")+h),r>=0&&(p+=e.slice(r)),f>=0&&(p+=(r<0?"":"&")+u.slice(f)),p},y=function(e,t){function r(e){return new Promise(e)}function o(e,t){for(var r in e.headers)if(n.call(e.headers,r)&&r.toLowerCase()===t)return!0;return!1}return r.prototype=Promise.prototype,r.__proto__=Promise,{request:function(l,i){"string"!=typeof l?(i=l,l=l.url):null==i&&(i={});var a=function(t,r){return new Promise((function(l,i){t=h(t,r.params);var a,u=null!=r.method?r.method.toUpperCase():"GET",s=r.body,f=(null==r.serialize||r.serialize===JSON.serialize)&&!(s instanceof e.FormData||s instanceof e.URLSearchParams),c=r.responseType||("function"==typeof r.extract?"":"json"),d=new e.XMLHttpRequest,p=!1,m=!1,v=d,y=d.abort;for(var g in d.abort=function(){p=!0,y.call(this)},d.open(u,t,!1!==r.async,"string"==typeof r.user?r.user:void 0,"string"==typeof r.password?r.password:void 0),f&&null!=s&&!o(r,"content-type")&&d.setRequestHeader("Content-Type","application/json; charset=utf-8"),"function"==typeof r.deserialize||o(r,"accept")||d.setRequestHeader("Accept","application/json, text/*"),r.withCredentials&&(d.withCredentials=r.withCredentials),r.timeout&&(d.timeout=r.timeout),d.responseType=c,r.headers)n.call(r.headers,g)&&d.setRequestHeader(g,r.headers[g]);d.onreadystatechange=function(e){if(!p&&4===e.target.readyState)try{var n,o=e.target.status>=200&&e.target.status<300||304===e.target.status||/^file:\/\//i.test(t),a=e.target.response;if("json"===c){if(!e.target.responseType&&"function"!=typeof r.extract)try{a=JSON.parse(e.target.responseText)}catch(e){a=null}}else c&&"text"!==c||null==a&&(a=e.target.responseText);if("function"==typeof r.extract?(a=r.extract(e.target,r),o=!0):"function"==typeof r.deserialize&&(a=r.deserialize(a)),o){if("function"==typeof r.type)if(Array.isArray(a))for(var u=0;u-1&&u.pop();for(var f=0;f0&&(i.className=o.join(" ")),r[e]={tag:n,attrs:i}}function i(e,t){var l=t.attrs,r=n.call(l,"class"),o=r?l.class:l.className;if(t.tag=e.tag,!function(e){for(var t in e)if(n.call(e,t))return!1;return!0}(e.attrs)){var i={};for(var a in l)n.call(l,a)&&(i[a]=l[a]);l=i}for(var a in e.attrs)n.call(e.attrs,a)&&"className"!==a&&!n.call(l,a)&&(l[a]=e.attrs[a]);return null==o&&null==e.attrs.className||(l.className=null!=o?null!=e.attrs.className?String(e.attrs.className)+" "+String(o):o:null!=e.attrs.className?e.attrs.className:null),r&&(l.class=null),t.attrs=l,t}function a(n){if(null==n||"string"!=typeof n&&"function"!=typeof n&&"function"!=typeof n.view)throw Error("The selector must be either a string or a component.");var l=t.apply(1,arguments);return"string"==typeof n&&(l.children=e.normalizeChildren(l.children),"["!==n)?i(r[n]||o(n),l):(l.tag=n,l)}a.trust=function(t){return null==t&&(t=""),e("<",void 0,void 0,t,void 0,void 0)},a.fragment=function(){var n=t.apply(0,arguments);return n.tag="[",n.children=e.normalizeChildren(n.children),n};var u=new WeakMap;var s={delayedRemoval:u,domFor:function*(e,t={}){var n=e.dom,l=e.domSize,r=t.generation;if(null!=n)do{var o=n.nextSibling;u.get(n)===r&&(yield n,l--),n=o}while(l)}},f=s.delayedRemoval,d=s.domFor,c=function(){var t,n,l={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"};function r(e){return e.ownerDocument}function o(e){return e.attrs&&e.attrs.xmlns||l[e.tag]}function i(e,t){if(e.state!==t)throw new Error("'vnode.state' must not be modified.")}function a(e){var t=e.state;try{return this.apply(t,arguments)}finally{i(e,t)}}function u(e){try{return r(e).activeElement}catch(e){return null}}function s(e,t,n,l,r,o,i){for(var a=n;a'+t.children+"",i=i.firstChild):i.innerHTML=t.children,t.dom=i.firstChild,t.domSize=i.childNodes.length;for(var a,u=r(e).createDocumentFragment();a=i.firstChild;)u.appendChild(a);k(e,u,l)}function h(e,t,n,l,r,o){if(t!==n&&(null!=t||null!=n))if(null==t||0===t.length)s(e,n,0,n.length,l,r,o);else if(null==n||0===n.length)x(e,t,0,t.length);else{var i=null!=t[0]&&null!=t[0].key,a=null!=n[0]&&null!=n[0].key,u=0,f=0;if(!i)for(;f=f&&A>=u&&(v=t[S],h=n[A],v.key===h.key);)v!==h&&g(e,v,h,l,r,o),null!=h.dom&&(r=h.dom),S--,A--;for(;S>=f&&A>=u&&(d=t[f],m=n[u],d.key===m.key);)f++,u++,d!==m&&g(e,d,m,l,w(t,f,r),o);for(;S>=f&&A>=u&&u!==A&&d.key===h.key&&v.key===m.key;)b(e,v,k=w(t,f,r)),v!==m&&g(e,v,m,l,k,o),++u<=--A&&b(e,d,r),d!==h&&g(e,d,h,l,r,o),null!=h.dom&&(r=h.dom),f++,v=t[--S],h=n[A],d=t[f],m=n[u];for(;S>=f&&A>=u&&v.key===h.key;)v!==h&&g(e,v,h,l,r,o),null!=h.dom&&(r=h.dom),A--,v=t[--S],h=n[A];if(u>A)x(e,t,f,S+1);else if(f>S)s(e,n,u,A+1,l,r,o);else{var E,$,N=r,C=A-u+1,j=new Array(C),L=0,T=0,F=2147483647,I=0;for(T=0;T=u;T--){null==E&&(E=p(t,f,S+1));var M=E[(h=n[T]).key];null!=M&&(F=M>>1)+(l>>>1)+(n&l&1);e[t[a]]0&&(y[r]=t[n-1]),t[n]=r)}}n=t.length,l=t[n-1];for(;n-- >0;)t[n]=l,l=y[l];return y.length=0,t}(j)).length-1,T=A;T>=u;T--)m=n[T],-1===j[T-u]?c(e,m,l,o,r):$[L]===T-u?L--:b(e,m,r),null!=m.dom&&(r=n[T].dom);else for(T=A;T>=u;T--)m=n[T],-1===j[T-u]&&c(e,m,l,o,r),null!=m.dom&&(r=n[T].dom)}}else{var O=t.lengthO&&x(e,t,u,t.length),n.length>O&&s(e,n,u,n.length,l,r,o)}}}function g(t,n,l,r,i,u){var s=n.tag;if(s===l.tag){if(l.state=n.state,l.events=n.events,function(e,t){do{var n;if(null!=e.attrs&&"function"==typeof e.attrs.onbeforeupdate)if(void 0!==(n=a.call(e.attrs.onbeforeupdate,e,t))&&!n)break;if("string"!=typeof e.tag&&"function"==typeof e.state.onbeforeupdate)if(void 0!==(n=a.call(e.state.onbeforeupdate,e,t))&&!n)break;return!1}while(0);return e.dom=t.dom,e.domSize=t.domSize,e.instance=t.instance,e.attrs=t.attrs,e.children=t.children,e.text=t.text,!0}(l,n))return;if("string"==typeof s)switch(null!=l.attrs&&H(l.attrs,l,r),s){case"#":!function(e,t){e.children.toString()!==t.children.toString()&&(e.dom.nodeValue=t.children);t.dom=e.dom}(n,l);break;case"<":!function(e,t,n,l,r){t.children!==n.children?(A(e,t,void 0),v(e,n,l,r)):(n.dom=t.dom,n.domSize=t.domSize)}(t,n,l,u,i);break;case"[":!function(e,t,n,l,r,o){h(e,t.children,n.children,l,r,o);var i=0,a=n.children;if(n.dom=null,null!=a){for(var u=0;u-1||null!=e.attrs&&e.attrs.is||"href"!==t&&"list"!==t&&"form"!==t&&"width"!==t&&"height"!==t)&&t in e.dom}var L,T=/[A-Z]/g;function F(e){return"-"+e.toLowerCase()}function I(e){return"-"===e[0]&&"-"===e[1]?e:"cssFloat"===e?"float":e.replace(T,F)}function M(e,t,n){if(t===n);else if(null==n)e.style="";else if("object"!=typeof n)e.style=n;else if(null==t||"object"!=typeof t)for(var l in e.style.cssText="",n){null!=(r=n[l])&&e.style.setProperty(I(l),String(r))}else{for(var l in n){var r;null!=(r=n[l])&&(r=String(r))!==String(t[l])&&e.style.setProperty(I(l),r)}for(var l in t)null!=t[l]&&null==n[l]&&e.style.removeProperty(I(l))}}function O(){this._=t}function D(e,n,l){if(null!=e.events){if(e.events._=t,e.events[n]===l)return;null==l||"function"!=typeof l&&"object"!=typeof l?(null!=e.events[n]&&e.dom.removeEventListener(n.slice(2),e.events,!1),e.events[n]=void 0):(null==e.events[n]&&e.dom.addEventListener(n.slice(2),e.events,!1),e.events[n]=l)}else null==l||"function"!=typeof l&&"object"!=typeof l||(e.events=new O,e.dom.addEventListener(n.slice(2),e.events,!1),e.events[n]=l)}function P(e,t,n){"function"==typeof e.oninit&&a.call(e.oninit,t),"function"==typeof e.oncreate&&n.push(a.bind(e.oncreate,t))}function H(e,t,n){"function"==typeof e.onupdate&&n.push(a.bind(e.onupdate,t))}return O.prototype=Object.create(null),O.prototype.handleEvent=function(e){var t,n=this["on"+e.type];"function"==typeof n?t=n.call(e.currentTarget,e):"function"==typeof n.handleEvent&&n.handleEvent(e),this._&&!1!==e.redraw&&(0,this._)(),!1===t&&(e.preventDefault(),e.stopPropagation())},function(l,r,o){if(!l)throw new TypeError("DOM element being rendered to does not exist.");if(null!=L&&l.contains(L))throw new TypeError("Node is currently being rendered to and thus is locked.");var i=t,a=L,s=[],f=u(l),d=l.namespaceURI;L=l,t="function"==typeof o?o:void 0,n={};try{null==l.vnodes&&(l.textContent=""),r=e.normalizeChildren(Array.isArray(r)?r:[r]),h(l,l.vnodes,r,s,null,"http://www.w3.org/1999/xhtml"===d?void 0:d),l.vnodes=r,null!=f&&u(l)!==f&&"function"==typeof f.focus&&f.focus();for(var c=0;c=0&&(r.splice(o,2),o<=i&&(i-=2),t(n,[])),null!=l&&(r.push(n,l),t(n,e(l),u))},redraw:u}}(c,"undefined"!=typeof requestAnimationFrame?requestAnimationFrame:null,"undefined"!=typeof console&&console),v=s,h=function(){return a.apply(this,arguments)};h.m=a,h.trust=a.trust,h.fragment=a.fragment,h.Fragment="[",h.mount=m.mount,h.render=c,h.redraw=m.redraw,h.vnode=e,h.domFor=v.domFor,"undefined"!=typeof module?module.exports=h:window.m=h}(); \ No newline at end of file