Clean up tests, resolve style differences, reduce upstream diff

This is in preparation for a PR, to reduce potential for merge conflicts
with either my PR or others', since mine will modify a large amount of
the main file.
This commit is contained in:
impinball 2015-07-23 05:24:48 -04:00
parent 565f9cf334
commit 3de01a1554
14 changed files with 1987 additions and 3578 deletions

View file

@ -1,5 +0,0 @@
node_modules
**/*.min.js
docs/layout/lib/**/*.js
tests/e2e/libs/**
mithril.closure-compiler-externs.js

View file

@ -1,27 +0,0 @@
{
"env": {
"browser": true
},
"rules": {
"no-cond-assign": [2, "except-parens"],
"no-shadow": 0,
"semi-spacing": 0,
"quotes": [2, "double", "avoid-escape"],
"curly": [2, "multi-line"],
"semi": [2, "never"],
"eqeqeq": [2, "allow-null"],
"no-throw-literal": 2,
"wrap-iife": 2,
"strict": [2, "function"],
"brace-style": [2, "1tbs", { "allowSingleLine": true }],
"linebreak-style": [1, "windows"],
"one-var": [2, {
"initialized": "never"
}],
"new-cap": 0,
"no-use-before-define": [2, "nofunc"],
"max-len": [2, 80, 4],
"dot-notation": 2,
"indent": [2, "tab"]
}
}

View file

@ -1,14 +1,11 @@
/* eslint-env node */
module.exports = function(grunt) { module.exports = function(grunt) {
"use strict" var _ = require("lodash");
var version = "0.4.0";
var _ = require("lodash") var inputFolder = "./docs";
var version = "0.4.0" var tempFolder = "./temp";
var archiveFolder = "./archive";
var inputFolder = "./docs" var outputFolder = "../mithril";
var tempFolder = "./temp"
var archiveFolder = "./archive"
var outputFolder = "../mithril"
var guide = [ var guide = [
"auto-redrawing", "auto-redrawing",
@ -25,7 +22,7 @@ module.exports = function(grunt) {
"routing", "routing",
"tools", "tools",
"web-services" "web-services"
] ];
var api = [ var api = [
"change-log", "change-log",
"roadmap", "roadmap",
@ -45,68 +42,53 @@ module.exports = function(grunt) {
"mithril.trust", "mithril.trust",
"mithril.withAttr", "mithril.withAttr",
"mithril.xhr" "mithril.xhr"
] ];
var md2htmlTasks = {} var md2htmlTasks = {};
var makeTasks = function(layout, pages) { var makeTasks = function(layout, pages) {
pages.map(function(name) { pages.map(function(name) {
var src = inputFolder + "/" + name + ".md" var src = inputFolder + "/" + name + ".md";
var title var title = (grunt.file.exists(src)) ? grunt.file.read(src).split(/\n/)[0].substring(3) + ' - ' : '';
if (grunt.file.exist(src)) {
title = grunt.file.read(src)
.split(/\n/)[0]
.substring(3) + " - "
} else {
title = ""
}
md2htmlTasks[name] = { md2htmlTasks[name] = {
options: { options: {layout: inputFolder + "/layout/" + layout + ".html", templateData: { "topic": title }},
layout: inputFolder + "/layout/" + layout + ".html",
templateData: { "topic": title }
},
files: [{src: [src], dest: tempFolder + "/" + name + ".html"}] files: [{src: [src], dest: tempFolder + "/" + name + ".html"}]
} }
}) })
} };
makeTasks("guide", guide) makeTasks("guide", guide);
makeTasks("api", api) makeTasks("api", api);
var sauceBrowsers = [ var sauceBrowsers =[
{ browserName: "firefox", version: "19", platform: "XP" }, { browserName: 'firefox', version: '19', platform: 'XP' },
{ browserName: "internet explorer", platform: "XP", version: "6"}, { browserName: "internet explorer", platform: "XP", version: "6"},
{ browserName: "safari", platform: "OS X 10.9", version: "7"}, { browserName: "safari", platform: "OS X 10.9", version: "7"},
{ browserName: "iPad", platform: "OS X 10.9", version: "7.1"}, { browserName: "iPad", platform: "OS X 10.9", version: "7.1"},
{ browserName: "opera", platform: "Linux", version: "12"}, { browserName: "opera", platform: "Linux", version: "12"},
{ browserName: "chrome", platform: "XP", version: "26"}, { browserName: "chrome", platform: "XP", version: "26"},
{ browserName: "chrome", platform: "Windows 8", version: "26"} { browserName: "chrome", platform: "Windows 8", version: "26"}
] ];
var sauceOnTestComplete = function(result, callback) { var sauceOnTestComplete = function(result, callback) {
var request = require("request") var request = require('request');
var user = process.env.SAUCE_USERNAME var user = process.env.SAUCE_USERNAME;
var pass = process.env.SAUCE_ACCESS_KEY var pass = process.env.SAUCE_ACCESS_KEY;
request.put({ request.put({
url: [ url: ['https://saucelabs.com/rest/v1', user, 'jobs', result.job_id].join('/'),
"https://saucelabs.com/rest/v1",
user,
"jobs",
result.job_id
].join("/"),
auth: { user: user, pass: pass }, auth: { user: user, pass: pass },
json: { passed: result.passed } json: { passed: result.passed }
}, function (error, response) { }, function (error, response) {
if (error) { if (error) {
callback(error) callback(error);
} else if (response.statusCode !== 200) { } else if (response.statusCode !== 200) {
callback(new Error("Unexpected response status: " callback(new Error('Unexpected response status: '
+ response.statusCode + "\n ")) + response.statusCode + "\n "));
} else { } else {
callback(null, result.passed) callback(null, result.passed);
} }
}) });
} };
var sauceBaseOptions = { var sauceBaseOptions = {
username: process.env.SAUCE_USERNAME, username: process.env.SAUCE_USERNAME,
@ -115,164 +97,74 @@ module.exports = function(grunt) {
browsers: sauceBrowsers, browsers: sauceBrowsers,
sauceConfig: { sauceConfig: {
"record-video": false, "record-video": false,
"record-screenshots": false "record-screenshots": false,
}, },
build: process.env.TRAVIS_JOB_ID, build: process.env.TRAVIS_JOB_ID,
onTestComplete: sauceOnTestComplete, onTestComplete: sauceOnTestComplete,
tunnelTimeout: 5 tunnelTimeout: 5,
} };
var sauceCustomOptions = { var sauceCustomOptions = {
testname: "Mithril Custom Tests " + new Date().toJSON(), testname: "Mithril Custom Tests "+ new Date().toJSON(),
urls: ["http://127.0.0.1:8000/tests/index.html"] urls: ["http://127.0.0.1:8000/tests/index.html"],
} };
_.assign(sauceCustomOptions, sauceBaseOptions) _.assign(sauceCustomOptions, sauceBaseOptions);
var sauceQunitOptions = { var sauceQunitOptions = {
testname: "qUnit Tests " + new Date().toJSON(), testname: "qUnit Tests "+ new Date().toJSON(),
urls: ["http://127.0.0.1:8000/tests/e2e/test.html"] urls: ["http://127.0.0.1:8000/tests/e2e/test.html"],
} };
_.assign(sauceQunitOptions, sauceBaseOptions) _.assign(sauceQunitOptions, sauceBaseOptions);
var currentVersionArchiveFolder = archiveFolder + "/v" + version var currentVersionArchiveFolder = archiveFolder + "/v" + version;
grunt.initConfig({ grunt.initConfig({
md2html: md2htmlTasks, md2html: md2htmlTasks,
uglify: { uglify: {
options: { options: {banner: "/*\nMithril v" + version + "\nhttp://github.com/lhorie/mithril.js\n(c) Leo Horie\nLicense: MIT\n*/", sourceMap: true},
banner: [[
"/*",
"Mithril v" + version,
"http://github.com/lhorie/mithril.js",
"(c) Leo Horie",
"License: MIT",
"*/"
].join("\n")],
sourceMap: true
},
mithril: {src: "mithril.js", dest: "mithril.min.js"} mithril: {src: "mithril.js", dest: "mithril.min.js"}
}, },
concat: { concat: {
test: { test: {src: ["mithril.js", "./tests/test.js", "./tests/mock.js", "./tests/mithril-tests.js"], dest: currentVersionArchiveFolder + "/mithril-tests.js"}
src: [
"mithril.js",
"./tests/test.js",
"./tests/mock.js",
"./tests/mithril-tests.js"
],
dest: currentVersionArchiveFolder + "/mithril-tests.js"
}
}, },
zip: { zip: {
distribution: { distribution: {
cwd: currentVersionArchiveFolder + "/", cwd: currentVersionArchiveFolder + "/",
src: [ src: [currentVersionArchiveFolder + "/mithril.min.js", currentVersionArchiveFolder + "/mithril.min.js.map", currentVersionArchiveFolder + "/mithril.js"],
currentVersionArchiveFolder + "/mithril.min.js",
currentVersionArchiveFolder + "/mithril.min.js.map",
currentVersionArchiveFolder + "/mithril.js"
],
dest: currentVersionArchiveFolder + "/mithril.min.zip" dest: currentVersionArchiveFolder + "/mithril.min.zip"
} }
}, },
replace: { replace: {
options: { options: {force: true, patterns: [{match: /\.md/g, replacement: ".html"}, {match: /\$version/g, replacement: version}]},
force: true, links: {expand: true, flatten: true, src: [tempFolder + "/**/*.html"], dest: currentVersionArchiveFolder + "/"},
patterns: [ index: {src: inputFolder + "/layout/index.html", dest: currentVersionArchiveFolder + "/index.html"},
{match: /\.md/g, replacement: ".html"}, commonjs: {expand: true, flatten: true, src: [inputFolder + "/layout/*.json"], dest: currentVersionArchiveFolder},
{match: /\$version/g, replacement: version} cdnjs: {src: "deploy/cdnjs-package.json", dest: "../cdnjs/ajax/libs/mithril/package.json"}
]
},
links: {
expand: true,
flatten: true,
src: [tempFolder + "/**/*.html"],
dest: currentVersionArchiveFolder + "/"
},
index: {
src: inputFolder + "/layout/index.html",
dest: currentVersionArchiveFolder + "/index.html"
},
commonjs: {
expand: true,
flatten: true,
src: [inputFolder + "/layout/*.json"],
dest: currentVersionArchiveFolder
},
cdnjs: {
src: "deploy/cdnjs-package.json",
dest: "../cdnjs/ajax/libs/mithril/package.json"
}
}, },
copy: { copy: {
style: { style: {src: inputFolder + "/layout/style.css", dest: currentVersionArchiveFolder + "/style.css"},
src: inputFolder + "/layout/style.css", pages: {src: inputFolder + "/layout/pages.json", dest: currentVersionArchiveFolder + "/pages.json"},
dest: currentVersionArchiveFolder + "/style.css" lib: {expand: true, cwd: inputFolder + "/layout/lib/", src: "./**", dest: currentVersionArchiveFolder + "/lib/"},
}, tools: {expand: true, cwd: inputFolder + "/layout/tools/", src: "./**", dest: currentVersionArchiveFolder + "/tools/"},
pages: { comparisons: {expand: true, cwd: inputFolder + "/layout/comparisons/", src: "./**", dest: currentVersionArchiveFolder + "/comparisons/"},
src: inputFolder + "/layout/pages.json", unminified: {src: "mithril.js", dest: currentVersionArchiveFolder + "/mithril.js"},
dest: currentVersionArchiveFolder + "/pages.json" minified: {src: "mithril.min.js", dest: currentVersionArchiveFolder + "/mithril.min.js"},
}, readme: {src: "README.md", dest: currentVersionArchiveFolder + "/README.md"},
lib: { map: {src: "mithril.min.js.map", dest: currentVersionArchiveFolder + "/mithril.min.js.map"},
expand: true, typescript: {src: "mithril.d.ts", dest: currentVersionArchiveFolder + "/mithril.d.ts"},
cwd: inputFolder + "/layout/lib/", publish: {expand: true, cwd: currentVersionArchiveFolder, src: "./**", dest: outputFolder},
src: "./**", archive: {expand: true, cwd: currentVersionArchiveFolder, src: "./**", dest: outputFolder + "/archive/v" + version},
dest: currentVersionArchiveFolder + "/lib/"
},
tools: {
expand: true,
cwd: inputFolder + "/layout/tools/",
src: "./**",
dest: currentVersionArchiveFolder + "/tools/"
},
comparisons: {
expand: true,
cwd: inputFolder + "/layout/comparisons/",
src: "./**",
dest: currentVersionArchiveFolder + "/comparisons/"
},
unminified: {
src: "mithril.js",
dest: currentVersionArchiveFolder + "/mithril.js"
},
minified: {
src: "mithril.min.js",
dest: currentVersionArchiveFolder + "/mithril.min.js"
},
readme: {
src: "README.md",
dest: currentVersionArchiveFolder + "/README.md"
},
map: {
src: "mithril.min.js.map",
dest: currentVersionArchiveFolder + "/mithril.min.js.map"
},
typescript: {
src: "mithril.d.ts",
dest: currentVersionArchiveFolder + "/mithril.d.ts"
},
publish: {
expand: true,
cwd: currentVersionArchiveFolder,
src: "./**",
dest: outputFolder
},
archive: {
expand: true,
cwd: currentVersionArchiveFolder,
src: "./**",
dest: outputFolder + "/archive/v" + version
}
}, },
execute: { execute: {
tests: {src: [currentVersionArchiveFolder + "/mithril-tests.js"]} tests: {src: [currentVersionArchiveFolder + "/mithril-tests.js"]}
}, },
qunit: { qunit: {
all: ["tests/e2e/**/*.html"] all: ['tests/e2e/**/*.html']
}, },
"saucelabs-custom": { "saucelabs-custom": {
all: { all:{
options: sauceCustomOptions options: sauceCustomOptions
} }
}, },
"saucelabs-qunit": { "saucelabs-qunit": {
all: { all:{
options: sauceQunitOptions options: sauceQunitOptions
} }
}, },
@ -282,7 +174,7 @@ module.exports = function(grunt) {
server: { server: {
options: { options: {
port: 8888, port: 8888,
base: "." base: '.'
} }
} }
}, },
@ -294,45 +186,34 @@ module.exports = function(grunt) {
default: { default: {
files: [{ files: [{
expand: true, expand: true,
src: ["mithril.js"], src: ['mithril.js'],
cwd: ".", cwd: '.',
dest: "." dest: '.'
}] }]
} }
},
eslint: {
target: [
"**/*.js",
"!node_modules/**",
"!**/*.min.js",
"!docs/layout/lib/**/*.js"
]
} }
}) });
grunt.loadNpmTasks("grunt-contrib-clean") grunt.loadNpmTasks("grunt-contrib-clean");
grunt.loadNpmTasks("grunt-contrib-concat") grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks("grunt-contrib-copy") grunt.loadNpmTasks("grunt-contrib-copy");
grunt.loadNpmTasks("grunt-contrib-uglify") grunt.loadNpmTasks("grunt-contrib-uglify");
grunt.loadNpmTasks("grunt-execute") grunt.loadNpmTasks('grunt-execute');
grunt.loadNpmTasks("grunt-md2html") grunt.loadNpmTasks("grunt-md2html");
grunt.loadNpmTasks("grunt-replace") grunt.loadNpmTasks("grunt-replace");
grunt.loadNpmTasks("grunt-zip") grunt.loadNpmTasks('grunt-zip');
grunt.loadNpmTasks("grunt-contrib-qunit") grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks("grunt-contrib-connect") grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks("grunt-saucelabs") grunt.loadNpmTasks('grunt-saucelabs');
grunt.loadNpmTasks("grunt-jsfmt") grunt.loadNpmTasks('grunt-jsfmt');
grunt.loadNpmTasks("grunt-eslint")
grunt.registerTask("build", [ grunt.registerTask("build", ["test", "uglify", "zip", "md2html", "replace", "copy", "clean"]);
"test", "uglify", "zip", "md2html", "replace", "copy", "clean"]) grunt.registerTask("testall", ["test", "teste2e"]);
grunt.registerTask("testall", ["test", "teste2e"]) grunt.registerTask("test", ["concat", "execute"]);
grunt.registerTask("test", ["eslint", "concat", "execute"]) grunt.registerTask('teste2e', ['connect', 'qunit']);
grunt.registerTask("teste2e", ["connect", "qunit"]) grunt.registerTask("default", ["build"]);
grunt.registerTask("default", ["build"])
grunt.registerTask("sauce-qunit", ["connect", "saucelabs-qunit"]) grunt.registerTask("sauce-qunit", ["connect", "saucelabs-qunit"]);
grunt.registerTask("sauce-custom", ["connect", "saucelabs-custom"]) grunt.registerTask("sauce-custom", ["connect", "saucelabs-custom"]);
grunt.registerTask("sauce-all", [ grunt.registerTask("sauce-all", ["connect", "saucelabs-qunit", "saucelabs-custom"]);
"connect", "saucelabs-qunit", "saucelabs-custom"]) };
}

View file

@ -1,5 +1,3 @@
**Note: This is a WIP partial rewrite of Mithril.**
[![JS.ORG](https://img.shields.io/badge/js.org-mithril-ffb400.svg?style=flat-square)](http://js.org) [![JS.ORG](https://img.shields.io/badge/js.org-mithril-ffb400.svg?style=flat-square)](http://js.org)
[![Join the chat at https://gitter.im/lhorie/mithril.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/lhorie/mithril.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/lhorie/mithril.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/lhorie/mithril.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Build Status](https://travis-ci.org/lhorie/mithril.js.svg?branch=master)](https://travis-ci.org/lhorie/mithril.js) [![Build Status](https://travis-ci.org/lhorie/mithril.js.svg?branch=master)](https://travis-ci.org/lhorie/mithril.js)

View file

@ -1,128 +1,90 @@
/* globals m */ var templateConverter = {};
var templateConverter = {}
templateConverter.DOMFragment = function(markup) { templateConverter.DOMFragment = function(markup) {
"use strict" if (markup.indexOf("<!doctype") > -1) return [new DOMParser().parseFromString(markup, "text/html").childNodes[1]]
if (markup.indexOf("<!doctype") > -1) { var container = document.createElement("div");
return [ container.insertAdjacentHTML("beforeend", markup);
new DOMParser().parseFromString(markup, "text/html").childNodes[1] return container.childNodes;
]
}
var container = document.createElement("div")
container.insertAdjacentHTML("beforeend", markup)
return container.childNodes
} }
templateConverter.VirtualFragment = function recurse(domFragment) { templateConverter.VirtualFragment = function recurse(domFragment) {
"use strict" var virtualFragment = [];
var virtualFragment = [] for (var i = 0, el; el = domFragment[i]; i++) {
for (var i = 0; i < domFragment.length; i++) { if (el.nodeType == 3) {
var el = domFragment[i] virtualFragment.push(el.nodeValue);
if (el.nodeType === 3) { }
virtualFragment.push(el.nodeValue) else if (el.nodeType == 1) {
} else if (el.nodeType === 1) { var attrs = {};
var attrs = {} for (var j = 0, attr; attr = el.attributes[j]; j++) {
for (var j = 0; el.attributes.length; j++) { attrs[attr.name] = attr.value;
var attr = el.attributes[j]
attrs[attr.name] = attr.value
} }
virtualFragment.push({ virtualFragment.push({tag: el.nodeName.toLowerCase(), attrs: attrs, children: recurse(el.childNodes)});
tag: el.nodeName.toLowerCase(),
attrs: attrs,
children: recurse(el.childNodes)
})
} }
} }
return virtualFragment return virtualFragment;
} }
templateConverter.Template = function recurse() { templateConverter.Template = function recurse() {
"use strict" if (Object.prototype.toString.call(arguments[0]) == "[object String]") {
if (Object.prototype.toString.call(arguments[0]) === "[object String]") { return new recurse(new templateConverter.VirtualFragment(new templateConverter.DOMFragment(arguments[0])));
return new recurse(new templateConverter.VirtualFragment(
new templateConverter.DOMFragment(arguments[0])))
} }
var virtualFragment = arguments[0] var virtualFragment = arguments[0], level = arguments[1]
var level = arguments[1] if (!level) level = 1;
if (!level) level = 1
var tab = "\n" + new Array(level + 1).join("\t");
var tab = "\n" + new Array(level + 1).join("\t") var virtuals = [];
var virtuals = [] for (var i = 0, el; el = virtualFragment[i]; i++) {
for (var i = 0; i < virtualFragment.length; i++) { if (typeof el == "string") {
var el = virtualFragment[i] if (el.match(/\t| {2,}/g) && el.trim().length == 0) virtuals.indented = true;
if (typeof el === "string") { else virtuals.push('"' + el.replace(/"/g, '\\"').replace(/\r/g, "\\r").replace(/\n/g, "\\n") + '"');
if (el.match(/\t| {2,}/g) && el.trim().length === 0) { }
virtuals.indented = true else {
} else { var virtual = "";
virtuals.push('"' + el if (el.tag != "div") virtual += el.tag;
.replace(/"/g, '\\"') if (el.attrs["class"]) {
.replace(/\r/g, "\\r") virtual += "." + el.attrs["class"].replace(/\t+/g, " ").split(" ").join(".");
.replace(/\n/g, "\\n") + '"') delete el.attrs["class"];
}
} else {
var virtual = ""
if (el.tag !== "div") virtual += el.tag
if (el.attrs.class) {
virtual += "." + el.attrs.class
.replace(/\t+/g, " ")
.split(" ")
.join(".")
delete el.attrs.class
} }
var attrNames = Object.keys(el.attrs).sort() var attrNames = Object.keys(el.attrs).sort()
for (var j = 0; j < attrNames.length; j++) { for (var j = 0, attrName; attrName = attrNames[j]; j++) {
var attrName = attrNames[j] if (attrName != "style") virtual += "[" + attrName + "='" + el.attrs[attrName].replace(/'/g, "\\'") + "']";
if (attrName !== "style") {
virtual += "[" + attrName + "='" +
el.attrs[attrName].replace(/'/g, "\\'") + "']"
}
} }
if (virtual === "") virtual = "div" if (virtual == "") virtual = "div"
virtual = '"' + virtual + '"' virtual = '"' + virtual + '"';
var style = ""
if (el.attrs.style) { if (el.attrs.style) {
virtual += ", {style: " + ("{\"" + el.attrs.style virtual += ", {style: " + ("{\"" + el.attrs.style.replace(/:/g, "\": \"").replace(/;/g, "\", \"") + "}").replace(/, "}|"}/, "}") + "}"
.replace(/:/g, "\": \"")
.replace(/;/g, "\", \"") + "}")
.replace(/, "}|"}/, "}") + "}"
} }
if (el.children.length > 0) { if (el.children.length > 0) {
virtual += ", " + recurse(el.children, level + 1) virtual += ", " + recurse(el.children, level + 1);
} }
virtual = "m(" + virtual + ")" virtual = "m(" + virtual + ")";
virtuals.push(virtual) virtuals.push(virtual);
} }
} }
if (!virtuals.indented) tab = "" if (!virtuals.indented) tab = "";
var isInline = virtuals.length === 1 && virtuals[0].charAt(0) === '"' var isInline = virtuals.length == 1 && virtuals[0].charAt(0) == '"';
var template = isInline ? var template = isInline ? virtuals.join(", ") : "[" + tab + virtuals.join("," + tab) + tab.slice(0, -1) + "]";
virtuals.join(", ") : return new String(template);
"[" + tab + virtuals.join("," + tab) + tab.slice(0, -1) + "]"
return new String(template) // eslint-disable-line no-new-wrappers
} }
templateConverter.controller = function() { templateConverter.controller = function() {
"use strict" this.source = m.prop("");
this.source = m.prop("") this.output = m.prop("");
this.output = m.prop("")
this.convert = function() { this.convert = function() {
return this.output(new templateConverter.Template(this.source())) return this.output(new templateConverter.Template(this.source()));
} };
}
};
templateConverter.view = function(ctrl) { templateConverter.view = function(ctrl) {
"use strict"
return m("div", [ return m("div", [
m("textarea", { m("textarea", {autofocus: true, style: {width:"100%", height: "40%"}, onchange: m.withAttr("value", ctrl.source)}, ctrl.source()),
autofocus: true,
style: {width: "100%", height: "40%"},
onchange: m.withAttr("value", ctrl.source)
}, ctrl.source()),
m("button", {onclick: ctrl.convert.bind(ctrl)}, "Convert"), m("button", {onclick: ctrl.convert.bind(ctrl)}, "Convert"),
m("textarea", {style: {width: "100%", height: "40%"}}, ctrl.output()) m("textarea", {style: {width:"100%", height: "40%"}}, ctrl.output())
]) ]);
} };

2319
mithril.js

File diff suppressed because it is too large Load diff

4
mithril.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,55 +1,46 @@
{ {
"name": "mithril", "name": "mithril",
"description": "Mithril.js beta build - use this to help us test the releases before they are released", "description": "Mithril.js beta build - use this to help us test the releases before they are released",
"version": "0.1.34-beta.0", "version": "0.1.34-beta.0",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git@github.com:lhorie/mithril.js.git" "url": "git@github.com:lhorie/mithril.js.git"
}, },
"scripts": { "scripts": {
"test": "grunt test" "test": "grunt test"
}, },
"main": "mithril.js", "main": "mithril.js",
"devDependencies": { "devDependencies": {
"colors": "~0.6.2", "grunt": "*",
"grunt": "*", "grunt-cli": "*",
"grunt-cli": "*", "grunt-contrib-copy": "*",
"grunt-contrib-clean": "*", "grunt-contrib-uglify": "*",
"grunt-contrib-concat": "*", "grunt-contrib-clean": "*",
"grunt-contrib-connect": "~0.7.1", "grunt-contrib-concat": "*",
"grunt-contrib-copy": "*", "grunt-execute": "*",
"grunt-contrib-jshint": "~0.10.0", "grunt-md2html": "*",
"grunt-contrib-qunit": "*", "grunt-replace": "*",
"grunt-contrib-uglify": "*", "grunt-contrib-qunit": "*",
"grunt-contrib-watch": "~0.6.1", "grunt-zip": "*",
"grunt-eslint": "^16.0.0", "grunt-jsfmt": "git://github.com/ysimonson/grunt-jsfmt",
"grunt-execute": "*",
"grunt-jscs": "^1.1.0", "grunt-contrib-connect": "~0.7.1",
"grunt-jsfmt": "git://github.com/ysimonson/grunt-jsfmt", "grunt-contrib-jshint": "~0.10.0",
"grunt-md2html": "*", "grunt-contrib-watch": "~0.6.1",
"grunt-replace": "*", "grunt-jscs": "^1.1.0",
"grunt-sauce-tunnel": "^0.2.1", "grunt-sauce-tunnel": "^0.2.1",
"grunt-saucelabs": "*", "load-grunt-config": "^0.9.2",
"grunt-zip": "*", "merge": "^1.1.3",
"load-grunt-config": "^0.9.2", "publish": "~0.3.2",
"lodash": "~2.4.1", "grunt-saucelabs": "*",
"merge": "^1.1.3", "request": "~2.35.0",
"publish": "~0.3.2", "q": "~1.0.0",
"q": "~1.0.0", "saucelabs": "~0.1.1",
"request": "~2.35.0", "sauce-tunnel": "~2.0.6",
"sauce-tunnel": "~2.0.6", "colors": "~0.6.2",
"saucelabs": "~0.1.1" "lodash": "~2.4.1"
}, },
"licenses": [ "main": "mithril.js",
{ "licenses": [{"type": "MIT", "url": "http://opensource.org/licenses/MIT"}],
"type": "MIT", "files": ["mithril.min.js", "mithril.min.js.map", "mithril.js", "README.*"]
"url": "http://opensource.org/licenses/MIT"
}
],
"files": [
"mithril.min.js",
"mithril.min.js.map",
"mithril.js",
"README.*"
]
} }

View file

@ -1,23 +0,0 @@
{
"extend": "../../.eslintrc",
"globals": {
"asyncTest": false,
"deepEqual": false,
"equal": false,
"expect": false,
"module": false,
"notDeepEqual": false,
"notEqual": false,
"notPropEqual": false,
"notStrictEqual": false,
"ok": false,
"propEqual": false,
"QUnit": false,
"raises": false,
"start": false,
"stop": false,
"strictEqual": false,
"test": false,
"throws": false
}
}

View file

@ -1,13 +1,8 @@
/* eslint-disable camelcase */ //saucelabs reporting; see https://github.com/axemclion/grunt-saucelabs#test-result-details-with-qunit
/* global m, Syn */
// saucelabs reporting; see
// https://github.com/axemclion/grunt-saucelabs#test-result-details-with-qunit
var log = [] var log = []
QUnit.done(function (test_results) { QUnit.done(function (test_results) {
"use strict"
var tests = [] var tests = []
for (var i = 0, len = log.length; i < len; i++) { for (var i = 0, len = log.length; i < len; i++) {
var details = log[i] var details = log[i]
@ -24,7 +19,6 @@ QUnit.done(function (test_results) {
window.global_test_results = test_results window.global_test_results = test_results
}) })
QUnit.testStart(function (testDetails) { QUnit.testStart(function (testDetails) {
"use strict"
QUnit.log(function (details) { QUnit.log(function (details) {
if (!details.result) { if (!details.result) {
details.name = testDetails.name details.name = testDetails.name
@ -33,11 +27,9 @@ QUnit.testStart(function (testDetails) {
}) })
}) })
// qunit doesn't support Function.prototype.bind... //qunit doesn't support Function.prototype.bind...
if (!Function.prototype.bind) { if (!Function.prototype.bind) {
/* eslint-disable */
Function.prototype.bind = function (oThis) { Function.prototype.bind = function (oThis) {
"use strict"
if (typeof this !== "function") { if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 // closest thing possible to the ECMAScript 5
// internal IsCallable function // internal IsCallable function
@ -59,181 +51,165 @@ if (!Function.prototype.bind) {
return fBound return fBound
} }
/* eslint-enable */
} }
//tests //tests
var dummyEl = document.getElementById("dummy") var dummyEl = document.getElementById('dummy')
test("Mithril accessible as window.m", function() { test('Mithril accessible as window.m', function() {
"use strict"
expect(1) expect(1)
ok(window.m) ok(window.m)
}) })
test("m.trust w/ html entities", function() { test('m.trust w/ html entities', function() {
"use strict"
expect(1) expect(1)
var view1 = m("div", "a", m.trust("&amp;"), "b") var view1 = m('div', "a", m.trust("&amp;"), "b")
m.render(dummyEl, view1) m.render(dummyEl, view1)
equal(dummyEl.innerHTML, "<div>a&amp;b</div>", "view1 rendered correctly") equal(dummyEl.innerHTML, '<div>a&amp;b</div>', 'view1 rendered correctly')
}) })
test("m.trust w/ html entities 2", function() { test('m.trust w/ html entities 2', function() {
"use strict"
expect(1) expect(1)
var view1 = m("div", "a", m.trust("&amp;"), "b", m.trust("&amp;"), "c") var view1 = m('div', "a", m.trust("&amp;"), "b", m.trust("&amp;"), "c")
m.render(dummyEl, view1) m.render(dummyEl, view1)
equal(dummyEl.innerHTML, "<div>a&amp;b&amp;c</div>", equal(dummyEl.innerHTML, '<div>a&amp;b&amp;c</div>', 'view1 rendered correctly')
"view1 rendered correctly")
}) })
test("array item removal", function() { test('array item removal', function() {
"use strict"
expect(2) expect(2)
var view1 = m("div", {}, [ var view1 = m('div', {}, [
m("div", {}, "0"), m('div', {}, '0'),
m("div", {}, "1"), m('div', {}, '1'),
m("div", {}, "2") m('div', {}, '2')
]) ])
var view2 = m("div", {}, [ var view2 = m('div', {}, [
m("div", {}, "0") m('div', {}, '0')
]) ])
m.render(dummyEl, view1) m.render(dummyEl, view1)
equal(dummyEl.innerHTML, "<div><div>0</div><div>1</div><div>2</div></div>", equal(dummyEl.innerHTML, '<div><div>0</div><div>1</div><div>2</div></div>', 'view1 rendered correctly')
"view1 rendered correctly")
m.render(dummyEl, view2) m.render(dummyEl, view2)
equal(dummyEl.innerHTML, "<div><div>0</div></div>", equal(dummyEl.innerHTML, '<div><div>0</div></div>', 'view2 should be rendered correctly')
"view2 should be rendered correctly")
}) })
test("issue99 regression", function() { test('issue99 regression', function() {
"use strict"
// see https://github.com/lhorie/mithril.js/issues/99 // see https://github.com/lhorie/mithril.js/issues/99
expect(2) expect(2)
var view1 = m("div", {}, [ var view1 = m('div', {}, [
m("div", {}, "0"), m('div', {}, '0'),
m("div", {}, "1"), m('div', {}, '1'),
m("div", {}, "2") m('div', {}, '2')
]) ])
var view2 = m("div", {}, [ var view2 = m('div', {}, [
m("span", {}, "0") m('span', {}, '0')
]) ])
m.render(dummyEl, view1) m.render(dummyEl, view1)
equal(dummyEl.innerHTML, "<div><div>0</div><div>1</div><div>2</div></div>", equal(dummyEl.innerHTML, '<div><div>0</div><div>1</div><div>2</div></div>', 'view1 rendered correctly')
"view1 rendered correctly")
m.render(dummyEl, view2) m.render(dummyEl, view2)
equal(dummyEl.innerHTML, "<div><span>0</span></div>", equal(dummyEl.innerHTML, '<div><span>0</span></div>', 'view2 should be rendered correctly')
"view2 should be rendered correctly")
}) })
test("config handler context", function() { test('config handler context', function() {
"use strict"
expect(3) expect(3)
var view = m("div", {config: function(evt, isInitialized, context) { var view = m('div', {config: function(evt, isInitialized, context) {
equal(context instanceof Object, true) equal(context instanceof Object, true)
context.data = 1 context.data = 1
}}) }})
m.render(dummyEl, view) m.render(dummyEl, view)
view = m("div", {config: function(evt, isInitialized, context) { view = m('div', {config: function(evt, isInitialized, context) {
equal(context instanceof Object, true) equal(context instanceof Object, true)
equal(context.data, 1) equal(context.data, 1)
}}) }})
m.render(dummyEl, view) m.render(dummyEl, view)
}) })
test("node identity remove firstChild", function() { test('node identity remove firstChild', function() {
"use strict"
expect(2) expect(2)
var view1 = m("div", {}, [ var view1 = m('div', {}, [
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 2}, "E2") m('div', {key:2}, 'E2')
]) ])
m.render(dummyEl, view1) m.render(dummyEl, view1)
var node2 = dummyEl.firstChild.lastChild var node2 = dummyEl.firstChild.lastChild
equal(node2.innerHTML, "E2") equal(node2.innerHTML, 'E2')
var view2 = m("div", {}, [ var view2 = m('div', {}, [
m("div", {key: 2}, "E2") m('div', {key:2}, 'E2')
]) ])
m.render(dummyEl, view2) m.render(dummyEl, view2)
equal(dummyEl.firstChild.firstChild, node2) equal(dummyEl.firstChild.firstChild, node2)
}) })
test("node identity change order", function() { test('node identity change order', function() {
"use strict"
expect(2) expect(2)
var view1 = m("div", {}, [ var view1 = m('div', {}, [
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 2}, "E2"), m('div', {key:2}, 'E2'),
m("div", {key: 3}, "E3") m('div', {key:3}, 'E3')
]) ])
m.render(dummyEl, view1) m.render(dummyEl, view1)
var e2 = dummyEl.firstChild.firstChild.nextSibling var e2 = dummyEl.firstChild.firstChild.nextSibling
equal(e2.innerHTML, "E2") equal(e2.innerHTML, 'E2')
var view2 = m("div", {}, [ var view2 = m('div', {}, [
m("div", {key: 2}, "E2"), m('div', {key:2}, 'E2'),
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 3}, "E3") m('div', {key:3}, 'E3')
]) ])
m.render(dummyEl, view2) m.render(dummyEl, view2)
equal(dummyEl.firstChild.firstChild, e2) equal(dummyEl.firstChild.firstChild, e2)
}) })
test("node identity remove in the middle", function() { test('node identity remove in the middle', function() {
"use strict"
expect(2) expect(2)
var view1 = m("div", {}, [ var view1 = m('div', {}, [
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 2}, "E2"), m('div', {key:2}, 'E2'),
m("div", {key: 3}, "E3") m('div', {key:3}, 'E3')
]) ])
m.render(dummyEl, view1) m.render(dummyEl, view1)
var e3 = dummyEl.firstChild.lastChild var e3 = dummyEl.firstChild.lastChild
equal(e3.innerHTML, "E3") equal(e3.innerHTML, 'E3')
var view2 = m("div", {}, [ var view2 = m('div', {}, [
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 3}, "E3") m('div', {key:3}, 'E3')
]) ])
m.render(dummyEl, view2) m.render(dummyEl, view2)
equal(dummyEl.firstChild.firstChild.nextSibling, e3) equal(dummyEl.firstChild.firstChild.nextSibling, e3)
}) })
test("node identity remove last", function() { test('node identity remove last', function() {
"use strict"
expect(4) expect(4)
var view1 = m("div", {}, [ var view1 = m('div', {}, [
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 2}, "E2"), m('div', {key:2}, 'E2'),
m("div", {key: 3}, "E3") m('div', {key:3}, 'E3')
]) ])
m.render(dummyEl, view1) m.render(dummyEl, view1)
var e1 = dummyEl.firstChild.firstChild var e1 = dummyEl.firstChild.firstChild
equal(e1.innerHTML, "E1") equal(e1.innerHTML, 'E1')
var e2 = dummyEl.firstChild.firstChild.nextSibling var e2 = dummyEl.firstChild.firstChild.nextSibling
equal(e2.innerHTML, "E2") equal(e2.innerHTML, 'E2')
var view2 = m("div", {}, [ var view2 = m('div', {}, [
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 2}, "E2") m('div', {key:2}, 'E2')
]) ])
m.render(dummyEl, view2) m.render(dummyEl, view2)
@ -241,176 +217,168 @@ test("node identity remove last", function() {
equal(dummyEl.firstChild.firstChild.nextSibling, e2) equal(dummyEl.firstChild.firstChild.nextSibling, e2)
}) })
test("node identity shuffle and remove", function() { test('node identity shuffle and remove', function() {
"use strict"
expect(8) expect(8)
var view1 = m("div", {}, [ var view1 = m('div', {}, [
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 2}, "E2"), m('div', {key:2}, 'E2'),
m("div", {key: 3}, "E3"), m('div', {key:3}, 'E3'),
m("div", {key: 4}, "E4"), m('div', {key:4}, 'E4'),
m("div", {key: 5}, "E5") m('div', {key:5}, 'E5')
]) ])
m.render(dummyEl, view1) m.render(dummyEl, view1)
var e1 = dummyEl.firstChild.firstChild var e1 = dummyEl.firstChild.firstChild
equal(e1.innerHTML, "E1") equal(e1.innerHTML, 'E1')
var e2 = e1.nextSibling var e2 = e1.nextSibling
equal(e2.innerHTML, "E2") equal(e2.innerHTML, 'E2')
var e3 = e2.nextSibling var e3 = e2.nextSibling
equal(e3.innerHTML, "E3") equal(e3.innerHTML, 'E3')
var e4 = e3.nextSibling var e4 = e3.nextSibling
equal(e4.innerHTML, "E4") equal(e4.innerHTML, 'E4')
var e5 = e4.nextSibling var e5 = e4.nextSibling
equal(e5.innerHTML, "E5") equal(e5.innerHTML, 'E5')
var view2 = m("div", {}, [ var view2 = m('div', {}, [
m("div", {key: 4}, "E4"), m('div', {key:4}, 'E4'),
m("div", {key: 10}, "E10"), m('div', {key:10}, 'E10'),
m("div", {key: 1}, "E1"), m('div', {key:1}, 'E1'),
m("div", {key: 2}, "E2") m('div', {key:2}, 'E2')
]) ])
m.render(dummyEl, view2) m.render(dummyEl, view2)
equal(dummyEl.firstChild.firstChild, e4, "e4 is first element") equal(dummyEl.firstChild.firstChild, e4, 'e4 is first element')
equal(dummyEl.firstChild.firstChild.nextSibling.nextSibling, e1, equal(dummyEl.firstChild.firstChild.nextSibling.nextSibling, e1, 'e1 is third element')
"e1 is third element") equal(dummyEl.firstChild.firstChild.nextSibling.nextSibling.nextSibling, e2, 'e2 is fourth element')
equal(dummyEl.firstChild.firstChild.nextSibling.nextSibling.nextSibling, e2,
"e2 is fourth element")
}) })
asyncTest("issue214 regression", function() { asyncTest('issue214 regression', function() {
"use strict"
// see https://github.com/lhorie/mithril.js/issues/214 // see https://github.com/lhorie/mithril.js/issues/214
expect(2) expect(2)
function controller() { function controller() {
this.inputValue = m.prop("") this.inputValue = m.prop('')
} }
function view(ctrl) { function view(ctrl) {
return m("input#testinput", { return m('input#testinput', {
value: ctrl.inputValue(), value: ctrl.inputValue(),
onkeyup: m.withAttr("value", ctrl.inputValue) onkeyup: m.withAttr('value', ctrl.inputValue)
}) })
} }
var ctrl = m.module(dummyEl, { controller: controller, view: view }) var ctrl = m.module(dummyEl, { controller: controller, view: view })
Syn.click({}, "testinput") Syn.click({}, 'testinput')
.type("0").delay(10) .type('0').delay(10)
.type("1").delay(10) .type('1').delay(10)
.type("2").delay(10) .type('2').delay(10)
.type("3").delay(10) .type('3').delay(10)
.type("4").delay(10) .type('4').delay(10)
.type("5").delay(10) .type('5').delay(10)
.type("6").delay(10) .type('6').delay(10)
.type("7").delay(10) .type('7').delay(10)
.type("8").delay(10) .type('8').delay(10)
.type("9").delay(10) .type('9').delay(10)
.type("a").delay(10) .type('a').delay(10)
.type("b").delay(10) .type('b').delay(10)
.type("c").delay(10) .type('c').delay(10)
.type("d").delay(10) .type('d').delay(10)
.type("e").delay(10) .type('e').delay(10)
.type("f").delay(10) .type('f').delay(10)
.type("0").delay(10) .type('0').delay(10)
.type("1").delay(10) .type('1').delay(10)
.type("2").delay(10) .type('2').delay(10)
.type("3").delay(10) .type('3').delay(10)
.type("4").delay(10) .type('4').delay(10)
.type("5").delay(10) .type('5').delay(10)
.type("6").delay(10) .type('6').delay(10)
.type("7").delay(10) .type('7').delay(10)
.type("8").delay(10) .type('8').delay(10)
.type("9").delay(10) .type('9').delay(10)
.type("a").delay(10) .type('a').delay(10)
.type("b").delay(10) .type('b').delay(10)
.type("c").delay(10) .type('c').delay(10)
.type("d").delay(10) .type('d').delay(10)
.type("e").delay(10) .type('e').delay(10)
.type("f").delay(10) .type('f').delay(10)
.type("0").delay(10) .type('0').delay(10)
.type("1").delay(10) .type('1').delay(10)
.type("2").delay(10) .type('2').delay(10)
.type("3").delay(10) .type('3').delay(10)
.type("4").delay(10) .type('4').delay(10)
.type("5").delay(10) .type('5').delay(10)
.type("6").delay(10) .type('6').delay(10)
.type("7").delay(10) .type('7').delay(10)
.type("8").delay(10) .type('8').delay(10)
.type("9").delay(10) .type('9').delay(10)
.type("a").delay(10) .type('a').delay(10)
.type("b").delay(10) .type('b').delay(10)
.type("c").delay(10) .type('c').delay(10)
.type("d").delay(10) .type('d').delay(10)
.type("e").delay(10) .type('e').delay(10)
.type("f").delay(10) .type('f').delay(10)
.type("0").delay(10) .type('0').delay(10)
.type("1").delay(10) .type('1').delay(10)
.type("2").delay(10) .type('2').delay(10)
.type("3").delay(10) .type('3').delay(10)
.type("4").delay(10) .type('4').delay(10)
.type("5").delay(10) .type('5').delay(10)
.type("6").delay(10) .type('6').delay(10)
.type("7").delay(10) .type('7').delay(10)
.type("8").delay(10) .type('8').delay(10)
.type("9").delay(10) .type('9').delay(10)
.type("a").delay(10) .type('a').delay(10)
.type("b").delay(10) .type('b').delay(10)
.type("c").delay(10) .type('c').delay(10)
.type("d").delay(10) .type('d').delay(10)
.type("e").delay(10) .type('e').delay(10)
.type("f", function() { .type('f', function() {
equal(ctrl.inputValue(), equal(ctrl.inputValue(), '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef')
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") equal(document.getElementById('testinput').value, '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef')
equal(document.getElementById("testinput").value,
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
start() start()
}) })
}) })
asyncTest("issue288 regression", function() { asyncTest('issue288 regression', function() {
"use strict"
// see https://github.com/lhorie/mithril.js/issues/288 // see https://github.com/lhorie/mithril.js/issues/288
expect(2) expect(2)
function controller() { function controller() {
this.inputValue = m.prop("") this.inputValue = m.prop('')
this.submit = function() { this.submit = function() {
if (this.inputValue()) { if (this.inputValue()) {
this.inputValue("") this.inputValue('')
} }
}.bind(this) }.bind(this);
} }
function view(ctrl) { function view(ctrl) {
return m("form", { onsubmit: ctrl.submit }, [ return m('form', { onsubmit: ctrl.submit }, [
m("input#testinput", { m('input#testinput', {
onkeyup: m.withAttr("value", ctrl.inputValue), onkeyup: m.withAttr('value', ctrl.inputValue),
value: ctrl.inputValue() value: ctrl.inputValue()
}), }),
m("button[type=submit]") m('button[type=submit]')
]) ])
} }
var ctrl = m.module(dummyEl, { controller: controller, view: view }) var ctrl = m.module(dummyEl, { controller: controller, view: view })
Syn.click({}, "testinput") Syn.click({}, 'testinput')
.type("a").delay(10) .type('a').delay(10)
.type("b").delay(10) .type('b').delay(10)
.type("c").delay(10) .type('c').delay(10)
.type("d").delay(10) .type('d').delay(10)
.type("[enter]", function() { .type('[enter]', function() {
equal(ctrl.inputValue(), "") equal(ctrl.inputValue(), '')
equal(document.getElementById("testinput").value, "") equal(document.getElementById('testinput').value, '')
start() start()
}) })
}) })
test("issue278 regression", function() { test('issue278 regression', function() {
"use strict"
// see https://github.com/lhorie/mithril.js/issues/278 // see https://github.com/lhorie/mithril.js/issues/278
expect(1) expect(1)
@ -421,24 +389,22 @@ test("issue278 regression", function() {
}, },
view: function(ctrl) { view: function(ctrl) {
return m("select#testselect", { return m('select#testselect', {
size: ctrl.values.length, size: ctrl.values.length,
multiple: "multiple" multiple: 'multiple'
}, [ }, [
ctrl.values.map(function(v){ ctrl.values.map(function(v){
var opts = {value: v} var opts = {value: v}
if (ctrl.value().indexOf(v) !== -1) { if (ctrl.value().indexOf(v) !== -1) opts.selected = 'selected'
opts.selected = "selected" return m('option', opts, v)
}
return m("option", opts, v)
}) })
]) ])
} }
} }
m.render(dummyEl, test.view(new test.controller())) m.render(dummyEl, test.view(new test.controller))
var select = document.getElementById("testselect") var select = document.getElementById('testselect')
for (var i = 0, selected = 0; i < select.options.length; i++) { for (var i = 0, selected = 0; i < select.options.length; i++) {
if (select.options[i].selected) selected++ if (select.options[i].selected) selected++
@ -447,30 +413,25 @@ test("issue278 regression", function() {
equal(selected, 2) equal(selected, 2)
}) })
test("mixing trusted content", function() { test("mixing trusted content", function() {
"use strict"
m.render(dummyEl, [m.trust("<p>1</p><p>2</p>"), m("i", "foo")]) m.render(dummyEl, [m.trust("<p>1</p><p>2</p>"), m("i", "foo")])
equal(dummyEl.childNodes[2].nodeName, "I") equal(dummyEl.childNodes[2].nodeName, "I")
}) })
test("mixing trusted content w/ text nodes", function() { test("mixing trusted content w/ text nodes", function() {
"use strict"
m.render(dummyEl, [m.trust("<p>1</p>123<p>2</p>"), m("i", "foo")]) m.render(dummyEl, [m.trust("<p>1</p>123<p>2</p>"), m("i", "foo")])
equal(dummyEl.childNodes[3].nodeName, "I") equal(dummyEl.childNodes[3].nodeName, "I")
}) })
test("mixing trusted content w/ td", function() { test("mixing trusted content w/ td", function() {
"use strict"
m.render(dummyEl, [m.trust("<td>1</td><td>2</td>"), m("i", "foo")]) m.render(dummyEl, [m.trust("<td>1</td><td>2</td>"), m("i", "foo")])
equal(dummyEl.childNodes[1].nodeName, "I") equal(dummyEl.childNodes[1].nodeName, "I")
}) })
test("0 should not be treated as empty string", function() { test("0 should not be treated as empty string", function() {
"use strict"
m.render(dummyEl, m("input", {value: ""})) m.render(dummyEl, m("input", {value: ""}))
m.render(dummyEl, m("input", {value: 0})) m.render(dummyEl, m("input", {value: 0}))
equal(dummyEl.childNodes[0].value, "0") equal(dummyEl.childNodes[0].value, "0")
}) })
test("empty value in <option> should show as attribute", function() { test("empty value in <option> should show as attribute", function() {
"use strict"
m.render(dummyEl, m("select", m("option", {value: ""}, "aaa"))) m.render(dummyEl, m("select", m("option", {value: ""}, "aaa")))
equal(dummyEl.childNodes[0].innerHTML, '<option value="">aaa</option>') equal(dummyEl.childNodes[0].innerHTML, '<option value="">aaa</option>')
}) })

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,3 @@
/* eslint-disable no-extend-native, strict */
if (!Array.prototype.indexOf) { if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) { Array.prototype.indexOf = function(item) {
for (var i = 0; i < this.length; i++) { for (var i = 0; i < this.length; i++) {
@ -32,11 +31,9 @@ if (!Object.keys) {
return keys return keys
} }
} }
/* eslint-enable no-extend-native, strict */
var mock = {} var mock = {}
mock.window = (function() { mock.window = (function() {
"use strict"
var window = {} var window = {}
window.document = {} window.document = {}
window.document.childNodes = [] window.document.childNodes = []
@ -60,10 +57,9 @@ mock.window = (function() {
insertAdjacentHTML: function(position, html) { insertAdjacentHTML: function(position, html) {
// todo: accept markup // todo: accept markup
if (position === "beforebegin") { if (position === "beforebegin") {
this.parentNode.insertBefore( this.parentNode.insertBefore(window.document.createTextNode(html), this)
window.document.createTextNode(html), }
this) else if (position === "beforeend") {
} else if (position === "beforeend") {
this.appendChild(window.document.createTextNode(html)) this.appendChild(window.document.createTextNode(html))
} }
}, },
@ -74,7 +70,7 @@ mock.window = (function() {
this.namespaceURI = namespace this.namespaceURI = namespace
this[name] = value.toString() this[name] = value.toString()
}, },
getAttribute: function(name) { getAttribute: function(name, value) {
return this[name] return this[name]
}, },
addEventListener: function () {}, addEventListener: function () {},
@ -111,22 +107,22 @@ mock.window = (function() {
// getElementsByTagName is only used by JSONP tests, it's not required by // getElementsByTagName is only used by JSONP tests, it's not required by
// Mithril // Mithril
window.document.getElementsByTagName = function(name){ window.document.getElementsByTagName = function(name){
name = name.toLowerCase() name = name.toLowerCase();
var out = [] var out = [];
var traverse = function(node){ var traverse = function(node){
if(node.childNodes && node.childNodes.length > 0){ if(node.childNodes && node.childNodes.length > 0){
node.childNodes.map(function(curr){ node.childNodes.map(function(curr){
if (curr.nodeName.toLowerCase() === name) { if (curr.nodeName.toLowerCase() === name) {
out.push(curr) out.push(curr);
} }
traverse(curr) traverse(curr);
}) });
} }
} }
traverse(window.document) traverse(window.document);
return out return out;
} }
window.scrollTo = function() {} window.scrollTo = function() {}
window.cancelAnimationFrame = function() {} window.cancelAnimationFrame = function() {}
@ -167,12 +163,10 @@ mock.window = (function() {
window.history.$$length = 0 window.history.$$length = 0
window.history.pushState = function(data, title, url) { window.history.pushState = function(data, title, url) {
window.history.$$length++ window.history.$$length++
window.location.pathname = window.location.search = window.location.pathname = window.location.search = window.location.hash = url
window.location.hash = url
} }
window.history.replaceState = function(data, title, url) { window.history.replaceState = function(data, title, url) {
window.location.pathname = window.location.search = window.location.pathname = window.location.search = window.location.hash = url
window.location.hash = url
} }
return window return window
}()) }())

View file

@ -1,19 +1,15 @@
/* eslint-disable no-console */
if (!this.console) { if (!this.console) {
var log = function(value) { var log = function(value) {document.write("<pre>" + value + "</pre>")}
"use strict"
document.write("<pre>" + value + "</pre>")
}
this.console = {log: log, error: log} this.console = {log: log, error: log}
} }
function test(condition) { function test(condition) {
"use strict"
test.total++ test.total++
try { try {
if (!condition()) throw new Error("failed") if (!condition()) throw new Error("failed")
} catch (e) { }
catch (e) {
console.error(e) console.error(e)
test.failures.push(condition) test.failures.push(condition)
} }
@ -21,7 +17,6 @@ function test(condition) {
test.total = 0 test.total = 0
test.failures = [] test.failures = []
test.print = function(print) { test.print = function(print) {
"use strict"
for (var i = 0; i < test.failures.length; i++) { for (var i = 0; i < test.failures.length; i++) {
print(test.failures[i].toString()) print(test.failures[i].toString())
} }