improved bundler, handle width/height atts
This commit is contained in:
parent
e58fa538bc
commit
b8ef290acd
13 changed files with 1211 additions and 786 deletions
|
|
@ -2,107 +2,125 @@
|
|||
|
||||
var fs = require("fs")
|
||||
var path = require("path")
|
||||
var proc = require("child_process")
|
||||
|
||||
module.exports = function(input, output, options) {
|
||||
function run(e, file) {
|
||||
function read(filepath) {
|
||||
try {return fs.readFileSync(filepath, "utf8")} catch (e) {throw new Error("File does not exist: " + filepath)}
|
||||
}
|
||||
function isFile(filepath) {
|
||||
try {return fs.statSync(filepath).isFile()} catch (e) {return false}
|
||||
}
|
||||
function parse(file) {
|
||||
var json = read(file)
|
||||
try {return JSON.parse(json)} catch (e) {throw new Error("invalid JSON: " + json)}
|
||||
}
|
||||
|
||||
function run(input, output) {
|
||||
try {
|
||||
var modules = {}
|
||||
var usedVariables = {}
|
||||
var globals = {}
|
||||
|
||||
function resolve(dir, data) {
|
||||
var replacements = []
|
||||
var bindings = {}
|
||||
var declaration = /^\s*(?:var|let|const|function)[\t ]+([\w_$]+)/gm
|
||||
var include = /(?:((?:var|let|const|,|)[\t ]*)([\w_$\.]+)(\s*=\s*))?require\(([^\)]+)\)(\s*[`\.\(\[])?/gm
|
||||
var uuid = 0
|
||||
function process(filepath, data) {
|
||||
data.replace(declaration, function(match, binding) {bindings[binding] = 0})
|
||||
|
||||
var globalMatch = data.match(/window\.([\w_$]+)\s*=\s*/)
|
||||
if (globalMatch) globals[globalMatch[1]] = true
|
||||
|
||||
data = data.replace(/^\s*\/\/[^\n]*/g, "").replace(/((?:var|let|const|)[\t ]*)([\w_$\.]+)(\s*=\s*)require\(([^\)]+)\)/g, function(match, def, variable, eq, dep) {
|
||||
usedVariables[variable] = usedVariables[variable] ? usedVariables[variable]++ : 1
|
||||
|
||||
var filename = new Function("return " + dep).call()
|
||||
return data.replace(include, function(match, def, variable, eq, dep, rest) {
|
||||
var filename = new Function("return " + dep).call(), pre = ""
|
||||
|
||||
//resolve npm dependencies
|
||||
if (filename[0] !== ".") {
|
||||
var meta
|
||||
try {meta = JSON.parse(fs.readFileSync("./node_modules/" + filename + "/package.json"))} catch (e) {meta = {}}
|
||||
var dependencyEntry = "./node_modules/" + filename + "/" + (meta.main || filename + ".js")
|
||||
try {fs.statSync(dependencyEntry).isFile()} catch (e) {dependencyEntry = "./node_modules/" + filename + "/index.js"}
|
||||
return process(dependencyEntry)
|
||||
}
|
||||
|
||||
//resolve local dependencies
|
||||
return process(dir + "/" + filename + ".js")
|
||||
|
||||
function process(dependency) {
|
||||
var normalized = path.resolve(dir, filename)
|
||||
if (modules[normalized] === undefined) {
|
||||
modules[normalized] = variable
|
||||
return resolve(path.dirname(dependency), exportCode(dependency, def, variable, eq))
|
||||
}
|
||||
else {
|
||||
if (modules[normalized] !== variable) {
|
||||
replacements.push({variable: variable, replacement: modules[normalized]})
|
||||
}
|
||||
return ""
|
||||
}
|
||||
}
|
||||
def = def || "", variable = variable || "", eq = eq || "", rest = rest || ""
|
||||
if (def[0] === ",") def = "\nvar ", pre = "\n"
|
||||
var dependency = resolve(filepath, filename)
|
||||
var code = process(dependency, pre + (modules[dependency] == null ? exportCode(filename, dependency, def, variable, eq, rest, uuid) : def + variable + eq + modules[dependency]))
|
||||
modules[dependency] = rest ? "_" + uuid : variable
|
||||
uuid++
|
||||
return code + rest
|
||||
})
|
||||
if (replacements.length > 0) {
|
||||
for (var i = 0; i < replacements.length; i++) {
|
||||
data = data.replace(new RegExp("\\b" + replacements[i].variable + "\\b", "g"), replacements[i].replacement)
|
||||
}
|
||||
}
|
||||
return data
|
||||
.replace(/(?:var|let|const)[\t ]([\w_$\.]+)(\s*=\s*)\1([\r\n;]+)/g, "$3") // remove assignments to itself
|
||||
.replace(/([\r\n]){2,}/g, "$1") // remove multiple consecutive line breaks
|
||||
.replace(/\}[\r\n]+\(/g, "}(") // remove space from iife
|
||||
.replace(/(window\.){2}/g, "") // collapse window references
|
||||
}
|
||||
|
||||
function exportCode(file, def, variable, eq) {
|
||||
var declared = {}
|
||||
return fixCollisions(fs.readFileSync(file, "utf8"))
|
||||
.replace(/("|')use strict\1;?/gm, "") // remove extraneous "use strict"
|
||||
.replace(/module\.exports\s*=\s*/gm, def + variable + eq)
|
||||
.replace(/module\.exports(\.|\[)/gm, function(match, token, length, code) {
|
||||
if (new RegExp("\\b" + variable + "\\b").test(variable) && !declared[variable]) {
|
||||
declared[variable] = true
|
||||
return def + variable + eq + "{}\n" + variable + token
|
||||
}
|
||||
return variable + token
|
||||
})
|
||||
}
|
||||
|
||||
function fixCollisions(code) {
|
||||
for (var variable in usedVariables) {
|
||||
var collision = new RegExp("([^\\.])\\b" + variable + "\\b(?![\"'`])", "g")
|
||||
var exported = new RegExp("module\\.exports\\s*=\\s*" + variable)
|
||||
if (collision.test(code) && !exported.test(code) && !globals[variable.match(/[^\.]+/)]) {
|
||||
var fixed = variable + usedVariables[variable]++
|
||||
code = code.replace(collision, "$1" + fixed)
|
||||
}
|
||||
}
|
||||
return code
|
||||
}
|
||||
|
||||
function setVersion(code) {
|
||||
var metadata = JSON.parse(fs.readFileSync(__dirname + "/../package.json"))
|
||||
return code.replace("bleeding-edge", metadata.version)
|
||||
}
|
||||
|
||||
function bundle(input, output) {
|
||||
console.log("bundling...")
|
||||
var code = setVersion(resolve(path.dirname(input), fs.readFileSync(input, "utf8")))
|
||||
if (new Function(code)) fs.writeFileSync(output, "new function() {\n" + code + "\n}", "utf8")
|
||||
console.log("done")
|
||||
}
|
||||
|
||||
if (file !== output && file !== output.replace(/\.js$/, ".min.js")) bundle(input, output)
|
||||
function resolve(filepath, filename) {
|
||||
if (filename[0] !== ".") {
|
||||
// resolve as npm dependency
|
||||
var packagePath = "./node_modules/" + filename + "/package.json"
|
||||
var meta = isFile(packagePath) ? parse(packagePath) : {}
|
||||
var main = "./node_modules/" + filename + "/" + (meta.main || filename + ".js")
|
||||
return path.resolve(isFile(main) ? main : "./node_modules/" + filename + "/index.js")
|
||||
}
|
||||
else {
|
||||
// resolve as local dependency
|
||||
return path.resolve(path.dirname(filepath), filename + ".js")
|
||||
}
|
||||
}
|
||||
|
||||
function exportCode(filename, filepath, def, variable, eq, rest, uuid) {
|
||||
var code = read(filepath)
|
||||
// if there's a syntax error, report w/ proper stack trace
|
||||
try {new Function(code)} catch (e) {
|
||||
proc.exec("node " + filename, function(error) {
|
||||
if (error !== null) console.log("\x1b[31m" + error.message)
|
||||
})
|
||||
}
|
||||
|
||||
// disambiguate collisions
|
||||
var ignored = {}
|
||||
code.replace(include, function(match, def, variable, eq, dep, rest) {
|
||||
var filename = new Function("return " + dep).call()
|
||||
var binding = modules[resolve(filepath, filename)]
|
||||
if (binding != null) ignored[binding] = true
|
||||
})
|
||||
if (code.match(new RegExp("module\\.exports\\s*=\\s*" + variable + "\s*$", "m"))) ignored[variable] = true
|
||||
for (var binding in bindings) {
|
||||
if (!ignored[binding]) {
|
||||
var before = code
|
||||
code = code.replace(new RegExp("(\\b)" + binding + "\\b", "g"), binding + bindings[binding])
|
||||
if (before !== code) bindings[binding]++
|
||||
}
|
||||
}
|
||||
|
||||
// fix strings that got mangled by collision disambiguation
|
||||
var string = /(["'])((?:\\\1|.)*?)(\1)/g
|
||||
var candidates = Object.keys(bindings).map(function(binding) {return binding + (bindings[binding] - 1)}).join("|")
|
||||
code = code.replace(string, function(match, open, data, close) {
|
||||
var variables = new RegExp(Object.keys(bindings).map(function(binding) {return binding + (bindings[binding] - 1)}).join("|"), "g")
|
||||
var fixed = data.replace(variables, function(match) {
|
||||
return match.replace(/\d+$/, "")
|
||||
})
|
||||
return open + fixed + close
|
||||
})
|
||||
|
||||
//fix props
|
||||
var props = new RegExp("(\\.\\s*)(" + candidates + ")|([\\{,]\\s*)(" + candidates + ")(\\s*:)", "gm")
|
||||
code = code.replace(props, function(match, dot, a, pre, b, post) {
|
||||
if (dot) return dot + a.replace(/\d+$/, "")
|
||||
else return pre + b.replace(/\d+$/, "") + post
|
||||
})
|
||||
|
||||
return code
|
||||
.replace(/("|')use strict\1;?/gm, "") // remove extraneous "use strict"
|
||||
.replace(/module\.exports\s*=\s*/gm, rest ? "var _" + uuid + eq : def + (rest ? "_" : "") + variable + eq) // export
|
||||
+ (rest ? "\n" + def + variable + eq + "_" + uuid : "") // if `rest` is truthy, it means the expression is fluent or higher-order (e.g. require(path).foo or require(path)(foo)
|
||||
}
|
||||
|
||||
var versionTag = "bleeding-edge"
|
||||
var packageFile = __dirname + "/../package.json"
|
||||
var code = process(path.resolve(input), read(input))
|
||||
.replace(/^\s*((?:var|let|const|)[\t ]*)([\w_$\.]+)(\s*=\s*)(\2)(?=[\s]+(\w)|;|$)/gm, "") // remove assignments to self
|
||||
.replace(/;+(\r|\n|$)/g, ";$1") // remove redundant semicolons
|
||||
.replace(/(\r|\n)+/g, "\n").replace(/(\r|\n)$/, "") // remove multiline breaks
|
||||
.replace(versionTag, isFile(packageFile) ? parse(packageFile).version : versionTag) // set version
|
||||
|
||||
fs.writeFileSync(output, "new function() {\n" + code + "\n}", "utf8")
|
||||
}
|
||||
run()
|
||||
catch (e) {
|
||||
console.error(e.message)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = function(input, output, options) {
|
||||
run(input, output)
|
||||
if (options && options.watch) {
|
||||
fs.watch(process.cwd(), {recursive: true}, function(type, file) {
|
||||
if (typeof file === "string" && path.resolve(output) !== path.resolve(file)) run()
|
||||
fs.watch(process.cwd(), {recursive: true}, function(file, type) {
|
||||
if (typeof file === "string" && path.resolve(output) !== path.resolve(file)) run(input, output)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
333
bundler/tests/test-bundler.js
Normal file
333
bundler/tests/test-bundler.js
Normal file
|
|
@ -0,0 +1,333 @@
|
|||
var o = require("../../ospec/ospec")
|
||||
var bundle = require("../bundle")
|
||||
|
||||
var fs = require("fs")
|
||||
|
||||
var ns = "bundler/tests/"
|
||||
function read(filepath) {
|
||||
try {return fs.readFileSync(ns + filepath, "utf8")} catch (e) {}
|
||||
}
|
||||
function write(filepath, data) {
|
||||
try {var exists = fs.statSync(ns + filepath).isFile()} catch (e) {}
|
||||
if (exists) throw new Error("Don't call `write('" + filepath + "')`. Cannot overwrite file")
|
||||
fs.writeFileSync(ns + filepath, data, "utf8")
|
||||
}
|
||||
function remove(filepath) {
|
||||
fs.unlinkSync(ns + filepath)
|
||||
}
|
||||
|
||||
o.spec("bundler", function() {
|
||||
o("relative imports works", function() {
|
||||
write("a.js", `var b = require("./b")`)
|
||||
write("b.js", `module.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports works with semicolons", function() {
|
||||
write("a.js", `var b = require("./b");`)
|
||||
write("b.js", `module.exports = 1;`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b = 1;\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports works with let", function() {
|
||||
write("a.js", `let b = require("./b")`)
|
||||
write("b.js", `module.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nlet b = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports works with const", function() {
|
||||
write("a.js", 'const b = require("./b")')
|
||||
write("b.js", `module.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nconst b = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports works with assignment", function() {
|
||||
write("a.js", `var a = {}\na.b = require("./b")`)
|
||||
write("b.js", `module.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar a = {}\na.b = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports works with reassignment", function() {
|
||||
write("a.js", `var b = {}\nb = require("./b")`)
|
||||
write("b.js", `module.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b = {}\nb = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports removes extra use strict", function() {
|
||||
write("a.js", `"use strict"\nvar b = require("./b")`)
|
||||
write("b.js", `"use strict"\nmodule.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\n"use strict"\nvar b = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports removes extra use strict using single quotes", function() {
|
||||
write("a.js", `'use strict'\nvar b = require("./b")`)
|
||||
write("b.js", `'use strict'\nmodule.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\n'use strict'\nvar b = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("relative imports removes extra use strict using mixed quotes", function() {
|
||||
write("a.js", `"use strict"\nvar b = require("./b")`)
|
||||
write("b.js", `'use strict'\nmodule.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\n"use strict"\nvar b = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works w/ window", function() {
|
||||
write("a.js", `window.a = 1\nvar b = require("./b")`)
|
||||
write("b.js", `module.exports = function() {return a}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nwindow.a = 1\nvar b = function() {return a}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works without assignment", function() {
|
||||
write("a.js", `require("./b")`)
|
||||
write("b.js", `1 + 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\n1 + 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if used fluently", function() {
|
||||
write("a.js", `var b = require("./b").toString()`)
|
||||
write("b.js", `module.exports = []`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar _0 = []\nvar b = _0.toString()\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if used fluently w/ multiline", function() {
|
||||
write("a.js", `var b = require("./b")\n\t.toString()`)
|
||||
write("b.js", `module.exports = []`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar _0 = []\nvar b = _0\n\t.toString()\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if used w/ curry", function() {
|
||||
write("a.js", `var b = require("./b")()`)
|
||||
write("b.js", `module.exports = function() {}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar _0 = function() {}\nvar b = _0()\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if used w/ curry w/ multiline", function() {
|
||||
write("a.js", `var b = require("./b")\n()`)
|
||||
write("b.js", `module.exports = function() {}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar _0 = function() {}\nvar b = _0\n()\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if used fluently in one place and not in another", function() {
|
||||
write("a.js", `var b = require("./b").toString()\nvar c = require("./c")`)
|
||||
write("b.js", `module.exports = []`)
|
||||
write("c.js", `var b = require("./b")\nmodule.exports = function() {return b}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar _0 = []\nvar b = _0.toString()\nvar b0 = _0\nvar c = function() {return b0}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("c.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if used in sequence", function() {
|
||||
write("a.js", `var b = require("./b"), c = require("./c")`)
|
||||
write("b.js", `module.exports = 1`)
|
||||
write("c.js", `var x\nmodule.exports = 2`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b = 1\nvar x\nvar c = 2\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("c.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if collision", function() {
|
||||
write("a.js", `var b = require("./b")`)
|
||||
write("b.js", `var b = 1\nmodule.exports = 2`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b0 = 1\nvar b = 2\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if multiple aliases", function() {
|
||||
write("a.js", `var b = require("./b")\n`)
|
||||
write("b.js", `var b = require("./c")\nb.x = 1\nmodule.exports = b`)
|
||||
write("c.js", `var b = {}\nmodule.exports = b`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b = {}\nb.x = 1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("c.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("works if multiple collision", function() {
|
||||
write("a.js", `var b = require("./b")\nvar c = require("./c")\nvar d = require("./d")`)
|
||||
write("b.js", `var a = 1\nmodule.exports = a`)
|
||||
write("c.js", `var a = 2\nmodule.exports = a`)
|
||||
write("d.js", `var a = 3\nmodule.exports = a`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar a = 1\nvar b = a\nvar a0 = 2\nvar c = a0\nvar a1 = 3\nvar d = a1\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("c.js")
|
||||
remove("d.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("reuses binding if possible", function() {
|
||||
write("a.js", `var b = require("./b")\nvar c = require("./c")`)
|
||||
write("b.js", `var d = require("./d")\nmodule.exports = function() {return d + 1}`)
|
||||
write("c.js", `var d = require("./d")\nmodule.exports = function() {return d + 2}`)
|
||||
write("d.js", `module.exports = 1`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar d = 1\nvar b = function() {return d + 1}\nvar c = function() {return d + 2}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("c.js")
|
||||
remove("d.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("disambiguates conflicts if imported collides with itself", function() {
|
||||
write("a.js", `var b = require("./b")`)
|
||||
write("b.js", `var b = 1\nmodule.exports = function() {return b}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b0 = 1\nvar b = function() {return b0}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("disambiguates conflicts if imported collides with something else", function() {
|
||||
write("a.js", `var a = 1\nvar b = require("./b")`)
|
||||
write("b.js", `var a = 2\nmodule.exports = function() {return a}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar a = 1\nvar a0 = 2\nvar b = function() {return a0}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("disambiguates conflicts if imported collides with function declaration", function() {
|
||||
write("a.js", `function a() {}\nvar b = require("./b")`)
|
||||
write("b.js", `var a = 2\nmodule.exports = function() {return a}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nfunction a() {}\nvar a0 = 2\nvar b = function() {return a0}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("disambiguates conflicts if imported collides with another module's private", function() {
|
||||
write("a.js", `var b = require("./b")\nvar c = require("./c")`)
|
||||
write("b.js", `var a = 1\nmodule.exports = function() {return a}`)
|
||||
write("c.js", `var a = 2\nmodule.exports = function() {return a}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar a = 1\nvar b = function() {return a}\nvar a0 = 2\nvar c = function() {return a0}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("c.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("does not mess up strings", function() {
|
||||
write("a.js", `var b = require("./b")`)
|
||||
write("b.js", `var b = "b b b \\\" b"\nmodule.exports = function() {return b}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b0 = "b b b \\\" b"\nvar b = function() {return b0}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
o("does not mess up properties", function() {
|
||||
write("a.js", `var b = require("./b")`)
|
||||
write("b.js", `var b = {b: 1}\nmodule.exports = function() {return b.b}`)
|
||||
bundle(ns + "a.js", ns + "out.js")
|
||||
|
||||
o(read("out.js")).equals(`new function() {\nvar b0 = {b: 1}\nvar b = function() {return b0.b}\n}`)
|
||||
|
||||
remove("a.js")
|
||||
remove("b.js")
|
||||
remove("out.js")
|
||||
})
|
||||
})
|
||||
|
|
@ -10,8 +10,6 @@
|
|||
<div id="app"></div>
|
||||
<script src="../../../module/module.js"></script>
|
||||
<script src="../../../render/vnode.js"></script>
|
||||
<script src="../../../render/trust.js"></script>
|
||||
<script src="../../../render/fragment.js"></script>
|
||||
<script src="../../../render/hyperscript.js"></script>
|
||||
<script src="../../../render/render.js"></script>
|
||||
<script src="../ENV.js"></script>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
var hyperscript = require("./render/hyperscript")
|
||||
|
||||
hyperscript.trust = require("./render/trust")
|
||||
hyperscript.fragment = require("./render/fragment")
|
||||
|
||||
|
||||
module.exports = hyperscript
|
||||
|
|
|
|||
12
index.js
12
index.js
|
|
@ -1,25 +1,21 @@
|
|||
"use strict"
|
||||
|
||||
var m = require("./hyperscript")
|
||||
var renderService = require("./render")
|
||||
var requestService = require("./request")
|
||||
var redrawService = require("./redraw")
|
||||
var parseQueryString = require("./querystring/parse")
|
||||
var buildQueryString = require("./querystring/build")
|
||||
var Stream = require("./stream")
|
||||
|
||||
requestService.setCompletionCallback(redrawService.publish)
|
||||
|
||||
m.mount = require("./mount")
|
||||
m.route = require("./route")
|
||||
m.withAttr = require("./util/withAttr")
|
||||
m.prop = Stream
|
||||
m.render = renderService.render
|
||||
m.prop = require("./stream")
|
||||
m.render = require("./render").render
|
||||
m.redraw = redrawService.publish
|
||||
m.request = requestService.request
|
||||
m.jsonp = requestService.jsonp
|
||||
m.parseQueryString = parseQueryString
|
||||
m.buildQueryString = buildQueryString
|
||||
m.parseQueryString = require("./querystring/parse")
|
||||
m.buildQueryString = require("./querystring/build")
|
||||
m.version = "bleeding-edge"
|
||||
|
||||
module.exports = m
|
||||
|
|
|
|||
1278
mithril.js
1278
mithril.js
File diff suppressed because it is too large
Load diff
84
mithril.min.js
vendored
84
mithril.min.js
vendored
|
|
@ -1,42 +1,42 @@
|
|||
new function(){function w(b,f,p,h,k,l){return{tag:b,key:f,attrs:p,children:h,text:k,dom:l,domSize:void 0,state:{},events:void 0,instance:void 0,skip:!1}}function y(b){if(null==b||"string"!==typeof b&&null==b.view)throw Error("The selector must be either a string or a component.");if("string"===typeof b&&void 0===H[b]){for(var f,p,h=[],k={};f=O.exec(b);){var l=f[1],m=f[2];""===l&&""!==m?p=m:"#"===l?k.id=m:"."===l?h.push(m):"["===f[3][0]&&((l=f[6])&&(l=l.replace(/\\(["'])/g,"$1").replace(/\\\\/g,"\\")),
|
||||
k[f[4]]=l||!0)}0<h.length&&(k.className=h.join(" "));H[b]=function(b,g){var f=!1,l,h,m=b.className||b["class"],r;for(r in k)b[r]=k[r];void 0!==m&&(void 0!==b["class"]&&(b["class"]=void 0,b.className=m),void 0!==k.className&&(b.className=k.className+" "+m));for(r in b)if("key"!==r){f=!0;break}g instanceof Array&&1==g.length&&null!=g[0]&&"#"===g[0].tag?h=g[0].children:l=g;return w(p||"div",b.key,f?b:void 0,l,h,void 0)}}var v;null!=arguments[1]&&("object"!==typeof arguments[1]||void 0!==arguments[1].tag||
|
||||
arguments[1]instanceof Array)?h=1:(v=arguments[1],h=2);if(arguments.length===h+1)f=arguments[h]instanceof Array?arguments[h]:[arguments[h]];else for(f=[];h<arguments.length;h++)f.push(arguments[h]);return"string"===typeof b?H[b](v||{},w.normalizeChildren(f)):w(b,v&&v.key,v||{},w.normalizeChildren(f),void 0,void 0)}w.normalize=function(b){return b instanceof Array?w("[",void 0,void 0,w.normalizeChildren(b),void 0,void 0):null!=b&&"object"!==typeof b?w("#",void 0,void 0,b,void 0,void 0):b};w.normalizeChildren=
|
||||
function(b){for(var f=0;f<b.length;f++)b[f]=w.normalize(b[f]);return b};var O=/(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g,H={};y.trust=function(b){return w("<",void 0,void 0,b,void 0,void 0)};y.fragment=function(b,f){return w("[",b.key,b,w.normalizeChildren(f),void 0,void 0)};var M=function(b){function f(c,a,e,g,b,f,d){for(;e<g;e++){var t=a[e];null!=t&&q(c,p(t,b,d),f)}}function p(c,a,e){var g=c.tag;null!=c.attrs&&D(c.attrs,c,a);if("string"===typeof g)switch(g){case "#":return c.dom=
|
||||
x.createTextNode(c.children);case "<":return h(c);case "[":var b=x.createDocumentFragment();null!=c.children&&(g=c.children,f(b,g,0,g.length,a,null,e));c.dom=b.firstChild;c.domSize=b.childNodes.length;return b;default:var d=c.tag;switch(c.tag){case "svg":e="http://www.w3.org/2000/svg";break;case "math":e="http://www.w3.org/1998/Math/MathML"}var l=(g=c.attrs)&&g.is,d=e?l?x.createElementNS(e,d,{is:l}):x.createElementNS(e,d):l?x.createElement(d,{is:l}):x.createElement(d);c.dom=d;if(null!=g)for(b in l=
|
||||
e,g)u(c,b,null,g[b],l);null!=c.text&&(""!==c.text?d.textContent=c.text:c.children=[w("#",void 0,void 0,c.text,void 0,void 0)]);null!=c.children&&(b=c.children,f(d,b,0,b.length,a,null,e),a=c.attrs,"select"===c.tag&&null!=a&&("value"in a&&u(c,"value",null,a.value,void 0),"selectedIndex"in a&&u(c,"selectedIndex",null,a.selectedIndex,void 0)));return d}else{c.state||(c.state={});P(c.state,c.tag);D(c.tag,c,a);c.instance=w.normalize(c.tag.view.call(c.state,c));if(null!=c.instance){if(c.instance===c)throw Error("A view cannot return the vnode it received as arguments");
|
||||
a=p(c.instance,a,e);c.dom=c.instance.dom;c.domSize=null!=c.dom?c.instance.domSize:0;c=a}else c.domSize=0,c=J;return c}}function h(c){var a={caption:"table",thead:"table",tbody:"table",tfoot:"table",tr:"tbody",th:"tr",td:"tr",colgroup:"table",col:"colgroup"}[(c.children.match(/^\s*?<(\w+)/im)||[])[1]]||"div",a=x.createElement(a);a.innerHTML=c.children;c.dom=a.firstChild;c.domSize=a.childNodes.length;c=x.createDocumentFragment();for(var e;e=a.firstChild;)c.appendChild(e);return c}function k(c,a,e,b,
|
||||
d,h){if(a!==e&&(null!=a||null!=e))if(null==a)f(c,e,0,e.length,b,d,void 0);else if(null==e)g(c,a,0,a.length,e);else{var k;a:{if(null!=a.pool&&Math.abs(a.pool.length-e.length)<=Math.abs(a.length-e.length)&&(k=e[0]&&e[0].children&&e[0].children.length||0,Math.abs((a.pool[0]&&a.pool[0].children&&a.pool[0].children.length||0)-k)<=Math.abs((a[0]&&a[0].children&&a[0].children.length||0)-k))){k=!0;break a}k=!1}k&&(a=a.concat(a.pool));if(a.length===e.length&&null!=e[0]&&null==e[0].key)for(var t=0;t<a.length;t++)a[t]===
|
||||
e[t]||null==a[t]&&null==e[t]||(null==a[t]?q(c,p(e[t],b,h),v(a,t+1,d)):null==e[t]?g(c,a,t,t+1,e):l(c,a[t],e[t],b,v(a,t+1,d),k,h),k&&a[t].tag===e[t].tag&&q(c,m(a[t]),v(a,t+1,d)));else{for(var A=t=0,B=a.length-1,z=e.length-1,n;B>=t&&z>=A;){var r=a[t],u=e[A];if(r===u)t++,A++;else if(null!=r&&null!=u&&r.key===u.key)t++,A++,l(c,r,u,b,v(a,t,d),k,h),k&&r.tag===u.tag&&q(c,m(r),d);else if(r=a[B],r===u)B--,A++;else if(null!=r&&null!=u&&r.key===u.key)l(c,r,u,b,v(a,B+1,d),k,h),A<z&&q(c,m(r),v(a,t,d)),B--,A++;
|
||||
else break}for(;B>=t&&z>=A;){r=a[B];u=e[z];if(r===u)B--;else if(null!=r&&null!=u&&r.key===u.key)l(c,r,u,b,v(a,B+1,d),k,h),k&&r.tag===u.tag&&q(c,m(r),d),null!=r.dom&&(d=r.dom),B--;else{if(!n){n=a;var r=B,C={},x;for(x=0;x<r;x++){var D=n[x];null!=D&&(D=D.key,null!=D&&(C[D]=x))}n=C}null!=u&&(r=n[u.key],null!=r?(C=a[r],l(c,C,u,b,v(a,B+1,d),k,h),q(c,m(C),d),a[r].skip=!0,null!=C.dom&&(d=C.dom)):(u=p(u,b,void 0),q(c,u,d),d=u))}z--;if(z<A)break}f(c,e,A,z+1,b,d,h);g(c,a,t,B+1,e)}}}function l(c,a,e,b,g,d,f){var t=
|
||||
a.tag;if(t===e.tag){e.state=a.state;e.events=a.events;var A;var B;null!=e.attrs&&"function"===typeof e.attrs.onbeforeupdate&&(A=e.attrs.onbeforeupdate.call(e.state,e,a));"string"!==typeof e.tag&&"function"===typeof e.tag.onbeforeupdate&&(B=e.tag.onbeforeupdate.call(e.state,e,a));void 0===A&&void 0===B||A||B?A=!1:(e.dom=a.dom,e.domSize=a.domSize,e.instance=a.instance,A=!0);if(!A)if(null!=e.attrs&&y(e.attrs,e,b,d),"string"===typeof t)switch(t){case "#":a.children.toString()!==e.children.toString()&&
|
||||
(a.dom.nodeValue=e.children);e.dom=a.dom;break;case "<":a.children!==e.children?(m(a),q(c,h(e),g)):(e.dom=a.dom,e.domSize=a.domSize);break;case "[":k(c,a.children,e.children,b,g,f);a=0;b=e.children;e.dom=null;if(null!=b){for(var n=0;n<b.length;n++)c=b[n],null!=c&&null!=c.dom&&(null==e.dom&&(e.dom=c.dom),a+=c.domSize||1);1!==a&&(e.domSize=a)}break;default:c=f;g=e.dom=a.dom;switch(e.tag){case "svg":c="http://www.w3.org/2000/svg";break;case "math":c="http://www.w3.org/1998/Math/MathML"}"textarea"===
|
||||
e.tag&&(null==e.attrs&&(e.attrs={}),null!=e.text&&(e.attrs.value=e.text));d=a.attrs;f=e.attrs;t=c;if(null!=f)for(n in f)u(e,n,d&&d[n],f[n],t);if(null!=d)for(n in d)null!=f&&n in f||("className"===n&&(n="class"),"o"!==n[0]||"n"!==n[1]||r(n)?"key"!==n&&e.dom.removeAttribute(n):C(e,n,void 0));null!=a.text&&null!=e.text&&""!==e.text?a.text.toString()!==e.text.toString()&&(a.dom.firstChild.nodeValue=e.text):(null!=a.text&&(a.children=[w("#",void 0,void 0,a.text,void 0,a.dom.firstChild)]),null!=e.text&&
|
||||
(e.children=[w("#",void 0,void 0,e.text,void 0,void 0)]),k(g,a.children,e.children,b,null,c))}else e.instance=w.normalize(e.tag.view.call(e.state,e)),y(e.tag,e,b,d),null!=e.instance?(null==a.instance?q(c,p(e.instance,b,f),g):l(c,a.instance,e.instance,b,g,d,f),e.dom=e.instance.dom,e.domSize=e.instance.domSize):null!=a.instance?(z(c,a.instance,null),e.dom=void 0,e.domSize=0):(e.dom=a.dom,e.domSize=a.domSize)}else z(c,a,null),q(c,p(e,b,void 0),g)}function m(c){var a=c.domSize;if(null!=a||null==c.dom){var e=
|
||||
x.createDocumentFragment();if(0<a){for(c=c.dom;--a;)e.appendChild(c.nextSibling);e.insertBefore(c,e.firstChild)}return e}return c.dom}function v(c,a,e){for(;a<c.length;a++)if(null!=c[a]&&null!=c[a].dom)return c[a].dom;return e}function q(c,a,e){e&&e.parentNode?c.insertBefore(a,e):c.appendChild(a)}function g(c,a,e,b,g){for(;e<b;e++){var d=a[e];null!=d&&(d.skip?d.skip=!1:z(c,d,g))}}function d(c){var a=!1;return function(){a||(a=!0,c())}}function z(c,a,e){function b(){if(++f===g&&(n(a),a.dom)){var d=
|
||||
a.domSize||1;if(1<d)for(var t=a.dom;--d;)c.removeChild(t.nextSibling);null!=a.dom.parentNode&&c.removeChild(a.dom);if(d=null!=e&&null==a.domSize)d=a.attrs,d=!(null!=d&&(d.oncreate||d.onupdate||d.onbeforeremove||d.onremove));d&&"string"===typeof a.tag&&(e.pool?e.pool.push(a):e.pool=[a])}}var g=1,f=0;a.attrs&&a.attrs.onbeforeremove&&(g++,a.attrs.onbeforeremove.call(a.state,a,d(b)));"string"!==typeof a.tag&&a.tag.onbeforeremove&&(g++,a.tag.onbeforeremove.call(a.state,a,d(b)));b()}function n(c){c.attrs&&
|
||||
c.attrs.onremove&&c.attrs.onremove.call(c.state,c);"string"!==typeof c.tag&&c.tag.onremove&&c.tag.onremove.call(c.state,c);if(null!=c.instance)n(c.instance);else if(c=c.children,c instanceof Array)for(var a=0;a<c.length;a++){var e=c[a];null!=e&&n(e)}}function u(c,a,e,b,g){var d=c.dom;if("key"!==a&&(e!==b||"value"===a||"checked"===a||"selectedIndex"===a||"selected"===a&&c.dom===x.activeElement||"object"===typeof b)&&"undefined"!==typeof b&&!r(a)){var f=a.indexOf(":");if(-1<f&&"xlink"===a.substr(0,
|
||||
f))d.setAttributeNS("http://www.w3.org/1999/xlink",a.slice(f+1),b);else if("o"===a[0]&&"n"===a[1]&&"function"===typeof b)C(c,a,b);else if("style"===a)if(c=e,c===b&&(d.style.cssText="",c=null),null==b)d.style.cssText="";else if("string"===typeof b)d.style.cssText=b;else{"string"===typeof c&&(d.style.cssText="");for(var t in b)d.style[t]=b[t];if(null!=c&&"string"!==typeof c)for(t in c)t in b||(d.style[t]="")}else if(a in d&&"href"!==a&&"list"!==a&&"form"!==a&&void 0===g){if("input"!==c.tag||"value"!==
|
||||
a||c.dom.value!==b||c.dom!==x.activeElement)d[a]=b}else"boolean"===typeof b?b?d.setAttribute(a,""):d.removeAttribute(a):d.setAttribute("className"===a?"class":a,b)}}function r(c){return"oninit"===c||"oncreate"===c||"onupdate"===c||"onremove"===c||"onbeforeremove"===c||"onbeforeupdate"===c}function C(c,a,b){var d=c.dom,g=function(a){var c=b.call(d,a);"function"===typeof I&&I.call(d,a);return c};if(a in d)d[a]=g;else{var f=a.slice(2);void 0===c.events&&(c.events={});null!=c.events[a]&&d.removeEventListener(f,
|
||||
c.events[a],!1);"function"===typeof b&&(c.events[a]=g,d.addEventListener(f,c.events[a],!1))}}function D(c,a,b){"function"===typeof c.oninit&&c.oninit.call(a.state,a);"function"===typeof c.oncreate&&b.push(c.oncreate.bind(a.state,a))}function y(c,a,b,d){d?D(c,a,b):"function"===typeof c.onupdate&&b.push(c.onupdate.bind(a.state,a))}function P(c,a){Object.keys(a).forEach(function(b){c[b]=a[b]})}var x=b.document,J=x.createDocumentFragment(),I;return{render:function(c,a){if(!c)throw Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");
|
||||
var b=[],d=x.activeElement;null==c.vnodes&&(c.textContent="");a instanceof Array||(a=[a]);k(c,c.vnodes,w.normalizeChildren(a),b,null,void 0);c.vnodes=a;for(var g=0;g<b.length;g++)b[g]();x.activeElement!==d&&d.focus()},setEventCallback:function(c){return I=c}}}(window),N=function(b){function f(){function a(){0<arguments.length&&arguments[0]!==F&&h(a,arguments[0],void 0);return a._state.value}p(a,arguments);0<arguments.length&&arguments[0]!==F&&h(a,arguments[0],void 0);return a}function p(a,c){a.constructor=
|
||||
f;a._state={id:H++,value:void 0,error:void 0,state:0,derive:void 0,recover:void 0,deps:{},parents:[],errorStream:void 0,endStream:void 0};a.map=w;a.ap=y;a.of=f;a.valueOf=x;a.toJSON=J;a.toString=x;a.run=d;a["catch"]=z;Object.defineProperties(a,{error:{get:function(){if(!a._state.errorStream){var c=function(){0<arguments.length&&arguments[0]!==F&&h(a,void 0,arguments[0]);return a._state.error};p(c,[]);r(c,[a],G,G);a._state.errorStream=c}return a._state.errorStream}},end:{get:function(){if(!a._state.endStream){var c=
|
||||
f();c.map(function(b){!0===b&&(D(a),D(c));return b});a._state.endStream=c}return a._state.endStream}}})}function h(a,c,b){k(a,c,b);for(var d in a._state.deps)m(a._state.deps[d],!1);a._state.changed=!1;for(var e in a._state.deps)a._state.deps[e]._state.changed=!1}function k(a,c,b){b=q(c,b);if(void 0!==b&&"function"===typeof a._state.recover){if(!v(a,l,!0))return}else l(a,c,b);a._state.changed=!0;2!==a._state.state&&(a._state.state=1)}function l(a,c,b){a._state.value=c;a._state.error=b}function m(b,
|
||||
d){var e=b._state.parents;0<e.length&&e.filter(c).length===e.length&&(d||0<e.filter(a).length)&&(e=e.filter(E),0<e.length?k(b,void 0,e[0]._state.error):v(b,k,!1))}function v(a,c,b){try{var d=b?a._state.recover():a._state.derive();if(d===F)return!1;c(a,d,void 0)}catch(e){c(a,void 0,null!=e.__error?e.__error:e),null==e.__error&&g(a,e)}return!0}function q(a,c){null!=a&&a.constructor===f&&(c=void 0!==a._state.error?a._state.error:q(a._state.value,a._state.error));return c}function g(a,c){0===Object.keys(a._state.deps).length&&
|
||||
setTimeout(function(){0===Object.keys(a._state.deps).length&&b(c)},0)}function d(a){var c=f(),b=this;return r(c,[b],function(){return u(c,a(b()))},void 0)}function z(a){var c=f(),b=this;return r(c,[b],function(){return b._state.value},function(){return u(c,a(b._state.error))})}function n(c,b){if(b.length>b.filter(I).length)throw Error("Ensure that each item passed to m.prop.combine/m.prop.merge is a stream");return r(f(),b,function(){var d=b.filter(E);if(0<d.length)throw{__error:d[0]._state.error};
|
||||
return c.apply(this,b.concat([b.filter(a)]))},void 0)}function u(a,c){if(null!=c&&c.constructor===f){var b=c,d=function(){k(a,b._state.value,b._state.error);for(var c in a._state.deps)m(a._state.deps[c],!1)};b.map(d)["catch"](function(a){d();throw{__error:a};});if(0===b._state.state)return F;if(b._state.error)throw{__error:b._state.error};c=b._state.value}return c}function r(a,c,b,d){var g=a._state;g.derive=b;g.recover=d;g.parents=c.filter(e);C(a,g.parents);m(a,!0);return a}function C(a,c){for(var b=
|
||||
0;b<c.length;b++)c[b]._state.deps[a._state.id]=a,C(a,c[b]._state.parents)}function D(a){for(var c=0;c<a._state.parents.length;c++)delete a._state.parents[c]._state.deps[a._state.id];for(var b in a._state.deps){var c=a._state.deps[b],d=c._state.parents.indexOf(a);-1<d&&c._state.parents.splice(d,1)}a._state.state=2;a._state.deps={}}function w(a){return n(function(c){return a(c())},[this])}function y(a){return n(function(a,c){return a()(c())},[this,a])}function x(){return this._state.value}function J(){return null!=
|
||||
this._state.value&&"function"===typeof this._state.value.toJSON?this._state.value.toJSON():this._state.value}function I(a){return a._state}function c(a){return 1===a._state.state}function a(a){return a._state.changed}function e(a){return 2!==a._state.state}function E(a){return a._state.error}var H=0,G=function(){},F={};f.merge=function(a){return n(function(){return a.map(function(a){return a()})},a)};f.combine=n;f.reject=function(a){var c=f();c.error(a);return c};f.HALT=F;return f}(console.log.bind(console)),
|
||||
E=function(b){function f(b,h){if(h instanceof Array)for(var m=0;m<h.length;m++)f(b+"["+m+"]",h[m]);else if("[object Object]"===Object.prototype.toString.call(h))for(m in h)f(b+"["+m+"]",h[m]);else p.push(encodeURIComponent(b)+(null!=h&&""!==h?"="+encodeURIComponent(h):""))}if("[object Object]"!==Object.prototype.toString.call(b))return"";var p=[],h;for(h in b)f(h,b[h]);return p.join("&")},G=function(b,f){function p(b,d){if(null==d)return b;for(var f=b.match(/:[^\/]+/gi)||[],h=0;h<f.length;h++){var k=
|
||||
f[h].slice(1);null!=d[k]&&(b=b.replace(f[h],d[k]),delete d[k])}return b}function h(b,d){var f=E(d);if(""!==f){var h=0>b.indexOf("?")?"?":"&";b+=h+f}return b}function k(b){try{return""!==b?JSON.parse(b):null}catch(d){throw Error(b);}}function l(b){return b.responseText}function m(b,d){if("function"===typeof b)if(d instanceof Array)for(var f=0;f<d.length;f++)d[f]=new b(d[f]);else return new b(d);return d}var v=0,q;return{request:function(g){var d=f();void 0!==g.initialValue&&d(g.initialValue);var z=
|
||||
"boolean"===typeof g.useBody?g.useBody:"GET"!==g.method&&"TRACE"!==g.method;"function"!==typeof g.serialize&&(g.serialize="undefined"!==typeof FormData&&g.data instanceof FormData?function(b){return b}:JSON.stringify);"function"!==typeof g.deserialize&&(g.deserialize=k);"function"!==typeof g.extract&&(g.extract=l);g.url=p(g.url,g.data);z?g.data=g.serialize(g.data):g.url=h(g.url,g.data);var n=new b.XMLHttpRequest;n.open(g.method,g.url,"boolean"===typeof g.async?g.async:!0,"string"===typeof g.user?
|
||||
g.user:void 0,"string"===typeof g.password?g.password:void 0);g.serialize===JSON.stringify&&z&&n.setRequestHeader("Content-Type","application/json; charset=utf-8");g.deserialize===k&&n.setRequestHeader("Accept","application/json, text/*");"function"===typeof g.config&&(n=g.config(n,g)||n);n.onreadystatechange=function(){if(4===n.readyState){try{var b=g.extract!==l?g.extract(n,g):g.deserialize(g.extract(n,g));if(200<=n.status&&300>n.status||304===n.status)d(m(g.type,b));else{var f=Error(n.responseText),
|
||||
h;for(h in b)f[h]=b[h];d.error(f)}}catch(k){d.error(k)}"function"===typeof q&&q()}};z?n.send(g.data):n.send();return d},jsonp:function(g){var d=f();void 0!==g.initialValue&&d(g.initialValue);var k=g.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+v++,n=b.document.createElement("script");b[k]=function(f){n.parentNode.removeChild(n);d(m(g.type,f));"function"===typeof q&&q();delete b[k]};n.onerror=function(){n.parentNode.removeChild(n);d.error(Error("JSONP request failed"));"function"===
|
||||
typeof q&&q();delete b[k]};null==g.data&&(g.data={});g.url=p(g.url,g.data);g.data[g.callbackKey||"callback"]=k;n.src=h(g.url,g.data);b.document.documentElement.appendChild(n);return d},setCompletionCallback:function(b){q=b}}}(window,N),K=function(){var b=[];return{subscribe:b.push.bind(b),unsubscribe:function(f){f=b.indexOf(f);-1<f&&b.splice(f,1)},publish:function(){for(var f=0;f<b.length;f++)b[f].apply(this,arguments)}}}(),L=function(b){if(""===b||null==b)return{};"?"===b.charAt(0)&&(b=b.slice(1));
|
||||
b=b.split("&");for(var f={},p={},h=0;h<b.length;h++){var k=b[h].split("="),l=decodeURIComponent(k[0]),k=2===k.length?decodeURIComponent(k[1]):"",m=Number(k);""!==k&&!isNaN(m)||"NaN"===k?k=m:"true"===k?k=!0:"false"===k?k=!1:"/"!==k.charAt(0)&&(m=new Date(k),isNaN(m.getTime())||(k=m));var m=l.split(/\]\[?|\[/),v=f;-1<l.indexOf("[")&&m.pop();for(var q=0;q<m.length;q++){var l=m[q],g=m[q+1],g=""==g||!isNaN(parseInt(g,10)),d=q===m.length-1;""===l&&(l=m.slice(0,q).join(),null==p[l]&&(p[l]=0),l=p[l]++);null==
|
||||
v[l]&&(v[l]=d?k:g?[]:{});v=v[l]}}return f};G.setCompletionCallback(K.publish);var Q=function(b){var f=0,p=null,h="function"===typeof requestAnimationFrame?requestAnimationFrame:setTimeout;return function(k){var l=Date.now();!0===k||0===f||16<=l-f?(f=l,b()):null===p&&(p=h(function(){p=null;b();f=Date.now()},16-(l-f)))}},R=function(b,f,p,h){h=Q(h);null!=f&&f.setEventCallback(function(b){!1!==b.redraw&&p.publish()});null!=p&&(b.redraw&&p.unsubscribe(b.redraw),p.subscribe(h));return b.redraw=h};y.mount=
|
||||
function(b,f){return function(p,h){null===h?(b.render(p,[]),f.unsubscribe(p.redraw),delete p.redraw):R(p,b,f,function(){b.render(p,w(h,void 0,void 0,void 0,void 0,void 0))})()}}(M,K);var S=function(b){function f(d){var f=b.location[d].replace(/(?:%[a-f89][a-f0-9])+/gim,decodeURIComponent);"pathname"===d&&"/"!==f[0]&&(f="/"+f);return f}function p(b){return function(){null==g&&(g=v(function(){g=null;b()}))}}function h(b,f,g){var h=b.indexOf("?"),k=b.indexOf("#"),l=-1<h?h:-1<k?k:b.length;if(-1<h){var h=
|
||||
L(b.slice(h+1,-1<k?k:b.length)),m;for(m in h)f[m]=h[m]}if(-1<k)for(m in f=L(b.slice(k+1)),f)g[m]=f[m];return b.slice(0,l)}function k(){switch(q.charAt(0)){case "#":return f("hash").slice(q.length);case "?":return f("search").slice(q.length)+f("hash");default:return f("pathname").slice(q.length)+f("search")+f("hash")}}function l(d,f,g){var k={},r={};d=h(d,k,r);if(null!=f){for(var l in f)k[l]=f[l];d=d.replace(/:([^\/]+)/g,function(b,d){delete k[d];return f[d]})}(l=E(k))&&(d+="?"+l);(r=E(r))&&(d+="#"+
|
||||
r);m?(g&&g.replace?b.history.replaceState(null,null,q+d):b.history.pushState(null,null,q+d),b.onpopstate()):b.location.href=q+d}var m="function"===typeof b.history.pushState,v="function"===typeof setImmediate?setImmediate:setTimeout,q="#!",g;return{setPrefix:function(b){q=b},getPath:k,setPath:l,defineRoutes:function(d,f,g){function l(){var b=k(),m={},p=h(b,m,m),q;for(q in d){var u=new RegExp("^"+q.replace(/:[^\/]+?\.{3}/g,"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+"/?$");if(u.test(p)){p.replace(u,function(){for(var g=
|
||||
q.match(/:[^\/]+/g)||[],h=[].slice.call(arguments,1,-2),k=0;k<g.length;k++)m[g[k].replace(/:|\./g,"")]=decodeURIComponent(h[k]);f(d[q],m,b,q)});return}}g(b,m)}m?b.onpopstate=p(l):"#"===q.charAt(0)&&(b.onhashchange=l);l();return l},link:function(b){b.dom.setAttribute("href",q+b.attrs.href);b.dom.onclick=function(f){f.preventDefault();f.redraw=!1;l(b.attrs.href,void 0,void 0)}}}};y.route=function(b,f){function p(b){return b}var h=S(b),k,l,m,v,q,g={view:function(){return m(w(l,null,v,void 0,void 0,void 0))}},
|
||||
d=function(b,d,u){l="div";m=p;v=null;f(b,g);h.defineRoutes(u,function(d,f,g){var h="function"!==typeof d.view,n=p,u=k=function(p){u===k&&(k=null,l=null!=p?p:h?"div":d,m=n,v=f,q=g,b.redraw(!0))},w=function(){u()};h&&("function"===typeof d.render&&(n=d.render.bind(d)),"function"===typeof d.onmatch&&(w=d.onmatch));w.call(d,u,f,g)},function(){h.setPath(d,null,{replace:!0})})};d.link=h.link;d.prefix=h.setPrefix;d.set=h.setPath;d.get=function(){return q};return d}(window,y.mount);y.withAttr=function(b,
|
||||
f,p){return function(h){return f.call(p||this,b in h.currentTarget?h.currentTarget[b]:h.currentTarget.getAttribute(b))}};y.prop=N;y.render=M.render;y.redraw=K.publish;y.request=G.request;y.jsonp=G.jsonp;y.parseQueryString=L;y.buildQueryString=E;y.version="1.0.0";"undefined"!==typeof module?module.exports=y:window.m=y};
|
||||
new function(){function u(b,e,l,g,k,h){return{tag:b,key:e,attrs:l,children:g,text:k,dom:h,domSize:void 0,state:{},events:void 0,instance:void 0,skip:!1}}function w(b){if(null==b||"string"!==typeof b&&null==b.view)throw Error("The selector must be either a string or a component.");if("string"===typeof b&&void 0===G[b]){for(var e,l,g=[],k={};e=P.exec(b);){var h=e[1],q=e[2];""===h&&""!==q?l=q:"#"===h?k.id=q:"."===h?g.push(q):"["===e[3][0]&&((h=e[6])&&(h=h.replace(/\\(["'])/g,"$1").replace(/\\\\/g,"\\")),
|
||||
k[e[4]]=h||!0)}0<g.length&&(k.className=g.join(" "));G[b]=function(b,f){var e=!1,h,g,q=b.className||b["class"],x;for(x in k)b[x]=k[x];void 0!==q&&(void 0!==b["class"]&&(b["class"]=void 0,b.className=q),void 0!==k.className&&(b.className=k.className+" "+q));for(x in b)if("key"!==x){e=!0;break}f instanceof Array&&1==f.length&&null!=f[0]&&"#"===f[0].tag?g=f[0].children:h=f;return u(l||"div",b.key,e?b:void 0,h,g,void 0)}}var t;null!=arguments[1]&&("object"!==typeof arguments[1]||void 0!==arguments[1].tag||
|
||||
arguments[1]instanceof Array)?g=1:(t=arguments[1],g=2);if(arguments.length===g+1)e=arguments[g]instanceof Array?arguments[g]:[arguments[g]];else for(e=[];g<arguments.length;g++)e.push(arguments[g]);return"string"===typeof b?G[b](t||{},u.normalizeChildren(e)):u(b,t&&t.key,t||{},u.normalizeChildren(e),void 0,void 0)}u.normalize=function(b){return b instanceof Array?u("[",void 0,void 0,u.normalizeChildren(b),void 0,void 0):null!=b&&"object"!==typeof b?u("#",void 0,void 0,b,void 0,void 0):b};u.normalizeChildren=
|
||||
function(b){for(var e=0;e<b.length;e++)b[e]=u.normalize(b[e]);return b};var P=/(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g,G={};w.trust=function(b){return u("<",void 0,void 0,b,void 0,void 0)};w.fragment=function(b,e){return u("[",b.key,b,u.normalizeChildren(e),void 0,void 0)};var N=function(b){function e(){function a(){0<arguments.length&&arguments[0]!==D&&g(a,arguments[0],void 0);return a._state.value}l(a,arguments);0<arguments.length&&arguments[0]!==D&&g(a,arguments[0],
|
||||
void 0);return a}function l(a,c){a.constructor=e;a._state={id:Q++,value:void 0,error:void 0,state:0,derive:void 0,recover:void 0,deps:{},parents:[],errorStream:void 0,endStream:void 0};a.map=u;a.ap=w;a.of=e;a.valueOf=n;a.toJSON=H;a.toString=n;a.run=p;a["catch"]=A;Object.defineProperties(a,{error:{get:function(){if(!a._state.errorStream){var c=function(){0<arguments.length&&arguments[0]!==D&&g(a,void 0,arguments[0]);return a._state.error};l(c,[]);x(c,[a],L,L);a._state.errorStream=c}return a._state.errorStream}},
|
||||
end:{get:function(){if(!a._state.endStream){var c=e();c.map(function(d){!0===d&&(z(a),z(c));return d});a._state.endStream=c}return a._state.endStream}}})}function g(a,c,d){k(a,c,d);for(var f in a._state.deps)q(a._state.deps[f],!1);a._state.changed=!1;for(var b in a._state.deps)a._state.deps[b]._state.changed=!1}function k(a,c,d){d=r(c,d);if(void 0!==d&&"function"===typeof a._state.recover){if(!t(a,h,!0))return}else h(a,c,d);a._state.changed=!0;2!==a._state.state&&(a._state.state=1)}function h(a,c,
|
||||
d){a._state.value=c;a._state.error=d}function q(d,f){var b=d._state.parents;0<b.length&&b.filter(c).length===b.length&&(f||0<b.filter(a).length)&&(b=b.filter(M),0<b.length?k(d,void 0,b[0]._state.error):t(d,k,!1))}function t(a,c,d){try{var b=d?a._state.recover():a._state.derive();if(b===D)return!1;c(a,b,void 0)}catch(e){c(a,void 0,null!=e.__error?e.__error:e),null==e.__error&&f(a,e)}return!0}function r(a,c){null!=a&&a.constructor===e&&(c=void 0!==a._state.error?a._state.error:r(a._state.value,a._state.error));
|
||||
return c}function f(a,c){0===Object.keys(a._state.deps).length&&setTimeout(function(){0===Object.keys(a._state.deps).length&&b(c)},0)}function p(a){var c=e(),d=this;return x(c,[d],function(){return B(c,a(d()))},void 0)}function A(a){var c=e(),d=this;return x(c,[d],function(){return d._state.value},function(){return B(c,a(d._state.error))})}function m(c,d){if(d.length>d.filter(E).length)throw Error("Ensure that each item passed to m.prop.combine/m.prop.merge is a stream");return x(e(),d,function(){var b=
|
||||
d.filter(M);if(0<b.length)throw{__error:b[0]._state.error};return c.apply(this,d.concat([d.filter(a)]))},void 0)}function B(a,c){if(null!=c&&c.constructor===e){var d=c,b=function(){k(a,d._state.value,d._state.error);for(var c in a._state.deps)q(a._state.deps[c],!1)};d.map(b)["catch"](function(a){b();throw{__error:a};});if(0===d._state.state)return D;if(d._state.error)throw{__error:d._state.error};c=d._state.value}return c}function x(a,c,b,f){var e=a._state;e.derive=b;e.recover=f;e.parents=c.filter(d);
|
||||
C(a,e.parents);q(a,!0);return a}function C(a,c){for(var d=0;d<c.length;d++)c[d]._state.deps[a._state.id]=a,C(a,c[d]._state.parents)}function z(a){for(var c=0;c<a._state.parents.length;c++)delete a._state.parents[c]._state.deps[a._state.id];for(var d in a._state.deps){var c=a._state.deps[d],b=c._state.parents.indexOf(a);-1<b&&c._state.parents.splice(b,1)}a._state.state=2;a._state.deps={}}function u(a){return m(function(c){return a(c())},[this])}function w(a){return m(function(a,c){return a()(c())},
|
||||
[this,a])}function n(){return this._state.value}function H(){return null!=this._state.value&&"function"===typeof this._state.value.toJSON?this._state.value.toJSON():this._state.value}function E(a){return a._state}function c(a){return 1===a._state.state}function a(a){return a._state.changed}function d(a){return 2!==a._state.state}function M(a){return a._state.error}var Q=0,L=function(){},D={};e.merge=function(a){return m(function(){return a.map(function(a){return a()})},a)};e.combine=m;e.reject=function(a){var c=
|
||||
e();c.error(a);return c};e.HALT=D;return e}(console.log.bind(console)),F=function(b){function e(b,h){if(h instanceof Array)for(var g=0;g<h.length;g++)e(b+"["+g+"]",h[g]);else if("[object Object]"===Object.prototype.toString.call(h))for(g in h)e(b+"["+g+"]",h[g]);else l.push(encodeURIComponent(b)+(null!=h&&""!==h?"="+encodeURIComponent(h):""))}if("[object Object]"!==Object.prototype.toString.call(b))return"";var l=[],g;for(g in b)e(g,b[g]);return l.join("&")},I=function(b,e){function l(b,e){if(null==
|
||||
e)return b;for(var g=b.match(/:[^\/]+/gi)||[],h=0;h<g.length;h++){var k=g[h].slice(1);null!=e[k]&&(b=b.replace(g[h],e[k]),delete e[k])}return b}function g(b,e){var g=F(e);if(""!==g){var h=0>b.indexOf("?")?"?":"&";b+=h+g}return b}function k(b){try{return""!==b?JSON.parse(b):null}catch(e){throw Error(b);}}function h(b){return b.responseText}function q(b,e){if("function"===typeof b)if(e instanceof Array)for(var g=0;g<e.length;g++)e[g]=new b(e[g]);else return new b(e);return e}var t=0,r;return{request:function(f){var p=
|
||||
e();void 0!==f.initialValue&&p(f.initialValue);var A="boolean"===typeof f.useBody?f.useBody:"GET"!==f.method&&"TRACE"!==f.method;"function"!==typeof f.serialize&&(f.serialize="undefined"!==typeof FormData&&f.data instanceof FormData?function(b){return b}:JSON.stringify);"function"!==typeof f.deserialize&&(f.deserialize=k);"function"!==typeof f.extract&&(f.extract=h);f.url=l(f.url,f.data);A?f.data=f.serialize(f.data):f.url=g(f.url,f.data);var m=new b.XMLHttpRequest;m.open(f.method,f.url,"boolean"===
|
||||
typeof f.async?f.async:!0,"string"===typeof f.user?f.user:void 0,"string"===typeof f.password?f.password:void 0);f.serialize===JSON.stringify&&A&&m.setRequestHeader("Content-Type","application/json; charset=utf-8");f.deserialize===k&&m.setRequestHeader("Accept","application/json, text/*");"function"===typeof f.config&&(m=f.config(m,f)||m);m.onreadystatechange=function(){if(4===m.readyState){try{var b=f.extract!==h?f.extract(m,f):f.deserialize(f.extract(m,f));if(200<=m.status&&300>m.status||304===
|
||||
m.status)p(q(f.type,b));else{var e=Error(m.responseText),g;for(g in b)e[g]=b[g];p.error(e)}}catch(k){p.error(k)}"function"===typeof r&&r()}};A?m.send(f.data):m.send();return p},jsonp:function(f){var h=e();void 0!==f.initialValue&&h(f.initialValue);var k=f.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+t++,m=b.document.createElement("script");b[k]=function(e){m.parentNode.removeChild(m);h(q(f.type,e));"function"===typeof r&&r();delete b[k]};m.onerror=function(){m.parentNode.removeChild(m);
|
||||
h.error(Error("JSONP request failed"));"function"===typeof r&&r();delete b[k]};null==f.data&&(f.data={});f.url=l(f.url,f.data);f.data[f.callbackKey||"callback"]=k;m.src=g(f.url,f.data);b.document.documentElement.appendChild(m);return h},setCompletionCallback:function(b){r=b}}}(window,N),J=function(){var b=[];return{subscribe:b.push.bind(b),unsubscribe:function(e){e=b.indexOf(e);-1<e&&b.splice(e,1)},publish:function(){for(var e=0;e<b.length;e++)b[e].apply(this,arguments)}}}();I.setCompletionCallback(J.publish);
|
||||
var O=function(b){function e(c,a,d,b,e,f,g){for(;d<b;d++){var h=a[d];null!=h&&r(c,l(h,e,g),f)}}function l(c,a,d){var b=c.tag;null!=c.attrs&&z(c.attrs,c,a);if("string"===typeof b)switch(b){case "#":return c.dom=n.createTextNode(c.children);case "<":return g(c);case "[":var f=n.createDocumentFragment();null!=c.children&&(b=c.children,e(f,b,0,b.length,a,null,d));c.dom=f.firstChild;c.domSize=f.childNodes.length;return f;default:var h=c.tag;switch(c.tag){case "svg":d="http://www.w3.org/2000/svg";break;
|
||||
case "math":d="http://www.w3.org/1998/Math/MathML"}var k=(b=c.attrs)&&b.is,h=d?k?n.createElementNS(d,h,{is:k}):n.createElementNS(d,h):k?n.createElement(h,{is:k}):n.createElement(h);c.dom=h;if(null!=b)for(f in k=d,b)B(c,f,null,b[f],k);null!=c.text&&(""!==c.text?h.textContent=c.text:c.children=[u("#",void 0,void 0,c.text,void 0,void 0)]);null!=c.children&&(f=c.children,e(h,f,0,f.length,a,null,d),a=c.attrs,"select"===c.tag&&null!=a&&("value"in a&&B(c,"value",null,a.value,void 0),"selectedIndex"in a&&
|
||||
B(c,"selectedIndex",null,a.selectedIndex,void 0)));return h}else{c.state||(c.state={});R(c.state,c.tag);z(c.tag,c,a);c.instance=u.normalize(c.tag.view.call(c.state,c));if(null!=c.instance){if(c.instance===c)throw Error("A view cannot return the vnode it received as arguments");a=l(c.instance,a,d);c.dom=c.instance.dom;c.domSize=null!=c.dom?c.instance.domSize:0;c=a}else c.domSize=0,c=H;return c}}function g(c){var a={caption:"table",thead:"table",tbody:"table",tfoot:"table",tr:"tbody",th:"tr",td:"tr",
|
||||
colgroup:"table",col:"colgroup"}[(c.children.match(/^\s*?<(\w+)/im)||[])[1]]||"div",a=n.createElement(a);a.innerHTML=c.children;c.dom=a.firstChild;c.domSize=a.childNodes.length;c=n.createDocumentFragment();for(var d;d=a.firstChild;)c.appendChild(d);return c}function k(c,a,d,b,g,k){if(a!==d&&(null!=a||null!=d))if(null==a)e(c,d,0,d.length,b,g,void 0);else if(null==d)f(c,a,0,a.length,d);else{var p;a:{if(null!=a.pool&&Math.abs(a.pool.length-d.length)<=Math.abs(a.length-d.length)&&(p=d[0]&&d[0].children&&
|
||||
d[0].children.length||0,Math.abs((a.pool[0]&&a.pool[0].children&&a.pool[0].children.length||0)-p)<=Math.abs((a[0]&&a[0].children&&a[0].children.length||0)-p))){p=!0;break a}p=!1}p&&(a=a.concat(a.pool));if(a.length===d.length&&null!=d[0]&&null==d[0].key)for(var v=0;v<a.length;v++)a[v]===d[v]||null==a[v]&&null==d[v]||(null==a[v]?r(c,l(d[v],b,k),t(a,v+1,g)):null==d[v]?f(c,a,v,v+1,d):h(c,a[v],d[v],b,t(a,v+1,g),p,k),p&&a[v].tag===d[v].tag&&r(c,q(a[v]),t(a,v+1,g)));else{for(var m=v=0,x=a.length-1,A=d.length-
|
||||
1,B;x>=v&&A>=m;){var y=a[v],n=d[m];if(y===n)v++,m++;else if(null!=y&&null!=n&&y.key===n.key)v++,m++,h(c,y,n,b,t(a,v,g),p,k),p&&y.tag===n.tag&&r(c,q(y),g);else if(y=a[x],y===n)x--,m++;else if(null!=y&&null!=n&&y.key===n.key)h(c,y,n,b,t(a,x+1,g),p,k),m<A&&r(c,q(y),t(a,v,g)),x--,m++;else break}for(;x>=v&&A>=m;){y=a[x];n=d[A];if(y===n)x--;else if(null!=y&&null!=n&&y.key===n.key)h(c,y,n,b,t(a,x+1,g),p,k),p&&y.tag===n.tag&&r(c,q(y),g),null!=y.dom&&(g=y.dom),x--;else{if(!B){B=a;var y=x,u={},w;for(w=0;w<
|
||||
y;w++){var C=B[w];null!=C&&(C=C.key,null!=C&&(u[C]=w))}B=u}null!=n&&(y=B[n.key],null!=y?(u=a[y],h(c,u,n,b,t(a,x+1,g),p,k),r(c,q(u),g),a[y].skip=!0,null!=u.dom&&(g=u.dom)):(n=l(n,b,void 0),r(c,n,g),g=n))}A--;if(A<m)break}e(c,d,m,A+1,b,g,k);f(c,a,v,x+1,d)}}}function h(c,a,d,b,e,f,p){var m=a.tag;if(m===d.tag){d.state=a.state;d.events=a.events;var n;var t;null!=d.attrs&&"function"===typeof d.attrs.onbeforeupdate&&(n=d.attrs.onbeforeupdate.call(d.state,d,a));"string"!==typeof d.tag&&"function"===typeof d.tag.onbeforeupdate&&
|
||||
(t=d.tag.onbeforeupdate.call(d.state,d,a));void 0===n&&void 0===t||n||t?n=!1:(d.dom=a.dom,d.domSize=a.domSize,d.instance=a.instance,n=!0);if(!n)if(null!=d.attrs&&w(d.attrs,d,b,f),"string"===typeof m)switch(m){case "#":a.children.toString()!==d.children.toString()&&(a.dom.nodeValue=d.children);d.dom=a.dom;break;case "<":a.children!==d.children?(q(a),r(c,g(d),e)):(d.dom=a.dom,d.domSize=a.domSize);break;case "[":k(c,a.children,d.children,b,e,p);a=0;b=d.children;d.dom=null;if(null!=b){for(var z=0;z<b.length;z++)c=
|
||||
b[z],null!=c&&null!=c.dom&&(null==d.dom&&(d.dom=c.dom),a+=c.domSize||1);1!==a&&(d.domSize=a)}break;default:c=p;e=d.dom=a.dom;switch(d.tag){case "svg":c="http://www.w3.org/2000/svg";break;case "math":c="http://www.w3.org/1998/Math/MathML"}"textarea"===d.tag&&(null==d.attrs&&(d.attrs={}),null!=d.text&&(d.attrs.value=d.text));f=a.attrs;p=d.attrs;m=c;if(null!=p)for(z in p)B(d,z,f&&f[z],p[z],m);if(null!=f)for(z in f)null!=p&&z in p||("className"===z&&(z="class"),"o"!==z[0]||"n"!==z[1]||x(z)?"key"!==z&&
|
||||
d.dom.removeAttribute(z):C(d,z,void 0));null!=a.text&&null!=d.text&&""!==d.text?a.text.toString()!==d.text.toString()&&(a.dom.firstChild.nodeValue=d.text):(null!=a.text&&(a.children=[u("#",void 0,void 0,a.text,void 0,a.dom.firstChild)]),null!=d.text&&(d.children=[u("#",void 0,void 0,d.text,void 0,void 0)]),k(e,a.children,d.children,b,null,c))}else d.instance=u.normalize(d.tag.view.call(d.state,d)),w(d.tag,d,b,f),null!=d.instance?(null==a.instance?r(c,l(d.instance,b,p),e):h(c,a.instance,d.instance,
|
||||
b,e,f,p),d.dom=d.instance.dom,d.domSize=d.instance.domSize):null!=a.instance?(A(c,a.instance,null),d.dom=void 0,d.domSize=0):(d.dom=a.dom,d.domSize=a.domSize)}else A(c,a,null),r(c,l(d,b,void 0),e)}function q(c){var a=c.domSize;if(null!=a||null==c.dom){var d=n.createDocumentFragment();if(0<a){for(c=c.dom;--a;)d.appendChild(c.nextSibling);d.insertBefore(c,d.firstChild)}return d}return c.dom}function t(c,a,d){for(;a<c.length;a++)if(null!=c[a]&&null!=c[a].dom)return c[a].dom;return d}function r(c,a,d){d&&
|
||||
d.parentNode?c.insertBefore(a,d):c.appendChild(a)}function f(c,a,d,b,e){for(;d<b;d++){var f=a[d];null!=f&&(f.skip?f.skip=!1:A(c,f,e))}}function p(c){var a=!1;return function(){a||(a=!0,c())}}function A(c,a,d){function b(){if(++f===e&&(m(a),a.dom)){var g=a.domSize||1;if(1<g)for(var h=a.dom;--g;)c.removeChild(h.nextSibling);null!=a.dom.parentNode&&c.removeChild(a.dom);if(g=null!=d&&null==a.domSize)g=a.attrs,g=!(null!=g&&(g.oncreate||g.onupdate||g.onbeforeremove||g.onremove));g&&"string"===typeof a.tag&&
|
||||
(d.pool?d.pool.push(a):d.pool=[a])}}var e=1,f=0;a.attrs&&a.attrs.onbeforeremove&&(e++,a.attrs.onbeforeremove.call(a.state,a,p(b)));"string"!==typeof a.tag&&a.tag.onbeforeremove&&(e++,a.tag.onbeforeremove.call(a.state,a,p(b)));b()}function m(c){c.attrs&&c.attrs.onremove&&c.attrs.onremove.call(c.state,c);"string"!==typeof c.tag&&c.tag.onremove&&c.tag.onremove.call(c.state,c);if(null!=c.instance)m(c.instance);else if(c=c.children,c instanceof Array)for(var a=0;a<c.length;a++){var d=c[a];null!=d&&m(d)}}
|
||||
function B(c,a,d,b,e){var f=c.dom;if("key"!==a&&(d!==b||"value"===a||"checked"===a||"selectedIndex"===a||"selected"===a&&c.dom===n.activeElement||"object"===typeof b)&&"undefined"!==typeof b&&!x(a)){var g=a.indexOf(":");if(-1<g&&"xlink"===a.substr(0,g))f.setAttributeNS("http://www.w3.org/1999/xlink",a.slice(g+1),b);else if("o"===a[0]&&"n"===a[1]&&"function"===typeof b)C(c,a,b);else if("style"===a)if(c=d,c===b&&(f.style.cssText="",c=null),null==b)f.style.cssText="";else if("string"===typeof b)f.style.cssText=
|
||||
b;else{"string"===typeof c&&(f.style.cssText="");for(var h in b)f.style[h]=b[h];if(null!=c&&"string"!==typeof c)for(h in c)h in b||(f.style[h]="")}else if(a in f&&"href"!==a&&"list"!==a&&"form"!==a&&"width"!==a&&"height"!==a&&void 0===e){if("input"!==c.tag||"value"!==a||c.dom.value!==b||c.dom!==n.activeElement)f[a]=b}else"boolean"===typeof b?b?f.setAttribute(a,""):f.removeAttribute(a):f.setAttribute("className"===a?"class":a,b)}}function x(c){return"oninit"===c||"oncreate"===c||"onupdate"===c||"onremove"===
|
||||
c||"onbeforeremove"===c||"onbeforeupdate"===c}function C(c,a,b){var e=c.dom,f=function(a){var c=b.call(e,a);"function"===typeof E&&E.call(e,a);return c};if(a in e)e[a]=f;else{var g=a.slice(2);void 0===c.events&&(c.events={});null!=c.events[a]&&e.removeEventListener(g,c.events[a],!1);"function"===typeof b&&(c.events[a]=f,e.addEventListener(g,c.events[a],!1))}}function z(c,a,b){"function"===typeof c.oninit&&c.oninit.call(a.state,a);"function"===typeof c.oncreate&&b.push(c.oncreate.bind(a.state,a))}
|
||||
function w(c,a,b,e){e?z(c,a,b):"function"===typeof c.onupdate&&b.push(c.onupdate.bind(a.state,a))}function R(c,a){Object.keys(a).forEach(function(b){c[b]=a[b]})}var n=b.document,H=n.createDocumentFragment(),E;return{render:function(c,a){if(!c)throw Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var b=[],e=n.activeElement;null==c.vnodes&&(c.textContent="");a instanceof Array||(a=[a]);k(c,c.vnodes,u.normalizeChildren(a),b,null,void 0);c.vnodes=a;for(var f=
|
||||
0;f<b.length;f++)b[f]();n.activeElement!==e&&e.focus()},setEventCallback:function(c){return E=c}}}(window),S=function(b){var e=0,l=null,g="function"===typeof requestAnimationFrame?requestAnimationFrame:setTimeout;return function(k){var h=Date.now();!0===k||0===e||16<=h-e?(e=h,b()):null===l&&(l=g(function(){l=null;b();e=Date.now()},16-(h-e)))}},T=function(b,e,l,g){g=S(g);null!=e&&e.setEventCallback(function(b){!1!==b.redraw&&l.publish()});null!=l&&(b.redraw&&l.unsubscribe(b.redraw),l.subscribe(g));
|
||||
return b.redraw=g};w.mount=function(b,e){return function(l,g){null===g?(b.render(l,[]),e.unsubscribe(l.redraw),delete l.redraw):T(l,b,e,function(){b.render(l,u(g,void 0,void 0,void 0,void 0,void 0))})()}}(O,J);var K=function(b){if(""===b||null==b)return{};"?"===b.charAt(0)&&(b=b.slice(1));b=b.split("&");for(var e={},l={},g=0;g<b.length;g++){var k=b[g].split("="),h=decodeURIComponent(k[0]),k=2===k.length?decodeURIComponent(k[1]):"",q=Number(k);""!==k&&!isNaN(q)||"NaN"===k?k=q:"true"===k?k=!0:"false"===
|
||||
k?k=!1:"/"!==k.charAt(0)&&(q=new Date(k),isNaN(q.getTime())||(k=q));var q=h.split(/\]\[?|\[/),t=e;-1<h.indexOf("[")&&q.pop();for(var r=0;r<q.length;r++){var h=q[r],f=q[r+1],f=""==f||!isNaN(parseInt(f,10)),p=r===q.length-1;""===h&&(h=q.slice(0,r).join(),null==l[h]&&(l[h]=0),h=l[h]++);null==t[h]&&(t[h]=p?k:f?[]:{});t=t[h]}}return e},U=function(b){function e(e){var f=b.location[e].replace(/(?:%[a-f89][a-f0-9])+/gim,decodeURIComponent);"pathname"===e&&"/"!==f[0]&&(f="/"+f);return f}function l(b){return function(){null==
|
||||
f&&(f=t(function(){f=null;b()}))}}function g(b,e,f){var g=b.indexOf("?"),h=b.indexOf("#"),k=-1<g?g:-1<h?h:b.length;if(-1<g){var g=K(b.slice(g+1,-1<h?h:b.length)),l;for(l in g)e[l]=g[l]}if(-1<h)for(l in e=K(b.slice(h+1)),e)f[l]=e[l];return b.slice(0,k)}function k(){switch(r.charAt(0)){case "#":return e("hash").slice(r.length);case "?":return e("search").slice(r.length)+e("hash");default:return e("pathname").slice(r.length)+e("search")+e("hash")}}function h(e,f,h){var k={},l={};e=g(e,k,l);if(null!=
|
||||
f){for(var t in f)k[t]=f[t];e=e.replace(/:([^\/]+)/g,function(b,e){delete k[e];return f[e]})}(t=F(k))&&(e+="?"+t);(l=F(l))&&(e+="#"+l);q?(h&&h.replace?b.history.replaceState(null,null,r+e):b.history.pushState(null,null,r+e),b.onpopstate()):b.location.href=r+e}var q="function"===typeof b.history.pushState,t="function"===typeof setImmediate?setImmediate:setTimeout,r="#!",f;return{setPrefix:function(b){r=b},getPath:k,setPath:h,defineRoutes:function(e,f,h){function t(){var b=k(),l={},r=g(b,l,l),q;for(q in e){var u=
|
||||
new RegExp("^"+q.replace(/:[^\/]+?\.{3}/g,"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+"/?$");if(u.test(r)){r.replace(u,function(){for(var g=q.match(/:[^\/]+/g)||[],h=[].slice.call(arguments,1,-2),k=0;k<g.length;k++)l[g[k].replace(/:|\./g,"")]=decodeURIComponent(h[k]);f(e[q],l,b,q)});return}}h(b,l)}q?b.onpopstate=l(t):"#"===r.charAt(0)&&(b.onhashchange=t);t();return t},link:function(b){b.dom.setAttribute("href",r+b.attrs.href);b.dom.onclick=function(e){e.preventDefault();e.redraw=!1;h(b.attrs.href,void 0,
|
||||
void 0)}}}};w.route=function(b,e){function l(b){return b}var g=U(b),k,h,q,t,r,f={view:function(){return q(u(h,null,t,void 0,void 0,void 0))}},p=function(b,m,p){h="div";q=l;t=null;e(b,f);g.defineRoutes(p,function(e,f,g){var m="function"!==typeof e.view,p=l,n=k=function(l){n===k&&(k=null,h=null!=l?l:m?"div":e,q=p,t=f,r=g,b.redraw(!0))},u=function(){n()};m&&("function"===typeof e.render&&(p=e.render.bind(e)),"function"===typeof e.onmatch&&(u=e.onmatch));u.call(e,n,f,g)},function(){g.setPath(m,null,{replace:!0})})};
|
||||
p.link=g.link;p.prefix=g.setPrefix;p.set=g.setPath;p.get=function(){return r};return p}(window,w.mount);w.withAttr=function(b,e,l){return function(g){return e.call(l||this,b in g.currentTarget?g.currentTarget[b]:g.currentTarget.getAttribute(b))}};w.prop=N;w.render=O.render;w.redraw=J.publish;w.request=I.request;w.jsonp=I.jsonp;w.parseQueryString=K;w.buildQueryString=F;w.version="1.0.0";"undefined"!==typeof module?module.exports=w:window.m=w};
|
||||
|
|
@ -65,7 +65,4 @@ function hyperscript(selector) {
|
|||
return Vnode(selector, attrs && attrs.key, attrs || {}, Vnode.normalizeChildren(children), undefined, undefined)
|
||||
}
|
||||
|
||||
hyperscript.trust = require("./trust")
|
||||
hyperscript.fragment = require("./fragment")
|
||||
|
||||
module.exports = hyperscript
|
||||
|
|
|
|||
|
|
@ -445,7 +445,7 @@ module.exports = function($window) {
|
|||
return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate"
|
||||
}
|
||||
function isAttribute(attr) {
|
||||
return attr === "href" || attr === "list" || attr === "form"// || attr === "type" || attr === "width" || attr === "height"
|
||||
return attr === "href" || attr === "list" || attr === "form" || attr === "width" || attr === "height"// || attr === "type"
|
||||
}
|
||||
function hasIntegrationMethods(source) {
|
||||
return source != null && (source.oncreate || source.onupdate || source.onbeforeremove || source.onremove)
|
||||
|
|
|
|||
|
|
@ -76,6 +76,16 @@ o.spec("attributes", function() {
|
|||
o(a.dom.attributes["href"]).equals(undefined)
|
||||
})
|
||||
})
|
||||
o.spec("canvas width and height", function() {
|
||||
o("uses attribute API", function() {
|
||||
var canvas = {tag: "canvas", attrs: {width: "100%"}}
|
||||
|
||||
render(root, canvas)
|
||||
|
||||
o(canvas.dom.attributes["width"].nodeValue).equals("100%")
|
||||
o(canvas.dom.width).equals(100)
|
||||
})
|
||||
})
|
||||
o.spec("svg class", function() {
|
||||
o("when className is specified then it should be added as a class", function() {
|
||||
var a = {tag: "svg", attrs: {className: "test"}}
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
var StreamFactory = require("./util/stream")
|
||||
module.exports = StreamFactory(console.log.bind(console))
|
||||
module.exports = require("./util/stream")(console.log.bind(console))
|
||||
|
|
@ -265,6 +265,17 @@ module.exports = function() {
|
|||
enumerable: true,
|
||||
})
|
||||
}
|
||||
|
||||
if (element.nodeName === "CANVAS") {
|
||||
Object.defineProperty(element, "width", {
|
||||
get: function() {return this.attributes["width"] ? Math.floor(parseInt(this.attributes["width"].nodeValue) || 0) : 300},
|
||||
set: function(value) {this.setAttribute("width", Math.floor(Number(value) || 0).toString())},
|
||||
})
|
||||
Object.defineProperty(element, "height", {
|
||||
get: function() {return this.attributes["height"] ? Math.floor(parseInt(this.attributes["height"].nodeValue) || 0) : 300},
|
||||
set: function(value) {this.setAttribute("height", Math.floor(Number(value) || 0).toString())},
|
||||
})
|
||||
}
|
||||
|
||||
function getOptions(element) {
|
||||
var options = []
|
||||
|
|
|
|||
|
|
@ -904,6 +904,63 @@ o.spec("domMock", function() {
|
|||
o(select.selectedIndex).equals(-1)
|
||||
})
|
||||
})
|
||||
o.spec("canvas width and height", function() {
|
||||
o("setting property works", function() {
|
||||
var canvas = $document.createElement("canvas")
|
||||
|
||||
canvas.width = 100
|
||||
o(canvas.attributes["width"].nodeValue).equals("100")
|
||||
o(canvas.width).equals(100)
|
||||
|
||||
canvas.height = 100
|
||||
o(canvas.attributes["height"].nodeValue).equals("100")
|
||||
o(canvas.height).equals(100)
|
||||
})
|
||||
o("setting string casts to number", function() {
|
||||
var canvas = $document.createElement("canvas")
|
||||
|
||||
canvas.width = "100"
|
||||
o(canvas.attributes["width"].nodeValue).equals("100")
|
||||
o(canvas.width).equals(100)
|
||||
|
||||
canvas.height = "100"
|
||||
o(canvas.attributes["height"].nodeValue).equals("100")
|
||||
o(canvas.height).equals(100)
|
||||
})
|
||||
o("setting float casts to int", function() {
|
||||
var canvas = $document.createElement("canvas")
|
||||
|
||||
canvas.width = 1.2
|
||||
o(canvas.attributes["width"].nodeValue).equals("1")
|
||||
o(canvas.width).equals(1)
|
||||
|
||||
canvas.height = 1.2
|
||||
o(canvas.attributes["height"].nodeValue).equals("1")
|
||||
o(canvas.height).equals(1)
|
||||
})
|
||||
o("setting percentage fails", function() {
|
||||
var canvas = $document.createElement("canvas")
|
||||
|
||||
canvas.width = "100%"
|
||||
o(canvas.attributes["width"].nodeValue).equals("0")
|
||||
o(canvas.width).equals(0)
|
||||
|
||||
canvas.height = "100%"
|
||||
o(canvas.attributes["height"].nodeValue).equals("0")
|
||||
o(canvas.height).equals(0)
|
||||
})
|
||||
o("setting attribute works", function() {
|
||||
var canvas = $document.createElement("canvas")
|
||||
|
||||
canvas.setAttribute("width", "100%")
|
||||
o(canvas.attributes["width"].nodeValue).equals("100%")
|
||||
o(canvas.width).equals(100)
|
||||
|
||||
canvas.setAttribute("height", "100%")
|
||||
o(canvas.attributes["height"].nodeValue).equals("100%")
|
||||
o(canvas.height).equals(100)
|
||||
})
|
||||
})
|
||||
})
|
||||
o.spec("className", function() {
|
||||
o("works", function() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue