From b52f2278397fc0c7d999bcf80156e03493e92c64 Mon Sep 17 00:00:00 2001 From: impinball Date: Fri, 6 Nov 2015 15:59:30 -0500 Subject: [PATCH 01/19] Re-enable some failing tests --- test/mithril.deferred.js | 2 +- test/mithril.render.js | 2 +- test/mithril.route.js | 9 ++++----- test/mithril.trust.js | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/test/mithril.deferred.js b/test/mithril.deferred.js index 1f31eb1c..ea7a8184 100644 --- a/test/mithril.deferred.js +++ b/test/mithril.deferred.js @@ -118,7 +118,7 @@ describe("m.deferred()", function () { }) // FIXME: this is a bug. - xit("synchronously throws subclasses of Errors on creation", function () { + it("synchronously throws subclasses of Errors on creation", function () { expect(function () { m.deferred().reject(new TypeError()) }).to.throw() diff --git a/test/mithril.render.js b/test/mithril.render.js index 34faa178..27e3c154 100644 --- a/test/mithril.render.js +++ b/test/mithril.render.js @@ -1318,7 +1318,7 @@ describe("m.render()", function () { // FIXME: implement document.createRange().createContextualFragment() in the // mock document to fix this test - xit("keeps unkeyed identity if mixed with elements/trusted text and identity can be inferred", function () { // eslint-disable-line + it("keeps unkeyed identity if mixed with elements/trusted text and identity can be inferred", function () { // eslint-disable-line var root = mock.document.createElement("div") m.render(root, m("div", [ diff --git a/test/mithril.route.js b/test/mithril.route.js index 7317d268..b82642ea 100644 --- a/test/mithril.route.js +++ b/test/mithril.route.js @@ -39,7 +39,6 @@ describe("m.route()", function () { // Use these instead of `it` and `xit` in this set of tests if you need a // root element. var dit = makeIt(it) - var xdit = makeIt(xit) // Wraps the `it` function for dependency injection that doesn't require // `this` @@ -103,7 +102,7 @@ describe("m.route()", function () { }) // FIXME: this causes others to fail - xdit("skips route change if component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + dit("skips route change if component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() @@ -131,7 +130,7 @@ describe("m.route()", function () { }) // FIXME: this causes others to fail - xdit("skips route change if subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + dit("skips route change if subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() @@ -162,7 +161,7 @@ describe("m.route()", function () { }) // FIXME: this causes others to fail - xdit("skips route change if non-curried component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + dit("skips route change if non-curried component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() @@ -191,7 +190,7 @@ describe("m.route()", function () { }) // FIXME: this causes others to fail - xdit("skips route change if non-curried subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + dit("skips route change if non-curried subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() diff --git a/test/mithril.trust.js b/test/mithril.trust.js index 748fa75e..41881b31 100644 --- a/test/mithril.trust.js +++ b/test/mithril.trust.js @@ -43,7 +43,7 @@ describe("m.trust()", function () { // FIXME: this is a bug (trusted string's contents rendered as just // textual contents) - xit("works with mixed trusted content in td", function () { + it("works with mixed trusted content in td", function () { var root = document.createElement("table") root.appendChild(root = document.createElement("tr")) From c17eac7436b871609ea865ee3480f0c12ca89222 Mon Sep 17 00:00:00 2001 From: Isiah Meadows Date: Sat, 7 Nov 2015 06:34:11 -0500 Subject: [PATCH 02/19] Create CONTRIBUTING.md I added the following to it: - Bug reporting - Feature requests - Contributing guide - Style guide --- CONTRIBUTING.md | 853 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 853 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..f76cec42 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,853 @@ +# Bug reports + +Use the [issue tracker](https://github.com/lhorie/mithril.js/issues). Do check to make sure your bug hasn't already been filed. Please give the following information, where possible: + +1. The version of Mithril you're using, whether it's the dev version or [the version on npm](http://npm.im/mithril.js). The version on npm may not have all the latest bug fixes, so your bug might very well be fixed in the dev version. +2. A detailed explanation of the bug. +3. A test case. The simpler, the better. + +# Feature requests + +Use the [issue tracker](https://github.com/lhorie/mithril.js/issues). Please do the following, where possible: + +1. Check to make sure your suggestion hasn't already been filed. There's a nice collection of some of these feature requests [here](https://github.com/lhorie/mithril.js/issues/802). +2. Clearly denote your issue as a feature request. It helps make the intent clearer. Even better is to denote it in the title. +3. Describe your idea. This is the most important part. +4. Submit, and wait for feedback. Don't forget to drop by the [Gitter room](https://gitter.im/lhorie/mithril.js) to get some publicity. It gets traffic daily. :smile: + +# Contributing + +We welcome any and all contributions. This is a community-driven project. Although we don't have a lot, we do have a few guidelines for contributions. + +1. Please adhere to the style guide. It's pretty lengthy, but most everything is checked by ESLint, and if anything fails to check, the build will fail, and you will know about it. Most of it is common practice and common sense. ESLint is also set up to check for other common errors, such as undeclared variables and invalid `typeof` values. +2. Please make sure there are no regressions with your patch. Please don't disable existing tests, and please don't send a PR with new, disabled tests. + - There are a few known failing tests currently (PRs welcome): [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.deferred.js#L121-L125) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.render.js#L1321-L1343) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L106-L131) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L134-L162) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L165-L191) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L194-L222) +3. For any new features introduced, be sure to write new unit tests for it. Maximum coverage is what we want. +4. Try to not leave any extra `TODO`s, `FIXME`s, etc. in your code. ESLint will nag at you until you fix whatever problem it is. + - Note that it's only a warning, not an error. It won't fail the CI tests, and there's a few outstanding ones inside Mithril right now. + +It is assumed that all contributions you make you have the appropriate rights to and that it may be made available under the MIT License, the license used for this project. + +# Style Guide + +The style is checked with ESLint. This style guide is here for one reason only: consistency. This should work for most code here, but this shouldn't be considered absolute &endash; consistency with the surrounding code is higher priority than following this guide. Also, if some sort of hack is impossible without violating this guide (e.g. if Mithril ever needs [Bluebird's infamous hack](https://stackoverflow.com/q/24987896)), just make sure the code is consistent with what's around it. + +### Line length + +Keep lines down to a maximum of 80 characters. Minifiers are very good at compressing whitespace, so don't be afraid to use it. + +The only exception to this rule is with long regexes. Append `// eslint-disable-line max-len` to the end of those lines. + +### Function length + +Keep function length to no more than 20 statements, including those in nested blocks. + +The only exceptions are for revealing module wrappers and Mocha `describe` and `context` blocks. + +This isn't checked for the tests, but still, keep it reasonable. + +### Line endings + +Use Windows-style line endings (i.e. CRLF). + +End each file with a line break. + +### Semicolons + +Avoid semicolons. (A few resources to help you understand this: [*](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding) [*](http://inimino.org/~inimino/blog/javascript_semicolons) [*](http://jamesallardice.com/understanding-automatic-semi-colon-insertion-in-javascript/)) + +### Redundant expressions + +Don't use redundant parentheses, curly braces, `undefined`s, labels, ternaries, etc. Examples: + +- `var foo = value === 1 ? true : false` is better written as `var foo = value === 1`. +- `var foo = (value === 1) ? bar : baz` is better written as `var foo = value === 1 ? bar : baz`. +- `var foo = undefined` is better written as `var foo`. +- `return undefined` is better written as `return`. +- `delete(obj.foo)` is better written as `delete obj.foo`. +- `return` at the end of a function if you're returning `undefined` should just be omitted. +- If you're returning `null`, there's usually little reason to not just return `undefined`. +- Unused variables should be removed. +- An exception is detailed below for assignment in conditions. + +### Equality testing + +Use strict equality (`===`/`!==`), not loose equality (`==`/`!=`). The only exception is if you're testing for `null` or `undefined`, in which loose equality, `value == null` and `value != null` is preferred. The reason is for type safety with primitives. + +### `eval` and friends + +Never use `eval`, the `Function` constructor, and friends. Those will fail when running under CSP restrictions, and this library should work in those environments. + +### Quotes + +Prefer double quotes to single quotes, but using single quotes to avoid escaping is okay. + +### Strict mode + +All code must be in strict mode, preferably wrapped in an IIFE. + +## Comments + +Comments are helpful. Use descriptive comments where needed, so others can read it and understand it. If a non-obvious hack is used, explain it with a comment. But don't repeat yourself with a redundant comment when the code adequately describes itself. + +```js +// Good, code is self-descriptive +var CARD_DECK_SIZE = 52 + +// Shuffle the deck of cards. +for (var i = 0; i < CARD_DECK_SIZE; i++) { + var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 + + var tmp = deck[i] + deck[i] = deck[j] + deck[j] = tmp +} + +// Also good, requires a descriptive comment. +function toFastProperties(obj) { + // Bluebird's toFastProperties hack. Forces V8 to optimize object as prototype, + // significantly speeding up property access. + + /* eslint-disable no-eval */ + function C() {} + C.prototype = obj + new C() + return + eval(obj) + /* eslint-enable no-eval */ +} + +// Bad, redundant comments +var CARD_DECK_SIZE = 52 + +// Shuffle the deck of cards. +function shuffle(deck) { + for (var i = 0; i < CARD_DECK_SIZE; i++) { + // Generate a random card index to swap at. + var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 + + // Swap the cards at each index. + var tmp = deck[i] + deck[i] = deck[j] + deck[j] = tmp + } +} +``` + +### Magic values + +Prefer constant variables to magic values where it helps with code readability. Also, don't use comments in place of a constant. + +```js +// Good +var CARD_DECK_SIZE = 52 +for (var i = 0; i < CARD_DECK_SIZE; i++) { + var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} + +// Bad, what's 52 for? +for (var i = 0; i < 52; i++) { + var j = i + (Math.random() * 52 - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} + +// Also bad, comment not substitute for constant +// 52 cards in a deck +for (var i = 0; i < 52; i++) { + var j = i + (Math.random() * 52 - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} +``` + +### Distracting comments + +Don't comment *everything*. It's distracting, pointless, and a waste of time. Only comment when you need to. + +```js +// Extremely bad. Don't *ever* do this. + +// This function loops through each item in a list, calling `f` with each item +// and their respective index. If the function `f` returns explicitly with +// `false`, iteration stops. This function returns the original list for +// convenience. +function forEach(list, f) { + // Loop through each entry in the list with the loop index `i` + for (var i = 0; i < list.length; i++) { + // Call the function with the current item and index + if (f(list[i], i) === false) { + // If the function explicitly returns `false`, immediately stop + // iteration. + break + } + } + // Return the list, for convenience. + return list +} +``` + +### Initial whitespace + +Start your comments with a space. It's more readable. + +```js +// Good +// This is a comment. + +// Bad +//This is a comment. +``` + +### Grammar and spelling + +Use proper grammar and spelling in your comments. This shouldn't need explanation. + +## Whitespace + +Use vertical whitespace and indentation to your advantage. It helps with readability, and minifiers are astonishingly great at removing this. :stuck_out_tongue_winking_eye: + +```js +// Good +function iterate() { + var index = 0 + var list = [] + while (hasNext()) { + list.push(next(index)) + index++ + } + + for (var i = 0; i < list.length; i++) { + read(list[i]) + } +} + +// Bad +function iterate() { + var index = 0 + var list = [] + while (hasNext()) list.push(next(index++)) + for (var i = 0; i < list.length; i++) read(list[i]) +} + +// Even worse +function iterate() { + var list = [] + for (var index = 0; hasNext(); list.push(next(index++))) {} + for (var i = 0; i < list.length; i++) read(list[i]) +} +``` + +### Trailing whitespace + +Please don't leave trailing spaces anywhere. It makes diffs harder to read. + +### Indentation and vertical whitespace + +Indent with hard tabs. Each one counts for 4 spaces. + +Never mix tabs and spaces. Don't use smart tabs. + +### Excessive whitespace + +Keep whitespace within reason. Limit vertical whitespace to no more than 2 consecutive blank lines, and don't start or end blocks with plain whitespace. Don't use more than one character of horizontal whitespace beyond indentation. + +```js +// Bad +function iterate() { + var index = 0 + var list = [] + + while (hasNext()) { + list.push(next(index)) + index++ + } + + // Too many empty lines + + + + for (var i = 0; i < list.length; i++) { + read(list[i]) + } +} + +// Also bad +var a = 2 +// ^^ ^^ +``` + +### Control keywords + +Always surround control keywords (e.g. `if`, `else`, `for`) with whitespace. + +## Operators + +### Binary operators + +Always surround binary keyword operators (e.g. `in`, `instanceof`) with whitespace. + +Always surround any other binary operator with whitespace, including assignment operators. Add line breaks after the operator, not before. + +```js +// Good +var a = 1 + 2 +a = 3 +a += 4 + +var a = 1 + 2 + 3 + 4 + 5 + + 6 + 7 + 8 + 9 + 10 + +// Bad +var a = 1+2 +var a = 1 +2 +var a = 1+ 2 +var a=1+2 +var a=1 + 2 +a=3 +a+=4 + +var a = 1 + 2 + 3 + 4 + 5 + + 6 + 7 + 8 + 9 + 10 +``` + +As an exception, casting to a 32-bit integer (i.e. `x|0`) doesn't require whitespace surrounding it. + +```js +// This is okay +var casted = value|0 +``` + +### Unary operators + +Always use whitespace between an unary keyword operator (e.g. `delete`, `new`) with whitespace. + +Do not use spaces between any other unary operator and the value they apply to. + +```js +// Good +!a +!!a +~~a +a++ +++a +-1 +~1 + +// Okay ++!a + +// Bad +! a +!! a +! ! a +++ a +a ++ ++ ! a + +// Even worse +- 1 +~ 1 +``` + +Don't use `new function () {}`. Just use an object literal instead, and an IIFE if needed. + +## Objects + +### Exterior whitespace + +Do not include space between the opening curly brace and the first object key in single line objects. For multi-line objects, don't include any extra preceding whitespace at the beginning or end. + +```js +// Good +var object = {foo: 1} + +var object = { + foo: 1, + bar: 2, + baz: 3, + quux: "string" +} + +// Bad +var object = { foo: 1 } + +var object = { + + foo: 1, + bar: 2, + baz: 3, + quux: "string" + +} +``` + +### Interior whitespace + +Use no space before an object key and the colon, but use a single space between the colon and value. + +```js +// Good +var object = {foo: 1} + +// Bad +var object = {foo:1} +var object = {foo : 1} + +// Very bad +var object = {foo :1} +``` + +### Larger objects + +Non-trivial objects should occupy multiple lines. + +```js +// Good +var object = { + foo: 1, + bar: 2, + baz: 3, + quux: "string" +} + +// Bad +var object = {foo: 1, bar: 2, baz: 3, quux: "string"} +``` + +### Comma placement + +Commas come last. Also, don't use trailing commas. + +```js +// Good +var object = { + foo: 1, + bar: 2 +} + +// Bad +var object = { + foo: 1, + bar: 2, // Trailing comma +} + +var object = { + foo: 1 +, bar: 2 // Comma first +} +``` + +### Member access + +When chaining methods and/or properties across multiple lines, dots come first. + +```js +// Good +object + .foo() + .bar() + +// Bad +object. + foo(). + bar() +``` + +### Property quoting + +Quote properties when needed. Never quote valid identifiers. This may lead to some inconsistency in whether properties are quoted or not in the object, but that inconsistency is okay, and is the only exception in consistency. + +```js +// Good +var object = { + foo: 1, + bar: 2 +} + +var object = { + foo: 1, + "non-identifier": 2 +} + +// Bad +var object = { + "foo": 1, + "bar": 2 +} + +var object = { + "foo": 1, + "non-identifier": 2 +} +``` + +### Iteration + +When iterating objects with `for-in`, filter it with `Object.prototype.hasOwnProperty` first. This may be on the same line if that's the only condition. If this is used more than once, make a local `hasOwn` alias to use like `hasOwn.call(object, prop)`. + +## Variables and declarations + +Use camel case (e.g. `loopIndex`) for variables, pascal case (e.g. `MyClass`) for classes, and upper case with underscores (e.g. `MAX_VALUE`) for constants. + +Use `self` to capture `this` where needed. (i.e. `var self = this`) + +Prefer short but clear, descriptive, and self-documenting variable names. + +Single letter names are only okay in these contexts: + +- Loop variables: `i`, `j`, etc. +- Function arguments in small, trivial functional utilities: `f`, `g`, etc. +- Standard mathematical algorithms: `x`, `y`, `a`, `b`, etc. + +```js +// Good +function forEach(list, f) { + for (var i = 0; i < list.length; i++) { + f(list[i], i) + } + return list +} + +function ajax(url, callback) { + var xhr = new XMLHttpRequest() + xhr.open("GET", url) + xhr.onreadystatechange = function () { + if (this.readyState === 4) { + callback(this.responseText, this.status) + } + } + xhr.send() +} + +// Bad +function iterateArray(listOfEntries, callback) { + for (var index = 0; index < listOfEntries.length; index++) { + callback(listOfEntries[index], index) + } + return listOfEntries +} + +function getRequestStringFromServer(serverLocation, functionToCall) { + var xmlHttpRequest = new XMLHttpRequest() + xmlHttpRequest.open("GET", serverLocation) + xmlHttpRequest.onreadystatechange = function () { + if (this.readyState === 4) { + functionToCall(this.responseText, this.status) + } + } + xmlHttpRequest.send() +} + +// Even worse +function e(l, c) { + for (var x = 0; x < l.length; x++) { + c(l[x], x) + } + return l +} + +function a(u, f) { + var x = new XMLHttpRequest() + x.open("GET", url) + x.onreadystatechange = function () { + if (this.readyState === 4) { + f(this.responseText,this.status) + } + } + x.send() +} +``` + +### Multiple variable declarations + +If a variable is assigned a value when it's declared, it gets its own line. + +If a variable is not immediately assigned a value, it may be grouped with others that aren't first assigned values. + +Do group related variables. + +Variable declarations in the init block of a for loop are excluded from this rule, but the number of declarations should still be minimized. + +```js +// Good +var a = 1 +var b = 2 +var c, d + +// Also good +var foo, bar, baz, quux +var spam, eggs, ham +var shouldUpdate, initialize + +// Okay, since it's within a for loop +for (var i = 0, test; (test = foo === 1); i++) { + doSomething(i) +} + +// Bad +var a = 1, b = 2, c, d + +// Even worse +var foo, bar, baz, quux, spam, eggs, ham, shouldUpdate, initialize +``` + +## Assignment + +### Native functions + +Don't assign to native functions or prototypes beyond polyfills. Ever. + +### Function declarations + +Don't assign to a function declaration. Declarations look like static values, so they should be treated that way. There is no difference in size, either. + +```js +// Bad +function foo() { return 1 } +foo = function () { return 2 } + +// Even worse +function foo() { return 1 } +foo = 2 +``` + +### Conditions + +Avoid assigning directly in conditions. If you need to assign in a condition, wrap them in a new set of parentheses. + +```js +// Good +var test = foo === 1 +if (test) { + doSomething() +} + +var test = foo === 1 +for (var i = 0; test; i++, test = foo === 1) { + doSomething(i) +} + +if ((test = foo === 1)) { + doSomething() +} + +for (var i = 0, test; (test = foo === 1); i++) { + doSomething(i) +} + +// Bad +if (test = foo === 1) { + doSomething() +} + +for (var i = 0, test; test = foo === 1; i++) { + doSomething(i) +} +``` + +## Functions + +Prefer anonymous functions to named functions in expressions where possible + +Prefer named function declarations to assigning a function to a declared variable where possible. + +```js +// Good +setTimeout(function () { doSomething() }, 0) + +function foo() { + return 1 +} + +// Good, uses recursion +setTimeout(function f() { + doSomething() + if (shouldRepeat()) setTimeout(f, 0) +}, 0) + +// Bad +requestAnimationFrame(function foo() { runNext() }) + +var foo = function () { + return 1 +} +``` + +### Anonymous functions + +Anonymous functions must have a single space between `function` and the arguments and between the arguments and the opening brace. + +### Named functions, function declarations + +Named functions and function declarations must have no space between the function name and the arguments and a single space between the arguments and the opening brace. + +## Blocks and conditionals + +### Curly braces + +Curly braces are required for blocks if the body takes up more than one line. This goes for functions as well. They are optional if it fits within one line, but don't be afraid to use them where you see fit. + +Do put an extra space after the first brace and before the final brace in single-line functions. + +```js +// Good +if (condition) doSomething() + +if (condition) { + doSomething() +} + +if (condition) { + doSomething() +} else { + doSomethingElse() +} + +if (condition) { + doSomething() + doSomethingElse() +} + +setTimeout(function () { doSomething() }, 0) + +setTimeout(function () { + doSomething() +}, 0) + +// Bad +if (condition) { doSomething(); doSomethingElse() } + +if (condition) + doSomething() + +setTimeout(function () { doSomething(); doSomethingElse() }, 0) + +setTimeout(function () {doSomething()}, 0) +``` + +### Function declarations + +Function declarations should always take more than one line. + +```js +// Good +function foo() { + return bar +} + +// Bad +function foo() { return bar } +``` + +### `if`-`else` + +Be consistent with braces in `if`-`else` statements. + +```js +// Good +if (condition) doSomething() +else doSomethingElse() + +if (condition) { + doSomething() +} else { + doSomethingElse() +} + +if (condition) { + doSomething() +} else if (anotherCondition) { + doSomethingElse() +} else { + doAnotherThing() +} + +// Okay +if (condition) doSomething() +else if (anotherCondition) doSomethingElse() +else doAnotherThing() + +// Bad +if (condition) doSomething() +else { + doSomethingElse() +} + +if (condition) doSomething() +else if (anotherCondition) { + doSomethingElse() +} else doAnotherThing() + + +if (condition) { + doSomething() +} else doSomethingElse() +``` + +### Empty blocks + +Mark empty blocks as intentionally empty via a comment or similar. Don't just leave an empty block and/or semicolon. + +```js +// Good +for (var i = 0; i < list.length && cond(list[i]); i++) { + // empty +} + +// Bad +for (var i = 0; i < list.length && cond(list[i]); i++) {} + +// Also bad +for (var i = 0; i < list.length && cond(list[i]); i++) { + ; +} + +// Even worse +for (var i = 0; i < list.length && cond(list[i]); i++); +``` + +### Nesting + +Don't nest `if` statements in `else` blocks if you don't need to. + +```js +// Good +if (test) { + doSomething() +} else if (otherTest) { + doSomethingElse() +} + +if (test) { + doSomething() +} else { + if (otherTest) { + doSomethingElse() + } + + doThisOtherThing() +} + +// Bad +if (test) { + doSomething() +} else { + if (otherTest) { + doSomethingElse() + } +} +``` + +Don't nest curly braces beyond 4 levels deep. This includes blocks, loops, and functions, as well as IIFE wrappers. This also includes the tests. There's rarely a reason to go farther, as most of the time, it's a signal to refactor and/or re-organize your code. + +### Brace style + +Put the `else`, `catch`, and `finally` on the same line as its closing brace. + +(Obviously, this doesn't apply to `if`-`else` statements that don't use curly braces.) From 9fab2b8371f87a7a8367a02fb51103b71c8dc495 Mon Sep 17 00:00:00 2001 From: Isiah Meadows Date: Sat, 7 Nov 2015 06:34:11 -0500 Subject: [PATCH 03/19] Create CONTRIBUTING.md I added the following to it: - Bug reporting - Feature requests - Contributing guide - Style guide --- .eslintrc | 1 + CONTRIBUTING.md | 856 ++++++++++++++++++++++++ Gruntfile.js | 114 ++-- docs/layout/tools/template-converter.js | 12 +- mithril.js | 22 +- test-deps/mock.js | 10 +- test/input-cursor.html | 22 +- test/mithril.js | 2 +- test/mithril.mount.js | 72 +- test/mithril.redraw.js | 26 +- test/mithril.render.js | 140 ++-- test/mithril.request.js | 32 +- test/mithril.route.buildQueryString.js | 4 +- test/mithril.route.js | 210 +++--- test/mithril.route.parseQueryString.js | 4 +- test/mithril.startComputation.js | 2 +- test/mithril.trust.js | 4 +- test/svg.html | 28 +- 18 files changed, 1209 insertions(+), 352 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/.eslintrc b/.eslintrc index f77243f3..3417ee64 100644 --- a/.eslintrc +++ b/.eslintrc @@ -53,6 +53,7 @@ "block-spacing": 2, "brace-style": [2, "1tbs", {"allowSingleLine": true}], "camelcase": 2, + "comma-dangle": [2, "always-multiline"], "comma-spacing": 2, "comma-style": 2, "consistent-this": [2, "self"], diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e4864595 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,856 @@ +# Bug reports + +Use the [issue tracker](https://github.com/lhorie/mithril.js/issues). Do check to make sure your bug hasn't already been filed. Please give the following information, where possible: + +1. The version of Mithril you're using, whether it's the dev version or [the version on npm](http://npm.im/mithril.js). The version on npm may not have all the latest bug fixes, so your bug might very well be fixed in the dev version. +2. A detailed explanation of the bug. +3. A test case. The simpler, the better. + +# Feature requests + +Use the [issue tracker](https://github.com/lhorie/mithril.js/issues). Please do the following, where possible: + +1. Check to make sure your suggestion hasn't already been filed. There's a nice collection of some of these feature requests [here](https://github.com/lhorie/mithril.js/issues/802). +2. Clearly denote your issue as a feature request. It helps make the intent clearer. Even better is to denote it in the title. +3. Describe your idea. This is the most important part. +4. Submit, and wait for feedback. Don't forget to drop by the [Gitter room](https://gitter.im/lhorie/mithril.js) to get some publicity. It gets traffic daily. :smile: + +# Contributing + +We welcome any and all contributions. This is a community-driven project. Although we don't have a lot, we do have a few guidelines for contributions. + +1. Please adhere to the style guide. It's pretty lengthy, but most everything is checked by ESLint, and if anything fails to check, the build will fail, and you will know about it. Most of it is common practice and common sense. ESLint is also set up to check for other common errors, such as undeclared variables and invalid `typeof` values. +2. Please make sure there are no regressions with your patch. Please don't disable existing tests, and please don't send a PR with new, disabled tests. + - There are a few known failing tests currently (PRs welcome): [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.deferred.js#L121-L125) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.render.js#L1321-L1343) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L106-L131) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L134-L162) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L165-L191) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L194-L222) +3. For any new features introduced, be sure to write new unit tests for it. Maximum coverage is what we want. +4. Try to not leave any extra `TODO`s, `FIXME`s, etc. in your code. ESLint will nag at you until you fix whatever problem it is. + - Note that it's only a warning, not an error. It won't fail the CI tests, and there's a few outstanding ones inside Mithril right now. + +It is assumed that all contributions you make you have the appropriate rights to and that it may be made available under the MIT License, the license used for this project. + +# Style Guide + +The style is checked with ESLint. This style guide is here for one reason only: consistency. This should work for most code here, but this shouldn't be considered absolute &endash; consistency with the surrounding code is higher priority than following this guide. Also, if some sort of hack is impossible without violating this guide (e.g. if Mithril ever needs [Bluebird's infamous hack](https://stackoverflow.com/q/24987896)), just make sure the code is consistent with what's around it. + +### Line length + +Keep lines down to a maximum of 80 characters. Minifiers are very good at compressing whitespace, so don't be afraid to use it. + +The only exception to this rule is with long regexes. Append `// eslint-disable-line max-len` to the end of those lines. + +### Function length + +Keep function length to no more than 20 statements, including those in nested blocks. + +The only exceptions are for revealing module wrappers and Mocha `describe` and `context` blocks. + +This isn't checked for the tests, but still, keep it reasonable. + +### Line endings + +Use Windows-style line endings (i.e. CRLF). + +End each file with a line break. + +### Semicolons + +Avoid semicolons. (A few resources to help you understand this: [*](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding) [*](http://inimino.org/~inimino/blog/javascript_semicolons) [*](http://jamesallardice.com/understanding-automatic-semi-colon-insertion-in-javascript/)) + +### Redundant expressions + +Don't use redundant parentheses, curly braces, `undefined`s, labels, ternaries, etc. Examples: + +- `var foo = value === 1 ? true : false` is better written as `var foo = value === 1`. +- `var foo = (value === 1) ? bar : baz` is better written as `var foo = value === 1 ? bar : baz`. +- `var foo = undefined` is better written as `var foo`. +- `return undefined` is better written as `return`. +- `delete(obj.foo)` is better written as `delete obj.foo`. +- `return` at the end of a function if you're returning `undefined` should just be omitted. +- If you're returning `null`, there's usually little reason to not just return `undefined`. +- Unused variables should be removed. +- An exception is detailed below for assignment in conditions. + +### Equality testing + +Use strict equality (`===`/`!==`), not loose equality (`==`/`!=`). The only exception is if you're testing for `null` or `undefined`, in which loose equality, `value == null` and `value != null` is preferred. The reason is for type safety with primitives. + +### `eval` and friends + +Never use `eval`, the `Function` constructor, and friends. Those will fail when running under CSP restrictions, and this library should work in those environments. + +### Quotes + +Prefer double quotes to single quotes, but using single quotes to avoid escaping is okay. + +### Strict mode + +All code must be in strict mode, preferably wrapped in an IIFE. + +## Comments + +Comments are helpful. Use descriptive comments where needed, so others can read it and understand it. If a non-obvious hack is used, explain it with a comment. But don't repeat yourself with a redundant comment when the code adequately describes itself. + +```js +// Good, code is self-descriptive +var CARD_DECK_SIZE = 52 + +// Shuffle the deck of cards. +for (var i = 0; i < CARD_DECK_SIZE; i++) { + var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 + + var tmp = deck[i] + deck[i] = deck[j] + deck[j] = tmp +} + +// Also good, requires a descriptive comment. +function toFastProperties(obj) { + // Bluebird's toFastProperties hack. Forces V8 to optimize object as prototype, + // significantly speeding up property access. + + /* eslint-disable no-eval */ + function C() {} + C.prototype = obj + new C() + return + eval(obj) + /* eslint-enable no-eval */ +} + +// Bad, redundant comments +var CARD_DECK_SIZE = 52 + +// Shuffle the deck of cards. +function shuffle(deck) { + for (var i = 0; i < CARD_DECK_SIZE; i++) { + // Generate a random card index to swap at. + var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 + + // Swap the cards at each index. + var tmp = deck[i] + deck[i] = deck[j] + deck[j] = tmp + } +} +``` + +### Magic values + +Prefer constant variables to magic values where it helps with code readability. Also, don't use comments in place of a constant. + +```js +// Good +var CARD_DECK_SIZE = 52 +for (var i = 0; i < CARD_DECK_SIZE; i++) { + var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} + +// Bad, what's 52 for? +for (var i = 0; i < 52; i++) { + var j = i + (Math.random() * 52 - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} + +// Also bad, comment not substitute for constant +// 52 cards in a deck +for (var i = 0; i < 52; i++) { + var j = i + (Math.random() * 52 - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} +``` + +### Distracting comments + +Don't comment *everything*. It's distracting, pointless, and a waste of time. Only comment when you need to. + +```js +// Extremely bad. Don't *ever* do this. + +// This function loops through each item in a list, calling `f` with each item +// and their respective index. If the function `f` returns explicitly with +// `false`, iteration stops. This function returns the original list for +// convenience. +function forEach(list, f) { + // Loop through each entry in the list with the loop index `i` + for (var i = 0; i < list.length; i++) { + // Call the function with the current item and index + if (f(list[i], i) === false) { + // If the function explicitly returns `false`, immediately stop + // iteration. + break + } + } + // Return the list, for convenience. + return list +} +``` + +### Initial whitespace + +Start your comments with a space. It's more readable. + +```js +// Good +// This is a comment. + +// Bad +//This is a comment. +``` + +### Grammar and spelling + +Use proper grammar and spelling in your comments. This shouldn't need explanation. + +## Whitespace + +Use vertical whitespace and indentation to your advantage. It helps with readability, and minifiers are astonishingly great at removing this. :stuck_out_tongue_winking_eye: + +```js +// Good +function iterate() { + var index = 0 + var list = [] + while (hasNext()) { + list.push(next(index)) + index++ + } + + for (var i = 0; i < list.length; i++) { + read(list[i]) + } +} + +// Bad +function iterate() { + var index = 0 + var list = [] + while (hasNext()) list.push(next(index++)) + for (var i = 0; i < list.length; i++) read(list[i]) +} + +// Even worse +function iterate() { + var list = [] + for (var index = 0; hasNext(); list.push(next(index++))) {} + for (var i = 0; i < list.length; i++) read(list[i]) +} +``` + +### Trailing whitespace + +Please don't leave trailing spaces anywhere. It makes diffs harder to read. + +### Indentation and vertical whitespace + +Indent with hard tabs. Each one counts for 4 spaces. + +Never mix tabs and spaces. Don't use smart tabs. + +### Excessive whitespace + +Keep whitespace within reason. Limit vertical whitespace to no more than 2 consecutive blank lines, and don't start or end blocks with plain whitespace. Don't use more than one character of horizontal whitespace beyond indentation. + +```js +// Bad +function iterate() { + var index = 0 + var list = [] + + while (hasNext()) { + list.push(next(index)) + index++ + } + + // Too many empty lines + + + + for (var i = 0; i < list.length; i++) { + read(list[i]) + } +} + +// Also bad +var a = 2 +// ^^ ^^ +``` + +### Control keywords + +Always surround control keywords (e.g. `if`, `else`, `for`) with whitespace. + +## Operators + +### Binary operators + +Always surround binary keyword operators (e.g. `in`, `instanceof`) with whitespace. + +Always surround any other binary operator with whitespace, including assignment operators. Add line breaks after the operator, not before. + +```js +// Good +var a = 1 + 2 +a = 3 +a += 4 + +var a = 1 + 2 + 3 + 4 + 5 + + 6 + 7 + 8 + 9 + 10 + +// Bad +var a = 1+2 +var a = 1 +2 +var a = 1+ 2 +var a=1+2 +var a=1 + 2 +a=3 +a+=4 + +var a = 1 + 2 + 3 + 4 + 5 + + 6 + 7 + 8 + 9 + 10 +``` + +As an exception, casting to a 32-bit integer (i.e. `x|0`) doesn't require whitespace surrounding it. + +```js +// This is okay +var casted = value|0 +``` + +### Unary operators + +Always use whitespace between an unary keyword operator (e.g. `delete`, `new`) with whitespace. + +Do not use spaces between any other unary operator and the value they apply to. + +```js +// Good +!a +!!a +~~a +a++ +++a +-1 +~1 + +// Okay ++!a + +// Bad +! a +!! a +! ! a +++ a +a ++ ++ ! a + +// Even worse +- 1 +~ 1 +``` + +Don't use `new function () {}`. Just use an object literal instead, and an IIFE if needed. + +## Objects + +### Exterior whitespace + +Do not include space between the opening curly brace and the first object key in single line objects. For multi-line objects, don't include any extra preceding whitespace at the beginning or end. + +```js +// Good +var object = {foo: 1} + +var object = { + foo: 1, + bar: 2, + baz: 3, + quux: "string", +} + +// Bad +var object = { foo: 1 } + +var object = { + + foo: 1, + bar: 2, + baz: 3, + quux: "string", + +} +``` + +### Interior whitespace + +Use no space before an object key and the colon, but use a single space between the colon and value. + +```js +// Good +var object = {foo: 1} + +// Bad +var object = {foo:1} +var object = {foo : 1} + +// Very bad +var object = {foo :1} +``` + +### Larger objects + +Non-trivial objects should occupy multiple lines. + +```js +// Good +var object = { + foo: 1, + bar: 2, + baz: 3, + quux: "string", +} + +// Bad +var object = {foo: 1, bar: 2, baz: 3, quux: "string"} +``` + +### Comma placement + +Commas come last. Also, use trailing commas if the object takes multiple lines. + +```js +// Good +var object = { + foo: 1, + bar: 2, +} + +// Bad +var object = { + foo: 1, + bar: 2 // No trailing comma +} + +var object = { + foo: 1 +, bar: 2 // Comma first +} + +// Trailing comma in single-line object +var object = {foo: 1,} +``` + +### Member access + +When chaining methods and/or properties across multiple lines, dots come first. + +```js +// Good +object + .foo() + .bar() + +// Bad +object. + foo(). + bar() +``` + +### Property quoting + +Quote properties when needed. Never quote valid identifiers. This may lead to some inconsistency in whether properties are quoted or not in the object, but that inconsistency is okay, and is the only exception in consistency. + +```js +// Good +var object = { + foo: 1, + bar: 2, +} + +var object = { + foo: 1, + "non-identifier": 2, +} + +// Bad +var object = { + "foo": 1, + "bar": 2, +} + +var object = { + "foo": 1, + "non-identifier": 2, +} +``` + +### Iteration + +When iterating objects with `for-in`, filter it with `Object.prototype.hasOwnProperty` first. This may be on the same line if that's the only condition. If this is used more than once, make a local `hasOwn` alias to use like `hasOwn.call(object, prop)`. + +## Variables and declarations + +Use camel case (e.g. `loopIndex`) for variables, pascal case (e.g. `MyClass`) for classes, and upper case with underscores (e.g. `MAX_VALUE`) for constants. + +Use `self` to capture `this` where needed. (i.e. `var self = this`) + +Prefer short but clear, descriptive, and self-documenting variable names. + +Single letter names are only okay in these contexts: + +- Loop variables: `i`, `j`, etc. +- Function arguments in small, trivial functional utilities: `f`, `g`, etc. +- Standard mathematical algorithms: `x`, `y`, `a`, `b`, etc. + +```js +// Good +function forEach(list, f) { + for (var i = 0; i < list.length; i++) { + f(list[i], i) + } + return list +} + +function ajax(url, callback) { + var xhr = new XMLHttpRequest() + xhr.open("GET", url) + xhr.onreadystatechange = function () { + if (this.readyState === 4) { + callback(this.responseText, this.status) + } + } + xhr.send() +} + +// Bad +function iterateArray(listOfEntries, callback) { + for (var index = 0; index < listOfEntries.length; index++) { + callback(listOfEntries[index], index) + } + return listOfEntries +} + +function getRequestStringFromServer(serverLocation, functionToCall) { + var xmlHttpRequest = new XMLHttpRequest() + xmlHttpRequest.open("GET", serverLocation) + xmlHttpRequest.onreadystatechange = function () { + if (this.readyState === 4) { + functionToCall(this.responseText, this.status) + } + } + xmlHttpRequest.send() +} + +// Even worse +function e(l, c) { + for (var x = 0; x < l.length; x++) { + c(l[x], x) + } + return l +} + +function a(u, f) { + var x = new XMLHttpRequest() + x.open("GET", url) + x.onreadystatechange = function () { + if (this.readyState === 4) { + f(this.responseText,this.status) + } + } + x.send() +} +``` + +### Multiple variable declarations + +If a variable is assigned a value when it's declared, it gets its own line. + +If a variable is not immediately assigned a value, it may be grouped with others that aren't first assigned values. + +Do group related variables. + +Variable declarations in the init block of a for loop are excluded from this rule, but the number of declarations should still be minimized. + +```js +// Good +var a = 1 +var b = 2 +var c, d + +// Also good +var foo, bar, baz, quux +var spam, eggs, ham +var shouldUpdate, initialize + +// Okay, since it's within a for loop +for (var i = 0, test; (test = foo === 1); i++) { + doSomething(i) +} + +// Bad +var a = 1, b = 2, c, d + +// Even worse +var foo, bar, baz, quux, spam, eggs, ham, shouldUpdate, initialize +``` + +## Assignment + +### Native functions + +Don't assign to native functions or prototypes beyond polyfills. Ever. + +### Function declarations + +Don't assign to a function declaration. Declarations look like static values, so they should be treated that way. There is no difference in size, either. + +```js +// Bad +function foo() { return 1 } +foo = function () { return 2 } + +// Even worse +function foo() { return 1 } +foo = 2 +``` + +### Conditions + +Avoid assigning directly in conditions. If you need to assign in a condition, wrap them in a new set of parentheses. + +```js +// Good +var test = foo === 1 +if (test) { + doSomething() +} + +var test = foo === 1 +for (var i = 0; test; i++, test = foo === 1) { + doSomething(i) +} + +if ((test = foo === 1)) { + doSomething() +} + +for (var i = 0, test; (test = foo === 1); i++) { + doSomething(i) +} + +// Bad +if (test = foo === 1) { + doSomething() +} + +for (var i = 0, test; test = foo === 1; i++) { + doSomething(i) +} +``` + +## Functions + +Prefer anonymous functions to named functions in expressions where possible + +Prefer named function declarations to assigning a function to a declared variable where possible. + +```js +// Good +setTimeout(function () { doSomething() }, 0) + +function foo() { + return 1 +} + +// Good, uses recursion +setTimeout(function f() { + doSomething() + if (shouldRepeat()) setTimeout(f, 0) +}, 0) + +// Bad +requestAnimationFrame(function foo() { runNext() }) + +var foo = function () { + return 1 +} +``` + +### Anonymous functions + +Anonymous functions must have a single space between `function` and the arguments and between the arguments and the opening brace. + +### Named functions, function declarations + +Named functions and function declarations must have no space between the function name and the arguments and a single space between the arguments and the opening brace. + +## Blocks and conditionals + +### Curly braces + +Curly braces are required for blocks if the body takes up more than one line. This goes for functions as well. They are optional if it fits within one line, but don't be afraid to use them where you see fit. + +Do put an extra space after the first brace and before the final brace in single-line functions. + +```js +// Good +if (condition) doSomething() + +if (condition) { + doSomething() +} + +if (condition) { + doSomething() +} else { + doSomethingElse() +} + +if (condition) { + doSomething() + doSomethingElse() +} + +setTimeout(function () { doSomething() }, 0) + +setTimeout(function () { + doSomething() +}, 0) + +// Bad +if (condition) { doSomething(); doSomethingElse() } + +if (condition) + doSomething() + +setTimeout(function () { doSomething(); doSomethingElse() }, 0) + +setTimeout(function () {doSomething()}, 0) // Body needs some space +``` + +### Function declarations + +Function declarations should always take more than one line. + +```js +// Good +function foo() { + return bar +} + +// Bad +function foo() { return bar } +``` + +### `if`-`else` + +Be consistent with braces in `if`-`else` statements. + +```js +// Good +if (condition) doSomething() +else doSomethingElse() + +if (condition) { + doSomething() +} else { + doSomethingElse() +} + +if (condition) { + doSomething() +} else if (anotherCondition) { + doSomethingElse() +} else { + doAnotherThing() +} + +// Okay +if (condition) doSomething() +else if (anotherCondition) doSomethingElse() +else doAnotherThing() + +// Bad +if (condition) doSomething() +else { + doSomethingElse() +} + +if (condition) doSomething() +else if (anotherCondition) { + doSomethingElse() +} else doAnotherThing() + + +if (condition) { + doSomething() +} else doSomethingElse() +``` + +### Empty blocks + +Mark empty blocks as intentionally empty via a comment or similar. Don't just leave an empty block and/or semicolon. + +```js +// Good +for (var i = 0; i < list.length && cond(list[i]); i++) { + // empty +} + +// Bad +for (var i = 0; i < list.length && cond(list[i]); i++) {} + +// Also bad +for (var i = 0; i < list.length && cond(list[i]); i++) { + ; +} + +// Even worse +for (var i = 0; i < list.length && cond(list[i]); i++); +``` + +### Nesting + +Don't nest `if` statements in `else` blocks if you don't need to. + +```js +// Good +if (test) { + doSomething() +} else if (otherTest) { + doSomethingElse() +} + +if (test) { + doSomething() +} else { + if (otherTest) { + doSomethingElse() + } + + doThisOtherThing() +} + +// Bad +if (test) { + doSomething() +} else { + if (otherTest) { + doSomethingElse() + } +} +``` + +Don't nest curly braces beyond 4 levels deep. This includes blocks, loops, and functions, as well as IIFE wrappers. This also includes the tests. There's rarely a reason to go farther, as most of the time, it's a signal to refactor and/or re-organize your code. + +### Brace style + +Put the `else`, `catch`, and `finally` on the same line as its closing brace. + +(Obviously, this doesn't apply to `if`-`else` statements that don't use curly braces.) diff --git a/Gruntfile.js b/Gruntfile.js index a22e6198..5e933cb2 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -21,7 +21,7 @@ module.exports = function (grunt) { // eslint-disable-line "refactoring", "routing", "tools", - "web-services" + "web-services", ] var api = [ @@ -42,7 +42,7 @@ module.exports = function (grunt) { // eslint-disable-line "mithril.sync", "mithril.trust", "mithril.withAttr", - "mithril.xhr" + "mithril.xhr", ] var md2htmlTasks = {} @@ -59,12 +59,12 @@ module.exports = function (grunt) { // eslint-disable-line md2htmlTasks[name] = { options: { layout: inputFolder + "/layout/" + layout + ".html", - templateData: {topic: title} + templateData: {topic: title}, }, files: [{ src: [src], - dest: tempFolder + "/" + name + ".html" - }] + dest: tempFolder + "/" + name + ".html", + }], } }) } @@ -79,7 +79,7 @@ module.exports = function (grunt) { // eslint-disable-line eslint: { options: { extensions: [".js"], - fix: true + fix: true, }, all: [ "**/*.js", @@ -88,17 +88,17 @@ module.exports = function (grunt) { // eslint-disable-line "!archive/**", "!deploy/**", "!mithril.closure-compiler-externs.js", - "!docs/layout/lib/**" - ] + "!docs/layout/lib/**", + ], }, mocha_phantomjs: { // eslint-disable-line camelcase test: { src: ["test/index.html"], options: { - reporter: "dot" - } - } + reporter: "dot", + }, + }, }, md2html: md2htmlTasks, @@ -111,11 +111,11 @@ module.exports = function (grunt) { // eslint-disable-line "http://github.com/lhorie/mithril.js", "(c) Leo Horie", "License: MIT", - "*/" + "*/", ].join("\n"), - sourceMap: true + sourceMap: true, }, - mithril: {src: "mithril.js", dest: "mithril.min.js"} + mithril: {src: "mithril.js", dest: "mithril.min.js"}, }, zip: { @@ -124,10 +124,10 @@ module.exports = function (grunt) { // eslint-disable-line src: [ currentVersionArchiveFolder + "/mithril.min.js", currentVersionArchiveFolder + "/mithril.min.js.map", - currentVersionArchiveFolder + "/mithril.js" + currentVersionArchiveFolder + "/mithril.js", ], - dest: currentVersionArchiveFolder + "/mithril.min.zip" - } + dest: currentVersionArchiveFolder + "/mithril.min.zip", + }, }, replace: { @@ -135,105 +135,105 @@ module.exports = function (grunt) { // eslint-disable-line force: true, patterns: [ {match: /\.md/g, replacement: ".html"}, - {match: /\$version/g, replacement: version} - ] + {match: /\$version/g, replacement: version}, + ], }, links: { expand: true, flatten: true, src: [tempFolder + "/**/*.html"], - dest: currentVersionArchiveFolder + "/" + dest: currentVersionArchiveFolder + "/", }, index: { src: inputFolder + "/layout/index.html", - dest: currentVersionArchiveFolder + "/index.html" + dest: currentVersionArchiveFolder + "/index.html", }, commonjs: { expand: true, flatten: true, src: [inputFolder + "/layout/*.json"], - dest: currentVersionArchiveFolder + dest: currentVersionArchiveFolder, }, cdnjs: { src: "deploy/cdnjs-package.json", - dest: "../cdnjs/ajax/libs/mithril/package.json" - } + dest: "../cdnjs/ajax/libs/mithril/package.json", + }, }, copy: { style: { src: inputFolder + "/layout/style.css", - dest: currentVersionArchiveFolder + "/style.css" + dest: currentVersionArchiveFolder + "/style.css", }, pages: { src: inputFolder + "/layout/pages.json", - dest: currentVersionArchiveFolder + "/pages.json" + dest: currentVersionArchiveFolder + "/pages.json", }, lib: { expand: true, cwd: inputFolder + "/layout/lib/", src: "./**", - dest: currentVersionArchiveFolder + "/lib/" + dest: currentVersionArchiveFolder + "/lib/", }, tools: { expand: true, cwd: inputFolder + "/layout/tools/", src: "./**", - dest: currentVersionArchiveFolder + "/tools/" + dest: currentVersionArchiveFolder + "/tools/", }, comparisons: { expand: true, cwd: inputFolder + "/layout/comparisons/", src: "./**", - dest: currentVersionArchiveFolder + "/comparisons/" + dest: currentVersionArchiveFolder + "/comparisons/", }, unminified: { src: "mithril.js", - dest: currentVersionArchiveFolder + "/mithril.js" + dest: currentVersionArchiveFolder + "/mithril.js", }, minified: { src: "mithril.min.js", - dest: currentVersionArchiveFolder + "/mithril.min.js" + dest: currentVersionArchiveFolder + "/mithril.min.js", }, readme: { src: "README.md", - dest: currentVersionArchiveFolder + "/README.md" + dest: currentVersionArchiveFolder + "/README.md", }, map: { src: "mithril.min.js.map", - dest: currentVersionArchiveFolder + "/mithril.min.js.map" + dest: currentVersionArchiveFolder + "/mithril.min.js.map", }, typescript: { src: "mithril.d.ts", - dest: currentVersionArchiveFolder + "/mithril.d.ts" + dest: currentVersionArchiveFolder + "/mithril.d.ts", }, publish: { expand: true, cwd: currentVersionArchiveFolder, src: "./**", - dest: outputFolder + dest: outputFolder, }, archive: { expand: true, cwd: currentVersionArchiveFolder, src: "./**", - dest: outputFolder + "/archive/v" + version - } + dest: outputFolder + "/archive/v" + version, + }, }, "saucelabs-browsers": { @@ -245,7 +245,7 @@ module.exports = function (grunt) { // eslint-disable-line return version === "dev" || version === "beta" || +version >= 38 // The latest ESR version }) - } + }, }, chrome: { @@ -256,7 +256,7 @@ module.exports = function (grunt) { // eslint-disable-line return version === "dev" || version === "beta" || +version >= 41 }) - } + }, }, ie: { @@ -265,7 +265,7 @@ module.exports = function (grunt) { // eslint-disable-line return browser.browserName === "internet explorer" && !/2003/.test(browser.platform) }) - } + }, }, edge: { @@ -273,7 +273,7 @@ module.exports = function (grunt) { // eslint-disable-line return browsers.filter(function (browser) { return browser.browserName === "microsoftedge" }) - } + }, }, safari: { @@ -281,7 +281,7 @@ module.exports = function (grunt) { // eslint-disable-line return browsers.filter(function (browser) { return browser.browserName === "safari" }) - } + }, }, opera: { @@ -289,8 +289,8 @@ module.exports = function (grunt) { // eslint-disable-line return browsers.filter(function (browser) { return browser.browserName === "opera" }) - } - } + }, + }, }, saucelabs: { @@ -303,7 +303,7 @@ module.exports = function (grunt) { // eslint-disable-line urls: ["http://localhost:8000/test/index.html"], sauceConfig: { "record-video": false, - "record-screenshots": false + "record-screenshots": false, }, build: process.env.TRAVIS_JOB_ID, onTestComplete: function (result, callback) { @@ -312,13 +312,13 @@ module.exports = function (grunt) { // eslint-disable-line var url = [ "https://saucelabs.com/rest/v1", user, "jobs", - result.job_id + result.job_id, ].join("/") require("request").put({ url: url, auth: {user: user, pass: pass}, - json: {passed: result.passed} + json: {passed: result.passed}, }, function (error, response) { if (error) { return callback(error) @@ -331,24 +331,24 @@ module.exports = function (grunt) { // eslint-disable-line } }) }, - tunnelTimeout: 5 - } - } + tunnelTimeout: 5, + }, + }, }, connect: { server: { options: { port: 8888, - base: "." - } - } + base: ".", + }, + }, }, clean: { options: {force: true}, - generated: [tempFolder] - } + generated: [tempFolder], + }, }) grunt.loadNpmTasks("grunt-saucelabs-browsers") @@ -370,7 +370,7 @@ module.exports = function (grunt) { // eslint-disable-line "md2html", "replace", "copy", - "clean" + "clean", ]) grunt.registerTask("test", ["eslint:all", "mocha_phantomjs"]) @@ -379,6 +379,6 @@ module.exports = function (grunt) { // eslint-disable-line grunt.registerTask("sauce", [ "saucelabs-browsers:all", "connect", - "saucelabs" + "saucelabs", ]) } diff --git a/docs/layout/tools/template-converter.js b/docs/layout/tools/template-converter.js index 55217ba3..34323507 100644 --- a/docs/layout/tools/template-converter.js +++ b/docs/layout/tools/template-converter.js @@ -14,7 +14,7 @@ window.templateConverter = (function () { return [ new DOMParser() .parseFromString(markup, "text/html") - .childNodes[1] + .childNodes[1], ] } @@ -39,7 +39,7 @@ window.templateConverter = (function () { list.push({ tag: el.nodeName.toLowerCase(), attrs: attrs, - children: createVirtual(el.childNodes) + children: createVirtual(el.childNodes), }) } }) @@ -115,7 +115,7 @@ window.templateConverter = (function () { var body = this.virtuals.join("," + tab) return "[" + tab + body + tab.slice(0, -1) + "]" } - } + }, } return { @@ -134,12 +134,12 @@ window.templateConverter = (function () { m("textarea", { autofocus: true, style: {width: "100%", height: "40%"}, - onchange: m.withAttr("value", ctrl.source) + onchange: m.withAttr("value", ctrl.source), }, ctrl.source()), m("button", {onclick: ctrl.convert}, "Convert"), m("textarea", {style: {width: "100%", height: "40%"}}, - ctrl.output()) + ctrl.output()), ]) - } + }, } })() diff --git a/mithril.js b/mithril.js index 864565f4..7f1cba65 100644 --- a/mithril.js +++ b/mithril.js @@ -231,7 +231,7 @@ index: i, from: existing[key].index, element: cached.nodes[existing[key].index] || - $document.createElement("div") + $document.createElement("div"), } } else { existing[key] = {action: INSERTION, index: i} @@ -263,7 +263,7 @@ insertNode(parent, dummy, index) newCached.splice(index, 0, { attrs: {key: data[index].attrs.key}, - nodes: [dummy] + nodes: [dummy], }) newCached.nodes[index] = dummy break @@ -691,7 +691,7 @@ tag: data.tag, attrs: attrs, children: children, - nodes: [node] + nodes: [node], } unloadCachedControllers(cached, views, controllers) @@ -729,7 +729,7 @@ if (controller.onunload != null) { unloaders.push({ controller: controller, - handler: controller.onunload + handler: controller.onunload, }) } @@ -1130,7 +1130,7 @@ this.appendChild(node) }, - childNodes: [] + childNodes: [], } var nodeCache = [] @@ -1293,7 +1293,7 @@ preventDefault: function () { isPrevented = true computePreRedrawHook = computePostRedrawHook = null - } + }, } forEach(unloaders, function (unloader) { @@ -1431,7 +1431,7 @@ var modes = { pathname: "", hash: "#", - search: "?" + search: "?", } var redirect = noop @@ -1948,8 +1948,8 @@ options.onload({ type: "load", target: { - responseText: resp - } + responseText: resp, + }, }) window[callbackKey] = undefined @@ -1962,8 +1962,8 @@ type: "error", target: { status: 500, - responseText: '{"error": "Error making jsonp request"}' - } + responseText: '{"error": "Error making jsonp request"}', + }, }) window[callbackKey] = undefined diff --git a/test-deps/mock.js b/test-deps/mock.js index 239af53c..21a0bc9c 100644 --- a/test-deps/mock.js +++ b/test-deps/mock.js @@ -49,7 +49,7 @@ this.mock = (function (global) { // the browser. Still waiting on mocha-phantomjs to update to be // compatible with PhantomJS 2.x. phantom: global.window && global.window.navigator && - /PhantomJS/.test(global.window.navigator.userAgent) + /PhantomJS/.test(global.window.navigator.userAgent), } var document = window.document = { @@ -102,7 +102,7 @@ this.mock = (function (global) { }, addEventListener: function () {}, - removeEventListener: function () {} + removeEventListener: function () {}, } }, @@ -156,7 +156,7 @@ this.mock = (function (global) { traverse(document) return out - } + }, } document.documentElement = document.createElement("html") @@ -182,7 +182,7 @@ this.mock = (function (global) { indices[id] = callbacks.length callbacks.push({ callback: callback, - id: id + id: id, }) return id } @@ -258,7 +258,7 @@ this.mock = (function (global) { replaceState: function (data, title, url) { location.pathname = location.search = location.hash = url - } + }, } return window diff --git a/test/input-cursor.html b/test/input-cursor.html index 8ee57964..71ee843e 100644 --- a/test/input-cursor.html +++ b/test/input-cursor.html @@ -20,13 +20,13 @@ function test(sel) { return m("li", [ m("p", m("code", "m(" + JSON.stringify(sel) + ")")), - m.apply(null, arguments) + m.apply(null, arguments), ]) } m.module(document.getElementById("test"), { controller: function() { - this.title = m.prop("hello world"); + this.title = m.prop("hello world") }, view: function (ctrl) { @@ -35,18 +35,18 @@ m.module(document.getElementById("test"), { m("ul", [ test("input[list=data]", { onkeyup: m.withAttr("value", ctrl.title), - value: ctrl.title() + value: ctrl.title(), }), test("datalist#data", [ m("option", "John"), m("option", "Bob"), - m("option", "Mary") + m("option", "Mary"), ]), test("textarea", { onkeyup: m.withAttr("value", ctrl.title), - value: ctrl.title() + value: ctrl.title(), }), m("li", [ @@ -63,11 +63,11 @@ m.module(document.getElementById("test"), { m("code", "m(\"div[contenteditable]\")")), m("div[contenteditable]", { style: {border: "1px solid #888"}, - onkeyup: m.withAttr("innerHTML", ctrl.title) + onkeyup: m.withAttr("innerHTML", ctrl.title), }, m.trust(ctrl.title())), - ]) - ]) - ]); - } -}); + ]), + ]), + ]) + }, +}) diff --git a/test/mithril.js b/test/mithril.js index bf86f972..37b618d6 100644 --- a/test/mithril.js +++ b/test/mithril.js @@ -202,7 +202,7 @@ describe("m()", function () { controller: spy, view: function () { return m("div", "testing") - } + }, } var args = {age: 12} diff --git a/test/mithril.mount.js b/test/mithril.mount.js index f76de2eb..a5ae6e61 100644 --- a/test/mithril.mount.js +++ b/test/mithril.mount.js @@ -22,7 +22,7 @@ describe("m.mount()", function () { function pure(view) { return { controller: function () {}, - view: view + view: view, } } @@ -38,7 +38,7 @@ describe("m.mount()", function () { return [ whatever % 2 ? m("span", "% 2") : undefined, m("div", "bugs"), - m("a") + m("a"), ] }) @@ -64,7 +64,7 @@ describe("m.mount()", function () { var mod1 = m.mount(root1, { controller: controller1, - view: view1 + view: view1, }) var controller2 = sinon.spy(function () { this.value = "test2" }) // eslint-disable-line @@ -73,7 +73,7 @@ describe("m.mount()", function () { var mod2 = mount(root2, { controller: controller2, - view: view2 + view: view2, }) expect(controller1).to.have.been.called @@ -97,7 +97,7 @@ describe("m.mount()", function () { controller: function () { this.onunload = spy }, - view: function () {} + view: function () {}, }) clear(root) @@ -114,7 +114,7 @@ describe("m.mount()", function () { var component = { controller: ctrlSpy, - view: viewSpy + view: viewSpy, } var arg = {} @@ -148,7 +148,7 @@ describe("m.mount()", function () { var sub = { controller: ctrlSpy, - view: viewSpy + view: viewSpy, } mount(root, pure(function () { return sub })) @@ -168,7 +168,7 @@ describe("m.mount()", function () { var subsub = { controller: ctrl1, - view: view1 + view: view1, } var ctrl2 = sinon.spy() @@ -176,7 +176,7 @@ describe("m.mount()", function () { var sub = { controller: ctrl2, - view: view2 + view: view2, } mount(root, pure(function () { return sub })) @@ -326,7 +326,7 @@ describe("m.mount()", function () { }, view: function () { return m("div") - } + }, } mount(root, pure(function () { @@ -358,7 +358,7 @@ describe("m.mount()", function () { }, view: function () { return m("div") - } + }, } var sub = { @@ -367,7 +367,7 @@ describe("m.mount()", function () { }, view: function (ctrl, opts) { return m.component(subsub, {key: opts.key}) - } + }, } mount(root, pure(function () { @@ -400,7 +400,7 @@ describe("m.mount()", function () { controller: function () { m.redraw() }, - view: spy + view: spy, } mount(root, pure(function () { return sub })) @@ -418,7 +418,7 @@ describe("m.mount()", function () { controller: function () { m.redraw() }, - view: spy + view: spy, } var sub = pure(function () { return subsub }) @@ -439,14 +439,14 @@ describe("m.mount()", function () { var CommentList = pure(function (ctrl, props) { return m(".list", props.list.map(function (i) { return m(".comment", [ - m.component(Reply, {key: i}) + m.component(Reply, {key: i}), ]) })) }) mount(root, pure(function () { return m(".outer", [ - m(".inner", m.component(CommentList, {list: [1, 2, 3]})) + m(".inner", m.component(CommentList, {list: [1, 2, 3]})), ]) })) @@ -461,7 +461,7 @@ describe("m.mount()", function () { controller: function () { this.onunload = spy }, - view: function () {} + view: function () {}, }) m.mount(root, pure(function () {})) @@ -480,7 +480,7 @@ describe("m.mount()", function () { return m("div", { config: function (el, init) { if (init) count += 1 - } + }, }) })) @@ -506,9 +506,9 @@ describe("m.mount()", function () { m(".foo", { key: 1, config: test, - onclick: function () { show = !show } + onclick: function () { show = !show }, }), - show ? m(".bar", {key: 2}) : null + show ? m(".bar", {key: 2}) : null, ] })) @@ -530,9 +530,9 @@ describe("m.mount()", function () { mount(root, pure(function () { return show ? [ m("h1", "1"), - sub + sub, ] : [ - m("h1", "2") + m("h1", "2"), ] })) @@ -561,10 +561,10 @@ describe("m.mount()", function () { a = !a m.redraw(true) found = root.childNodes[0].childNodes[1] - } + }, }, "asd"), a ? m("#a", "aaa") : null, - "test" + "test", ]) }) @@ -573,7 +573,7 @@ describe("m.mount()", function () { config: function (el, init, ctx) { if (!init) ctx.onunload = onunload - } + }, } m.mount(root, pure(function () { return Comp })) @@ -603,10 +603,10 @@ describe("m.mount()", function () { m.redraw(true) found = root.childNodes[0].childNodes[1] m.redraw.strategy("none") - } + }, }, "asd"), a ? m("#a", "aaa") : null, - "test" + "test", ]) }) @@ -615,7 +615,7 @@ describe("m.mount()", function () { config: function (el, init, ctx) { if (!init) ctx.onunload = onunload - } + }, } m.mount(root, pure(function () { return Comp })) @@ -635,7 +635,7 @@ describe("m.mount()", function () { var root = mock.document.createElement("div") var view = sinon.stub().returns(m("div", { - onclick: function () { m.redraw(true) } + onclick: function () { m.redraw(true) }, })) m.mount(root, pure(view)) @@ -667,7 +667,7 @@ describe("m.mount()", function () { this.foo = m.request({method: "GET", url: "/foo"}) }, - view: view + view: view, } mount(root, pure(function () { return Comp })) @@ -692,20 +692,20 @@ describe("m.mount()", function () { controller: function () { this.foo = m.request({method: "GET", url: "/foo"}) }, - view: view1 + view: view1, } var Comp2 = { controller: function () { this.bar = m.request({method: "GET", url: "/bar"}) }, - view: view2 + view: view2, } mount(root, pure(function () { return m("div", [ Comp1, - Comp2 + Comp2, ]) })) @@ -752,7 +752,7 @@ describe("m.mount()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - } + }, }) }) @@ -795,9 +795,9 @@ describe("m.mount()", function () { ctrl.bar = true m.redraw(true) el = root.childNodes[0].childNodes[1] - } + }, }, "click me"), - ctrl.bar ? m.component(sub) : "" + ctrl.bar ? m.component(sub) : "", ]) })) diff --git a/test/mithril.redraw.js b/test/mithril.redraw.js index ada5b196..a6efe643 100644 --- a/test/mithril.redraw.js +++ b/test/mithril.redraw.js @@ -15,7 +15,7 @@ describe("m.redraw()", function () { m.mount(root, { controller: function () { ctx = this }, // eslint-disable-line - view: function (ctrl) { return ctrl.value } + view: function (ctrl) { return ctrl.value }, }) mock.requestAnimationFrame.$resolve() @@ -38,7 +38,7 @@ describe("m.redraw()", function () { m.mount(root, { controller: function () {}, - view: view + view: view, }) mock.requestAnimationFrame.$resolve() // teardown m.redraw() @@ -57,7 +57,7 @@ describe("m.redraw()", function () { var view = sinon.spy() m.mount(root, { controller: function () {}, - view: view + view: view, }) mock.requestAnimationFrame.$resolve() // teardown m.redraw(true) @@ -88,7 +88,7 @@ describe("m.redraw()", function () { function pure(view) { return { controller: noop, - view: view + view: view, } } @@ -138,8 +138,8 @@ describe("m.redraw()", function () { }, view: function () { return m("div") - } - } + }, + }, }) expect(strategy).to.equal("all") @@ -164,8 +164,8 @@ describe("m.redraw()", function () { }, view: function () { return m("div", {config: config}) - } - } + }, + }, }) route("/bar1") @@ -185,10 +185,10 @@ describe("m.redraw()", function () { strategy = m.redraw.strategy() ctrl.number++ m.redraw.strategy("none") - } + }, }, ctrl.number) - } - } + }, + }, }) root.childNodes[0].onclick({}) mock.requestAnimationFrame.$resolve() @@ -211,9 +211,9 @@ describe("m.redraw()", function () { config: config, onclick: function () { m.redraw.strategy("all") - } + }, }) - }) + }), }) root.childNodes[0].onclick({}) mock.requestAnimationFrame.$resolve() diff --git a/test/mithril.render.js b/test/mithril.render.js index 34faa178..7b00ccc3 100644 --- a/test/mithril.render.js +++ b/test/mithril.render.js @@ -62,7 +62,7 @@ describe("m.render()", function () { m.render(root, m("svg", [m("g")])) expect(root.childNodes[0].childNodes[0]).to.contain.all.keys({ nodeName: "G", - namespaceURI: "http://www.w3.org/2000/svg" + namespaceURI: "http://www.w3.org/2000/svg", }) }) @@ -237,7 +237,7 @@ describe("m.render()", function () { m.render(root, m("#foo", [ [m("div", "a"), m("div", "b")], [m("div", "c"), m("div", "d")], - m("#bar") + m("#bar"), ])) expect(root.childNodes[0].childNodes[3].childNodes[0].nodeValue) @@ -269,7 +269,7 @@ describe("m.render()", function () { ["a", "b", "c", "d"].map(function () { return [m("div"), " "] }), - m("span") + m("span"), ])) expect(root.childNodes[0].childNodes[8].nodeName).to.equal("SPAN") }) @@ -282,7 +282,7 @@ describe("m.render()", function () { m.render(root, m("#foo", [ [m("div", "a"), m("div", "b"), m("div", "c")], - m("#bar") + m("#bar"), ])) expect(root.childNodes[0].childNodes[2].childNodes[0].nodeValue) @@ -295,12 +295,12 @@ describe("m.render()", function () { m.render(root, m("main", [ m("button"), - m("article", [m("section"), m("nav")]) + m("article", [m("section"), m("nav")]), ])) m.render(root, m("main", [ m("button"), - m("article", [m("span"), m("nav")]) + m("article", [m("span"), m("nav")]), ])) expect(root.childNodes[0].childNodes[1].childNodes[0].nodeName) @@ -313,12 +313,12 @@ describe("m.render()", function () { m.render(root, m("main", [ m("button"), - m("article", [m("section"), m("nav")]) + m("article", [m("section"), m("nav")]), ])) m.render(root, m("main", [ m("button"), - m("article", ["test", m("nav")]) + m("article", ["test", m("nav")]), ])) expect(root.childNodes[0].childNodes[1].childNodes[0].nodeValue) @@ -331,12 +331,12 @@ describe("m.render()", function () { m.render(root, m("main", [ m("button"), - m("article", [m("section"), m("nav")]) + m("article", [m("section"), m("nav")]), ])) m.render(root, m("main", [ m("button"), - m("article", [m.trust("test"), m("nav")]) + m("article", [m.trust("test"), m("nav")]), ])) expect(root.childNodes[0].childNodes[1].childNodes[0].nodeValue) @@ -550,7 +550,7 @@ describe("m.render()", function () { var config = sinon.spy() m.render(root, m("div", { - config: function (el, init, ctx) { ctx.data = 1 } + config: function (el, init, ctx) { ctx.data = 1 }, })) m.render(root, m("div", {config: config})) @@ -564,7 +564,7 @@ describe("m.render()", function () { var index = 0 var node = m("div", { - config: function (el, init, ctx) { ctx.data = index++ } + config: function (el, init, ctx) { ctx.data = index++ }, }) m.render(root, [node, node]) @@ -604,7 +604,7 @@ describe("m.render()", function () { m.render(root, m("div", [ ["foo", "bar"], ["foo", "bar"], - ["foo", "bar"] + ["foo", "bar"], ])) m.render(root, m("div", ["asdf", "asdf2", "asdf3"])) @@ -619,7 +619,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3) + m("a", {key: 3}, 3), ]) var firstBefore = root.childNodes[0] @@ -628,7 +628,7 @@ describe("m.render()", function () { m("a", {key: 4}, 4), m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3) + m("a", {key: 3}, 3), ]) var firstAfter = root.childNodes[1] @@ -648,7 +648,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3) + m("a", {key: 3}, 3), ]) var firstBefore = root.childNodes[0] @@ -656,7 +656,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 4}, 4), m("a", {key: 1}, 1), - m("a", {key: 2}, 2) + m("a", {key: 2}, 2), ]) var firstAfter = root.childNodes[1] @@ -676,7 +676,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3) + m("a", {key: 3}, 3), ]) var firstBefore = root.childNodes[1] @@ -684,7 +684,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 2}, 2), m("a", {key: 3}, 3), - m("a", {key: 4}, 4) + m("a", {key: 4}, 4), ]) var firstAfter = root.childNodes[0] @@ -706,7 +706,7 @@ describe("m.render()", function () { m("a", {key: 2}, 2), m("a", {key: 3}, 3), m("a", {key: 4}, 4), - m("a", {key: 5}, 5) + m("a", {key: 5}, 5), ]) var firstBefore = root.childNodes[0] @@ -717,7 +717,7 @@ describe("m.render()", function () { m("a", {key: 4}, 4), m("a", {key: 10}, 10), m("a", {key: 1}, 1), - m("a", {key: 2}, 2) + m("a", {key: 2}, 2), ]) var firstAfter = root.childNodes[2] @@ -740,7 +740,7 @@ describe("m.render()", function () { m("a", {key: 2}, 2), m("a", {key: 3}, 3), m("a", {key: 4}, 4), - m("a", {key: 5}, 5) + m("a", {key: 5}, 5), ]) var firstBefore = root.childNodes[0] @@ -753,7 +753,7 @@ describe("m.render()", function () { m("a", {key: 2}, 2), m("a", {key: 1}, 1), m("a", {key: 6}, 6), - m("a", {key: 7}, 7) + m("a", {key: 7}, 7), ]) var firstAfter = root.childNodes[3] @@ -780,7 +780,7 @@ describe("m.render()", function () { m("a", {key: 2}), m("a"), m("a", {key: 4}), - m("a", {key: 5}) + m("a", {key: 5}), ]) var firstBefore = root.childNodes[0] @@ -794,7 +794,7 @@ describe("m.render()", function () { m("a", {key: 5}), m("a"), m("a", {key: 1}), - m("a", {key: 2}) + m("a", {key: 2}), ]) var firstAfter = root.childNodes[3] @@ -848,8 +848,8 @@ describe("m.render()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = spy - } - }) + }, + }), ]) m.render(root, [ m("div", {key: 2}), @@ -857,8 +857,8 @@ describe("m.render()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = spy - } - }) + }, + }), ]) expect(spy).to.not.have.been.called }) @@ -918,7 +918,7 @@ describe("m.render()", function () { m.render(root, m("ul", [ m("li", {key: 0}, 0), m("li", {key: 2}, 2), - m("li", {key: 4}, 4) + m("li", {key: 4}, 4), ])) m.render(root, m("ul", [ @@ -927,7 +927,7 @@ describe("m.render()", function () { m("li", {key: 2}, 2), m("li", {key: 3}, 3), m("li", {key: 4}, 4), - m("li", {key: 5}, 5) + m("li", {key: 5}, 5), ])) expect( @@ -963,7 +963,7 @@ describe("m.render()", function () { m("li", {key: 2}, 2), m("li", {key: 3}, 3), m("li", {key: 4}, 4), - m("li", {key: 5}, 5) + m("li", {key: 5}, 5), ])) m.render(root, m("ul", [ @@ -971,7 +971,7 @@ describe("m.render()", function () { m("li", {key: 1}, 1), m("li", {key: 2}, 2), m("li", {key: 4}, 4), - m("li", {key: 5}, 5) + m("li", {key: 5}, 5), ])) expect( @@ -991,7 +991,7 @@ describe("m.render()", function () { m("li", {key: 2}, 2), m("li", {key: 3}, 3), m("li", {key: 4}, 4), - m("li", {key: 5}, 5) + m("li", {key: 5}, 5), ])) m.render(root, m("ul", [ @@ -1000,7 +1000,7 @@ describe("m.render()", function () { m("li", {key: 3}, 3), m("li", {key: 4}, 4), m("li", {key: 5}, 5), - m("li", {key: 6}, 6) + m("li", {key: 6}, 6), ])) m.render(root, m("ul", [ @@ -1009,7 +1009,7 @@ describe("m.render()", function () { m("li", {key: 14}, 14), m("li", {key: 15}, 15), m("li", {key: 16}, 16), - m("li", {key: 17}, 17) + m("li", {key: 17}, 17), ])) expect( @@ -1045,7 +1045,7 @@ describe("m.render()", function () { m.render(root, [m("div", { config: function (el, init, ctx) { ctx.onunload = onunload1 - } + }, })]) m.render(root, []) @@ -1053,7 +1053,7 @@ describe("m.render()", function () { m.render(root, [m("div", { config: function (el, init, ctx) { ctx.onunload = onunload2 - } + }, })]) m.render(root, []) @@ -1069,7 +1069,7 @@ describe("m.render()", function () { m.render(root, [ m("div.green", [m("div")]), - m("div.blue") + m("div.blue"), ]) expect(root.childNodes).to.have.length(2) @@ -1103,7 +1103,7 @@ describe("m.render()", function () { m("div", {key: 3}, 3), m("div", {key: 4}, 4), m("div", {key: 5}, 5), - null, null, null, null, null, null, null, null, null, null + null, null, null, null, null, null, null, null, null, null, ])) m.render(root, m("div", [ @@ -1116,7 +1116,7 @@ describe("m.render()", function () { null, null, m("div", {key: 12}, 12), null, null, - m("div", {key: 15}, 15) + m("div", {key: 15}, 15), ])) m.render(root, m("div", [ @@ -1125,7 +1125,7 @@ describe("m.render()", function () { m("div", {key: 3}, 3), m("div", {key: 4}, 4), m("div", {key: 5}, 5), - null, null, null, null, null, null, null, null, null, null + null, null, null, null, null, null, null, null, null, null, ])) expect( @@ -1146,9 +1146,9 @@ describe("m.render()", function () { [ m("div", {key: 3}, 3), m("div", {key: 4}, 4), - m("div", {key: 5}, 5) + m("div", {key: 5}, 5), ], - [m("div", {key: 6}, 6)] + [m("div", {key: 6}, 6)], ])) m.render(root, m("div", [ @@ -1157,9 +1157,9 @@ describe("m.render()", function () { [ m("div", {key: 3}, 3), m("div", {key: 4}, 4), - m("div", {key: 5}, 5) + m("div", {key: 5}, 5), ], - [m("div", {key: 6}, 6)] + [m("div", {key: 6}, 6)], ])) expect( @@ -1184,7 +1184,7 @@ describe("m.render()", function () { m.render(root, [ m("#div-1", {key: 1}), m("#div-2", {key: 2}), - m("#div-3", {key: 3}) + m("#div-3", {key: 3}), ]) root.appendChild(root.childNodes[1]) @@ -1192,7 +1192,7 @@ describe("m.render()", function () { m.render(root, [ m("#div-1", {key: 1}), m("#div-3", {key: 3}), - m("#div-2", {key: 2}) + m("#div-2", {key: 2}), ]) expect( @@ -1229,7 +1229,7 @@ describe("m.render()", function () { m("a", {key: 1}), m("a", {key: 2}), m("a", {key: 3}), - m("i") + m("i"), ])) var before = root.childNodes[0].childNodes[3] @@ -1237,7 +1237,7 @@ describe("m.render()", function () { m("b", {key: 3}), m("b", {key: 4}), m("i"), - m("b", {key: 1}) + m("b", {key: 1}), ])) var after = root.childNodes[0].childNodes[2] @@ -1252,7 +1252,7 @@ describe("m.render()", function () { m("a", {key: 2}), "foo", m("a", {key: 3}), - m("i") + m("i"), ])) var before = root.childNodes[0].childNodes[4] @@ -1261,7 +1261,7 @@ describe("m.render()", function () { m("a", {key: 4}), "bar", m("i"), - m("a", {key: 1}) + m("a", {key: 1}), ])) var after = root.childNodes[0].childNodes[3] @@ -1276,7 +1276,7 @@ describe("m.render()", function () { m("a", {key: 2}), null, m("a", {key: 3}), - m("i") + m("i"), ])) var before = root.childNodes[0].childNodes[4] @@ -1285,7 +1285,7 @@ describe("m.render()", function () { m("a", {key: 4}), null, m("i"), - m("a", {key: 1}) + m("a", {key: 1}), ])) var after = root.childNodes[0].childNodes[3] @@ -1300,7 +1300,7 @@ describe("m.render()", function () { m("a", {key: 2}), undefined, m("a", {key: 3}), - m("i") + m("i"), ])) var before = root.childNodes[0].childNodes[4] @@ -1309,7 +1309,7 @@ describe("m.render()", function () { m("a", {key: 4}), undefined, m("i"), - m("a", {key: 1}) + m("a", {key: 1}), ])) var after = root.childNodes[0].childNodes[3] @@ -1326,7 +1326,7 @@ describe("m.render()", function () { m("a", {key: 2}), m.trust("a"), m("a", {key: 3}), - m("i") + m("i"), ])) var before = root.childNodes[0].childNodes[4] @@ -1335,7 +1335,7 @@ describe("m.render()", function () { m("a", {key: 4}), m.trust("a"), m("i"), - m("a", {key: 1}) + m("a", {key: 1}), ])) var after = root.childNodes[0].childNodes[3] @@ -1361,7 +1361,7 @@ describe("m.render()", function () { m.render(root, m("div", {}, [ m("div", {}, "0"), m("div", {}, "1"), - m("div", {}, "2") + m("div", {}, "2"), ])) expect( @@ -1371,7 +1371,7 @@ describe("m.render()", function () { ).to.eql(["0", "1", "2"]) m.render(root, m("div", {}, [ - m("div", {}, "0") + m("div", {}, "0"), ])) expect( @@ -1386,7 +1386,7 @@ describe("m.render()", function () { m.render(root, m("span", {}, [ m("div", {}, "0"), m("div", {}, "1"), - m("div", {}, "2") + m("div", {}, "2"), ])) expect( @@ -1396,7 +1396,7 @@ describe("m.render()", function () { ).to.eql(["0", "1", "2"]) m.render(root, m("span", {}, [ - m("div", {}, "0") + m("div", {}, "0"), ])) expect( @@ -1421,9 +1421,9 @@ describe("m.render()", function () { view: function (ctrl) { return m("input", { value: ctrl.inputValue(), - onkeyup: m.withAttr("value", ctrl.inputValue) + onkeyup: m.withAttr("value", ctrl.inputValue), }) - } + }, }) mock.requestAnimationFrame.$resolve() @@ -1467,11 +1467,11 @@ describe("m.render()", function () { return m("form", {onsubmit: ctrl.submit}, [ m("input", { onkeyup: m.withAttr("value", ctrl.inputValue), - value: ctrl.inputValue() + value: ctrl.inputValue(), }), - m("button[type=submit]") + m("button[type=submit]"), ]) - } + }, }) var form = root.childNodes[0] @@ -1512,7 +1512,7 @@ describe("m.render()", function () { view: function (ctrl) { return m("select", { size: ctrl.values.length, - multiple: "multiple" + multiple: "multiple", }, [ ctrl.values.map(function (v) { var opts = {value: v} @@ -1520,9 +1520,9 @@ describe("m.render()", function () { opts.selected = "selected" } return m("option", opts, v) - }) + }), ]) - } + }, }) mock.requestAnimationFrame.$resolve() diff --git a/test/mithril.request.js b/test/mithril.request.js index fd8ab1f4..e2409959 100644 --- a/test/mithril.request.js +++ b/test/mithril.request.js @@ -21,12 +21,12 @@ describe("m.request()", function () { it("sets the correct properties on `GET`", function () { var prop = request({ method: "GET", - url: "test" + url: "test", }) expect(prop()).to.contain.keys({ method: "GET", - url: "test" + url: "test", }) }) @@ -49,12 +49,12 @@ describe("m.request()", function () { var prop = request({ method: "POST", url: "http://domain.com:80", - data: {} + data: {}, }) expect(prop()).to.contain.keys({ method: "POST", - url: "http://domain.com:80" + url: "http://domain.com:80", }) }) @@ -62,7 +62,7 @@ describe("m.request()", function () { expect(request({ method: "POST", url: "http://domain.com:80/:test1", - data: {test1: "foo"} + data: {test1: "foo"}, })().url).to.equal("http://domain.com:80/foo") }) @@ -72,7 +72,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new Error("error occurred") } + deserialize: function () { throw new Error("error occurred") }, }).then(null, error) resolve() @@ -86,7 +86,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new Error("error occurred") } + deserialize: function () { throw new Error("error occurred") }, }).catch(error) resolve() @@ -99,7 +99,7 @@ describe("m.request()", function () { var data = m.prop() var prop = m.request({ method: "GET", - url: "test" + url: "test", }) .then(function () { return "foo" }) .finally(data) @@ -142,7 +142,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new Error("error occurred") } + deserialize: function () { throw new Error("error occurred") }, }) .catch(error) .finally(function () { error("finally") }) @@ -158,7 +158,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new TypeError("error occurred") } + deserialize: function () { throw new TypeError("error occurred") }, }).then(null, error) try { @@ -178,7 +178,7 @@ describe("m.request()", function () { m.request({ method: "POST", url: "test", - data: {foo: 1} + data: {foo: 1}, }).then(null, error) var xhr = mock.XMLHttpRequest.$instances.pop() @@ -194,7 +194,7 @@ describe("m.request()", function () { m.request({ method: "POST", - url: "test" + url: "test", }).then(null, error) var xhr = mock.XMLHttpRequest.$instances.pop() @@ -207,7 +207,7 @@ describe("m.request()", function () { var prop = m.request({ method: "POST", url: "test", - initialValue: "foo" + initialValue: "foo", }) var initialValue = prop() @@ -220,7 +220,7 @@ describe("m.request()", function () { var prop = m.request({ method: "POST", url: "test", - initialValue: "foo" + initialValue: "foo", }).then(function (value) { return value }) var initialValue = prop() @@ -233,7 +233,7 @@ describe("m.request()", function () { var prop = m.request({ method: "POST", url: "test", - initialValue: "foo" + initialValue: "foo", }).then(function () { return "bar" }) resolve() @@ -290,7 +290,7 @@ describe("m.request()", function () { url: "/test", dataType: "jsonp", data: data, - callbackKey: callbackKey + callbackKey: callbackKey, }) } diff --git a/test/mithril.route.buildQueryString.js b/test/mithril.route.buildQueryString.js index bd53ad5e..f8c2e159 100644 --- a/test/mithril.route.buildQueryString.js +++ b/test/mithril.route.buildQueryString.js @@ -15,11 +15,11 @@ describe("m.route.buildQueryString()", function () { foo: "bar", hello: ["world", "mars", "mars"], world: { - test: 3 + test: 3, }, bam: "", yup: null, - removed: undefined + removed: undefined, }) ).to.equal("foo=bar&hello=world&hello=mars&world%5Btest%5D=3&bam=&yup") }) diff --git a/test/mithril.route.js b/test/mithril.route.js index 7317d268..20da73ec 100644 --- a/test/mithril.route.js +++ b/test/mithril.route.js @@ -13,7 +13,7 @@ describe("m.route()", function () { var types = { search: "?", hash: "#", - pathname: "/" + pathname: "/", } return function (type) { @@ -32,7 +32,7 @@ describe("m.route()", function () { function pure(view) { return { controller: noop, - view: view + view: view, } } @@ -74,7 +74,7 @@ describe("m.route()", function () { mode("search") route(root, "/test1", { - "/test1": pure(function () { return "foo" }) + "/test1": pure(function () { return "foo" }), }) expect(mock.location.search).to.equal("?/test1") @@ -88,12 +88,12 @@ describe("m.route()", function () { route(root, "/", { "/": { controller: function () { route1 = m.route() }, - view: noop + view: noop, }, "/test13": { controller: function () { route2 = m.route() }, - view: noop - } + view: noop, + }, }) m.route("/test13") @@ -113,7 +113,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - } + }, } route(root, "/a", { @@ -121,8 +121,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop - } + view: noop, + }, }) route("/b") @@ -142,7 +142,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - } + }, } var sub = pure(function () { return subsub }) @@ -152,8 +152,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop - } + view: noop, + }, }) route("/b") @@ -173,7 +173,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - } + }, } route(root, "/a", { @@ -181,8 +181,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop - } + view: noop, + }, }) route("/b") @@ -202,7 +202,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - } + }, } var sub = pure(function () { return subsub }) @@ -212,8 +212,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop - } + view: noop, + }, }) route("/b") @@ -229,26 +229,26 @@ describe("m.route()", function () { var sub1 = { controller: ctrl1, - view: function () { return m("div") } + view: function () { return m("div") }, } var sub2 = { controller: ctrl2, - view: function () { return m("div") } + view: function () { return m("div") }, } route(root, "/a", { "/a": pure(function () { return m(".page-a", [ - m("h1"), m.component(sub1, {x: 11}) + m("h1"), m.component(sub1, {x: 11}), ]) }), "/b": pure(function () { return m(".page-b", [ - m("h2"), m.component(sub2, {y: 22}) + m("h2"), m.component(sub2, {y: 22}), ]) - }) + }), }) route("/b") @@ -264,7 +264,7 @@ describe("m.route()", function () { var Component = pure(function () { return m(".comp") }) route(root, "/foo", { - "/foo": pure(function () { return [Component] }) + "/foo": pure(function () { return [Component] }), }) expect(root.childNodes[0].nodeName).to.equal("DIV") @@ -279,7 +279,7 @@ describe("m.route()", function () { view: function (ctrl) { return m("div", ctrl.name) - } + }, } route(root, "/", { @@ -287,7 +287,7 @@ describe("m.route()", function () { return m("div", [ m("a[href=/]", {config: m.route}, "foo"), m("a[href=/bar]", {config: m.route}, "bar"), - m.component(MyComponent, {name: "Jane"}) + m.component(MyComponent, {name: "Jane"}), ]) }), @@ -295,9 +295,9 @@ describe("m.route()", function () { return m("div", [ m("a[href=/]", {config: m.route}, "foo"), m("a[href=/bar]", {config: m.route}, "bar"), - m.component(MyComponent, {name: "Bob"}) + m.component(MyComponent, {name: "Bob"}), ]) - }) + }), }) route("/bar") @@ -313,9 +313,9 @@ describe("m.route()", function () { "/test2": pure(function () { return [ "foo", - m("a", {href: "/test2", config: m.route}, "Test2") + m("a", {href: "/test2", config: m.route}, "Test2"), ] - }) + }), }) expect(mock.location.pathname).to.equal("/test2") @@ -327,7 +327,7 @@ describe("m.route()", function () { mode("hash") route(root, "/test3", { - "/test3": pure(function () { return "foo" }) + "/test3": pure(function () { return "foo" }), }) expect(mock.location.hash).to.equal("#/test3") @@ -338,7 +338,7 @@ describe("m.route()", function () { mode("search") route(root, "/test4/foo", { - "/test4/:test": pure(function () { return m.route.param("test") }) + "/test4/:test": pure(function () { return m.route.param("test") }), }) expect(mock.location.search).to.equal("?/test4/foo") @@ -357,7 +357,7 @@ describe("m.route()", function () { m.route(root, "/test5/foo", { "/": component, - "/test5/:test": component + "/test5/:test": component, }) var paramValueBefore = m.route.param("test") @@ -381,7 +381,7 @@ describe("m.route()", function () { m.route(root, "/test6/foo", { "/": component, - "/test6/:a1": component + "/test6/:a1": component, }) var paramValueBefore = m.route.param("a1") @@ -406,7 +406,7 @@ describe("m.route()", function () { m.route(root, "/test7/foo", { "/": component, - "/test7/:a1": component + "/test7/:a1": component, }) var routeValueBefore = m.route() @@ -428,7 +428,7 @@ describe("m.route()", function () { route(root, "/test8/foo/SEP/bar/baz", { "/test8/:test/SEP/:path...": pure(function () { return m.route.param("test") + "_" + m.route.param("path") - }) + }), }) expect(mock.location.search).to.equal("?/test8/foo/SEP/bar/baz") @@ -441,7 +441,7 @@ describe("m.route()", function () { route(root, "/test9/foo/bar/SEP/baz", { "/test9/:test.../SEP/:path": pure(function () { return m.route.param("test") + "_" + m.route.param("path") - }) + }), }) expect(mock.location.search).to.equal("?/test9/foo/bar/SEP/baz") @@ -454,7 +454,7 @@ describe("m.route()", function () { route(root, "/test10/foo%20bar", { "/test10/:test": pure(function () { return m.route.param("test") - }) + }), }) expect(root.childNodes[0].nodeValue).to.equal("foo bar") @@ -465,7 +465,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "foo" }), - "/test11": pure(function () { return "bar" }) + "/test11": pure(function () { return "bar" }), }) route("/test11/") @@ -479,7 +479,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(noop), - "/test12": pure(noop) + "/test12": pure(noop), }) route("/test12?a=foo&b=bar") @@ -496,7 +496,7 @@ describe("m.route()", function () { "/": pure(function () { return "bar" }), "/test13/:test": pure(function () { return m.route.param("test") - }) + }), }) route("/test13/foo?test=bar") @@ -510,7 +510,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "bar" }), - "/test14": pure(function () { return "foo" }) + "/test14": pure(function () { return "foo" }), }) route("/test14?test&test2=") @@ -525,7 +525,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(noop), - "/test12": pure(noop) + "/test12": pure(noop), }) route("/test12", {a: "foo", b: "bar"}) @@ -540,7 +540,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(noop), - "/test12": pure(noop) + "/test12": pure(noop), }) route("/test12", {a: "foo", b: "bar"}) @@ -562,10 +562,10 @@ describe("m.route()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - } + }, }) }), - "/test14": pure(noop) + "/test14": pure(noop), }) route("/test14") @@ -585,11 +585,11 @@ describe("m.route()", function () { m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - } - }) + }, + }), ] }), - "/test15": pure(function () { return [m("div")] }) + "/test15": pure(function () { return [m("div")] }), }) route("/test15") @@ -607,10 +607,10 @@ describe("m.route()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - } + }, }) }), - "/test16": pure(function () { return m("a") }) + "/test16": pure(function () { return m("a") }), }) route("/test16") @@ -629,11 +629,11 @@ describe("m.route()", function () { m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - } - }) + }, + }), ] }), - "/test17": pure(function () { return m("a") }) + "/test17": pure(function () { return m("a") }), }) route("/test17") @@ -651,10 +651,10 @@ describe("m.route()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - } + }, }) }), - "/test18": pure(function () { return [m("a")] }) + "/test18": pure(function () { return [m("a")] }), }) route("/test18") @@ -674,8 +674,8 @@ describe("m.route()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = onunload - } - }) + }, + }), ] }), "/test20": pure(function () { @@ -684,10 +684,10 @@ describe("m.route()", function () { key: 2, config: function (el, init, ctx) { ctx.onunload = onunload - } - }) + }, + }), ] - }) + }), }) route("/test20") @@ -707,8 +707,8 @@ describe("m.route()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = onunload - } - }) + }, + }), ] }), "/test21": pure(function () { @@ -716,10 +716,10 @@ describe("m.route()", function () { m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - } - }) + }, + }), ] - }) + }), }) route("/test21") @@ -732,7 +732,7 @@ describe("m.route()", function () { route(root, "/foo", { "/foo": pure(function () { return m("div", "foo") }), - "/bar": pure(function () { return m("div", "bar") }) + "/bar": pure(function () { return m("div", "bar") }), }) var foo = root.childNodes[0].childNodes[0].nodeValue @@ -757,7 +757,7 @@ describe("m.route()", function () { }), "/bar1": pure(function () { return m("main", m("a", {config: config}, "foo")) - }) + }), }) route("/bar1") @@ -774,8 +774,8 @@ describe("m.route()", function () { controller: function () { value = m.route.param("arg") }, view: function () { return "" - } - } + }, + }, }) expect(value).to.equal("foo+bar") }) @@ -785,7 +785,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "foo" }), - "/test22": pure(function () { return "bar" }) + "/test22": pure(function () { return "bar" }), }) m.route("/test22/") @@ -799,7 +799,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "foo" }), - "/test23": pure(function () { return "bar" }) + "/test23": pure(function () { return "bar" }), }) route(new String("/test23/")) // eslint-disable-line no-new-wrappers @@ -817,8 +817,8 @@ describe("m.route()", function () { controller: function () { value = m.route.param("arg") }, view: function () { return "" - } - } + }, + }, }) expect(value).to.equal("foo+bar") }) @@ -832,8 +832,8 @@ describe("m.route()", function () { controller: function () { value = m.route.param("arg") }, view: function () { return "" - } - } + }, + }, }) expect(value).to.equal("foo+bar") @@ -845,10 +845,10 @@ describe("m.route()", function () { route(root, "/a", { "/a": { controller: function () { m.route("/b") }, - view: function () { return "a" } + view: function () { return "a" }, }, - "/b": pure(function () { return "b" }) + "/b": pure(function () { return "b" }), }) expect(root.childNodes[0].nodeValue).to.equal("b") @@ -862,9 +862,9 @@ describe("m.route()", function () { controller: function () { m.route("/b?foo=1", {foo: 2}) }, - view: function () { return "a" } + view: function () { return "a" }, }, - "/b": pure(function () { return "b" }) + "/b": pure(function () { return "b" }), }) expect(mock.location.search).to.equal("?/b?foo=2") @@ -876,7 +876,7 @@ describe("m.route()", function () { route(root, "/a", { "/a": pure(function () { return "a" }), - "/b": pure(function () { return "b" }) + "/b": pure(function () { return "b" }), }) route("/b") @@ -890,7 +890,7 @@ describe("m.route()", function () { route(root, "/a", { "/a": pure(function () { return "a" }), - "/b": pure(function () { return "b" }) + "/b": pure(function () { return "b" }), }) route("/a") @@ -908,13 +908,13 @@ describe("m.route()", function () { return m("a", { config: function (el, init) { if (!init) initCount++ - } + }, }) }) route(root, "/a", { "/a": a, - "/b": pure(a.view) + "/b": pure(a.view), }) route("/b") @@ -931,13 +931,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = false if (!init) initCount++ - } + }, }) }) route(root, "/a", { "/a": a, - "/b": pure(a.view) + "/b": pure(a.view), }) route("/b") @@ -954,13 +954,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = true if (!init) initCount++ - } + }, }) }) route(root, "/a", { "/a": a, - "/b": pure(a.view) + "/b": pure(a.view), }) route("/b") @@ -984,7 +984,7 @@ describe("m.route()", function () { }), "/b": pure(function () { return m("section", m("a", {config: config})) - }) + }), }) route("/b") @@ -1006,7 +1006,7 @@ describe("m.route()", function () { }), "/b": pure(function () { return m("section", m("a", {config: config})) - }) + }), }) route("/b") @@ -1028,7 +1028,7 @@ describe("m.route()", function () { }), "/b": pure(function () { return m("section", m("a", {config: config})) - }) + }), }) route("/b") @@ -1042,7 +1042,7 @@ describe("m.route()", function () { function diff(view) { return { controller: function () { m.redraw.strategy("diff") }, - view: view + view: view, } } @@ -1055,13 +1055,13 @@ describe("m.route()", function () { return m("a", { config: function (el, init) { if (!init) initCount++ - } + }, }) }) route(root, "/a", { "/a": a, - "/b": diff(a.view) + "/b": diff(a.view), }) route("/b") @@ -1078,13 +1078,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = true if (!init) initCount++ - } + }, }) }) route(root, "/a", { "/a": a, - "/b": diff(a.view) + "/b": diff(a.view), }) route("/b") @@ -1101,13 +1101,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = false if (!init) initCount++ - } + }, }) }) route(root, "/a", { "/a": a, - "/b": diff(a.view) + "/b": diff(a.view), }) route("/b") @@ -1131,7 +1131,7 @@ describe("m.route()", function () { }), "/b": diff(function () { return m("section", m("a", {config: config})) - }) + }), }) route("/b") @@ -1154,7 +1154,7 @@ describe("m.route()", function () { }), "/b": diff(function () { return m("section", m("a", {config: config})) - }) + }), }) route("/b") @@ -1177,7 +1177,7 @@ describe("m.route()", function () { }), "/b": diff(function () { return m("section", m("a", {config: config})) - }) + }), }) m.route("/b") @@ -1204,12 +1204,12 @@ describe("m.route()", function () { controller: function () { m.redraw.strategy("diff") }, view: function () { return m("section", m("a", {config: config})) - } + }, } route(root, "/a", { "/a": pure(function () { return m("div", a) }), - "/b": pure(function () { return m("div", b) }) + "/b": pure(function () { return m("div", b) }), }) route("/b") @@ -1226,10 +1226,10 @@ describe("m.route()", function () { return m("div", { config: function (el) { el.childNodes[0].modified = true - } + }, }, m("div")) }), - "/b": pure(function () { return m("div", m("div")) }) + "/b": pure(function () { return m("div", m("div")) }), }) route("/b") diff --git a/test/mithril.route.parseQueryString.js b/test/mithril.route.parseQueryString.js index 3acc68ba..1999ae39 100644 --- a/test/mithril.route.parseQueryString.js +++ b/test/mithril.route.parseQueryString.js @@ -18,7 +18,7 @@ describe("m.route.parseQueryString()", function () { foo: "bar", hello: ["world", "mars"], bam: "", - yup: null + yup: null, }) }) @@ -28,7 +28,7 @@ describe("m.route.parseQueryString()", function () { expect(args).to.eql({ foo: "bar", - "hello[]": ["world", "mars", "pluto"] + "hello[]": ["world", "mars", "pluto"], }) }) }) diff --git a/test/mithril.startComputation.js b/test/mithril.startComputation.js index cfa58063..dffe557c 100644 --- a/test/mithril.startComputation.js +++ b/test/mithril.startComputation.js @@ -12,7 +12,7 @@ describe("m.startComputation(), m.endComputation()", function () { var root = mock.document.createElement("div") var controller = m.mount(root, { controller: function () {}, - view: function (ctrl) { return ctrl.value } + view: function (ctrl) { return ctrl.value }, }) mock.requestAnimationFrame.$resolve() diff --git a/test/mithril.trust.js b/test/mithril.trust.js index 748fa75e..262bb964 100644 --- a/test/mithril.trust.js +++ b/test/mithril.trust.js @@ -36,7 +36,7 @@ describe("m.trust()", function () { var root = document.createElement("div") m.render(root, [ m.trust("

1

123

2

"), - m("i", "foo") + m("i", "foo"), ]) expect(root.childNodes[3].tagName).to.equal("I") }) @@ -49,7 +49,7 @@ describe("m.trust()", function () { m.render(root, [ m.trust("12"), - m("td", "foo") + m("td", "foo"), ]) expect(root.childNodes[2].tagName).to.equal("td") diff --git a/test/svg.html b/test/svg.html index 322d1045..5f99195c 100644 --- a/test/svg.html +++ b/test/svg.html @@ -57,20 +57,20 @@ m.render(document.getElementById("test"), [ height: 100, width: 100, transform: "translate(30) rotate(45 50 50)", - style: {stroke: "#000", fill: "#0086b2"} + style: {stroke: "#000", fill: "#0086b2"}, }), m("a[href='http://google.com'][title='SVG link'][target=_new]", { - style: {textDecoration: "underline"} + style: {textDecoration: "underline"}, }, [ - m("text[x=0][y=20]", "SVG Link") - ]) + m("text[x=0][y=20]", "SVG Link"), + ]), ]), m("svg[height=201px][width=201px]", [ m("image[href='http://placekitten.com/201/201']", { height: "200px", width: "200px", - title: "Cat picture" - }) + title: "Cat picture", + }), ]), m("svg[title='Line drawings']", { "enable-background": "new 0 0 340 333", @@ -78,7 +78,7 @@ m.render(document.getElementById("test"), [ viewBox: "0 0 340 333", width: "340px", x: "0px", - y: "0px" + y: "0px", }, [ m("path.path", { d: [ @@ -141,7 +141,7 @@ m.render(document.getElementById("test"), [ type: "rotate", repeatCount: "indefinite", dur: "12h", - by: 360 + by: 360, }), m("circle[r=7]") ]), @@ -151,7 +151,7 @@ m.render(document.getElementById("test"), [ y2: 93, "stroke-linecap": "round", stroke: "green", - opacity: 0.9 + opacity: 0.9, }), m("animateTransform[attributeName=transform]", { type: "rotate", @@ -167,13 +167,13 @@ m.render(document.getElementById("test"), [ y1: -20, y2: 102, "stroke-linecap": "round", - stroke: "red" + stroke: "red", }), m("animateTransform[attributeName=transform]", { type: "rotate", repeatCount: "indefinite", dur: "60s", - by: 360 + by: 360, }), m("circle[r=4][fill=blue]") ]) @@ -207,8 +207,8 @@ m.render(document.getElementById("test"), [ }, m("div", {xmlns: "http://www.w3.org/1999/xhtml"}, [ m.trust("this is a piece of html rendered as " + "" + - "SVG foreignObject") - ])) - ]) + "SVG foreignObject"), + ])), + ]), ]) From 8d1f33860bd48f0dfde3ed8aa9c7052614bf0123 Mon Sep 17 00:00:00 2001 From: Isiah Meadows Date: Tue, 10 Nov 2015 13:55:06 -0500 Subject: [PATCH 04/19] Spell check != grammar check --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4864595..354bc999 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,7 +19,7 @@ Use the [issue tracker](https://github.com/lhorie/mithril.js/issues). Please do We welcome any and all contributions. This is a community-driven project. Although we don't have a lot, we do have a few guidelines for contributions. -1. Please adhere to the style guide. It's pretty lengthy, but most everything is checked by ESLint, and if anything fails to check, the build will fail, and you will know about it. Most of it is common practice and common sense. ESLint is also set up to check for other common errors, such as undeclared variables and invalid `typeof` values. +1. Please adhere to the style guide. It's pretty lengthy, but most of it is checked by ESLint, and if anything fails to check, the build will fail, and you will know about it. Most of it is common practice and common sense. ESLint is also set up to check for other common errors, such as undeclared variables and invalid `typeof` values. 2. Please make sure there are no regressions with your patch. Please don't disable existing tests, and please don't send a PR with new, disabled tests. - There are a few known failing tests currently (PRs welcome): [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.deferred.js#L121-L125) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.render.js#L1321-L1343) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L106-L131) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L134-L162) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L165-L191) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L194-L222) 3. For any new features introduced, be sure to write new unit tests for it. Maximum coverage is what we want. From d4b618d2afb213884aa71fa65153a343b156a25d Mon Sep 17 00:00:00 2001 From: Isiah Meadows Date: Tue, 10 Nov 2015 14:24:31 -0500 Subject: [PATCH 05/19] Clarify a few things [ci skip] --- CONTRIBUTING.md | 51 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 354bc999..b492bb37 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,12 +25,13 @@ We welcome any and all contributions. This is a community-driven project. Althou 3. For any new features introduced, be sure to write new unit tests for it. Maximum coverage is what we want. 4. Try to not leave any extra `TODO`s, `FIXME`s, etc. in your code. ESLint will nag at you until you fix whatever problem it is. - Note that it's only a warning, not an error. It won't fail the CI tests, and there's a few outstanding ones inside Mithril right now. + - If you must, use a `TODO(): whatever` (or the equivalent `FIXME`, etc.) if it's something you are actively working on, or if it's something more general, file an issue titled "TODO: " and reference the `TODO` comment itself. -It is assumed that all contributions you make you have the appropriate rights to and that it may be made available under the MIT License, the license used for this project. +It is assumed that you have the appropriate rights to all contributions that you make, and that they can be made available under the MIT License which is used for this project. # Style Guide -The style is checked with ESLint. This style guide is here for one reason only: consistency. This should work for most code here, but this shouldn't be considered absolute &endash; consistency with the surrounding code is higher priority than following this guide. Also, if some sort of hack is impossible without violating this guide (e.g. if Mithril ever needs [Bluebird's infamous hack](https://stackoverflow.com/q/24987896)), just make sure the code is consistent with what's around it. +The style is checked with ESLint. This style guide is here for one reason only: consistency. This should work for most code here, but this shouldn't be considered absolute &endash; consistency with the surrounding code is higher priority than following this guide. Also, if some sort of hack is impossible without violating this guide (e.g. if Mithril ever needs [Bluebird's infamous hack](https://stackoverflow.com/q/24987896)), just make sure the code is consistent with what's around it, and that you document how the hack works if you can, and why the hack was employed. If it's a more common one such as Bluebird's, a direct link to a description suffices for how. ### Line length @@ -245,7 +246,11 @@ function iterate() { ### Trailing whitespace -Please don't leave trailing spaces anywhere. It makes diffs harder to read. +Please don't leave trailing whitespace anywhere. It makes diffs harder to read. + +Blank lines should have no indentation or spaces. It should be empty other than a line ending. + +All files should end with a trailing space. Some editors add this on their own, so it will result in unnecessary lines in later diffs if you don't. ### Indentation and vertical whitespace @@ -793,6 +798,46 @@ if (condition) { } else doSomethingElse() ``` +### `do`-`while` loops + +This should be avoided in most cases, since the only good use case is if the intent is "do this, and then check" each iteration. This should only be used in cases like below: + +```js +// Form 1 +doSomething() + +while (condition) { + doSomething() +} + +// Form 2 +while (true) { + doSomething() + if (!condition) break +} +``` + +Always use braces. Also, there must be a semicolon at the end of the `while` condition. This is the only exception to the semicolon rule, since the omission is a syntax error. The semicolon is never automatically inserted before ES6. + +```js +// Good +do { + doSomething() +} while (condition); + +// Bad +do doSomething() +while (condition); + +// Syntax errors +do { + doSomething() +} while (condition) + +do doSomething() +while (condition) +``` + ### Empty blocks Mark empty blocks as intentionally empty via a comment or similar. Don't just leave an empty block and/or semicolon. From 7eb2c9a5b1581733bcdde3387e60edef74b96dd2 Mon Sep 17 00:00:00 2001 From: Isiah Meadows Date: Tue, 10 Nov 2015 14:26:12 -0500 Subject: [PATCH 06/19] Add mention of browser [ci skip] --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b492bb37..0d33390d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,8 +3,9 @@ Use the [issue tracker](https://github.com/lhorie/mithril.js/issues). Do check to make sure your bug hasn't already been filed. Please give the following information, where possible: 1. The version of Mithril you're using, whether it's the dev version or [the version on npm](http://npm.im/mithril.js). The version on npm may not have all the latest bug fixes, so your bug might very well be fixed in the dev version. -2. A detailed explanation of the bug. -3. A test case. The simpler, the better. +2. The name and version of the browser(s) affected. +3. A detailed explanation of the bug. +4. A test case. The simpler, the better. # Feature requests From 2ccd07b8f0274cb5dc35fc88a41ac3bff86428ac Mon Sep 17 00:00:00 2001 From: Isiah Meadows Date: Tue, 10 Nov 2015 14:43:10 -0500 Subject: [PATCH 07/19] Remove redundant part, s/space/line break/ --- CONTRIBUTING.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d33390d..9c17170a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,8 +52,6 @@ This isn't checked for the tests, but still, keep it reasonable. Use Windows-style line endings (i.e. CRLF). -End each file with a line break. - ### Semicolons Avoid semicolons. (A few resources to help you understand this: [*](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding) [*](http://inimino.org/~inimino/blog/javascript_semicolons) [*](http://jamesallardice.com/understanding-automatic-semi-colon-insertion-in-javascript/)) @@ -251,7 +249,7 @@ Please don't leave trailing whitespace anywhere. It makes diffs harder to read. Blank lines should have no indentation or spaces. It should be empty other than a line ending. -All files should end with a trailing space. Some editors add this on their own, so it will result in unnecessary lines in later diffs if you don't. +All files should end with a trailing line break. Some editors add this on their own, so it will result in unnecessary lines in later diffs if you don't. ### Indentation and vertical whitespace From b7ae45b6e0ab0e83b774779ec2e4092d7a68380c Mon Sep 17 00:00:00 2001 From: impinball Date: Fri, 13 Nov 2015 21:40:25 -0500 Subject: [PATCH 08/19] Address @lhorie's comments, fix HTML test files --- .eslintrc | 2 +- CONTRIBUTING.md | 239 +++++++++++++++++++---------------------- mithril.js | 4 + test/index.html | 2 +- test/mithril.mount.js | 1 - test/mithril.render.js | 1 - test/svg.html | 32 +++--- 7 files changed, 131 insertions(+), 150 deletions(-) diff --git a/.eslintrc b/.eslintrc index 3417ee64..52b95c9e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -65,7 +65,7 @@ "no-array-constructor": 2, "no-lonely-if": 2, "no-new-object": 2, - "no-multiple-empty-lines": [2, {"max": 2}], + "no-multiple-empty-lines": [2, {"max": 1}], "no-spaced-func": 2, "no-unneeded-ternary": 2, "object-curly-spacing": 2, diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4864595..82c3777c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,32 +19,49 @@ Use the [issue tracker](https://github.com/lhorie/mithril.js/issues). Please do We welcome any and all contributions. This is a community-driven project. Although we don't have a lot, we do have a few guidelines for contributions. -1. Please adhere to the style guide. It's pretty lengthy, but most everything is checked by ESLint, and if anything fails to check, the build will fail, and you will know about it. Most of it is common practice and common sense. ESLint is also set up to check for other common errors, such as undeclared variables and invalid `typeof` values. +1. Please try to adhere to the style guide. Most of it is checked by ESLint. ESLint is also set up to check for other common errors, such as undeclared variables and invalid `typeof` values. 2. Please make sure there are no regressions with your patch. Please don't disable existing tests, and please don't send a PR with new, disabled tests. - There are a few known failing tests currently (PRs welcome): [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.deferred.js#L121-L125) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.render.js#L1321-L1343) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L106-L131) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L134-L162) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L165-L191) [*](https://github.com/lhorie/mithril.js/blob/next/test/mithril.route.js#L194-L222) 3. For any new features introduced, be sure to write new unit tests for it. Maximum coverage is what we want. 4. Try to not leave any extra `TODO`s, `FIXME`s, etc. in your code. ESLint will nag at you until you fix whatever problem it is. - Note that it's only a warning, not an error. It won't fail the CI tests, and there's a few outstanding ones inside Mithril right now. -It is assumed that all contributions you make you have the appropriate rights to and that it may be made available under the MIT License, the license used for this project. +It is assumed that for all contributions you make, you have the appropriate rights to and it may be made available under the MIT License, the license used for this project. # Style Guide -The style is checked with ESLint. This style guide is here for one reason only: consistency. This should work for most code here, but this shouldn't be considered absolute &endash; consistency with the surrounding code is higher priority than following this guide. Also, if some sort of hack is impossible without violating this guide (e.g. if Mithril ever needs [Bluebird's infamous hack](https://stackoverflow.com/q/24987896)), just make sure the code is consistent with what's around it. +The style is checked with ESLint. This style guide is here for one reason only: consistency. This should work for most code here, but it shouldn't be considered absolute &endash; consistency with the surrounding code is higher priority than following this guide. Also, if you need some sort of hack that doesn't follow this style guide like [Bluebird's `toFastProperties` hack](https://stackoverflow.com/q/24987896), make sure the code is consistent with what's around it, and disable whatever ESLint warnings you need to. (In that case, you would use `no-eval` and `no-unused-expressions`). + +### EditorConfig + +This project has its own [EditorConfig](http://editorconfig.org/). Most common editors either support it natively or have a plugin to support it. Here's links for several editors: + +- [Atom](https://atom.io/packages/editorconfig) +- [Nodepad++](https://github.com/editorconfig/editorconfig-notepad-plus-plus#readme) +- [Sublime Text](https://packagecontrol.io/packages/EditorConfig) +- [Vim](http://www.vim.org/scripts/script.php?script_id=3934) +- [Emacs](https://marmalade-repo.org/packages/editorconfig) +- IntelliJ, WebStorm: You're already set, since it supports EditorConfig natively. +- [Eclipse](https://marketplace.eclipse.org/content/editorconfig-eclipse) +- [Visual Studio](https://visualstudiogallery.msdn.microsoft.com/c8bccfe2-650c-4b42-bc5c-845e21f96328) +- [Xcode](https://github.com/MarcoSero/EditorConfig-Xcode) +- [Komodo](http://komodoide.com/packages/addons/editorconfig/) + +EditorConfig also has [their own curated list](http://editorconfig.org/#download) of plugins. Do note that Text Mate's plugin doesn't support multiple properties used in this repo's `.editorconfig`. ### Line length -Keep lines down to a maximum of 80 characters. Minifiers are very good at compressing whitespace, so don't be afraid to use it. +Please keep line length down to a maximum of 80 characters. -The only exception to this rule is with long regexes. Append `// eslint-disable-line max-len` to the end of those lines. +The only exception to this rule is with long regexes and test names. You can use `// eslint-disable-line max-len` to suppress this. ### Function length -Keep function length to no more than 20 statements, including those in nested blocks. +Please keep function length to no more than 20 statements, including those in nested blocks. -The only exceptions are for revealing module wrappers and Mocha `describe` and `context` blocks. +The only exceptions are for revealing module wrappers and Mocha `describe` and `context` blocks. If you need to suppress this, you can use `// eslint-disable-line max-statements` at the beginning of the function. -This isn't checked for the tests, but still, keep it reasonable. +This isn't checked for the tests, but still, please keep it reasonable. ### Line endings @@ -54,25 +71,21 @@ End each file with a line break. ### Semicolons -Avoid semicolons. (A few resources to help you understand this: [*](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding) [*](http://inimino.org/~inimino/blog/javascript_semicolons) [*](http://jamesallardice.com/understanding-automatic-semi-colon-insertion-in-javascript/)) +Avoid semicolons. A few resources to help you understand this: [*](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding) [*](http://inimino.org/~inimino/blog/javascript_semicolons) [*](http://jamesallardice.com/understanding-automatic-semi-colon-insertion-in-javascript/) ### Redundant expressions -Don't use redundant parentheses, curly braces, `undefined`s, labels, ternaries, etc. Examples: +Don't use redundant parentheses, curly braces, `undefined`s, ternaries, etc. - `var foo = value === 1 ? true : false` is better written as `var foo = value === 1`. -- `var foo = (value === 1) ? bar : baz` is better written as `var foo = value === 1 ? bar : baz`. - `var foo = undefined` is better written as `var foo`. - `return undefined` is better written as `return`. - `delete(obj.foo)` is better written as `delete obj.foo`. -- `return` at the end of a function if you're returning `undefined` should just be omitted. -- If you're returning `null`, there's usually little reason to not just return `undefined`. -- Unused variables should be removed. -- An exception is detailed below for assignment in conditions. +- As an exception, use an extra set of parentheses when assigning in conditions. ### Equality testing -Use strict equality (`===`/`!==`), not loose equality (`==`/`!=`). The only exception is if you're testing for `null` or `undefined`, in which loose equality, `value == null` and `value != null` is preferred. The reason is for type safety with primitives. +Prefer strict equality (`===`/`!==`) to loose equality (`==`/`!=`), unless you're comparing against `null` or `undefined`, where loose equality (`== null`/`!= null`) is preferred. It's more type-safe with primitives. ### `eval` and friends @@ -84,14 +97,14 @@ Prefer double quotes to single quotes, but using single quotes to avoid escaping ### Strict mode -All code must be in strict mode, preferably wrapped in an IIFE. +Any code not in the global scope should be in strict mode unless there's a good reason it shouldn't be. Browsers run it faster, and there's certain things where it's safer. ## Comments Comments are helpful. Use descriptive comments where needed, so others can read it and understand it. If a non-obvious hack is used, explain it with a comment. But don't repeat yourself with a redundant comment when the code adequately describes itself. ```js -// Good, code is self-descriptive +// Good var CARD_DECK_SIZE = 52 // Shuffle the deck of cards. @@ -103,7 +116,7 @@ for (var i = 0; i < CARD_DECK_SIZE; i++) { deck[j] = tmp } -// Also good, requires a descriptive comment. +// Also good function toFastProperties(obj) { // Bluebird's toFastProperties hack. Forces V8 to optimize object as prototype, // significantly speeding up property access. @@ -117,7 +130,7 @@ function toFastProperties(obj) { /* eslint-enable no-eval */ } -// Bad, redundant comments +// Bad var CARD_DECK_SIZE = 52 // Shuffle the deck of cards. @@ -132,47 +145,8 @@ function shuffle(deck) { deck[j] = tmp } } -``` - -### Magic values - -Prefer constant variables to magic values where it helps with code readability. Also, don't use comments in place of a constant. - -```js -// Good -var CARD_DECK_SIZE = 52 -for (var i = 0; i < CARD_DECK_SIZE; i++) { - var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 - var tmp = a[i] - a[i] = a[j] - a[j] = tmp -} - -// Bad, what's 52 for? -for (var i = 0; i < 52; i++) { - var j = i + (Math.random() * 52 - i)|0 - var tmp = a[i] - a[i] = a[j] - a[j] = tmp -} - -// Also bad, comment not substitute for constant -// 52 cards in a deck -for (var i = 0; i < 52; i++) { - var j = i + (Math.random() * 52 - i)|0 - var tmp = a[i] - a[i] = a[j] - a[j] = tmp -} -``` - -### Distracting comments - -Don't comment *everything*. It's distracting, pointless, and a waste of time. Only comment when you need to. - -```js -// Extremely bad. Don't *ever* do this. +// Also bad // This function loops through each item in a list, calling `f` with each item // and their respective index. If the function `f` returns explicitly with // `false`, iteration stops. This function returns the original list for @@ -192,6 +166,38 @@ function forEach(list, f) { } ``` +### Magic values + +Prefer constant variables to magic values where it helps with code readability. Also, don't use comments in place of a constant. + +```js +// Good +var CARD_DECK_SIZE = 52 +for (var i = 0; i < CARD_DECK_SIZE; i++) { + var j = i + (Math.random() * CARD_DECK_SIZE - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} + +// Bad +for (var i = 0; i < 52; i++) { + var j = i + (Math.random() * 52 - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} + +// Also bad +// Note: 52 cards in a deck +for (var i = 0; i < 52; i++) { + var j = i + (Math.random() * 52 - i)|0 + var tmp = a[i] + a[i] = a[j] + a[j] = tmp +} +``` + ### Initial whitespace Start your comments with a space. It's more readable. @@ -206,7 +212,7 @@ Start your comments with a space. It's more readable. ### Grammar and spelling -Use proper grammar and spelling in your comments. This shouldn't need explanation. +Please try to use proper grammar and spelling. Not all of us are perfect English speakers (even us native ones struggle at times), but it's easier to understand down the road when reading the code. ## Whitespace @@ -235,7 +241,7 @@ function iterate() { for (var i = 0; i < list.length; i++) read(list[i]) } -// Even worse +// Also bad function iterate() { var list = [] for (var index = 0; hasNext(); list.push(next(index++))) {} @@ -245,7 +251,7 @@ function iterate() { ### Trailing whitespace -Please don't leave trailing spaces anywhere. It makes diffs harder to read. +Please don't leave trailing spaces, even in blank likes. It makes diffs harder to read. If your [editor supports EditorConfig, or you've downloaded a plugin for it](http://editorconfig.org/#download), you're already set. Otherwise, searching " strip trailing whitespace blank lines" should help you. ### Indentation and vertical whitespace @@ -255,7 +261,7 @@ Never mix tabs and spaces. Don't use smart tabs. ### Excessive whitespace -Keep whitespace within reason. Limit vertical whitespace to no more than 2 consecutive blank lines, and don't start or end blocks with plain whitespace. Don't use more than one character of horizontal whitespace beyond indentation. +Keep whitespace within reason. Limit vertical whitespace to no more than 1 consecutive blank line, and don't start or end blocks with plain whitespace. Don't use more than one character of horizontal whitespace beyond indentation. ```js // Bad @@ -268,8 +274,6 @@ function iterate() { index++ } - // Too many empty lines - for (var i = 0; i < list.length; i++) { @@ -282,6 +286,8 @@ var a = 2 // ^^ ^^ ``` +If you're find yourself resorting to multiple consecutive blank lines to separate logic, consider refactoring the code into smaller functions if possible. + ### Control keywords Always surround control keywords (e.g. `if`, `else`, `for`) with whitespace. @@ -298,25 +304,20 @@ Always surround any other binary operator with whitespace, including assignment // Good var a = 1 + 2 a = 3 -a += 4 var a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 // Bad var a = 1+2 -var a = 1 +2 -var a = 1+ 2 var a=1+2 -var a=1 + 2 a=3 -a+=4 var a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 ``` -As an exception, casting to a 32-bit integer (i.e. `x|0`) doesn't require whitespace surrounding it. +In the event you're casting to a 32-bit integer (i.e. `x|0`), it's okay to omit the whitespace. Mithril doesn't currently have any instances of this, but it may in the future. ```js // This is okay @@ -332,31 +333,15 @@ Do not use spaces between any other unary operator and the value they apply to. ```js // Good !a -!!a -~~a -a++ -++a -1 ~1 -// Okay -+!a - // Bad ! a -!! a -! ! a -++ a -a ++ -+ ! a - -// Even worse - 1 ~ 1 ``` -Don't use `new function () {}`. Just use an object literal instead, and an IIFE if needed. - ## Objects ### Exterior whitespace @@ -398,8 +383,6 @@ var object = {foo: 1} // Bad var object = {foo:1} var object = {foo : 1} - -// Very bad var object = {foo :1} ``` @@ -420,6 +403,8 @@ var object = { var object = {foo: 1, bar: 2, baz: 3, quux: "string"} ``` +Prefer plain objects over `new function () {}`, but if you feel the latter is better, use `// eslint-disable-line no-new-func` on the first line. + ### Comma placement Commas come last. Also, use trailing commas if the object takes multiple lines. @@ -442,7 +427,7 @@ var object = { , bar: 2 // Comma first } -// Trailing comma in single-line object +// Also bad var object = {foo: 1,} ``` @@ -464,7 +449,7 @@ object. ### Property quoting -Quote properties when needed. Never quote valid identifiers. This may lead to some inconsistency in whether properties are quoted or not in the object, but that inconsistency is okay, and is the only exception in consistency. +Quote properties when needed. Never quote valid identifiers. This may lead to some inconsistency in whether properties are quoted or not in the object, but that inconsistency is okay. ```js // Good @@ -502,7 +487,7 @@ Use `self` to capture `this` where needed. (i.e. `var self = this`) Prefer short but clear, descriptive, and self-documenting variable names. -Single letter names are only okay in these contexts: +Single letter names are generally okay in these contexts: - Loop variables: `i`, `j`, etc. - Function arguments in small, trivial functional utilities: `f`, `g`, etc. @@ -517,15 +502,12 @@ function forEach(list, f) { return list } -function ajax(url, callback) { - var xhr = new XMLHttpRequest() - xhr.open("GET", url) - xhr.onreadystatechange = function () { - if (this.readyState === 4) { - callback(this.responseText, this.status) - } +// Also good +function forEach(list, func) { + for (var index = 0; index < list.length; index++) { + func(list[index], index) } - xhr.send() + return list } // Bad @@ -536,35 +518,13 @@ function iterateArray(listOfEntries, callback) { return listOfEntries } -function getRequestStringFromServer(serverLocation, functionToCall) { - var xmlHttpRequest = new XMLHttpRequest() - xmlHttpRequest.open("GET", serverLocation) - xmlHttpRequest.onreadystatechange = function () { - if (this.readyState === 4) { - functionToCall(this.responseText, this.status) - } - } - xmlHttpRequest.send() -} - -// Even worse +// Also bad function e(l, c) { for (var x = 0; x < l.length; x++) { c(l[x], x) } return l } - -function a(u, f) { - var x = new XMLHttpRequest() - x.open("GET", url) - x.onreadystatechange = function () { - if (this.readyState === 4) { - f(this.responseText,this.status) - } - } - x.send() -} ``` ### Multiple variable declarations @@ -596,7 +556,7 @@ for (var i = 0, test; (test = foo === 1); i++) { // Bad var a = 1, b = 2, c, d -// Even worse +// Also bad var foo, bar, baz, quux, spam, eggs, ham, shouldUpdate, initialize ``` @@ -615,7 +575,7 @@ Don't assign to a function declaration. Declarations look like static values, so function foo() { return 1 } foo = function () { return 2 } -// Even worse +// Also bad function foo() { return 1 } foo = 2 ``` @@ -632,8 +592,9 @@ if (test) { } var test = foo === 1 -for (var i = 0; test; i++, test = foo === 1) { +for (var i = 0; test; i++) { doSomething(i) + test = foo === 1 } if ((test = foo === 1)) { @@ -793,6 +754,21 @@ if (condition) { } else doSomethingElse() ``` +## `do`-`while` loops + +Always use braces. + +```js +// Good +do { + doSomething() +} while (condition) + +// Bad +do doSomething() +while (condition) +``` + ### Empty blocks Mark empty blocks as intentionally empty via a comment or similar. Don't just leave an empty block and/or semicolon. @@ -800,7 +776,12 @@ Mark empty blocks as intentionally empty via a comment or similar. Don't just le ```js // Good for (var i = 0; i < list.length && cond(list[i]); i++) { - // empty + // do nothing +} + +// Even better +for (var i = 0; i < list.length; i++) { + if (!cond(list[i])) break } // Bad @@ -852,5 +833,3 @@ Don't nest curly braces beyond 4 levels deep. This includes blocks, loops, and f ### Brace style Put the `else`, `catch`, and `finally` on the same line as its closing brace. - -(Obviously, this doesn't apply to `if`-`else` statements that don't use curly braces.) diff --git a/mithril.js b/mithril.js index 7f1cba65..aaf27974 100644 --- a/mithril.js +++ b/mithril.js @@ -1815,6 +1815,10 @@ return fire() } + if (state === REJECTING) { + m.deferred.onerror(promiseValue) + } + thennable(then, function () { state = RESOLVING fire() diff --git a/test/index.html b/test/index.html index 6880ccfe..b4ca2f5c 100644 --- a/test/index.html +++ b/test/index.html @@ -67,7 +67,7 @@ runner.on('fail', function (test, err) { result: false, message: err.message, stack: err.stack, - titles: flattenTitles(test) + titles: flattenTitles(test), }) }) diff --git a/test/mithril.mount.js b/test/mithril.mount.js index a5ae6e61..5c7803e1 100644 --- a/test/mithril.mount.js +++ b/test/mithril.mount.js @@ -469,7 +469,6 @@ describe("m.mount()", function () { expect(spy).to.have.been.called }) - it("calls config with truthy init only once", function () { mock.requestAnimationFrame.$resolve() diff --git a/test/mithril.render.js b/test/mithril.render.js index 7b00ccc3..6a019ce3 100644 --- a/test/mithril.render.js +++ b/test/mithril.render.js @@ -911,7 +911,6 @@ describe("m.render()", function () { expect(root.childNodes[0].nodeName).to.equal("DIV") }) - // https://github.com/lhorie/mithril.js/issues/157 it("renders nodes with new keys correctly", function () { var root = mock.document.createElement("div") diff --git a/test/svg.html b/test/svg.html index 5f99195c..6ecd34f6 100644 --- a/test/svg.html +++ b/test/svg.html @@ -94,13 +94,13 @@ m.render(document.getElementById("test"), [ "s 11 -61 -11 -80", "s -79 -7 -70 -41", "C 46.039,146.545,53.039,128.545,66.039,133.545", - "z" + "z", ].join(" "), fill: "#FFFFFF", stroke: "#000000", "stroke-miterlimit": 10, - "stroke-width": 4 - }) + "stroke-width": 4, + }), ]), m("svg[height=270px][width=270px][viewBox='0 0 270 270']", [ m("g[transform='translate(150,150)'][title=Clock]", [ @@ -109,7 +109,7 @@ m.render(document.getElementById("test"), [ r: 108, fill: "none", "stroke-width": 4, - stroke: "gray" + stroke: "gray", }), m("circle", { r: 97, @@ -117,7 +117,7 @@ m.render(document.getElementById("test"), [ "stroke-width": 11, stroke: "black", "stroke-dasharray": "4,46.789082", - transform: "rotate(-1.5)" + transform: "rotate(-1.5)", }), m("circle", { r: 100, @@ -125,8 +125,8 @@ m.render(document.getElementById("test"), [ "stroke-width": 5, stroke: "black", "stroke-dasharray": "2,8.471976", - transform: "rotate(-.873)" - }) + transform: "rotate(-.873)", + }), ]), m("g[transform='rotate(180)']", [ m("g#hour", [ @@ -135,7 +135,7 @@ m.render(document.getElementById("test"), [ y2: 75, "stroke-linecap": "round", stroke: "blue", - opacity: 0.5 + opacity: 0.5, }), m("animateTransform[attributeName=transform]", { type: "rotate", @@ -143,7 +143,7 @@ m.render(document.getElementById("test"), [ dur: "12h", by: 360, }), - m("circle[r=7]") + m("circle[r=7]"), ]), m("g#minute", [ m("line", { @@ -157,9 +157,9 @@ m.render(document.getElementById("test"), [ type: "rotate", repeatCount: "indefinite", dur: "60min", - by: 360 + by: 360, }), - m("circle[r=6][fill=red]") + m("circle[r=6][fill=red]"), ]), m("g#second", [ m("line", { @@ -175,9 +175,9 @@ m.render(document.getElementById("test"), [ dur: "60s", by: 360, }), - m("circle[r=4][fill=blue]") - ]) - ]) + m("circle[r=4][fill=blue]"), + ]), + ]), ]), m("script", "(" + function () { "use strict" @@ -195,7 +195,7 @@ m.render(document.getElementById("test"), [ rotate("hour", 30 * (hours + minutes / 60 + seconds / 3600)) rotate("minute", 6 * (minutes + seconds / 60)) rotate("second", 6 * seconds) - }.toString() + ")()") + }.toString() + ")()"), ]), m("svg[height=200px][width=200px]", [ m("foreignObject", { @@ -203,7 +203,7 @@ m.render(document.getElementById("test"), [ y: 0, width: "100px", height: "100px", - transform: "translate(0,0)" + transform: "translate(0,0)", }, m("div", {xmlns: "http://www.w3.org/1999/xhtml"}, [ m.trust("this is a piece of html rendered as " + "" + From e9d46d0e062866cccc03208bbdeadc6ffc9cd9f4 Mon Sep 17 00:00:00 2001 From: Dan Okkels Brendstrup Date: Sun, 15 Nov 2015 20:59:53 +0100 Subject: [PATCH 09/19] Download button + links point to Installation page --- docs/installation.md | 2 +- docs/layout/api.html | 2 +- docs/layout/guide.html | 2 +- docs/layout/index.html | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 206caa37..b19f7ad3 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -6,7 +6,7 @@ Mithril is available from a variety of sources: ### Direct download -You can [download a zip of the latest version version here](http://lhorie.github.io/mithril/mithril.min.zip). +You can [download a zip of the latest version version here](mithril.min.zip). Links to older versions can be found in the [change log](change-log.html). diff --git a/docs/layout/api.html b/docs/layout/api.html index 63bdd3b1..4cd8543b 100644 --- a/docs/layout/api.html +++ b/docs/layout/api.html @@ -14,7 +14,7 @@ API Community Learn - Download + Download Github diff --git a/docs/layout/guide.html b/docs/layout/guide.html index 3623adb4..8eb90a00 100644 --- a/docs/layout/guide.html +++ b/docs/layout/guide.html @@ -14,7 +14,7 @@ API Community Learn - Download + Download Github diff --git a/docs/layout/index.html b/docs/layout/index.html index 7b34ad28..b91fedea 100644 --- a/docs/layout/index.html +++ b/docs/layout/index.html @@ -14,7 +14,7 @@ API Community Learn - Download + Download Github @@ -28,7 +28,7 @@

Guide - Download v$version + Download v$version

From e0f51db6182efcbf196251e9eac6bf3ced63523a Mon Sep 17 00:00:00 2001 From: impinball Date: Wed, 25 Nov 2015 22:43:02 -0500 Subject: [PATCH 10/19] Disable tests that mysteriously affect others --- test/mithril.route.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/test/mithril.route.js b/test/mithril.route.js index 64e03794..f130c279 100644 --- a/test/mithril.route.js +++ b/test/mithril.route.js @@ -39,6 +39,7 @@ describe("m.route()", function () { // Use these instead of `it` and `xit` in this set of tests if you need a // root element. var dit = makeIt(it) + var xdit = makeIt(xit) // Wraps the `it` function for dependency injection that doesn't require // `this` @@ -101,8 +102,8 @@ describe("m.route()", function () { expect(route2).to.equal("/test13") }) - // FIXME: this causes others to fail - dit("skips route change if component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + // FIXME: this causes others to fail, even though it passes + xdit("skips route change if component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() @@ -129,8 +130,8 @@ describe("m.route()", function () { expect(spy).to.not.have.been.called }) - // FIXME: this causes others to fail - dit("skips route change if subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + // FIXME: this causes others to fail, even though it passes + xdit("skips route change if subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() @@ -160,8 +161,8 @@ describe("m.route()", function () { expect(spy).to.not.have.been.called }) - // FIXME: this causes others to fail - dit("skips route change if non-curried component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + // FIXME: this causes others to fail, even though it passes + xdit("skips route change if non-curried component ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() @@ -189,8 +190,8 @@ describe("m.route()", function () { expect(spy).to.not.have.been.called }) - // FIXME: this causes others to fail - dit("skips route change if non-curried subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line + // FIXME: this causes others to fail, even though it passes + xdit("skips route change if non-curried subcomponent ctrl.onunload calls preventDefault", function (root) { // eslint-disable-line mode("search") var spy = sinon.spy() From 0b173deed753ce86762f02e79446e32324064770 Mon Sep 17 00:00:00 2001 From: impinball Date: Wed, 25 Nov 2015 22:45:45 -0500 Subject: [PATCH 11/19] Merge 'origin/patch-2', remove trailing commas --- .eslintrc | 1 - CONTRIBUTING.md | 27 ++- Gruntfile.js | 114 ++++++------- docs/layout/tools/template-converter.js | 12 +- mithril.js | 22 +-- test-deps/mock.js | 10 +- test/index.html | 2 +- test/input-cursor.html | 20 +-- test/mithril.js | 2 +- test/mithril.mount.js | 72 ++++---- test/mithril.redraw.js | 26 +-- test/mithril.render.js | 140 ++++++++-------- test/mithril.request.js | 32 ++-- test/mithril.route.buildQueryString.js | 4 +- test/mithril.route.js | 210 ++++++++++++------------ test/mithril.route.parseQueryString.js | 4 +- test/mithril.startComputation.js | 2 +- test/mithril.trust.js | 4 +- test/svg.html | 60 +++---- 19 files changed, 380 insertions(+), 384 deletions(-) diff --git a/.eslintrc b/.eslintrc index 3e4f6cf2..14612a91 100644 --- a/.eslintrc +++ b/.eslintrc @@ -53,7 +53,6 @@ "block-spacing": 2, "brace-style": [2, "1tbs", {"allowSingleLine": true}], "camelcase": 2, - "comma-dangle": [2, "always-multiline"], "comma-spacing": 2, "comma-style": 2, "consistent-this": [2, "self"], diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a113e406..4054409d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -120,8 +120,8 @@ for (var i = 0; i < CARD_DECK_SIZE; i++) { // Also good function toFastProperties(obj) { - // Bluebird's toFastProperties hack. Forces V8 to optimize object as prototype, - // significantly speeding up property access. + // Bluebird's toFastProperties hack. Forces V8 to optimize object as + // prototype, significantly speeding up property access. /* eslint-disable no-eval */ function C() {} @@ -362,7 +362,7 @@ var object = { foo: 1, bar: 2, baz: 3, - quux: "string", + quux: "string" } // Bad @@ -373,7 +373,7 @@ var object = { foo: 1, bar: 2, baz: 3, - quux: "string", + quux: "string" } ``` @@ -402,7 +402,7 @@ var object = { foo: 1, bar: 2, baz: 3, - quux: "string", + quux: "string" } // Bad @@ -413,28 +413,25 @@ Prefer plain objects over `new function () {}`, but if you feel the latter is be ### Comma placement -Commas come last. Also, use trailing commas if the object takes multiple lines. +Commas come last. Don't use trailing commas ```js // Good var object = { foo: 1, - bar: 2, + bar: 2 } // Bad var object = { foo: 1, - bar: 2 // No trailing comma + bar: 2, // Trailing comma } var object = { foo: 1 , bar: 2 // Comma first } - -// Also bad -var object = {foo: 1,} ``` ### Member access @@ -461,23 +458,23 @@ Quote properties when needed. Never quote valid identifiers. This may lead to so // Good var object = { foo: 1, - bar: 2, + bar: 2 } var object = { foo: 1, - "non-identifier": 2, + "non-identifier": 2 } // Bad var object = { "foo": 1, - "bar": 2, + "bar": 2 } var object = { "foo": 1, - "non-identifier": 2, + "non-identifier": 2 } ``` diff --git a/Gruntfile.js b/Gruntfile.js index 654dad3d..9844f85b 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -22,7 +22,7 @@ module.exports = function (grunt) { // eslint-disable-line "refactoring", "routing", "tools", - "web-services", + "web-services" ] var api = [ @@ -43,7 +43,7 @@ module.exports = function (grunt) { // eslint-disable-line "mithril.sync", "mithril.trust", "mithril.withAttr", - "mithril.xhr", + "mithril.xhr" ] var md2htmlTasks = {} @@ -60,12 +60,12 @@ module.exports = function (grunt) { // eslint-disable-line md2htmlTasks[name] = { options: { layout: inputFolder + "/layout/" + layout + ".html", - templateData: {topic: title}, + templateData: {topic: title} }, files: [{ src: [src], - dest: tempFolder + "/" + name + ".html", - }], + dest: tempFolder + "/" + name + ".html" + }] } }) } @@ -80,7 +80,7 @@ module.exports = function (grunt) { // eslint-disable-line eslint: { options: { extensions: [".js"], - fix: true, + fix: true }, all: [ "**/*.js", @@ -89,17 +89,17 @@ module.exports = function (grunt) { // eslint-disable-line "!archive/**", "!deploy/**", "!mithril.closure-compiler-externs.js", - "!docs/layout/lib/**", - ], + "!docs/layout/lib/**" + ] }, mocha_phantomjs: { // eslint-disable-line camelcase test: { src: ["test/index.html"], options: { - reporter: "dot", - }, - }, + reporter: "dot" + } + } }, md2html: md2htmlTasks, @@ -112,11 +112,11 @@ module.exports = function (grunt) { // eslint-disable-line pkg.homepage, "(c) 2014-" + currentYear + " " + pkg.author.name, "License: " + pkg.license, - "*/", + "*/" ].join("\n"), - sourceMap: true, + sourceMap: true }, - mithril: {src: "mithril.js", dest: "mithril.min.js"}, + mithril: {src: "mithril.js", dest: "mithril.min.js"} }, zip: { @@ -125,10 +125,10 @@ module.exports = function (grunt) { // eslint-disable-line src: [ currentVersionArchiveFolder + "/mithril.min.js", currentVersionArchiveFolder + "/mithril.min.js.map", - currentVersionArchiveFolder + "/mithril.js", + currentVersionArchiveFolder + "/mithril.js" ], - dest: currentVersionArchiveFolder + "/mithril.min.zip", - }, + dest: currentVersionArchiveFolder + "/mithril.min.zip" + } }, replace: { @@ -136,105 +136,105 @@ module.exports = function (grunt) { // eslint-disable-line force: true, patterns: [ {match: /\.md/g, replacement: ".html"}, - {match: /\$version/g, replacement: pkg.version}, - ], + {match: /\$version/g, replacement: pkg.version} + ] }, links: { expand: true, flatten: true, src: [tempFolder + "/**/*.html"], - dest: currentVersionArchiveFolder + "/", + dest: currentVersionArchiveFolder + "/" }, index: { src: inputFolder + "/layout/index.html", - dest: currentVersionArchiveFolder + "/index.html", + dest: currentVersionArchiveFolder + "/index.html" }, commonjs: { expand: true, flatten: true, src: [inputFolder + "/layout/*.json"], - dest: currentVersionArchiveFolder, + dest: currentVersionArchiveFolder }, cdnjs: { src: "deploy/cdnjs-package.json", - dest: "../cdnjs/ajax/libs/mithril/package.json", - }, + dest: "../cdnjs/ajax/libs/mithril/package.json" + } }, copy: { style: { src: inputFolder + "/layout/style.css", - dest: currentVersionArchiveFolder + "/style.css", + dest: currentVersionArchiveFolder + "/style.css" }, pages: { src: inputFolder + "/layout/pages.json", - dest: currentVersionArchiveFolder + "/pages.json", + dest: currentVersionArchiveFolder + "/pages.json" }, lib: { expand: true, cwd: inputFolder + "/layout/lib/", src: "./**", - dest: currentVersionArchiveFolder + "/lib/", + dest: currentVersionArchiveFolder + "/lib/" }, tools: { expand: true, cwd: inputFolder + "/layout/tools/", src: "./**", - dest: currentVersionArchiveFolder + "/tools/", + dest: currentVersionArchiveFolder + "/tools/" }, comparisons: { expand: true, cwd: inputFolder + "/layout/comparisons/", src: "./**", - dest: currentVersionArchiveFolder + "/comparisons/", + dest: currentVersionArchiveFolder + "/comparisons/" }, unminified: { src: "mithril.js", - dest: currentVersionArchiveFolder + "/mithril.js", + dest: currentVersionArchiveFolder + "/mithril.js" }, minified: { src: "mithril.min.js", - dest: currentVersionArchiveFolder + "/mithril.min.js", + dest: currentVersionArchiveFolder + "/mithril.min.js" }, readme: { src: "README.md", - dest: currentVersionArchiveFolder + "/README.md", + dest: currentVersionArchiveFolder + "/README.md" }, map: { src: "mithril.min.js.map", - dest: currentVersionArchiveFolder + "/mithril.min.js.map", + dest: currentVersionArchiveFolder + "/mithril.min.js.map" }, typescript: { src: "mithril.d.ts", - dest: currentVersionArchiveFolder + "/mithril.d.ts", + dest: currentVersionArchiveFolder + "/mithril.d.ts" }, publish: { expand: true, cwd: currentVersionArchiveFolder, src: "./**", - dest: outputFolder, + dest: outputFolder }, archive: { expand: true, cwd: currentVersionArchiveFolder, src: "./**", - dest: outputFolder + "/archive/v" + pkg.version, - }, + dest: outputFolder + "/archive/v" + pkg.version + } }, "saucelabs-browsers": { @@ -246,7 +246,7 @@ module.exports = function (grunt) { // eslint-disable-line return version === "dev" || version === "beta" || +version >= 38 // The latest ESR version }) - }, + } }, chrome: { @@ -257,7 +257,7 @@ module.exports = function (grunt) { // eslint-disable-line return version === "dev" || version === "beta" || +version >= 41 }) - }, + } }, ie: { @@ -266,7 +266,7 @@ module.exports = function (grunt) { // eslint-disable-line return browser.browserName === "internet explorer" && !/2003/.test(browser.platform) }) - }, + } }, edge: { @@ -274,7 +274,7 @@ module.exports = function (grunt) { // eslint-disable-line return browsers.filter(function (browser) { return browser.browserName === "microsoftedge" }) - }, + } }, safari: { @@ -282,7 +282,7 @@ module.exports = function (grunt) { // eslint-disable-line return browsers.filter(function (browser) { return browser.browserName === "safari" }) - }, + } }, opera: { @@ -290,8 +290,8 @@ module.exports = function (grunt) { // eslint-disable-line return browsers.filter(function (browser) { return browser.browserName === "opera" }) - }, - }, + } + } }, saucelabs: { @@ -304,7 +304,7 @@ module.exports = function (grunt) { // eslint-disable-line urls: ["http://localhost:8000/test/index.html"], sauceConfig: { "record-video": false, - "record-screenshots": false, + "record-screenshots": false }, build: process.env.TRAVIS_JOB_ID, onTestComplete: function (result, callback) { @@ -313,13 +313,13 @@ module.exports = function (grunt) { // eslint-disable-line var url = [ "https://saucelabs.com/rest/v1", user, "jobs", - result.job_id, + result.job_id ].join("/") require("request").put({ url: url, auth: {user: user, pass: pass}, - json: {passed: result.passed}, + json: {passed: result.passed} }, function (error, response) { if (error) { return callback(error) @@ -332,24 +332,24 @@ module.exports = function (grunt) { // eslint-disable-line } }) }, - tunnelTimeout: 5, - }, - }, + tunnelTimeout: 5 + } + } }, connect: { server: { options: { port: 8888, - base: ".", - }, - }, + base: "." + } + } }, clean: { options: {force: true}, - generated: [tempFolder], - }, + generated: [tempFolder] + } }) grunt.loadNpmTasks("grunt-saucelabs-browsers") @@ -371,7 +371,7 @@ module.exports = function (grunt) { // eslint-disable-line "md2html", "replace", "copy", - "clean", + "clean" ]) grunt.registerTask("test", ["eslint:all", "mocha_phantomjs"]) @@ -380,6 +380,6 @@ module.exports = function (grunt) { // eslint-disable-line grunt.registerTask("sauce", [ "saucelabs-browsers:all", "connect", - "saucelabs", + "saucelabs" ]) } diff --git a/docs/layout/tools/template-converter.js b/docs/layout/tools/template-converter.js index 34323507..55217ba3 100644 --- a/docs/layout/tools/template-converter.js +++ b/docs/layout/tools/template-converter.js @@ -14,7 +14,7 @@ window.templateConverter = (function () { return [ new DOMParser() .parseFromString(markup, "text/html") - .childNodes[1], + .childNodes[1] ] } @@ -39,7 +39,7 @@ window.templateConverter = (function () { list.push({ tag: el.nodeName.toLowerCase(), attrs: attrs, - children: createVirtual(el.childNodes), + children: createVirtual(el.childNodes) }) } }) @@ -115,7 +115,7 @@ window.templateConverter = (function () { var body = this.virtuals.join("," + tab) return "[" + tab + body + tab.slice(0, -1) + "]" } - }, + } } return { @@ -134,12 +134,12 @@ window.templateConverter = (function () { m("textarea", { autofocus: true, style: {width: "100%", height: "40%"}, - onchange: m.withAttr("value", ctrl.source), + onchange: m.withAttr("value", ctrl.source) }, ctrl.source()), m("button", {onclick: ctrl.convert}, "Convert"), m("textarea", {style: {width: "100%", height: "40%"}}, - ctrl.output()), + ctrl.output()) ]) - }, + } } })() diff --git a/mithril.js b/mithril.js index bb92d6fd..9a70070c 100644 --- a/mithril.js +++ b/mithril.js @@ -231,7 +231,7 @@ void (function (global, factory) { // eslint-disable-line index: i, from: existing[key].index, element: cached.nodes[existing[key].index] || - $document.createElement("div"), + $document.createElement("div") } } else { existing[key] = {action: INSERTION, index: i} @@ -263,7 +263,7 @@ void (function (global, factory) { // eslint-disable-line insertNode(parent, dummy, index) newCached.splice(index, 0, { attrs: {key: data[index].attrs.key}, - nodes: [dummy], + nodes: [dummy] }) newCached.nodes[index] = dummy break @@ -694,7 +694,7 @@ void (function (global, factory) { // eslint-disable-line tag: data.tag, attrs: attrs, children: children, - nodes: [node], + nodes: [node] } unloadCachedControllers(cached, views, controllers) @@ -732,7 +732,7 @@ void (function (global, factory) { // eslint-disable-line if (controller.onunload != null) { unloaders.push({ controller: controller, - handler: controller.onunload, + handler: controller.onunload }) } @@ -1133,7 +1133,7 @@ void (function (global, factory) { // eslint-disable-line this.appendChild(node) }, - childNodes: [], + childNodes: [] } var nodeCache = [] @@ -1296,7 +1296,7 @@ void (function (global, factory) { // eslint-disable-line preventDefault: function () { isPrevented = true computePreRedrawHook = computePostRedrawHook = null - }, + } } forEach(unloaders, function (unloader) { @@ -1434,7 +1434,7 @@ void (function (global, factory) { // eslint-disable-line var modes = { pathname: "", hash: "#", - search: "?", + search: "?" } var redirect = noop @@ -1955,8 +1955,8 @@ void (function (global, factory) { // eslint-disable-line options.onload({ type: "load", target: { - responseText: resp, - }, + responseText: resp + } }) window[callbackKey] = undefined @@ -1969,8 +1969,8 @@ void (function (global, factory) { // eslint-disable-line type: "error", target: { status: 500, - responseText: '{"error": "Error making jsonp request"}', - }, + responseText: '{"error": "Error making jsonp request"}' + } }) window[callbackKey] = undefined diff --git a/test-deps/mock.js b/test-deps/mock.js index 21a0bc9c..239af53c 100644 --- a/test-deps/mock.js +++ b/test-deps/mock.js @@ -49,7 +49,7 @@ this.mock = (function (global) { // the browser. Still waiting on mocha-phantomjs to update to be // compatible with PhantomJS 2.x. phantom: global.window && global.window.navigator && - /PhantomJS/.test(global.window.navigator.userAgent), + /PhantomJS/.test(global.window.navigator.userAgent) } var document = window.document = { @@ -102,7 +102,7 @@ this.mock = (function (global) { }, addEventListener: function () {}, - removeEventListener: function () {}, + removeEventListener: function () {} } }, @@ -156,7 +156,7 @@ this.mock = (function (global) { traverse(document) return out - }, + } } document.documentElement = document.createElement("html") @@ -182,7 +182,7 @@ this.mock = (function (global) { indices[id] = callbacks.length callbacks.push({ callback: callback, - id: id, + id: id }) return id } @@ -258,7 +258,7 @@ this.mock = (function (global) { replaceState: function (data, title, url) { location.pathname = location.search = location.hash = url - }, + } } return window diff --git a/test/index.html b/test/index.html index b4ca2f5c..6880ccfe 100644 --- a/test/index.html +++ b/test/index.html @@ -67,7 +67,7 @@ runner.on('fail', function (test, err) { result: false, message: err.message, stack: err.stack, - titles: flattenTitles(test), + titles: flattenTitles(test) }) }) diff --git a/test/input-cursor.html b/test/input-cursor.html index 71ee843e..f291b302 100644 --- a/test/input-cursor.html +++ b/test/input-cursor.html @@ -20,7 +20,7 @@ function test(sel) { return m("li", [ m("p", m("code", "m(" + JSON.stringify(sel) + ")")), - m.apply(null, arguments), + m.apply(null, arguments) ]) } @@ -35,18 +35,18 @@ m.module(document.getElementById("test"), { m("ul", [ test("input[list=data]", { onkeyup: m.withAttr("value", ctrl.title), - value: ctrl.title(), + value: ctrl.title() }), test("datalist#data", [ m("option", "John"), m("option", "Bob"), - m("option", "Mary"), + m("option", "Mary") ]), test("textarea", { onkeyup: m.withAttr("value", ctrl.title), - value: ctrl.title(), + value: ctrl.title() }), m("li", [ @@ -55,7 +55,7 @@ m.module(document.getElementById("test"), { m("div[contenteditable]", { style: {border: "1px solid #888"}, onkeyup: m.withAttr("innerHTML", ctrl.title) - }, ctrl.title()), + }, ctrl.title()) ]), m("li", [ @@ -63,11 +63,11 @@ m.module(document.getElementById("test"), { m("code", "m(\"div[contenteditable]\")")), m("div[contenteditable]", { style: {border: "1px solid #888"}, - onkeyup: m.withAttr("innerHTML", ctrl.title), - }, m.trust(ctrl.title())), - ]), - ]), + onkeyup: m.withAttr("innerHTML", ctrl.title) + }, m.trust(ctrl.title())) + ]) + ]) ]) - }, + } }) diff --git a/test/mithril.js b/test/mithril.js index 37b618d6..bf86f972 100644 --- a/test/mithril.js +++ b/test/mithril.js @@ -202,7 +202,7 @@ describe("m()", function () { controller: spy, view: function () { return m("div", "testing") - }, + } } var args = {age: 12} diff --git a/test/mithril.mount.js b/test/mithril.mount.js index 5c7803e1..fa68d11f 100644 --- a/test/mithril.mount.js +++ b/test/mithril.mount.js @@ -22,7 +22,7 @@ describe("m.mount()", function () { function pure(view) { return { controller: function () {}, - view: view, + view: view } } @@ -38,7 +38,7 @@ describe("m.mount()", function () { return [ whatever % 2 ? m("span", "% 2") : undefined, m("div", "bugs"), - m("a"), + m("a") ] }) @@ -64,7 +64,7 @@ describe("m.mount()", function () { var mod1 = m.mount(root1, { controller: controller1, - view: view1, + view: view1 }) var controller2 = sinon.spy(function () { this.value = "test2" }) // eslint-disable-line @@ -73,7 +73,7 @@ describe("m.mount()", function () { var mod2 = mount(root2, { controller: controller2, - view: view2, + view: view2 }) expect(controller1).to.have.been.called @@ -97,7 +97,7 @@ describe("m.mount()", function () { controller: function () { this.onunload = spy }, - view: function () {}, + view: function () {} }) clear(root) @@ -114,7 +114,7 @@ describe("m.mount()", function () { var component = { controller: ctrlSpy, - view: viewSpy, + view: viewSpy } var arg = {} @@ -148,7 +148,7 @@ describe("m.mount()", function () { var sub = { controller: ctrlSpy, - view: viewSpy, + view: viewSpy } mount(root, pure(function () { return sub })) @@ -168,7 +168,7 @@ describe("m.mount()", function () { var subsub = { controller: ctrl1, - view: view1, + view: view1 } var ctrl2 = sinon.spy() @@ -176,7 +176,7 @@ describe("m.mount()", function () { var sub = { controller: ctrl2, - view: view2, + view: view2 } mount(root, pure(function () { return sub })) @@ -326,7 +326,7 @@ describe("m.mount()", function () { }, view: function () { return m("div") - }, + } } mount(root, pure(function () { @@ -358,7 +358,7 @@ describe("m.mount()", function () { }, view: function () { return m("div") - }, + } } var sub = { @@ -367,7 +367,7 @@ describe("m.mount()", function () { }, view: function (ctrl, opts) { return m.component(subsub, {key: opts.key}) - }, + } } mount(root, pure(function () { @@ -400,7 +400,7 @@ describe("m.mount()", function () { controller: function () { m.redraw() }, - view: spy, + view: spy } mount(root, pure(function () { return sub })) @@ -418,7 +418,7 @@ describe("m.mount()", function () { controller: function () { m.redraw() }, - view: spy, + view: spy } var sub = pure(function () { return subsub }) @@ -439,14 +439,14 @@ describe("m.mount()", function () { var CommentList = pure(function (ctrl, props) { return m(".list", props.list.map(function (i) { return m(".comment", [ - m.component(Reply, {key: i}), + m.component(Reply, {key: i}) ]) })) }) mount(root, pure(function () { return m(".outer", [ - m(".inner", m.component(CommentList, {list: [1, 2, 3]})), + m(".inner", m.component(CommentList, {list: [1, 2, 3]})) ]) })) @@ -461,7 +461,7 @@ describe("m.mount()", function () { controller: function () { this.onunload = spy }, - view: function () {}, + view: function () {} }) m.mount(root, pure(function () {})) @@ -479,7 +479,7 @@ describe("m.mount()", function () { return m("div", { config: function (el, init) { if (init) count += 1 - }, + } }) })) @@ -505,9 +505,9 @@ describe("m.mount()", function () { m(".foo", { key: 1, config: test, - onclick: function () { show = !show }, + onclick: function () { show = !show } }), - show ? m(".bar", {key: 2}) : null, + show ? m(".bar", {key: 2}) : null ] })) @@ -529,9 +529,9 @@ describe("m.mount()", function () { mount(root, pure(function () { return show ? [ m("h1", "1"), - sub, + sub ] : [ - m("h1", "2"), + m("h1", "2") ] })) @@ -560,10 +560,10 @@ describe("m.mount()", function () { a = !a m.redraw(true) found = root.childNodes[0].childNodes[1] - }, + } }, "asd"), a ? m("#a", "aaa") : null, - "test", + "test" ]) }) @@ -572,7 +572,7 @@ describe("m.mount()", function () { config: function (el, init, ctx) { if (!init) ctx.onunload = onunload - }, + } } m.mount(root, pure(function () { return Comp })) @@ -602,10 +602,10 @@ describe("m.mount()", function () { m.redraw(true) found = root.childNodes[0].childNodes[1] m.redraw.strategy("none") - }, + } }, "asd"), a ? m("#a", "aaa") : null, - "test", + "test" ]) }) @@ -614,7 +614,7 @@ describe("m.mount()", function () { config: function (el, init, ctx) { if (!init) ctx.onunload = onunload - }, + } } m.mount(root, pure(function () { return Comp })) @@ -634,7 +634,7 @@ describe("m.mount()", function () { var root = mock.document.createElement("div") var view = sinon.stub().returns(m("div", { - onclick: function () { m.redraw(true) }, + onclick: function () { m.redraw(true) } })) m.mount(root, pure(view)) @@ -666,7 +666,7 @@ describe("m.mount()", function () { this.foo = m.request({method: "GET", url: "/foo"}) }, - view: view, + view: view } mount(root, pure(function () { return Comp })) @@ -691,20 +691,20 @@ describe("m.mount()", function () { controller: function () { this.foo = m.request({method: "GET", url: "/foo"}) }, - view: view1, + view: view1 } var Comp2 = { controller: function () { this.bar = m.request({method: "GET", url: "/bar"}) }, - view: view2, + view: view2 } mount(root, pure(function () { return m("div", [ Comp1, - Comp2, + Comp2 ]) })) @@ -751,7 +751,7 @@ describe("m.mount()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - }, + } }) }) @@ -794,9 +794,9 @@ describe("m.mount()", function () { ctrl.bar = true m.redraw(true) el = root.childNodes[0].childNodes[1] - }, + } }, "click me"), - ctrl.bar ? m.component(sub) : "", + ctrl.bar ? m.component(sub) : "" ]) })) diff --git a/test/mithril.redraw.js b/test/mithril.redraw.js index a6efe643..ada5b196 100644 --- a/test/mithril.redraw.js +++ b/test/mithril.redraw.js @@ -15,7 +15,7 @@ describe("m.redraw()", function () { m.mount(root, { controller: function () { ctx = this }, // eslint-disable-line - view: function (ctrl) { return ctrl.value }, + view: function (ctrl) { return ctrl.value } }) mock.requestAnimationFrame.$resolve() @@ -38,7 +38,7 @@ describe("m.redraw()", function () { m.mount(root, { controller: function () {}, - view: view, + view: view }) mock.requestAnimationFrame.$resolve() // teardown m.redraw() @@ -57,7 +57,7 @@ describe("m.redraw()", function () { var view = sinon.spy() m.mount(root, { controller: function () {}, - view: view, + view: view }) mock.requestAnimationFrame.$resolve() // teardown m.redraw(true) @@ -88,7 +88,7 @@ describe("m.redraw()", function () { function pure(view) { return { controller: noop, - view: view, + view: view } } @@ -138,8 +138,8 @@ describe("m.redraw()", function () { }, view: function () { return m("div") - }, - }, + } + } }) expect(strategy).to.equal("all") @@ -164,8 +164,8 @@ describe("m.redraw()", function () { }, view: function () { return m("div", {config: config}) - }, - }, + } + } }) route("/bar1") @@ -185,10 +185,10 @@ describe("m.redraw()", function () { strategy = m.redraw.strategy() ctrl.number++ m.redraw.strategy("none") - }, + } }, ctrl.number) - }, - }, + } + } }) root.childNodes[0].onclick({}) mock.requestAnimationFrame.$resolve() @@ -211,9 +211,9 @@ describe("m.redraw()", function () { config: config, onclick: function () { m.redraw.strategy("all") - }, + } }) - }), + }) }) root.childNodes[0].onclick({}) mock.requestAnimationFrame.$resolve() diff --git a/test/mithril.render.js b/test/mithril.render.js index bd6c6096..ec6ba1ce 100644 --- a/test/mithril.render.js +++ b/test/mithril.render.js @@ -62,7 +62,7 @@ describe("m.render()", function () { m.render(root, m("svg", [m("g")])) expect(root.childNodes[0].childNodes[0]).to.contain.all.keys({ nodeName: "G", - namespaceURI: "http://www.w3.org/2000/svg", + namespaceURI: "http://www.w3.org/2000/svg" }) }) @@ -237,7 +237,7 @@ describe("m.render()", function () { m.render(root, m("#foo", [ [m("div", "a"), m("div", "b")], [m("div", "c"), m("div", "d")], - m("#bar"), + m("#bar") ])) expect(root.childNodes[0].childNodes[3].childNodes[0].nodeValue) @@ -269,7 +269,7 @@ describe("m.render()", function () { ["a", "b", "c", "d"].map(function () { return [m("div"), " "] }), - m("span"), + m("span") ])) expect(root.childNodes[0].childNodes[8].nodeName).to.equal("SPAN") }) @@ -282,7 +282,7 @@ describe("m.render()", function () { m.render(root, m("#foo", [ [m("div", "a"), m("div", "b"), m("div", "c")], - m("#bar"), + m("#bar") ])) expect(root.childNodes[0].childNodes[2].childNodes[0].nodeValue) @@ -295,12 +295,12 @@ describe("m.render()", function () { m.render(root, m("main", [ m("button"), - m("article", [m("section"), m("nav")]), + m("article", [m("section"), m("nav")]) ])) m.render(root, m("main", [ m("button"), - m("article", [m("span"), m("nav")]), + m("article", [m("span"), m("nav")]) ])) expect(root.childNodes[0].childNodes[1].childNodes[0].nodeName) @@ -313,12 +313,12 @@ describe("m.render()", function () { m.render(root, m("main", [ m("button"), - m("article", [m("section"), m("nav")]), + m("article", [m("section"), m("nav")]) ])) m.render(root, m("main", [ m("button"), - m("article", ["test", m("nav")]), + m("article", ["test", m("nav")]) ])) expect(root.childNodes[0].childNodes[1].childNodes[0].nodeValue) @@ -331,12 +331,12 @@ describe("m.render()", function () { m.render(root, m("main", [ m("button"), - m("article", [m("section"), m("nav")]), + m("article", [m("section"), m("nav")]) ])) m.render(root, m("main", [ m("button"), - m("article", [m.trust("test"), m("nav")]), + m("article", [m.trust("test"), m("nav")]) ])) expect(root.childNodes[0].childNodes[1].childNodes[0].nodeValue) @@ -550,7 +550,7 @@ describe("m.render()", function () { var config = sinon.spy() m.render(root, m("div", { - config: function (el, init, ctx) { ctx.data = 1 }, + config: function (el, init, ctx) { ctx.data = 1 } })) m.render(root, m("div", {config: config})) @@ -564,7 +564,7 @@ describe("m.render()", function () { var index = 0 var node = m("div", { - config: function (el, init, ctx) { ctx.data = index++ }, + config: function (el, init, ctx) { ctx.data = index++ } }) m.render(root, [node, node]) @@ -604,7 +604,7 @@ describe("m.render()", function () { m.render(root, m("div", [ ["foo", "bar"], ["foo", "bar"], - ["foo", "bar"], + ["foo", "bar"] ])) m.render(root, m("div", ["asdf", "asdf2", "asdf3"])) @@ -619,7 +619,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3), + m("a", {key: 3}, 3) ]) var firstBefore = root.childNodes[0] @@ -628,7 +628,7 @@ describe("m.render()", function () { m("a", {key: 4}, 4), m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3), + m("a", {key: 3}, 3) ]) var firstAfter = root.childNodes[1] @@ -648,7 +648,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3), + m("a", {key: 3}, 3) ]) var firstBefore = root.childNodes[0] @@ -656,7 +656,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 4}, 4), m("a", {key: 1}, 1), - m("a", {key: 2}, 2), + m("a", {key: 2}, 2) ]) var firstAfter = root.childNodes[1] @@ -676,7 +676,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 1}, 1), m("a", {key: 2}, 2), - m("a", {key: 3}, 3), + m("a", {key: 3}, 3) ]) var firstBefore = root.childNodes[1] @@ -684,7 +684,7 @@ describe("m.render()", function () { m.render(root, [ m("a", {key: 2}, 2), m("a", {key: 3}, 3), - m("a", {key: 4}, 4), + m("a", {key: 4}, 4) ]) var firstAfter = root.childNodes[0] @@ -706,7 +706,7 @@ describe("m.render()", function () { m("a", {key: 2}, 2), m("a", {key: 3}, 3), m("a", {key: 4}, 4), - m("a", {key: 5}, 5), + m("a", {key: 5}, 5) ]) var firstBefore = root.childNodes[0] @@ -717,7 +717,7 @@ describe("m.render()", function () { m("a", {key: 4}, 4), m("a", {key: 10}, 10), m("a", {key: 1}, 1), - m("a", {key: 2}, 2), + m("a", {key: 2}, 2) ]) var firstAfter = root.childNodes[2] @@ -740,7 +740,7 @@ describe("m.render()", function () { m("a", {key: 2}, 2), m("a", {key: 3}, 3), m("a", {key: 4}, 4), - m("a", {key: 5}, 5), + m("a", {key: 5}, 5) ]) var firstBefore = root.childNodes[0] @@ -753,7 +753,7 @@ describe("m.render()", function () { m("a", {key: 2}, 2), m("a", {key: 1}, 1), m("a", {key: 6}, 6), - m("a", {key: 7}, 7), + m("a", {key: 7}, 7) ]) var firstAfter = root.childNodes[3] @@ -780,7 +780,7 @@ describe("m.render()", function () { m("a", {key: 2}), m("a"), m("a", {key: 4}), - m("a", {key: 5}), + m("a", {key: 5}) ]) var firstBefore = root.childNodes[0] @@ -794,7 +794,7 @@ describe("m.render()", function () { m("a", {key: 5}), m("a"), m("a", {key: 1}), - m("a", {key: 2}), + m("a", {key: 2}) ]) var firstAfter = root.childNodes[3] @@ -848,8 +848,8 @@ describe("m.render()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = spy - }, - }), + } + }) ]) m.render(root, [ m("div", {key: 2}), @@ -857,8 +857,8 @@ describe("m.render()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = spy - }, - }), + } + }) ]) expect(spy).to.not.have.been.called }) @@ -917,7 +917,7 @@ describe("m.render()", function () { m.render(root, m("ul", [ m("li", {key: 0}, 0), m("li", {key: 2}, 2), - m("li", {key: 4}, 4), + m("li", {key: 4}, 4) ])) m.render(root, m("ul", [ @@ -926,7 +926,7 @@ describe("m.render()", function () { m("li", {key: 2}, 2), m("li", {key: 3}, 3), m("li", {key: 4}, 4), - m("li", {key: 5}, 5), + m("li", {key: 5}, 5) ])) expect( @@ -962,7 +962,7 @@ describe("m.render()", function () { m("li", {key: 2}, 2), m("li", {key: 3}, 3), m("li", {key: 4}, 4), - m("li", {key: 5}, 5), + m("li", {key: 5}, 5) ])) m.render(root, m("ul", [ @@ -970,7 +970,7 @@ describe("m.render()", function () { m("li", {key: 1}, 1), m("li", {key: 2}, 2), m("li", {key: 4}, 4), - m("li", {key: 5}, 5), + m("li", {key: 5}, 5) ])) expect( @@ -990,7 +990,7 @@ describe("m.render()", function () { m("li", {key: 2}, 2), m("li", {key: 3}, 3), m("li", {key: 4}, 4), - m("li", {key: 5}, 5), + m("li", {key: 5}, 5) ])) m.render(root, m("ul", [ @@ -999,7 +999,7 @@ describe("m.render()", function () { m("li", {key: 3}, 3), m("li", {key: 4}, 4), m("li", {key: 5}, 5), - m("li", {key: 6}, 6), + m("li", {key: 6}, 6) ])) m.render(root, m("ul", [ @@ -1008,7 +1008,7 @@ describe("m.render()", function () { m("li", {key: 14}, 14), m("li", {key: 15}, 15), m("li", {key: 16}, 16), - m("li", {key: 17}, 17), + m("li", {key: 17}, 17) ])) expect( @@ -1044,7 +1044,7 @@ describe("m.render()", function () { m.render(root, [m("div", { config: function (el, init, ctx) { ctx.onunload = onunload1 - }, + } })]) m.render(root, []) @@ -1052,7 +1052,7 @@ describe("m.render()", function () { m.render(root, [m("div", { config: function (el, init, ctx) { ctx.onunload = onunload2 - }, + } })]) m.render(root, []) @@ -1068,7 +1068,7 @@ describe("m.render()", function () { m.render(root, [ m("div.green", [m("div")]), - m("div.blue"), + m("div.blue") ]) expect(root.childNodes).to.have.length(2) @@ -1102,7 +1102,7 @@ describe("m.render()", function () { m("div", {key: 3}, 3), m("div", {key: 4}, 4), m("div", {key: 5}, 5), - null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null ])) m.render(root, m("div", [ @@ -1115,7 +1115,7 @@ describe("m.render()", function () { null, null, m("div", {key: 12}, 12), null, null, - m("div", {key: 15}, 15), + m("div", {key: 15}, 15) ])) m.render(root, m("div", [ @@ -1124,7 +1124,7 @@ describe("m.render()", function () { m("div", {key: 3}, 3), m("div", {key: 4}, 4), m("div", {key: 5}, 5), - null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null ])) expect( @@ -1145,9 +1145,9 @@ describe("m.render()", function () { [ m("div", {key: 3}, 3), m("div", {key: 4}, 4), - m("div", {key: 5}, 5), + m("div", {key: 5}, 5) ], - [m("div", {key: 6}, 6)], + [m("div", {key: 6}, 6)] ])) m.render(root, m("div", [ @@ -1156,9 +1156,9 @@ describe("m.render()", function () { [ m("div", {key: 3}, 3), m("div", {key: 4}, 4), - m("div", {key: 5}, 5), + m("div", {key: 5}, 5) ], - [m("div", {key: 6}, 6)], + [m("div", {key: 6}, 6)] ])) expect( @@ -1183,7 +1183,7 @@ describe("m.render()", function () { m.render(root, [ m("#div-1", {key: 1}), m("#div-2", {key: 2}), - m("#div-3", {key: 3}), + m("#div-3", {key: 3}) ]) root.appendChild(root.childNodes[1]) @@ -1191,7 +1191,7 @@ describe("m.render()", function () { m.render(root, [ m("#div-1", {key: 1}), m("#div-3", {key: 3}), - m("#div-2", {key: 2}), + m("#div-2", {key: 2}) ]) expect( @@ -1228,7 +1228,7 @@ describe("m.render()", function () { m("a", {key: 1}), m("a", {key: 2}), m("a", {key: 3}), - m("i"), + m("i") ])) var before = root.childNodes[0].childNodes[3] @@ -1236,7 +1236,7 @@ describe("m.render()", function () { m("b", {key: 3}), m("b", {key: 4}), m("i"), - m("b", {key: 1}), + m("b", {key: 1}) ])) var after = root.childNodes[0].childNodes[2] @@ -1251,7 +1251,7 @@ describe("m.render()", function () { m("a", {key: 2}), "foo", m("a", {key: 3}), - m("i"), + m("i") ])) var before = root.childNodes[0].childNodes[4] @@ -1260,7 +1260,7 @@ describe("m.render()", function () { m("a", {key: 4}), "bar", m("i"), - m("a", {key: 1}), + m("a", {key: 1}) ])) var after = root.childNodes[0].childNodes[3] @@ -1275,7 +1275,7 @@ describe("m.render()", function () { m("a", {key: 2}), null, m("a", {key: 3}), - m("i"), + m("i") ])) var before = root.childNodes[0].childNodes[4] @@ -1284,7 +1284,7 @@ describe("m.render()", function () { m("a", {key: 4}), null, m("i"), - m("a", {key: 1}), + m("a", {key: 1}) ])) var after = root.childNodes[0].childNodes[3] @@ -1299,7 +1299,7 @@ describe("m.render()", function () { m("a", {key: 2}), undefined, m("a", {key: 3}), - m("i"), + m("i") ])) var before = root.childNodes[0].childNodes[4] @@ -1308,7 +1308,7 @@ describe("m.render()", function () { m("a", {key: 4}), undefined, m("i"), - m("a", {key: 1}), + m("a", {key: 1}) ])) var after = root.childNodes[0].childNodes[3] @@ -1325,7 +1325,7 @@ describe("m.render()", function () { m("a", {key: 2}), m.trust("a"), m("a", {key: 3}), - m("i"), + m("i") ])) var before = root.childNodes[0].childNodes[4] @@ -1334,7 +1334,7 @@ describe("m.render()", function () { m("a", {key: 4}), m.trust("a"), m("i"), - m("a", {key: 1}), + m("a", {key: 1}) ])) var after = root.childNodes[0].childNodes[3] @@ -1360,7 +1360,7 @@ describe("m.render()", function () { m.render(root, m("div", {}, [ m("div", {}, "0"), m("div", {}, "1"), - m("div", {}, "2"), + m("div", {}, "2") ])) expect( @@ -1370,7 +1370,7 @@ describe("m.render()", function () { ).to.eql(["0", "1", "2"]) m.render(root, m("div", {}, [ - m("div", {}, "0"), + m("div", {}, "0") ])) expect( @@ -1385,7 +1385,7 @@ describe("m.render()", function () { m.render(root, m("span", {}, [ m("div", {}, "0"), m("div", {}, "1"), - m("div", {}, "2"), + m("div", {}, "2") ])) expect( @@ -1395,7 +1395,7 @@ describe("m.render()", function () { ).to.eql(["0", "1", "2"]) m.render(root, m("span", {}, [ - m("div", {}, "0"), + m("div", {}, "0") ])) expect( @@ -1420,9 +1420,9 @@ describe("m.render()", function () { view: function (ctrl) { return m("input", { value: ctrl.inputValue(), - onkeyup: m.withAttr("value", ctrl.inputValue), + onkeyup: m.withAttr("value", ctrl.inputValue) }) - }, + } }) mock.requestAnimationFrame.$resolve() @@ -1466,11 +1466,11 @@ describe("m.render()", function () { return m("form", {onsubmit: ctrl.submit}, [ m("input", { onkeyup: m.withAttr("value", ctrl.inputValue), - value: ctrl.inputValue(), + value: ctrl.inputValue() }), - m("button[type=submit]"), + m("button[type=submit]") ]) - }, + } }) var form = root.childNodes[0] @@ -1511,7 +1511,7 @@ describe("m.render()", function () { view: function (ctrl) { return m("select", { size: ctrl.values.length, - multiple: "multiple", + multiple: "multiple" }, [ ctrl.values.map(function (v) { var opts = {value: v} @@ -1519,9 +1519,9 @@ describe("m.render()", function () { opts.selected = "selected" } return m("option", opts, v) - }), + }) ]) - }, + } }) mock.requestAnimationFrame.$resolve() diff --git a/test/mithril.request.js b/test/mithril.request.js index e2409959..fd8ab1f4 100644 --- a/test/mithril.request.js +++ b/test/mithril.request.js @@ -21,12 +21,12 @@ describe("m.request()", function () { it("sets the correct properties on `GET`", function () { var prop = request({ method: "GET", - url: "test", + url: "test" }) expect(prop()).to.contain.keys({ method: "GET", - url: "test", + url: "test" }) }) @@ -49,12 +49,12 @@ describe("m.request()", function () { var prop = request({ method: "POST", url: "http://domain.com:80", - data: {}, + data: {} }) expect(prop()).to.contain.keys({ method: "POST", - url: "http://domain.com:80", + url: "http://domain.com:80" }) }) @@ -62,7 +62,7 @@ describe("m.request()", function () { expect(request({ method: "POST", url: "http://domain.com:80/:test1", - data: {test1: "foo"}, + data: {test1: "foo"} })().url).to.equal("http://domain.com:80/foo") }) @@ -72,7 +72,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new Error("error occurred") }, + deserialize: function () { throw new Error("error occurred") } }).then(null, error) resolve() @@ -86,7 +86,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new Error("error occurred") }, + deserialize: function () { throw new Error("error occurred") } }).catch(error) resolve() @@ -99,7 +99,7 @@ describe("m.request()", function () { var data = m.prop() var prop = m.request({ method: "GET", - url: "test", + url: "test" }) .then(function () { return "foo" }) .finally(data) @@ -142,7 +142,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new Error("error occurred") }, + deserialize: function () { throw new Error("error occurred") } }) .catch(error) .finally(function () { error("finally") }) @@ -158,7 +158,7 @@ describe("m.request()", function () { var prop = m.request({ method: "GET", url: "test", - deserialize: function () { throw new TypeError("error occurred") }, + deserialize: function () { throw new TypeError("error occurred") } }).then(null, error) try { @@ -178,7 +178,7 @@ describe("m.request()", function () { m.request({ method: "POST", url: "test", - data: {foo: 1}, + data: {foo: 1} }).then(null, error) var xhr = mock.XMLHttpRequest.$instances.pop() @@ -194,7 +194,7 @@ describe("m.request()", function () { m.request({ method: "POST", - url: "test", + url: "test" }).then(null, error) var xhr = mock.XMLHttpRequest.$instances.pop() @@ -207,7 +207,7 @@ describe("m.request()", function () { var prop = m.request({ method: "POST", url: "test", - initialValue: "foo", + initialValue: "foo" }) var initialValue = prop() @@ -220,7 +220,7 @@ describe("m.request()", function () { var prop = m.request({ method: "POST", url: "test", - initialValue: "foo", + initialValue: "foo" }).then(function (value) { return value }) var initialValue = prop() @@ -233,7 +233,7 @@ describe("m.request()", function () { var prop = m.request({ method: "POST", url: "test", - initialValue: "foo", + initialValue: "foo" }).then(function () { return "bar" }) resolve() @@ -290,7 +290,7 @@ describe("m.request()", function () { url: "/test", dataType: "jsonp", data: data, - callbackKey: callbackKey, + callbackKey: callbackKey }) } diff --git a/test/mithril.route.buildQueryString.js b/test/mithril.route.buildQueryString.js index f8c2e159..bd53ad5e 100644 --- a/test/mithril.route.buildQueryString.js +++ b/test/mithril.route.buildQueryString.js @@ -15,11 +15,11 @@ describe("m.route.buildQueryString()", function () { foo: "bar", hello: ["world", "mars", "mars"], world: { - test: 3, + test: 3 }, bam: "", yup: null, - removed: undefined, + removed: undefined }) ).to.equal("foo=bar&hello=world&hello=mars&world%5Btest%5D=3&bam=&yup") }) diff --git a/test/mithril.route.js b/test/mithril.route.js index f130c279..b252267d 100644 --- a/test/mithril.route.js +++ b/test/mithril.route.js @@ -13,7 +13,7 @@ describe("m.route()", function () { var types = { search: "?", hash: "#", - pathname: "/", + pathname: "/" } return function (type) { @@ -32,7 +32,7 @@ describe("m.route()", function () { function pure(view) { return { controller: noop, - view: view, + view: view } } @@ -74,7 +74,7 @@ describe("m.route()", function () { mode("search") route(root, "/test1", { - "/test1": pure(function () { return "foo" }), + "/test1": pure(function () { return "foo" }) }) expect(mock.location.search).to.equal("?/test1") @@ -88,12 +88,12 @@ describe("m.route()", function () { route(root, "/", { "/": { controller: function () { route1 = m.route() }, - view: noop, + view: noop }, "/test13": { controller: function () { route2 = m.route() }, - view: noop, - }, + view: noop + } }) m.route("/test13") @@ -113,7 +113,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - }, + } } route(root, "/a", { @@ -121,8 +121,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop, - }, + view: noop + } }) route("/b") @@ -142,7 +142,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - }, + } } var sub = pure(function () { return subsub }) @@ -152,8 +152,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop, - }, + view: noop + } }) route("/b") @@ -173,7 +173,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - }, + } } route(root, "/a", { @@ -181,8 +181,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop, - }, + view: noop + } }) route("/b") @@ -202,7 +202,7 @@ describe("m.route()", function () { }, view: function () { return m("div") - }, + } } var sub = pure(function () { return subsub }) @@ -212,8 +212,8 @@ describe("m.route()", function () { "/b": { controller: spy, - view: noop, - }, + view: noop + } }) route("/b") @@ -229,26 +229,26 @@ describe("m.route()", function () { var sub1 = { controller: ctrl1, - view: function () { return m("div") }, + view: function () { return m("div") } } var sub2 = { controller: ctrl2, - view: function () { return m("div") }, + view: function () { return m("div") } } route(root, "/a", { "/a": pure(function () { return m(".page-a", [ - m("h1"), m.component(sub1, {x: 11}), + m("h1"), m.component(sub1, {x: 11}) ]) }), "/b": pure(function () { return m(".page-b", [ - m("h2"), m.component(sub2, {y: 22}), + m("h2"), m.component(sub2, {y: 22}) ]) - }), + }) }) route("/b") @@ -264,7 +264,7 @@ describe("m.route()", function () { var Component = pure(function () { return m(".comp") }) route(root, "/foo", { - "/foo": pure(function () { return [Component] }), + "/foo": pure(function () { return [Component] }) }) expect(root.childNodes[0].nodeName).to.equal("DIV") @@ -279,7 +279,7 @@ describe("m.route()", function () { view: function (ctrl) { return m("div", ctrl.name) - }, + } } route(root, "/", { @@ -287,7 +287,7 @@ describe("m.route()", function () { return m("div", [ m("a[href=/]", {config: m.route}, "foo"), m("a[href=/bar]", {config: m.route}, "bar"), - m.component(MyComponent, {name: "Jane"}), + m.component(MyComponent, {name: "Jane"}) ]) }), @@ -295,9 +295,9 @@ describe("m.route()", function () { return m("div", [ m("a[href=/]", {config: m.route}, "foo"), m("a[href=/bar]", {config: m.route}, "bar"), - m.component(MyComponent, {name: "Bob"}), + m.component(MyComponent, {name: "Bob"}) ]) - }), + }) }) route("/bar") @@ -313,9 +313,9 @@ describe("m.route()", function () { "/test2": pure(function () { return [ "foo", - m("a", {href: "/test2", config: m.route}, "Test2"), + m("a", {href: "/test2", config: m.route}, "Test2") ] - }), + }) }) expect(mock.location.pathname).to.equal("/test2") @@ -327,7 +327,7 @@ describe("m.route()", function () { mode("hash") route(root, "/test3", { - "/test3": pure(function () { return "foo" }), + "/test3": pure(function () { return "foo" }) }) expect(mock.location.hash).to.equal("#/test3") @@ -338,7 +338,7 @@ describe("m.route()", function () { mode("search") route(root, "/test4/foo", { - "/test4/:test": pure(function () { return m.route.param("test") }), + "/test4/:test": pure(function () { return m.route.param("test") }) }) expect(mock.location.search).to.equal("?/test4/foo") @@ -357,7 +357,7 @@ describe("m.route()", function () { m.route(root, "/test5/foo", { "/": component, - "/test5/:test": component, + "/test5/:test": component }) var paramValueBefore = m.route.param("test") @@ -381,7 +381,7 @@ describe("m.route()", function () { m.route(root, "/test6/foo", { "/": component, - "/test6/:a1": component, + "/test6/:a1": component }) var paramValueBefore = m.route.param("a1") @@ -406,7 +406,7 @@ describe("m.route()", function () { m.route(root, "/test7/foo", { "/": component, - "/test7/:a1": component, + "/test7/:a1": component }) var routeValueBefore = m.route() @@ -428,7 +428,7 @@ describe("m.route()", function () { route(root, "/test8/foo/SEP/bar/baz", { "/test8/:test/SEP/:path...": pure(function () { return m.route.param("test") + "_" + m.route.param("path") - }), + }) }) expect(mock.location.search).to.equal("?/test8/foo/SEP/bar/baz") @@ -441,7 +441,7 @@ describe("m.route()", function () { route(root, "/test9/foo/bar/SEP/baz", { "/test9/:test.../SEP/:path": pure(function () { return m.route.param("test") + "_" + m.route.param("path") - }), + }) }) expect(mock.location.search).to.equal("?/test9/foo/bar/SEP/baz") @@ -454,7 +454,7 @@ describe("m.route()", function () { route(root, "/test10/foo%20bar", { "/test10/:test": pure(function () { return m.route.param("test") - }), + }) }) expect(root.childNodes[0].nodeValue).to.equal("foo bar") @@ -465,7 +465,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "foo" }), - "/test11": pure(function () { return "bar" }), + "/test11": pure(function () { return "bar" }) }) route("/test11/") @@ -479,7 +479,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(noop), - "/test12": pure(noop), + "/test12": pure(noop) }) route("/test12?a=foo&b=bar") @@ -496,7 +496,7 @@ describe("m.route()", function () { "/": pure(function () { return "bar" }), "/test13/:test": pure(function () { return m.route.param("test") - }), + }) }) route("/test13/foo?test=bar") @@ -510,7 +510,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "bar" }), - "/test14": pure(function () { return "foo" }), + "/test14": pure(function () { return "foo" }) }) route("/test14?test&test2=") @@ -525,7 +525,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(noop), - "/test12": pure(noop), + "/test12": pure(noop) }) route("/test12", {a: "foo", b: "bar"}) @@ -540,7 +540,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(noop), - "/test12": pure(noop), + "/test12": pure(noop) }) route("/test12", {a: "foo", b: "bar"}) @@ -562,10 +562,10 @@ describe("m.route()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - }, + } }) }), - "/test14": pure(noop), + "/test14": pure(noop) }) route("/test14") @@ -585,11 +585,11 @@ describe("m.route()", function () { m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - }, - }), + } + }) ] }), - "/test15": pure(function () { return [m("div")] }), + "/test15": pure(function () { return [m("div")] }) }) route("/test15") @@ -607,10 +607,10 @@ describe("m.route()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - }, + } }) }), - "/test16": pure(function () { return m("a") }), + "/test16": pure(function () { return m("a") }) }) route("/test16") @@ -629,11 +629,11 @@ describe("m.route()", function () { m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - }, - }), + } + }) ] }), - "/test17": pure(function () { return m("a") }), + "/test17": pure(function () { return m("a") }) }) route("/test17") @@ -651,10 +651,10 @@ describe("m.route()", function () { return m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - }, + } }) }), - "/test18": pure(function () { return [m("a")] }), + "/test18": pure(function () { return [m("a")] }) }) route("/test18") @@ -674,8 +674,8 @@ describe("m.route()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = onunload - }, - }), + } + }) ] }), "/test20": pure(function () { @@ -684,10 +684,10 @@ describe("m.route()", function () { key: 2, config: function (el, init, ctx) { ctx.onunload = onunload - }, - }), + } + }) ] - }), + }) }) route("/test20") @@ -707,8 +707,8 @@ describe("m.route()", function () { key: 1, config: function (el, init, ctx) { ctx.onunload = onunload - }, - }), + } + }) ] }), "/test21": pure(function () { @@ -716,10 +716,10 @@ describe("m.route()", function () { m("div", { config: function (el, init, ctx) { ctx.onunload = onunload - }, - }), + } + }) ] - }), + }) }) route("/test21") @@ -732,7 +732,7 @@ describe("m.route()", function () { route(root, "/foo", { "/foo": pure(function () { return m("div", "foo") }), - "/bar": pure(function () { return m("div", "bar") }), + "/bar": pure(function () { return m("div", "bar") }) }) var foo = root.childNodes[0].childNodes[0].nodeValue @@ -757,7 +757,7 @@ describe("m.route()", function () { }), "/bar1": pure(function () { return m("main", m("a", {config: config}, "foo")) - }), + }) }) route("/bar1") @@ -774,8 +774,8 @@ describe("m.route()", function () { controller: function () { value = m.route.param("arg") }, view: function () { return "" - }, - }, + } + } }) expect(value).to.equal("foo+bar") }) @@ -785,7 +785,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "foo" }), - "/test22": pure(function () { return "bar" }), + "/test22": pure(function () { return "bar" }) }) m.route("/test22/") @@ -799,7 +799,7 @@ describe("m.route()", function () { route(root, "/", { "/": pure(function () { return "foo" }), - "/test23": pure(function () { return "bar" }), + "/test23": pure(function () { return "bar" }) }) route(new String("/test23/")) // eslint-disable-line no-new-wrappers @@ -817,8 +817,8 @@ describe("m.route()", function () { controller: function () { value = m.route.param("arg") }, view: function () { return "" - }, - }, + } + } }) expect(value).to.equal("foo+bar") }) @@ -832,8 +832,8 @@ describe("m.route()", function () { controller: function () { value = m.route.param("arg") }, view: function () { return "" - }, - }, + } + } }) expect(value).to.equal("foo+bar") @@ -845,10 +845,10 @@ describe("m.route()", function () { route(root, "/a", { "/a": { controller: function () { m.route("/b") }, - view: function () { return "a" }, + view: function () { return "a" } }, - "/b": pure(function () { return "b" }), + "/b": pure(function () { return "b" }) }) expect(root.childNodes[0].nodeValue).to.equal("b") @@ -862,9 +862,9 @@ describe("m.route()", function () { controller: function () { m.route("/b?foo=1", {foo: 2}) }, - view: function () { return "a" }, + view: function () { return "a" } }, - "/b": pure(function () { return "b" }), + "/b": pure(function () { return "b" }) }) expect(mock.location.search).to.equal("?/b?foo=2") @@ -876,7 +876,7 @@ describe("m.route()", function () { route(root, "/a", { "/a": pure(function () { return "a" }), - "/b": pure(function () { return "b" }), + "/b": pure(function () { return "b" }) }) route("/b") @@ -890,7 +890,7 @@ describe("m.route()", function () { route(root, "/a", { "/a": pure(function () { return "a" }), - "/b": pure(function () { return "b" }), + "/b": pure(function () { return "b" }) }) route("/a") @@ -908,13 +908,13 @@ describe("m.route()", function () { return m("a", { config: function (el, init) { if (!init) initCount++ - }, + } }) }) route(root, "/a", { "/a": a, - "/b": pure(a.view), + "/b": pure(a.view) }) route("/b") @@ -931,13 +931,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = false if (!init) initCount++ - }, + } }) }) route(root, "/a", { "/a": a, - "/b": pure(a.view), + "/b": pure(a.view) }) route("/b") @@ -954,13 +954,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = true if (!init) initCount++ - }, + } }) }) route(root, "/a", { "/a": a, - "/b": pure(a.view), + "/b": pure(a.view) }) route("/b") @@ -984,7 +984,7 @@ describe("m.route()", function () { }), "/b": pure(function () { return m("section", m("a", {config: config})) - }), + }) }) route("/b") @@ -1006,7 +1006,7 @@ describe("m.route()", function () { }), "/b": pure(function () { return m("section", m("a", {config: config})) - }), + }) }) route("/b") @@ -1028,7 +1028,7 @@ describe("m.route()", function () { }), "/b": pure(function () { return m("section", m("a", {config: config})) - }), + }) }) route("/b") @@ -1042,7 +1042,7 @@ describe("m.route()", function () { function diff(view) { return { controller: function () { m.redraw.strategy("diff") }, - view: view, + view: view } } @@ -1055,13 +1055,13 @@ describe("m.route()", function () { return m("a", { config: function (el, init) { if (!init) initCount++ - }, + } }) }) route(root, "/a", { "/a": a, - "/b": diff(a.view), + "/b": diff(a.view) }) route("/b") @@ -1078,13 +1078,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = true if (!init) initCount++ - }, + } }) }) route(root, "/a", { "/a": a, - "/b": diff(a.view), + "/b": diff(a.view) }) route("/b") @@ -1101,13 +1101,13 @@ describe("m.route()", function () { config: function (el, init, ctx) { ctx.retain = false if (!init) initCount++ - }, + } }) }) route(root, "/a", { "/a": a, - "/b": diff(a.view), + "/b": diff(a.view) }) route("/b") @@ -1131,7 +1131,7 @@ describe("m.route()", function () { }), "/b": diff(function () { return m("section", m("a", {config: config})) - }), + }) }) route("/b") @@ -1154,7 +1154,7 @@ describe("m.route()", function () { }), "/b": diff(function () { return m("section", m("a", {config: config})) - }), + }) }) route("/b") @@ -1177,7 +1177,7 @@ describe("m.route()", function () { }), "/b": diff(function () { return m("section", m("a", {config: config})) - }), + }) }) m.route("/b") @@ -1204,12 +1204,12 @@ describe("m.route()", function () { controller: function () { m.redraw.strategy("diff") }, view: function () { return m("section", m("a", {config: config})) - }, + } } route(root, "/a", { "/a": pure(function () { return m("div", a) }), - "/b": pure(function () { return m("div", b) }), + "/b": pure(function () { return m("div", b) }) }) route("/b") @@ -1226,10 +1226,10 @@ describe("m.route()", function () { return m("div", { config: function (el) { el.childNodes[0].modified = true - }, + } }, m("div")) }), - "/b": pure(function () { return m("div", m("div")) }), + "/b": pure(function () { return m("div", m("div")) }) }) route("/b") diff --git a/test/mithril.route.parseQueryString.js b/test/mithril.route.parseQueryString.js index 1999ae39..3acc68ba 100644 --- a/test/mithril.route.parseQueryString.js +++ b/test/mithril.route.parseQueryString.js @@ -18,7 +18,7 @@ describe("m.route.parseQueryString()", function () { foo: "bar", hello: ["world", "mars"], bam: "", - yup: null, + yup: null }) }) @@ -28,7 +28,7 @@ describe("m.route.parseQueryString()", function () { expect(args).to.eql({ foo: "bar", - "hello[]": ["world", "mars", "pluto"], + "hello[]": ["world", "mars", "pluto"] }) }) }) diff --git a/test/mithril.startComputation.js b/test/mithril.startComputation.js index dffe557c..cfa58063 100644 --- a/test/mithril.startComputation.js +++ b/test/mithril.startComputation.js @@ -12,7 +12,7 @@ describe("m.startComputation(), m.endComputation()", function () { var root = mock.document.createElement("div") var controller = m.mount(root, { controller: function () {}, - view: function (ctrl) { return ctrl.value }, + view: function (ctrl) { return ctrl.value } }) mock.requestAnimationFrame.$resolve() diff --git a/test/mithril.trust.js b/test/mithril.trust.js index a96075c5..41881b31 100644 --- a/test/mithril.trust.js +++ b/test/mithril.trust.js @@ -36,7 +36,7 @@ describe("m.trust()", function () { var root = document.createElement("div") m.render(root, [ m.trust("

1

123

2

"), - m("i", "foo"), + m("i", "foo") ]) expect(root.childNodes[3].tagName).to.equal("I") }) @@ -49,7 +49,7 @@ describe("m.trust()", function () { m.render(root, [ m.trust("12"), - m("td", "foo"), + m("td", "foo") ]) expect(root.childNodes[2].tagName).to.equal("td") diff --git a/test/svg.html b/test/svg.html index 6ecd34f6..322d1045 100644 --- a/test/svg.html +++ b/test/svg.html @@ -57,20 +57,20 @@ m.render(document.getElementById("test"), [ height: 100, width: 100, transform: "translate(30) rotate(45 50 50)", - style: {stroke: "#000", fill: "#0086b2"}, + style: {stroke: "#000", fill: "#0086b2"} }), m("a[href='http://google.com'][title='SVG link'][target=_new]", { - style: {textDecoration: "underline"}, + style: {textDecoration: "underline"} }, [ - m("text[x=0][y=20]", "SVG Link"), - ]), + m("text[x=0][y=20]", "SVG Link") + ]) ]), m("svg[height=201px][width=201px]", [ m("image[href='http://placekitten.com/201/201']", { height: "200px", width: "200px", - title: "Cat picture", - }), + title: "Cat picture" + }) ]), m("svg[title='Line drawings']", { "enable-background": "new 0 0 340 333", @@ -78,7 +78,7 @@ m.render(document.getElementById("test"), [ viewBox: "0 0 340 333", width: "340px", x: "0px", - y: "0px", + y: "0px" }, [ m("path.path", { d: [ @@ -94,13 +94,13 @@ m.render(document.getElementById("test"), [ "s 11 -61 -11 -80", "s -79 -7 -70 -41", "C 46.039,146.545,53.039,128.545,66.039,133.545", - "z", + "z" ].join(" "), fill: "#FFFFFF", stroke: "#000000", "stroke-miterlimit": 10, - "stroke-width": 4, - }), + "stroke-width": 4 + }) ]), m("svg[height=270px][width=270px][viewBox='0 0 270 270']", [ m("g[transform='translate(150,150)'][title=Clock]", [ @@ -109,7 +109,7 @@ m.render(document.getElementById("test"), [ r: 108, fill: "none", "stroke-width": 4, - stroke: "gray", + stroke: "gray" }), m("circle", { r: 97, @@ -117,7 +117,7 @@ m.render(document.getElementById("test"), [ "stroke-width": 11, stroke: "black", "stroke-dasharray": "4,46.789082", - transform: "rotate(-1.5)", + transform: "rotate(-1.5)" }), m("circle", { r: 100, @@ -125,8 +125,8 @@ m.render(document.getElementById("test"), [ "stroke-width": 5, stroke: "black", "stroke-dasharray": "2,8.471976", - transform: "rotate(-.873)", - }), + transform: "rotate(-.873)" + }) ]), m("g[transform='rotate(180)']", [ m("g#hour", [ @@ -135,15 +135,15 @@ m.render(document.getElementById("test"), [ y2: 75, "stroke-linecap": "round", stroke: "blue", - opacity: 0.5, + opacity: 0.5 }), m("animateTransform[attributeName=transform]", { type: "rotate", repeatCount: "indefinite", dur: "12h", - by: 360, + by: 360 }), - m("circle[r=7]"), + m("circle[r=7]") ]), m("g#minute", [ m("line", { @@ -151,15 +151,15 @@ m.render(document.getElementById("test"), [ y2: 93, "stroke-linecap": "round", stroke: "green", - opacity: 0.9, + opacity: 0.9 }), m("animateTransform[attributeName=transform]", { type: "rotate", repeatCount: "indefinite", dur: "60min", - by: 360, + by: 360 }), - m("circle[r=6][fill=red]"), + m("circle[r=6][fill=red]") ]), m("g#second", [ m("line", { @@ -167,17 +167,17 @@ m.render(document.getElementById("test"), [ y1: -20, y2: 102, "stroke-linecap": "round", - stroke: "red", + stroke: "red" }), m("animateTransform[attributeName=transform]", { type: "rotate", repeatCount: "indefinite", dur: "60s", - by: 360, + by: 360 }), - m("circle[r=4][fill=blue]"), - ]), - ]), + m("circle[r=4][fill=blue]") + ]) + ]) ]), m("script", "(" + function () { "use strict" @@ -195,7 +195,7 @@ m.render(document.getElementById("test"), [ rotate("hour", 30 * (hours + minutes / 60 + seconds / 3600)) rotate("minute", 6 * (minutes + seconds / 60)) rotate("second", 6 * seconds) - }.toString() + ")()"), + }.toString() + ")()") ]), m("svg[height=200px][width=200px]", [ m("foreignObject", { @@ -203,12 +203,12 @@ m.render(document.getElementById("test"), [ y: 0, width: "100px", height: "100px", - transform: "translate(0,0)", + transform: "translate(0,0)" }, m("div", {xmlns: "http://www.w3.org/1999/xhtml"}, [ m.trust("this is a piece of html rendered as " + "" + - "SVG foreignObject"), - ])), - ]), + "SVG foreignObject") + ])) + ]) ]) From c92c92d9dfdb5f66b591fdd5482deaed0ff7e69d Mon Sep 17 00:00:00 2001 From: Julien Bisconti Date: Mon, 30 Nov 2015 21:06:58 +0100 Subject: [PATCH 12/19] fix missing paren in code --- docs/mithril.render.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/mithril.render.md b/docs/mithril.render.md index 39b0a808..f571e429 100644 --- a/docs/mithril.render.md +++ b/docs/mithril.render.md @@ -29,7 +29,7 @@ m.render(document.body, [ m("ul.nav", [ m("li", links.map(function(link) { return m("a", {href: link.url, config: m.route}, link.title) - }) + })) ]) ]); ``` From bd0ce5c06bd2488b73fc3dfd744a19cd6430a272 Mon Sep 17 00:00:00 2001 From: Julien Bisconti Date: Tue, 1 Dec 2015 18:04:11 +0100 Subject: [PATCH 13/19] Overriding extract option in m.request fixes: #859 --- mithril.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril.js b/mithril.js index 9a70070c..cec9a331 100644 --- a/mithril.js +++ b/mithril.js @@ -2087,7 +2087,7 @@ void (function (global, factory) { // eslint-disable-line if (!options.dataType || options.dataType.toLowerCase() !== "jsonp") { serialize = options.serialize || JSON.stringify deserialize = options.deserialize || JSON.parse - extract = function (xhr) { + extract = options.extract || function (xhr) { if (xhr.responseText.length === 0 && deserialize === JSON.parse) { return null From b121ba28241c3624e24be104977ae4b31c4edb76 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Wed, 2 Dec 2015 22:06:05 -0500 Subject: [PATCH 14/19] point to mithril-objectify --- docs/optimizing-performance.md | 69 ++++------------------------------ 1 file changed, 8 insertions(+), 61 deletions(-) diff --git a/docs/optimizing-performance.md b/docs/optimizing-performance.md index d4ed8b44..b880350e 100644 --- a/docs/optimizing-performance.md +++ b/docs/optimizing-performance.md @@ -10,13 +10,13 @@ For example, if you are building a table with thousands of rows and finding that ## Compiling templates -You can optionally pre-compile templates that use `m()` by running the [`template-compiler.sjs`](tools/template-compiler.sjs) macro with [Sweet.js](https://github.com/mozilla/sweet.js). This step isn't required in order to use Mithril, but it's an easy way to squeeze a little bit more performance out of an application, without the need for code changes. +You can optionally pre-compile templates that use `m()` by using [mithril-objectify](https://github.com/tivac/mithril-objectify/). This step isn't required in order to use Mithril, but it's an easy way to squeeze a little bit more performance out of an application, without the need for code changes. Compiling a template transforms the nested function calls of a template into a raw virtual DOM tree (which is merely a collection of native Javascript objects that is ready to be rendered via [`m.render`](mithril.render.md)). This means that compiled templates don't need to parse the string in `m("div#foo")` and they don't incur the cost of the function call. It's worth mentioning that Mithril has built-in mechanisms elsewhere that take care of real bottlenecks like browser repaint management and DOM updating. This optional compilation tool is merely "icing on the cake" that speeds up the Javascript run-time of templates (which is already fast, even without compilation - see the [performance section on the homepage](http://lhorie.github.io/mithril/index.html#performance)). -The macro takes regular Mithril templates like the one below: +The tool takes regular Mithril templates like the one below: ```javascript var view = function() { @@ -36,71 +36,18 @@ Note that compiled templates are meant to be generated by an automated build pro --- -### Installing NodeJS and SweetJS for one-off compilations +### Installing -SweetJS requires a [NodeJS](http://nodejs.org) environment. To install it, go to its website and use the installer provided. +Mithril-objectify requires a [NodeJS](http://nodejs.org) environment. To install it, go to its website and use the installer provided. -To install SweetJS, NodeJS provides a command-line package manager tool. In a command line, type: +To install mithril-objectify, NodeJS provides a command-line package manager tool. In a command line, type: ``` -npm install -g sweet.js +npm install -g mithril-objectify ``` -To compile a file, type: +Then, to compile a file, type: ``` -sjs -r -m /template-compiler.sjs -o .js .js +mithril-objectify ./input-filename.js ./output-filename.js ``` - ---- - -### Automating Compilation - -If you want to automate compilation, you can use [GruntJS](http://gruntjs.com), a task automation tool. If you're not familiar with GruntJS, you can find a tutorial on their website. - -Assuming NodeJS is already installed, run the following command to install GruntJS: - -``` -npm install -g grunt-cli -``` - -Once installed, create two files in the root of your project, `package.json` and `Gruntfile.js` - -`package.json` - -```javascript -{ - "name": "project-name-goes-here", - "version": "0.0.0", //must follow this format - "devDependencies": { - "grunt-sweet.js": "*" - } -} -``` - -`Gruntfile.js` - -```javascript -module.exports = function(grunt) { - grunt.initConfig({ - sweetjs: { - modules: ["template-compiler.sjs"], - compile: {expand: true, cwd: ".", src: "**/*.js", dest: "destination-folder-goes-here/"} - } - }); - - grunt.loadNpmTasks('grunt-sweet.js'); - - grunt.registerTask('default', ['sweetjs']); -} -``` - -Make sure to replace the `project-name-goes-here` and `destination-folder-goes-here` placeholders with appropriate values. - -To run the automation task, run the following command from the root folder of your project: - -``` -grunt -``` - -More documentation on the grunt-sweet.js task and its options [can be found here](https://github.com/natefaubion/grunt-sweet.js) From 0fcba673400c9b9e0873ded902261e2fe21bc46c Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Wed, 2 Dec 2015 22:12:00 -0500 Subject: [PATCH 15/19] add installation link to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 13e795a3..6ed92eea 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ m.mount(document.getElementById("example"), app); ### Learn more +- [Installation](http://mithril.js.org/installation.html) - [Tutorial](http://mithril.js.org/getting-started.html) - [Differences from Other Frameworks](http://mithril.js.org/comparison.html) - [Benchmarks](http://mithril.js.org/benchmarks.html) From a3af03a600dbf859170e419a61b527f21c2b083b Mon Sep 17 00:00:00 2001 From: kaspertidemann Date: Thu, 10 Dec 2015 15:51:17 +0100 Subject: [PATCH 16/19] Fixes wording. --- docs/installation.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index b19f7ad3..b471b560 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -6,7 +6,7 @@ Mithril is available from a variety of sources: ### Direct download -You can [download a zip of the latest version version here](mithril.min.zip). +You can [download a zip of the latest version here](mithril.min.zip). Links to older versions can be found in the [change log](change-log.html). @@ -133,4 +133,3 @@ To use the bleeding edge version from npm, use the following command: ``` npm install git://github.com/lhorie/mithril.js#next --save ``` - From e846335f167eb75f604a39d7b3f5a3c38d544378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Einar=20Nor=C3=B0fj=C3=B6r=C3=B0?= Date: Fri, 4 Dec 2015 12:53:35 +0000 Subject: [PATCH 17/19] fix subcomponent unloading --- mithril.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/mithril.js b/mithril.js index cec9a331..2e553790 100644 --- a/mithril.js +++ b/mithril.js @@ -729,15 +729,19 @@ void (function (global, factory) { // eslint-disable-line var unloaders = [] function updateLists(views, controllers, view, controller) { - if (controller.onunload != null) { - unloaders.push({ - controller: controller, - handler: controller.onunload - }) - } - views.push(view) - controllers.push(controller) + var idx = controllers.push(controller) - 1 + unloaders[idx] = { + controller: controller, + handler: function () { + controllers.splice(controllers.indexOf(controller), 1) + views.splice(views.indexOf(view), 1) + var unload = controller && controller.onunload + if (type.call(unload) === "[object Function]") { + controller.onunload() + } + } + } } var forcing = false @@ -1300,6 +1304,7 @@ void (function (global, factory) { // eslint-disable-line } forEach(unloaders, function (unloader) { + if (unloader.controller == null) return unloader.handler.call(unloader.controller, ev) unloader.controller.onunload = null }) From 5ef5addb8261c43f72e1b0891e3ab2be470ca781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Einar=20Nor=C3=B0fj=C3=B6r=C3=B0?= Date: Thu, 10 Dec 2015 19:01:52 +0000 Subject: [PATCH 18/19] fix linting errors --- docs/layout/tools/template-converter.js | 2 +- mithril.js | 12 ++++++++---- test-deps/mock.js | 10 ++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/layout/tools/template-converter.js b/docs/layout/tools/template-converter.js index 55217ba3..ccd4faff 100644 --- a/docs/layout/tools/template-converter.js +++ b/docs/layout/tools/template-converter.js @@ -1,5 +1,5 @@ /* global m: false */ -// TODO: ensure this targets the current API. +// NTBD: ensure this targets the current API. window.templateConverter = (function () { "use strict" diff --git a/mithril.js b/mithril.js index cec9a331..d710445b 100644 --- a/mithril.js +++ b/mithril.js @@ -44,8 +44,10 @@ void (function (global, factory) { // eslint-disable-line } function forOwn(obj, f) { - for (var prop in obj) if (hasOwn.call(obj, prop)) { - if (f(obj[prop], prop)) break + for (var prop in obj) { + if (hasOwn.call(obj, prop)) { + if (f(obj[prop], prop)) break + } } } @@ -960,8 +962,10 @@ void (function (global, factory) { // eslint-disable-line } }) - for (var rule in cachedAttr) if (hasOwn.call(cachedAttr, rule)) { - if (!hasOwn.call(dataAttr, rule)) node.style[rule] = "" + for (var rule in cachedAttr) { + if (hasOwn.call(cachedAttr, rule)) { + if (!hasOwn.call(dataAttr, rule)) node.style[rule] = "" + } } } else if (namespace != null) { // handle SVG diff --git a/test-deps/mock.js b/test-deps/mock.js index 239af53c..698f86bc 100644 --- a/test-deps/mock.js +++ b/test-deps/mock.js @@ -33,8 +33,10 @@ Object.keys = Object.keys || function (obj) { var keys = [] - for (var i in obj) if ({}.hasOwnProperty.call(obj, i)) { - keys.push(i) + for (var i in obj) { + if ({}.hasOwnProperty.call(obj, i)) { + keys.push(i) + } } return keys } @@ -53,7 +55,7 @@ this.mock = (function (global) { } var document = window.document = { - // TODO: add document.createRange().createContextualFragment() + // NTBD: add document.createRange().createContextualFragment() childNodes: [], @@ -78,7 +80,7 @@ this.mock = (function (global) { }, insertAdjacentHTML: function (position, html) { - // TODO: accept markup + // NTBD: accept markup if (position === "beforebegin") { this.parentNode.insertBefore( document.createTextNode(html), From cb29a21ec308bf892dd01bd2e2c39711fa61150d Mon Sep 17 00:00:00 2001 From: impinball Date: Thu, 10 Dec 2015 18:52:51 -0500 Subject: [PATCH 19/19] Fix #873, regenerate minified variants. Drive-by fix: uppercase tag name in failing m.trust test (doesn't make it pass, though). --- mithril.js | 17 ++++++++--------- mithril.min.js | 6 +++--- mithril.min.js.map | 2 +- test/mithril.request.js | 36 ++++++++++++++++++++++++++++++++++++ test/mithril.trust.js | 2 +- 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/mithril.js b/mithril.js index b80f2a0d..967de22c 100644 --- a/mithril.js +++ b/mithril.js @@ -2115,7 +2115,7 @@ void (function (global, factory) { // eslint-disable-line options.onload = options.onerror = function (ev) { ev = ev || event var doSuccess = ev.type === "load" - var unwrap, response + var unwrap if (doSuccess) { unwrap = options.unwrapSuccess @@ -2124,7 +2124,7 @@ void (function (global, factory) { // eslint-disable-line } try { - response = (unwrap || identity)( + var response = (unwrap || identity)( deserialize(extract(ev.target, options)), ev.target) if (doSuccess) { if (isArray(response) && options.type) { @@ -2134,16 +2134,15 @@ void (function (global, factory) { // eslint-disable-line } else if (options.type) { response = new options.type(response) } + deferred.resolve(response) + } else { + deferred.reject(response) } } catch (e) { - m.deferred.onerror(e) - response = e - doSuccess = false + deferred.reject(e) + } finally { + if (options.background !== true) m.endComputation() } - - deferred[doSuccess ? "resolve" : "reject"](response) - - if (options.background !== true) m.endComputation() } ajax(options) diff --git a/mithril.min.js b/mithril.min.js index 9dbccf83..5dabdb0f 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -1,8 +1,8 @@ /* Mithril v0.2.1 -http://github.com/lhorie/mithril.js -(c) Leo Horie +http://mithril.js.org +(c) 2014-2015 Leo Horie License: MIT */ -!function(a,b){"use strict";var c=b("undefined"!=typeof window?window:{});"object"==typeof module&&null!=module&&module.exports?module.exports=c:"function"==typeof define&&define.amd?define(function(){return c}):a.m=c}(this,function(a,b){"use strict";function c(a){return"function"==typeof a}function d(a){return"[object Object]"===Ka.call(a)}function e(a){return"[object String]"===Ka.call(a)}function f(){}function g(a,b){for(var c=0;cd;d++)if(a[d]!==b[d])return!1;return!0}function y(a,b,c){return a.tag!==b.tag?!0:x(c,Object.keys(b.attrs))?a.attrs.id!==b.attrs.id?!0:a.attrs.key!==b.attrs.key?!0:"all"===n.redraw.strategy()?!(b.configContext&&b.configContext.retain===!0):"diff"===n.redraw.strategy()?b.configContext&&b.configContext.retain===!1:void 0:!0}function z(a,b,d){y(a,b,d)&&(b.nodes.length&&Z(b.nodes),b.configContext&&c(b.configContext.onunload)&&b.configContext.onunload(),b.controllers&&g(b.controllers,function(a){a.unload&&a.onunload({preventDefault:f})}))}function A(a,b){return a.attrs.xmlns?a.attrs.xmlns:"svg"===a.tag?"http://www.w3.org/2000/svg":"math"===a.tag?"http://www.w3.org/1998/Math/MathML":b}function B(a,b,c){c.length&&(a.views=b,a.controllers=c,g(c,function(a){if(a.onunload&&a.onunload.$old&&(a.onunload=a.onunload.$old),Ta&&a.onunload){var b=a.onunload;a.onunload=f,a.onunload.$old=b}}))}function C(a,b,d,e,f){var g=b.attrs.config;if(c(g)){var h=f.configContext=f.configContext||{};a.push(function(){return g.call(b,d,!e,h,f)})}}function D(a,c,d,e,f,g,h,i){var j=a.nodes[0];return e&&Y(j,c.tag,c.attrs,a.attrs,f),a.children=U(j,c.tag,b,b,c.children,a.children,!1,0,c.attrs.contenteditable?j:d,f,h),a.nodes.intact=!0,i.length&&(a.views=g,a.controllers=i),j}function E(a,b,c){var d;a.$trusted?d=_(b,c,a):(d=[Fa.createTextNode(a)],Pa.test(b.nodeName)||s(b,d[0],c));var e;return e="string"==typeof a||"number"==typeof a||"boolean"==typeof a?new a.constructor(a):a,e.nodes=d,e}function F(a,b,c,d,e,f){var g=b.nodes;return d&&d===Fa.activeElement||(a.$trusted?(Z(g,b),g=_(c,e,a)):"textarea"===f?c.value=a:d?d.innerHTML=a:((1===g[0].nodeType||g.length>1)&&(Z(b.nodes,b),g=[Fa.createTextNode(a)]),q(c,g[0],e,a))),b=new a.constructor(a),b.nodes=g,b}function G(a,b,c,d,e,f,g){return 0===a.nodes.length?E(b,d,c):a.valueOf()!==b.valueOf()||e?F(b,a,d,f,c,g):(a.nodes.intact=!0,a)}function H(a){if(!a.$trusted)return Ma(a)?a.length:1;var b=a.match(/<[^\/]|\>\s*[^<]/g);return null!=b?b.length:void 0}function I(a,c,d,e,f,g,h,i,j){a=r(a);var k=[],l=c.length===a.length,m=0,n={},p=!1;o(c,function(a,b){p=!0,n[c[b].attrs.key]={action:Qa,index:b}}),w(a),p&&(c=u(a,c,n,d));for(var q=0,s=0,t=a.length;t>s;s++){var x=U(d,f,c,e,a[s],c[q],g,e+m||m,h,i,j);x!==b&&(l=l&&x.nodes.intact,m+=H(x),c[q++]=x)}return l||v(a,c,k),c}function J(a,b,c,d,e){if(null!=b){if(Ka.call(b)===Ka.call(a))return b;if(e&&e.nodes){var f=c-d,g=f+(Ma(a)?a:b.nodes).length;Z(e.nodes.slice(f,g),e.slice(f,g))}else b.nodes&&Z(b.nodes,b)}return b=new a.constructor,b.tag&&(b={}),b.nodes=[],b}function K(a,c){return c===b?a.attrs.is?Fa.createElement(a.tag,a.attrs.is):Fa.createElement(a.tag):a.attrs.is?Fa.createElementNS(c,a.tag,a.attrs.is):Fa.createElementNS(c,a.tag)}function L(a,b,c,d){return d?Y(b,a.tag,a.attrs,{},c):a.attrs}function M(a,c,d,e,f,g){return null!=a.children&&0!==a.children.length?U(c,a.tag,b,b,a.children,d.children,!0,0,a.attrs.contenteditable?c:e,f,g):a.children}function N(a,b,c,d,e,f,g){var h={tag:a.tag,attrs:b,children:c,nodes:[d]};return B(h,f,g),h.children&&!h.children.nodes&&(h.children.nodes=[]),"select"===a.tag&&"value"in a.attrs&&Y(d,a.tag,{value:a.attrs.value},{},e),h}function O(a,b,c,d){var e="diff"===n.redraw.strategy()&&a?a.indexOf(b):-1;return e>-1?c[e]:"function"==typeof d?new d:{}}function P(a,b,c,d){null!=d.onunload&&Va.push({controller:d,handler:d.onunload}),a.push(c),b.push(d)}function Q(a,b,c,d,e,f){var g=O(c.views,b,d,a.controller),h=+(a&&a.attrs&&a.attrs.key);return a=0===Ta||Wa||d&&d.indexOf(g)>-1?a.view(g):{tag:"placeholder"},"retain"===a.subtree?c:(h===h&&((a.attrs=a.attrs||{}).key=h),P(f,e,b,g),a)}function R(a,b,c,d){for(var e=b&&b.controllers;null!=a.view;)a=Q(a,a.view.$original||a.view,b,e,d,c);return a}function S(a,b,c,d,e,f,g,h,i,j,k,l){var m;if(a){m=K(b,c);var n=L(b,m,c,d),o=M(b,m,e,f,c,g);e=N(b,n,o,m,c,h,i)}else m=D(e,b,f,d,c,h,g,i);return(a||k&&null!=m)&&s(j,m,l),C(g,b,m,a,e),e}function T(a,b,c,d,f,g,h,i){var j=[],k=[];if(a=R(a,b,j,k),!a.tag&&k.length)throw new Error("Component template must return a virtual element, not an array, string, etc.");a.attrs=a.attrs||{},b.attrs=b.attrs||{};var l=Object.keys(a.attrs),m=l.length>+("key"in a.attrs);return z(a,b,l),e(a.tag)?S(0===b.nodes.length,a,A(a,h),m,b,c,i,j,k,d,g,f):void 0}function U(a,b,e,f,g,h,i,j,k,l,m){return g=p(g),"retain"===g.subtree?h:(h=J(g,h,j,f,e),Ma(g)?I(g,h,a,j,b,i,k,l,m):null!=g&&d(g)?T(g,h,k,a,j,i,l,m):c(g)?h:G(h,g,j,a,i,k,b))}function V(a,b){return a.action-b.action||a.index-b.index}function W(a){return"list"!==a&&"style"!==a&&"form"!==a&&"type"!==a&&"width"!==a&&"height"!==a}function X(a,b,e,f,g,i){if("config"!==a&&"key"!==a)if(c(b)&&"on"===a.slice(0,2))f[a]=aa(b,f);else if("style"===a&&null!=b&&d(b)){h(b,function(a,b){(null==e||e[b]!==a)&&(f.style[b]=a)});for(var j in e)La.call(e,j)&&(La.call(b,j)||(f.style[j]=""))}else null!=g?"href"===a?f.setAttributeNS("http://www.w3.org/1999/xlink","href",b):f.setAttribute("className"===a?"class":a,b):a in f&&W(a)?("input"!==i||f[a]!==b)&&(f[a]=b):f.setAttribute(a,b)}function Y(a,b,c,d,e){return h(c,function(c,f){var g=d[f];if(f in d&&g===c)"value"===f&&"input"===b&&a.value!=c&&(a.value=c);else{d[f]=c;try{X(f,c,g,a,e,b)}catch(h){if(h.message.indexOf("Invalid argument")<0)throw h}}}),d}function Z(a,b){for(var c=a.length-1;c>=0;c--)if(a[c]&&a[c].parentNode){try{a[c].parentNode.removeChild(a[c])}catch(d){}b=[].concat(b),b[c]&&$(b[c])}a.length&&(a.length=0)}function $(a){a.configContext&&c(a.configContext.onunload)&&(a.configContext.onunload(),a.configContext.onunload=null),a.controllers&&g(a.controllers,function(a){c(a.onunload)&&a.onunload({preventDefault:f})}),a.children&&(Ma(a.children)?g(a.children,$):a.children.tag&&$(a.children))}function _(a,b,c){var d=a.childNodes[b];if(d){var e=1!==d.nodeType,f=Fa.createElement("span");e?(a.insertBefore(f,d||null),f.insertAdjacentHTML("beforebegin",c),a.removeChild(f)):d.insertAdjacentHTML("beforebegin",c)}else Xa(a,c);for(var g=[];a.childNodes[b]!==d;)g.push(a.childNodes[b]),b++;return g}function aa(a,b){return function(c){c=c||event,n.redraw.strategy("diff"),n.startComputation();try{return a.call(b,c)}finally{ia()}}}function ba(a){var b=Za.indexOf(a);return 0>b?Za.push(a)-1:b}function ca(a){function b(){return arguments.length&&(a=arguments[0]),a}return b.toJSON=function(){return a},b}function da(a,b){function c(){return e.apply(this,b)||this}function d(c){for(var d=[c].concat(b),e=1;e0&&Ia(gb),gb=Ha(ha,fb)}function ha(){db&&(db(),db=null),g(ab,function(a,b){var c=bb[b];if(cb[b]){var d=[cb[b]];n.render(a,c.view?c.view(cb[b],d):"")}}),eb&&(eb(),eb=null),gb=null,hb=new Date,n.redraw.strategy("diff")}function ia(){"none"===n.redraw.strategy()?(Ta--,n.redraw.strategy("diff")):n.endComputation()}function ja(b){a[b]=function(){var a=Ga[n.route.mode];"pathname"===n.route.mode&&(a+=Ga.search),lb!==na(a)&&nb(a)},db=qa,a[b]()}function ka(){return("pathname"===n.route.mode?"":Ga.pathname)+mb[n.route.mode]}function la(b){if(a.history.pushState){db=qa;var c=b?"replaceState":"pushState";eb=function(){a.history[c](null,Fa.title,mb[n.route.mode]+lb)},nb(mb[n.route.mode]+lb)}else Ga[n.route.mode]=lb,nb(mb[n.route.mode]+lb)}function ma(a,b,c){arguments.length<3&&"object"!=typeof b&&(c=b,b=null);var d=lb;lb=a;var e,f,g=b||{},i=lb.indexOf("?");if(i>=0){var j=sa(lb.slice(i+1));h(g,function(a,b){j[b]=g[b]}),e=ra(j),f=lb.slice(0,i)}else e=ra(b),f=lb;if(e){var k=-1===f.indexOf("?")?"?":"&";lb=f+k+e}return la(c||d===a)}function na(a){return a.slice(mb[n.route.mode].length)}function oa(a,b,c){var d=c.indexOf("?");d>=0?(kb=sa(c.substr(d+1,c.length)),c=c.substr(0,d)):kb={};var e=Object.keys(b),f=e.indexOf(c);if(f>=0)return n.mount(a,b[e[f]]),!0;for(var h in b)if(La.call(b,h)){if(h===c)return n.mount(a,b[h]),!0;var i=new RegExp("^"+h.replace(/:[^\/]+?\.{3}/g,"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+"/?$");if(i.test(c))return c.replace(i,function(){var c=h.match(/:[^\/]+/g)||[],d=[].slice.call(arguments,1,-2);g(c,function(a,b){a=a.replace(/:|\./g,""),kb[a]=decodeURIComponent(d[b])}),n.mount(a,b[h])}),!0}}function pa(a){if(a=a||event,!a.ctrlKey&&!a.metaKey&&2!==a.which){a.preventDefault?a.preventDefault():a.returnValue=!1;var b,c=a.currentTarget||a.srcElement;for(b="pathname"===n.route.mode&&c.search?sa(c.search.slice(1)):{};c&&"A"!==c.nodeName.toUpperCase();)c=c.parentNode;n.route(c[n.route.mode].slice(mb[n.route.mode].length),b)}}function qa(){"hash"!==n.route.mode&&Ga.hash?Ga.hash=Ga.hash:a.scrollTo(0,0)}function ra(a,c){var e={},f=[];return h(a,function(a,h){var i=c?c+"["+h+"]":h;if(null===a)f.push(encodeURIComponent(i));else if(d(a))f.push(ra(a,i));else if(Ma(a)){var j=[];e[i]=e[i]||{},g(a,function(a){e[i][a]||(e[i][a]=!0,j.push(encodeURIComponent(i)+"="+encodeURIComponent(a)))}),f.push(j.join("&"))}else a!==b&&f.push(encodeURIComponent(i)+"="+encodeURIComponent(a))}),f.join("&")}function sa(a){if(""===a||null==a)return{};"?"===a.charAt(0)&&(a=a.slice(1));var b=a.split("&"),c={};return g(b,function(a){var b=a.split("="),d=decodeURIComponent(b[0]),e=2===b.length?decodeURIComponent(b[1]):null;null!=c[d]?(Ma(c[d])||(c[d]=[c[d]]),c[d].push(e)):c[d]=e}),c}function ta(a){var c=ba(a);Z(a.childNodes,$a[c]),$a[c]=b}function ua(a,b){function e(a){j=a||sb,g(l,function(a){j===rb?a.resolve(k):a.reject(k)})}function f(a,b,e,f){if((null!=k&&d(k)||c(k))&&c(a))try{var g=0;a.call(k,function(a){g++||(k=a,b())},function(a){g++||(k=a,e())})}catch(h){n.deferred.onerror(h),k=h,e()}else f()}function h(){var d;try{d=k&&k.then}catch(g){return n.deferred.onerror(g),k=g,j=qb,h()}f(d,function(){j=pb,h()},function(){j=qb,h()},function(){try{j===pb&&c(a)?k=a(k):j===qb&&c(b)&&(k=b(k),j=pb)}catch(g){return n.deferred.onerror(g),k=g,e()}k===i?(k=TypeError(),e()):f(d,function(){e(rb)},e,function(){e(j===pb&&rb)})})}var i=this,j=0,k=0,l=[];i.promise={},i.resolve=function(a){return j||(k=a,j=pb,h()),this},i.reject=function(a){return j||(k=a,j=qb,h()),this},i.promise.then=function(a,b){var c=new ua(a,b);return j===rb?c.resolve(k):j===sb?c.reject(k):l.push(c),c.promise}}function va(a,b){var c=n.prop(b);return a.then(c),c.then=function(c,d){return va(a.then(c,d),b)},c["catch"]=c.then.bind(null,null),c["finally"]=function(a){function d(){return n.deferred().resolve(a()).promise}return c.then(function(a){return va(d().then(function(){return a}),b)},function(a){return va(d().then(function(){throw new Error(a)}),b)})},c}function wa(a){return a instanceof EvalError||a instanceof RangeError||a instanceof ReferenceError||a instanceof SyntaxError||a instanceof TypeError||a instanceof URIError}function xa(a){return a}function ya(){return"mithril_callback_"+(new Date).getTime()+"_"+Math.round(1e16*Math.random()).toString(36)}function za(c){var d=ya(),e=Fa.createElement("script");a[d]=function(f){e.parentNode.removeChild(e),c.onload({type:"load",target:{responseText:f}}),a[d]=b},e.onerror=function(){return e.parentNode.removeChild(e),c.onerror({type:"error",target:{status:500,responseText:'{"error": "Error making jsonp request"}'}}),a[d]=b,!1},e.onload=function(){return!1},e.src=c.url+(c.url.indexOf("?")>0?"&":"?")+(c.callbackKey?c.callbackKey:"callback")+"="+d+"&"+ra(c.data||{}),Fa.body.appendChild(e)}function Aa(b){var d=new a.XMLHttpRequest;if(d.open(b.method,b.url,!0,b.user,b.password),d.onreadystatechange=function(){4===d.readyState&&(d.status>=200&&d.status<300?b.onload({type:"load",target:d}):b.onerror({type:"error",target:d}))},b.serialize===JSON.stringify&&b.data&&"GET"!==b.method&&d.setRequestHeader("Content-Type","application/json; charset=utf-8"),b.deserialize===JSON.parse&&d.setRequestHeader("Accept","application/json, text/*"),c(b.config)){var f=b.config(d,b);null!=f&&(d=f)}var g;if(g="GET"!==b.method&&b.data?b.data:"",g&&!e(g)&&g.constructor!==a.FormData)throw new Error("Request data should be either be a string or FormData. Check the `serialize` option in `m.request`");return d.send(g),d}function Ba(a){return a.dataType&&"jsonp"===a.dataType.toLowerCase()?za(a):Aa(a)}function Ca(a,b,c){if("GET"===a.method&&"jsonp"!==a.dataType){var d=a.url.indexOf("?")<0?"?":"&",e=ra(b);a.url+=e?d+e:""}else a.data=c(b);return a}function Da(a,b){var c=a.match(/:[a-z]\w+/gi);return c&&b&&g(c,function(c){var d=c.slice(1);a=a.replace(c,b[d]),delete b[d]}),a}function Ea(a){return a.responseText}var Fa,Ga,Ha,Ia,Ja="v0.2.1",Ka={}.toString,La={}.hasOwnProperty,Ma=Array.isArray||function(a){return"[object Array]"===Ka.call(a)},Na=/(?:(^|#|\.)([^#\.\[\]]+))|(\[.+?\])/g,Oa=/\[(.+?)(?:=("|'|)(.*?)\2)?\]/,Pa=/^(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|KEYGEN|LINK|META|PARAM|SOURCE|TRACK|WBR)$/;i(a),n.deps=function(b){return i(a=b||a),a},n.version=function(){return Ja};var Qa=1,Ra=2,Sa=3,Ta=0;n.startComputation=function(){Ta++},n.endComputation=function(){Ta>1?Ta--:(Ta=0,n.redraw())};var Ua,Va=[],Wa=!1,Xa=function(){try{return Fa.createRange().createContextualFragment("x"),function(a,b){a.appendChild(Fa.createRange().createContextualFragment(b))}}catch(a){return function(a,b){a.insertAdjacentHTML("beforeend",b)}}}(),Ya={appendChild:function(a){Ua===b&&(Ua=Fa.createElement("html")),Fa.documentElement&&Fa.documentElement!==a?Fa.replaceChild(a,Fa.documentElement):Fa.appendChild(a),this.childNodes=Fa.childNodes},insertBefore:function(a){this.appendChild(a)},childNodes:[]},Za=[],$a={};n.render=function(a,c,d){if(!a)throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var e,f=[],h=ba(a),i=a===Fa;e=i||a===Fa.documentElement?Ya:a,i&&"html"!==c.tag&&(c={tag:"html",attrs:{},children:c}),$a[h]===b&&Z(e.childNodes),d===!0&&ta(a),$a[h]=U(e,null,b,b,c,$a[h],!1,0,null,b,f),g(f,function(a){a()})},n.trust=function(a){return a=new String(a),a.$trusted=!0,a},n.prop=function(a){return(null!=a&&d(a)||c(a))&&c(a.then)?va(a):ca(a)};var _a,ab=[],bb=[],cb=[],db=null,eb=null,fb=16;n.component=function(a){for(var b=[],c=1;cd&&(d=ab.length);var e=!1,f={preventDefault:function(){e=!0,db=eb=null}};return g(Va,function(a){a.handler.call(a.controller,f),a.controller.onunload=null}),e?g(Va,function(a){a.controller.onunload=a.handler}):Va=[],cb[d]&&c(cb[d].onunload)&&cb[d].onunload(f),ea(b,a,d,e)};var gb=0,hb=0,ib=Ha===a.requestAnimationFrame?ga:function(){+new Date-hb>fb&&ga()},jb=!1;n.redraw=function(a){if(!jb){jb=!0,a&&(Wa=!0);try{gb&&!a?ib():(ha(),gb=Ha(function(){gb=0},fb))}finally{jb=Wa=!1}}},n.redraw.strategy=n.prop(),n.withAttr=function(a,b,c){return function(d){d=d||event;var e,f=d.currentTarget||this,g=c||this;e=a in f?f[a]:f.getAttribute(a),b.call(g,e)}};var kb,lb,mb={pathname:"",hash:"#",search:"?"},nb=f,ob=!1;n.route=function(a,b,c,d){if(0===arguments.length)return lb;if(3===arguments.length&&e(b))nb=function(d){var e=lb=na(d);if(!oa(a,c,e)){if(ob)throw new Error("Ensure the default route matches one of the routes defined in m.route");ob=!0,n.route(b,!0),ob=!1}},ja("hash"===n.route.mode?"onhashchange":"onpopstate");else if(a.addEventListener||a.attachEvent)a.href=ka()+d.attrs.href,a.addEventListener?(a.removeEventListener("click",pa),a.addEventListener("click",pa)):(a.detachEvent("onclick",pa),a.attachEvent("onclick",pa));else if(e(a))return ma.apply(this,arguments)},n.route.param=function(a){if(!kb)throw new Error("You must call m.route(element, defaultRoute, routes) before calling m.route.param()");return a?kb[a]:kb},n.route.mode="search",n.route.buildQueryString=ra,n.route.parseQueryString=sa;var pb=1,qb=2,rb=3,sb=4;return n.deferred=function(){var a=new ua;return a.promise=va(a.promise),a},n.deferred.onerror=function(a){if(wa(a))throw Ta=0,a},n.sync=function(a){function b(a,b){return function(g){return e[a]=g,b||(f="reject"),0===--d&&(c.promise(e),c[f](e)),g}}var c=n.deferred(),d=a.length,e=new Array(d),f="resolve";return a.length>0?g(a,function(a,c){a.then(b(c,!0),b(c,!1))}):c.resolve([]),c.promise},n.request=function(a){a.background!==!0&&n.startComputation();var b=new ua,c=xa,d=xa,e=Ea;return a.dataType&&"jsonp"===a.dataType.toLowerCase()||(c=a.serialize||JSON.stringify,d=a.deserialize||JSON.parse,e=function(a){return 0===a.responseText.length&&d===JSON.parse?null:a.responseText}),a.serialize=c,a.deserialize=d,a.method=(a.method||"GET").toUpperCase(),a.url=Da(a.url,a.data),a=Ca(a,a.data,c),a.onload=a.onerror=function(c){c=c||event;var f,h,i="load"===c.type;f=i?a.unwrapSuccess:a.unwrapError;try{h=(f||xa)(d(e(c.target,a)),c.target),i&&(Ma(h)&&a.type?g(h,function(b,c){h[c]=new a.type(b)}):a.type&&(h=new a.type(h)))}catch(j){n.deferred.onerror(j),h=j,i=!1}b[i?"resolve":"reject"](h),a.background!==!0&&n.endComputation()},Ba(a),b.promise=va(b.promise,a.initialValue),b.promise},n}); +void function(a,b){"use strict";var c=b("undefined"!=typeof window?window:{});"object"==typeof module&&null!=module&&module.exports?module.exports=c:"function"==typeof define&&define.amd?define(function(){return c}):a.m=c}(this,function(a,b){"use strict";function c(a){return"function"==typeof a}function d(a){return"[object Object]"===Ka.call(a)}function e(a){return"[object String]"===Ka.call(a)}function f(){}function g(a,b){for(var c=0;cd;d++)if(a[d]!==b[d])return!1;return!0}function y(a,b,c){return a.tag!==b.tag?!0:x(c,Object.keys(b.attrs))?a.attrs.id!==b.attrs.id?!0:a.attrs.key!==b.attrs.key?!0:"all"===n.redraw.strategy()?!(b.configContext&&b.configContext.retain===!0):"diff"===n.redraw.strategy()?b.configContext&&b.configContext.retain===!1:void 0:!0}function z(a,b,d){y(a,b,d)&&(b.nodes.length&&Z(b.nodes),b.configContext&&c(b.configContext.onunload)&&b.configContext.onunload(),b.controllers&&g(b.controllers,function(a){a.unload&&a.onunload({preventDefault:f})}))}function A(a,b){return a.attrs.xmlns?a.attrs.xmlns:"svg"===a.tag?"http://www.w3.org/2000/svg":"math"===a.tag?"http://www.w3.org/1998/Math/MathML":b}function B(a,b,c){c.length&&(a.views=b,a.controllers=c,g(c,function(a){if(a.onunload&&a.onunload.$old&&(a.onunload=a.onunload.$old),Ta&&a.onunload){var b=a.onunload;a.onunload=f,a.onunload.$old=b}}))}function C(a,b,d,e,f){var g=b.attrs.config;if(c(g)){var h=f.configContext=f.configContext||{};a.push(function(){return g.call(b,d,!e,h,f)})}}function D(a,c,d,e,f,g,h,i){var j=a.nodes[0];return e&&Y(j,c.tag,c.attrs,a.attrs,f),a.children=U(j,c.tag,b,b,c.children,a.children,!1,0,c.attrs.contenteditable?j:d,f,h),a.nodes.intact=!0,i.length&&(a.views=g,a.controllers=i),j}function E(a,b,c){var d;a.$trusted?d=_(b,c,a):(d=[Fa.createTextNode(a)],Pa.test(b.nodeName)||s(b,d[0],c));var e;return e="string"==typeof a||"number"==typeof a||"boolean"==typeof a?new a.constructor(a):a,e.nodes=d,e}function F(a,b,c,d,e,f){var g=b.nodes;return d&&d===Fa.activeElement||(a.$trusted?(Z(g,b),g=_(c,e,a)):"textarea"===f?c.value=a:d?d.innerHTML=a:((1===g[0].nodeType||g.length>1||g[0].nodeValue.trim&&!g[0].nodeValue.trim())&&(Z(b.nodes,b),g=[Fa.createTextNode(a)]),q(c,g[0],e,a))),b=new a.constructor(a),b.nodes=g,b}function G(a,b,c,d,e,f,g){return 0===a.nodes.length?E(b,d,c):a.valueOf()!==b.valueOf()||e?F(b,a,d,f,c,g):(a.nodes.intact=!0,a)}function H(a){if(!a.$trusted)return Ma(a)?a.length:1;var b=a.match(/<[^\/]|\>\s*[^<]/g);return null!=b?b.length:void 0}function I(a,c,d,e,f,g,h,i,j){a=r(a);var k=[],l=c.length===a.length,m=0,n={},p=!1;o(c,function(a,b){p=!0,n[c[b].attrs.key]={action:Qa,index:b}}),w(a),p&&(c=u(a,c,n,d));for(var q=0,s=0,t=a.length;t>s;s++){var x=U(d,f,c,e,a[s],c[q],g,e+m||m,h,i,j);x!==b&&(l=l&&x.nodes.intact,m+=H(x),c[q++]=x)}return l||v(a,c,k),c}function J(a,b,c,d,e){if(null!=b){if(Ka.call(b)===Ka.call(a))return b;if(e&&e.nodes){var f=c-d,g=f+(Ma(a)?a:b.nodes).length;Z(e.nodes.slice(f,g),e.slice(f,g))}else b.nodes&&Z(b.nodes,b)}return b=new a.constructor,b.tag&&(b={}),b.nodes=[],b}function K(a,c){return c===b?a.attrs.is?Fa.createElement(a.tag,a.attrs.is):Fa.createElement(a.tag):a.attrs.is?Fa.createElementNS(c,a.tag,a.attrs.is):Fa.createElementNS(c,a.tag)}function L(a,b,c,d){return d?Y(b,a.tag,a.attrs,{},c):a.attrs}function M(a,c,d,e,f,g){return null!=a.children&&0!==a.children.length?U(c,a.tag,b,b,a.children,d.children,!0,0,a.attrs.contenteditable?c:e,f,g):a.children}function N(a,b,c,d,e,f,g){var h={tag:a.tag,attrs:b,children:c,nodes:[d]};return B(h,f,g),h.children&&!h.children.nodes&&(h.children.nodes=[]),"select"===a.tag&&"value"in a.attrs&&Y(d,a.tag,{value:a.attrs.value},{},e),h}function O(a,b,c,d){var e="diff"===n.redraw.strategy()&&a?a.indexOf(b):-1;return e>-1?c[e]:"function"==typeof d?new d:{}}function P(a,b,c,d){a.push(c);var e=b.push(d)-1;Va[e]={controller:d,handler:function(){b.splice(b.indexOf(d),1),a.splice(a.indexOf(c),1);var e=d&&d.onunload;"[object Function]"===Ka.call(e)&&d.onunload()}}}function Q(a,b,c,d,e,f){var g=O(c.views,b,d,a.controller),h=+(a&&a.attrs&&a.attrs.key);return a=0===Ta||Wa||d&&d.indexOf(g)>-1?a.view(g):{tag:"placeholder"},"retain"===a.subtree?c:(h===h&&((a.attrs=a.attrs||{}).key=h),P(f,e,b,g),a)}function R(a,b,c,d){for(var e=b&&b.controllers;null!=a.view;)a=Q(a,a.view.$original||a.view,b,e,d,c);return a}function S(a,b,c,d,e,f,g,h,i,j,k,l){var m;if(a){m=K(b,c);var n=L(b,m,c,d),o=M(b,m,e,f,c,g);e=N(b,n,o,m,c,h,i)}else m=D(e,b,f,d,c,h,g,i);return(a||k&&null!=m)&&s(j,m,l),C(g,b,m,a,e),e}function T(a,b,c,d,f,g,h,i){var j=[],k=[];if(a=R(a,b,j,k),!a.tag&&k.length)throw new Error("Component template must return a virtual element, not an array, string, etc.");a.attrs=a.attrs||{},b.attrs=b.attrs||{};var l=Object.keys(a.attrs),m=l.length>+("key"in a.attrs);return z(a,b,l),e(a.tag)?S(0===b.nodes.length,a,A(a,h),m,b,c,i,j,k,d,g,f):void 0}function U(a,b,e,f,g,h,i,j,k,l,m){return g=p(g),"retain"===g.subtree?h:(h=J(g,h,j,f,e),Ma(g)?I(g,h,a,j,b,i,k,l,m):null!=g&&d(g)?T(g,h,k,a,j,i,l,m):c(g)?h:G(h,g,j,a,i,k,b))}function V(a,b){return a.action-b.action||a.index-b.index}function W(a){return"list"!==a&&"style"!==a&&"form"!==a&&"type"!==a&&"width"!==a&&"height"!==a}function X(a,b,e,f,g,i){if("config"!==a&&"key"!==a)if(c(b)&&"on"===a.slice(0,2))f[a]=aa(b,f);else if("style"===a&&null!=b&&d(b)){h(b,function(a,b){(null==e||e[b]!==a)&&(f.style[b]=a)});for(var j in e)La.call(e,j)&&(La.call(b,j)||(f.style[j]=""))}else null!=g?"href"===a?f.setAttributeNS("http://www.w3.org/1999/xlink","href",b):f.setAttribute("className"===a?"class":a,b):a in f&&W(a)?("input"!==i||f[a]!==b)&&(f[a]=b):f.setAttribute(a,b)}function Y(a,b,c,d,e){return h(c,function(c,f){var g=d[f];if(f in d&&g===c)"value"===f&&"input"===b&&a.value!=c&&(a.value=c);else{d[f]=c;try{X(f,c,g,a,e,b)}catch(h){if(h.message.indexOf("Invalid argument")<0)throw h}}}),d}function Z(a,b){for(var c=a.length-1;c>=0;c--)if(a[c]&&a[c].parentNode){try{a[c].parentNode.removeChild(a[c])}catch(d){}b=[].concat(b),b[c]&&$(b[c])}a.length&&(a.length=0)}function $(a){a.configContext&&c(a.configContext.onunload)&&(a.configContext.onunload(),a.configContext.onunload=null),a.controllers&&g(a.controllers,function(a){c(a.onunload)&&a.onunload({preventDefault:f})}),a.children&&(Ma(a.children)?g(a.children,$):a.children.tag&&$(a.children))}function _(a,b,c){var d=a.childNodes[b];if(d){var e=1!==d.nodeType,f=Fa.createElement("span");e?(a.insertBefore(f,d||null),f.insertAdjacentHTML("beforebegin",c),a.removeChild(f)):d.insertAdjacentHTML("beforebegin",c)}else Xa(a,c);for(var g=[];a.childNodes[b]!==d;)g.push(a.childNodes[b]),b++;return g}function aa(a,b){return function(c){c=c||event,n.redraw.strategy("diff"),n.startComputation();try{return a.call(b,c)}finally{ia()}}}function ba(a){var b=Za.indexOf(a);return 0>b?Za.push(a)-1:b}function ca(a){function b(){return arguments.length&&(a=arguments[0]),a}return b.toJSON=function(){return a},b}function da(a,b){function c(){return e.apply(this,b)||this}function d(c){for(var d=[c].concat(b),e=1;e0&&Ia(gb),gb=Ha(ha,fb)}function ha(){db&&(db(),db=null),g(ab,function(a,b){var c=bb[b];if(cb[b]){var d=[cb[b]];n.render(a,c.view?c.view(cb[b],d):"")}}),eb&&(eb(),eb=null),gb=null,hb=new Date,n.redraw.strategy("diff")}function ia(){"none"===n.redraw.strategy()?(Ta--,n.redraw.strategy("diff")):n.endComputation()}function ja(b){a[b]=function(){var a=Ga[n.route.mode];"pathname"===n.route.mode&&(a+=Ga.search),lb!==na(a)&&nb(a)},db=qa,a[b]()}function ka(){return("pathname"===n.route.mode?"":Ga.pathname)+mb[n.route.mode]}function la(b){if(a.history.pushState){db=qa;var c=b?"replaceState":"pushState";eb=function(){a.history[c](null,Fa.title,mb[n.route.mode]+lb)},nb(mb[n.route.mode]+lb)}else Ga[n.route.mode]=lb,nb(mb[n.route.mode]+lb)}function ma(a,b,c){arguments.length<3&&"object"!=typeof b&&(c=b,b=null);var d=lb;lb=a;var e,f,g=b||{},i=lb.indexOf("?");if(i>=0){var j=sa(lb.slice(i+1));h(g,function(a,b){j[b]=g[b]}),e=ra(j),f=lb.slice(0,i)}else e=ra(b),f=lb;if(e){var k=-1===f.indexOf("?")?"?":"&";lb=f+k+e}return la(c||d===a)}function na(a){return a.slice(mb[n.route.mode].length)}function oa(a,b,c){var d=c.indexOf("?");d>=0?(kb=sa(c.substr(d+1,c.length)),c=c.substr(0,d)):kb={};var e=Object.keys(b),f=e.indexOf(c);if(f>=0)return n.mount(a,b[e[f]]),!0;for(var h in b)if(La.call(b,h)){if(h===c)return n.mount(a,b[h]),!0;var i=new RegExp("^"+h.replace(/:[^\/]+?\.{3}/g,"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+"/?$");if(i.test(c))return c.replace(i,function(){var c=h.match(/:[^\/]+/g)||[],d=[].slice.call(arguments,1,-2);g(c,function(a,b){a=a.replace(/:|\./g,""),kb[a]=decodeURIComponent(d[b])}),n.mount(a,b[h])}),!0}}function pa(a){if(a=a||event,!a.ctrlKey&&!a.metaKey&&2!==a.which){a.preventDefault?a.preventDefault():a.returnValue=!1;var b,c=a.currentTarget||a.srcElement;for(b="pathname"===n.route.mode&&c.search?sa(c.search.slice(1)):{};c&&"A"!==c.nodeName.toUpperCase();)c=c.parentNode;n.route(c[n.route.mode].slice(mb[n.route.mode].length),b)}}function qa(){"hash"!==n.route.mode&&Ga.hash?Ga.hash=Ga.hash:a.scrollTo(0,0)}function ra(a,c){var e={},f=[];return h(a,function(a,h){var i=c?c+"["+h+"]":h;if(null===a)f.push(encodeURIComponent(i));else if(d(a))f.push(ra(a,i));else if(Ma(a)){var j=[];e[i]=e[i]||{},g(a,function(a){e[i][a]||(e[i][a]=!0,j.push(encodeURIComponent(i)+"="+encodeURIComponent(a)))}),f.push(j.join("&"))}else a!==b&&f.push(encodeURIComponent(i)+"="+encodeURIComponent(a))}),f.join("&")}function sa(a){if(""===a||null==a)return{};"?"===a.charAt(0)&&(a=a.slice(1));var b=a.split("&"),c={};return g(b,function(a){var b=a.split("="),d=decodeURIComponent(b[0]),e=2===b.length?decodeURIComponent(b[1]):null;null!=c[d]?(Ma(c[d])||(c[d]=[c[d]]),c[d].push(e)):c[d]=e}),c}function ta(a){var c=ba(a);Z(a.childNodes,$a[c]),$a[c]=b}function ua(a,b){function e(a){j=a||sb,g(l,function(a){j===rb?a.resolve(k):a.reject(k)})}function f(a,b,e,f){if((null!=k&&d(k)||c(k))&&c(a))try{var g=0;a.call(k,function(a){g++||(k=a,b())},function(a){g++||(k=a,e())})}catch(h){n.deferred.onerror(h),k=h,e()}else f()}function h(){var d;try{d=k&&k.then}catch(g){return n.deferred.onerror(g),k=g,j=qb,h()}j===qb&&n.deferred.onerror(k),f(d,function(){j=pb,h()},function(){j=qb,h()},function(){try{j===pb&&c(a)?k=a(k):j===qb&&c(b)&&(k=b(k),j=pb)}catch(g){return n.deferred.onerror(g),k=g,e()}k===i?(k=TypeError(),e()):f(d,function(){e(rb)},e,function(){e(j===pb&&rb)})})}var i=this,j=0,k=0,l=[];i.promise={},i.resolve=function(a){return j||(k=a,j=pb,h()),this},i.reject=function(a){return j||(k=a,j=qb,h()),this},i.promise.then=function(a,b){var c=new ua(a,b);return j===rb?c.resolve(k):j===sb?c.reject(k):l.push(c),c.promise}}function va(a,b){var c=n.prop(b);return a.then(c),c.then=function(c,d){return va(a.then(c,d),b)},c["catch"]=c.then.bind(null,null),c["finally"]=function(a){function d(){return n.deferred().resolve(a()).promise}return c.then(function(a){return va(d().then(function(){return a}),b)},function(a){return va(d().then(function(){throw new Error(a)}),b)})},c}function wa(a){return a instanceof EvalError||a instanceof RangeError||a instanceof ReferenceError||a instanceof SyntaxError||a instanceof TypeError||a instanceof URIError}function xa(a){return a}function ya(){return"mithril_callback_"+(new Date).getTime()+"_"+Math.round(1e16*Math.random()).toString(36)}function za(c){var d=ya(),e=Fa.createElement("script");a[d]=function(f){e.parentNode.removeChild(e),c.onload({type:"load",target:{responseText:f}}),a[d]=b},e.onerror=function(){return e.parentNode.removeChild(e),c.onerror({type:"error",target:{status:500,responseText:'{"error": "Error making jsonp request"}'}}),a[d]=b,!1},e.onload=function(){return!1},e.src=c.url+(c.url.indexOf("?")>0?"&":"?")+(c.callbackKey?c.callbackKey:"callback")+"="+d+"&"+ra(c.data||{}),Fa.body.appendChild(e)}function Aa(b){var d=new a.XMLHttpRequest;if(d.open(b.method,b.url,!0,b.user,b.password),d.onreadystatechange=function(){4===d.readyState&&(d.status>=200&&d.status<300?b.onload({type:"load",target:d}):b.onerror({type:"error",target:d}))},b.serialize===JSON.stringify&&b.data&&"GET"!==b.method&&d.setRequestHeader("Content-Type","application/json; charset=utf-8"),b.deserialize===JSON.parse&&d.setRequestHeader("Accept","application/json, text/*"),c(b.config)){var f=b.config(d,b);null!=f&&(d=f)}var g;if(g="GET"!==b.method&&b.data?b.data:"",g&&!e(g)&&g.constructor!==a.FormData)throw new Error("Request data should be either be a string or FormData. Check the `serialize` option in `m.request`");return d.send(g),d}function Ba(a){return a.dataType&&"jsonp"===a.dataType.toLowerCase()?za(a):Aa(a)}function Ca(a,b,c){if("GET"===a.method&&"jsonp"!==a.dataType){var d=a.url.indexOf("?")<0?"?":"&",e=ra(b);a.url+=e?d+e:""}else a.data=c(b);return a}function Da(a,b){var c=a.match(/:[a-z]\w+/gi);return c&&b&&g(c,function(c){var d=c.slice(1);a=a.replace(c,b[d]),delete b[d]}),a}function Ea(a){return a.responseText}var Fa,Ga,Ha,Ia,Ja="v0.2.1",Ka={}.toString,La={}.hasOwnProperty,Ma=Array.isArray||function(a){return"[object Array]"===Ka.call(a)},Na=/(?:(^|#|\.)([^#\.\[\]]+))|(\[.+?\])/g,Oa=/\[(.+?)(?:=("|'|)(.*?)\2)?\]/,Pa=/^(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|KEYGEN|LINK|META|PARAM|SOURCE|TRACK|WBR)$/;i(a),n.deps=function(b){return i(a=b||a),a},n.version=function(){return Ja};var Qa=1,Ra=2,Sa=3,Ta=0;n.startComputation=function(){Ta++},n.endComputation=function(){Ta>1?Ta--:(Ta=0,n.redraw())};var Ua,Va=[],Wa=!1,Xa=function(){try{return Fa.createRange().createContextualFragment("x"),function(a,b){a.appendChild(Fa.createRange().createContextualFragment(b))}}catch(a){return function(a,b){a.insertAdjacentHTML("beforeend",b)}}}(),Ya={appendChild:function(a){Ua===b&&(Ua=Fa.createElement("html")),Fa.documentElement&&Fa.documentElement!==a?Fa.replaceChild(a,Fa.documentElement):Fa.appendChild(a),this.childNodes=Fa.childNodes},insertBefore:function(a){this.appendChild(a)},childNodes:[]},Za=[],$a={};n.render=function(a,c,d){if(!a)throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var e,f=[],h=ba(a),i=a===Fa;e=i||a===Fa.documentElement?Ya:a,i&&"html"!==c.tag&&(c={tag:"html",attrs:{},children:c}),$a[h]===b&&Z(e.childNodes),d===!0&&ta(a),$a[h]=U(e,null,b,b,c,$a[h],!1,0,null,b,f),g(f,function(a){a()})},n.trust=function(a){return a=new String(a),a.$trusted=!0,a},n.prop=function(a){return(null!=a&&d(a)||c(a))&&c(a.then)?va(a):ca(a)};var _a,ab=[],bb=[],cb=[],db=null,eb=null,fb=16;n.component=function(a){for(var b=[],c=1;cd&&(d=ab.length);var e=!1,f={preventDefault:function(){e=!0,db=eb=null}};return g(Va,function(a){null!=a.controller&&(a.handler.call(a.controller,f),a.controller.onunload=null)}),e?g(Va,function(a){a.controller.onunload=a.handler}):Va=[],cb[d]&&c(cb[d].onunload)&&cb[d].onunload(f),ea(b,a,d,e)};var gb=0,hb=0,ib=Ha===a.requestAnimationFrame?ga:function(){+new Date-hb>fb&&ga()},jb=!1;n.redraw=function(a){if(!jb){jb=!0,a&&(Wa=!0);try{gb&&!a?ib():(ha(),gb=Ha(function(){gb=0},fb))}finally{jb=Wa=!1}}},n.redraw.strategy=n.prop(),n.withAttr=function(a,b,c){return function(d){d=d||event;var e,f=d.currentTarget||this,g=c||this;e=a in f?f[a]:f.getAttribute(a),b.call(g,e)}};var kb,lb,mb={pathname:"",hash:"#",search:"?"},nb=f,ob=!1;n.route=function(a,b,c,d){if(0===arguments.length)return lb;if(3===arguments.length&&e(b))nb=function(d){var e=lb=na(d);if(!oa(a,c,e)){if(ob)throw new Error("Ensure the default route matches one of the routes defined in m.route");ob=!0,n.route(b,!0),ob=!1}},ja("hash"===n.route.mode?"onhashchange":"onpopstate");else if(a.addEventListener||a.attachEvent)a.href=ka()+d.attrs.href,a.addEventListener?(a.removeEventListener("click",pa),a.addEventListener("click",pa)):(a.detachEvent("onclick",pa),a.attachEvent("onclick",pa));else if(e(a))return ma.apply(this,arguments)},n.route.param=function(a){if(!kb)throw new Error("You must call m.route(element, defaultRoute, routes) before calling m.route.param()");return a?kb[a]:kb},n.route.mode="search",n.route.buildQueryString=ra,n.route.parseQueryString=sa;var pb=1,qb=2,rb=3,sb=4;return n.deferred=function(){var a=new ua;return a.promise=va(a.promise),a},n.deferred.onerror=function(a){if(wa(a))throw Ta=0,a},n.sync=function(a){function b(a,b){return function(g){return e[a]=g,b||(f="reject"),0===--d&&(c.promise(e),c[f](e)),g}}var c=n.deferred(),d=a.length,e=new Array(d),f="resolve";return a.length>0?g(a,function(a,c){a.then(b(c,!0),b(c,!1))}):c.resolve([]),c.promise},n.request=function(a){a.background!==!0&&n.startComputation();var b=new ua,c=xa,d=xa,e=Ea;return a.dataType&&"jsonp"===a.dataType.toLowerCase()||(c=a.serialize||JSON.stringify,d=a.deserialize||JSON.parse,e=a.extract||function(a){return 0===a.responseText.length&&d===JSON.parse?null:a.responseText}),a.serialize=c,a.deserialize=d,a.method=(a.method||"GET").toUpperCase(),a.url=Da(a.url,a.data),a=Ca(a,a.data,c),a.onload=a.onerror=function(c){c=c||event;var f,h="load"===c.type;f=h?a.unwrapSuccess:a.unwrapError;try{var i=(f||xa)(d(e(c.target,a)),c.target);h?(Ma(i)&&a.type?g(i,function(b,c){i[c]=new a.type(b)}):a.type&&(i=new a.type(i)),b.resolve(i)):b.reject(i)}catch(j){b.reject(j)}finally{a.background!==!0&&n.endComputation()}},Ba(a),b.promise=va(b.promise,a.initialValue),b.promise},n}); //# sourceMappingURL=mithril.min.js.map \ No newline at end of file diff --git a/mithril.min.js.map b/mithril.min.js.map index 100cda44..a5db9814 100644 --- a/mithril.min.js.map +++ b/mithril.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["mithril.js"],"names":["global","factory","m","window","module","exports","define","amd","this","undefined","isFunction","object","isObject","type","call","isString","noop","forEach","list","f","i","length","forOwn","obj","prop","hasOwn","initialize","$document","document","$location","location","$cancelAnimationFrame","cancelAnimationFrame","clearTimeout","$requestAnimationFrame","requestAnimationFrame","setTimeout","checkForAttrs","pairs","parseSelector","tag","cell","match","classes","parser","exec","attrs","id","push","pair","attrParser","getChildrenFromList","hasAttrs","args","children","slice","isArray","assignAttrs","classAttr","value","attr","join","arguments","parameterize","Error","forKeys","key","dataToString","data","toString","e","injectTextNode","parent","first","index","insertNode","nodeValue","flatten","concat","apply","node","insertBefore","childNodes","handleKeysDiffer","existing","cached","action","MOVE","from","element","nodes","createElement","INSERTION","actions","changes","sort","sortChanges","newCached","Array","change","DELETION","clear","splice","dummy","changeElement","maybeChanged","diffKeys","parentElement","keysDiffer","cachedCell","diffArray","_","parentNode","indexOf","buildArrayKeys","guid","arraySortCompare","a","b","len","elemIsDifferentEnough","dataAttrKeys","Object","keys","redraw","strategy","configContext","retain","maybeRecreateObject","onunload","controllers","controller","unload","preventDefault","getObjectNamespace","namespace","xmlns","unloadCachedControllers","views","$old","pendingRequests","scheduleConfigsToBeCalled","configs","isNew","config","context","buildUpdatedNode","editable","hasKeys","setAttributes","build","contenteditable","intact","handleNonexistentNodes","$trusted","injectHTML","createTextNode","voidElements","test","nodeName","constructor","reattachNodes","parentTag","activeElement","innerHTML","nodeType","handleTextNode","shouldReattach","valueOf","getSubArrayCount","item","buildArray","subArrayCount","shouldMaintainIdentities","cacheCount","makeCache","parentIndex","parentCache","offset","end","constructNode","is","createElementNS","constructAttrs","constructChildren","reconstructCached","getController","view","cachedControllers","updateLists","unloaders","handler","checkView","forcing","subtree","markViews","$original","initObjectNode","buildObject","shouldSetAttrDirectly","trySetAttribute","dataAttr","cachedAttr","autoredraw","rule","style","setAttributeNS","setAttribute","dataAttrs","cachedAttrs","message","removeChild","nextSibling","isElement","placeholder","insertAdjacentHTML","insertAdjacentBeforeEnd","callback","event","startComputation","endFirstComputation","getCellCacheKey","nodeCache","gettersetter","store","toJSON","component","Ctrl","originalCtrl","ctrl","rest","originalView","prototype","output","initComponent","root","isPrevented","isNullComponent","roots","topComponent","components","removeRootElement","reset","actuallyPerformRedraw","lastRedrawId","FRAME_BUDGET","computePreRedrawHook","render","computePostRedrawHook","lastRedrawCallTime","Date","endComputation","runHistoryListener","listener","path","route","mode","search","currentRoute","normalizeRoute","redirect","setScroll","getRouteBase","pathname","modes","computeAndLaunchRedirect","shouldReplaceHistoryEntry","history","pushState","method","title","routeTo","params","oldRoute","queryString","currentPath","queryIndex","paramsObj","parseQueryString","buildQueryString","delimiter","routeByValue","router","queryStart","routeParams","substr","mount","matcher","RegExp","replace","values","decodeURIComponent","routeUnobtrusive","ctrlKey","metaKey","which","returnValue","currentTarget","srcElement","toUpperCase","hash","scrollTo","prefix","duplicates","str","encodeURIComponent","charAt","split","string","cacheKey","cellCache","Deferred","onSuccess","onFailure","finish","state","REJECTED","next","deferred","RESOLVED","resolve","promiseValue","reject","thennable","then","success","fail","notThennable","count","onerror","fire","REJECTING","RESOLVING","self","TypeError","promise","propify","initialValue","bind","_callback","reason","isNativeError","EvalError","RangeError","ReferenceError","SyntaxError","URIError","identity","generateCallbackKey","getTime","Math","round","random","getJsonp","options","callbackKey","script","resp","onload","target","responseText","status","src","url","body","appendChild","runXhr","xhr","XMLHttpRequest","open","user","password","onreadystatechange","readyState","serialize","JSON","stringify","setRequestHeader","deserialize","parse","maybeXhr","FormData","send","ajax","dataType","toLowerCase","bindData","xhrOptions","querystring","parameterizeUrl","tokens","token","defaultExtract","jsonp","VERSION","hasOwnProperty","deps","mock","version","html","createRange","createContextualFragment","documentNode","documentElement","replaceChild","forceRecreation","isDocumentRoot","trust","String","ev","unloader","performRedraw","redrawing","force","withAttr","withAttrCallback","callbackThis","targetProp","_this","getAttribute","isDefaultRoute","arg1","arg2","vdom","source","addEventListener","attachEvent","href","removeEventListener","detachEvent","param","sync","synchronizer","pos","resolved","results","outstanding","arg","request","background","extract","unwrap","response","doSuccess","unwrapSuccess","unwrapError","res"],"mappings":"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","file":"mithril.min.js"} \ No newline at end of file +{"version":3,"sources":["mithril.js"],"names":["global","factory","m","window","module","exports","define","amd","this","undefined","isFunction","object","isObject","type","call","isString","noop","forEach","list","f","i","length","forOwn","obj","prop","hasOwn","initialize","$document","document","$location","location","$cancelAnimationFrame","cancelAnimationFrame","clearTimeout","$requestAnimationFrame","requestAnimationFrame","setTimeout","checkForAttrs","pairs","parseSelector","tag","cell","match","classes","parser","exec","attrs","id","push","pair","attrParser","getChildrenFromList","hasAttrs","args","children","slice","isArray","assignAttrs","classAttr","value","attr","join","arguments","parameterize","Error","forKeys","key","dataToString","data","toString","e","injectTextNode","parent","first","index","insertNode","nodeValue","flatten","concat","apply","node","insertBefore","childNodes","handleKeysDiffer","existing","cached","action","MOVE","from","element","nodes","createElement","INSERTION","actions","changes","sort","sortChanges","newCached","Array","change","DELETION","clear","splice","dummy","changeElement","maybeChanged","diffKeys","parentElement","keysDiffer","cachedCell","diffArray","_","parentNode","indexOf","buildArrayKeys","guid","arraySortCompare","a","b","len","elemIsDifferentEnough","dataAttrKeys","Object","keys","redraw","strategy","configContext","retain","maybeRecreateObject","onunload","controllers","controller","unload","preventDefault","getObjectNamespace","namespace","xmlns","unloadCachedControllers","views","$old","pendingRequests","scheduleConfigsToBeCalled","configs","isNew","config","context","buildUpdatedNode","editable","hasKeys","setAttributes","build","contenteditable","intact","handleNonexistentNodes","$trusted","injectHTML","createTextNode","voidElements","test","nodeName","constructor","reattachNodes","parentTag","activeElement","innerHTML","nodeType","trim","handleTextNode","shouldReattach","valueOf","getSubArrayCount","item","buildArray","subArrayCount","shouldMaintainIdentities","cacheCount","makeCache","parentIndex","parentCache","offset","end","constructNode","is","createElementNS","constructAttrs","constructChildren","reconstructCached","getController","view","cachedControllers","updateLists","idx","unloaders","handler","checkView","forcing","subtree","markViews","$original","initObjectNode","buildObject","shouldSetAttrDirectly","trySetAttribute","dataAttr","cachedAttr","autoredraw","rule","style","setAttributeNS","setAttribute","dataAttrs","cachedAttrs","message","removeChild","nextSibling","isElement","placeholder","insertAdjacentHTML","insertAdjacentBeforeEnd","callback","event","startComputation","endFirstComputation","getCellCacheKey","nodeCache","gettersetter","store","toJSON","component","Ctrl","originalCtrl","ctrl","rest","originalView","prototype","output","initComponent","root","isPrevented","isNullComponent","roots","topComponent","components","removeRootElement","reset","actuallyPerformRedraw","lastRedrawId","FRAME_BUDGET","computePreRedrawHook","render","computePostRedrawHook","lastRedrawCallTime","Date","endComputation","runHistoryListener","listener","path","route","mode","search","currentRoute","normalizeRoute","redirect","setScroll","getRouteBase","pathname","modes","computeAndLaunchRedirect","shouldReplaceHistoryEntry","history","pushState","method","title","routeTo","params","oldRoute","queryString","currentPath","queryIndex","paramsObj","parseQueryString","buildQueryString","delimiter","routeByValue","router","queryStart","routeParams","substr","mount","matcher","RegExp","replace","values","decodeURIComponent","routeUnobtrusive","ctrlKey","metaKey","which","returnValue","currentTarget","srcElement","toUpperCase","hash","scrollTo","prefix","duplicates","str","encodeURIComponent","charAt","split","string","cacheKey","cellCache","Deferred","onSuccess","onFailure","finish","state","REJECTED","next","deferred","RESOLVED","resolve","promiseValue","reject","thennable","then","success","fail","notThennable","count","onerror","fire","REJECTING","RESOLVING","self","TypeError","promise","propify","initialValue","bind","_callback","reason","isNativeError","EvalError","RangeError","ReferenceError","SyntaxError","URIError","identity","generateCallbackKey","getTime","Math","round","random","getJsonp","options","callbackKey","script","resp","onload","target","responseText","status","src","url","body","appendChild","runXhr","xhr","XMLHttpRequest","open","user","password","onreadystatechange","readyState","serialize","JSON","stringify","setRequestHeader","deserialize","parse","maybeXhr","FormData","send","ajax","dataType","toLowerCase","bindData","xhrOptions","querystring","parameterizeUrl","tokens","token","defaultExtract","jsonp","VERSION","hasOwnProperty","deps","mock","version","html","createRange","createContextualFragment","documentNode","documentElement","replaceChild","forceRecreation","isDocumentRoot","trust","String","ev","unloader","performRedraw","redrawing","force","withAttr","withAttrCallback","callbackThis","targetProp","_this","getAttribute","isDefaultRoute","arg1","arg2","vdom","source","addEventListener","attachEvent","href","removeEventListener","detachEvent","param","sync","synchronizer","pos","resolved","results","outstanding","arg","request","background","extract","unwrap","doSuccess","unwrapSuccess","unwrapError","response","res"],"mappings":"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","file":"mithril.min.js"} \ No newline at end of file diff --git a/test/mithril.request.js b/test/mithril.request.js index fd8ab1f4..d432ab43 100644 --- a/test/mithril.request.js +++ b/test/mithril.request.js @@ -345,4 +345,40 @@ describe("m.request()", function () { expect(req()).to.eql({foo: "bar1"}) }) }) + + it("ends the computation when a SyntaxError is thrown from `options.extract`", function () { // eslint-disable-line max-len + var root = mock.document.createElement("div") + var viewSpy = sinon.spy(function () { return m("div") }) + var resolved = sinon.spy() + var rejected = sinon.spy() + + m.mount(root, { + controller: function () { + m.request({ + url: "/test", + extract: function () { + throw new SyntaxError() + } + }).then(resolved, rejected) + }, + + view: viewSpy + }) + + // For good measure + mock.requestAnimationFrame.$resolve() + + expect(function () { + resolve() + }).to.throw() + + expect(resolved).to.not.have.been.called + expect(rejected).to.not.have.been.called + + // The controller should throw, but the view should still render. + expect(viewSpy).to.have.been.called + + // For good measure + mock.requestAnimationFrame.$resolve() + }) }) diff --git a/test/mithril.trust.js b/test/mithril.trust.js index 41881b31..d16bf11b 100644 --- a/test/mithril.trust.js +++ b/test/mithril.trust.js @@ -52,7 +52,7 @@ describe("m.trust()", function () { m("td", "foo") ]) - expect(root.childNodes[2].tagName).to.equal("td") + expect(root.childNodes[2].tagName).to.equal("TD") }) }) })