From 8c0029639337837f9dcf0ca20976af973828c055 Mon Sep 17 00:00:00 2001 From: Jonatan Nilsson Date: Mon, 9 Feb 2015 21:35:34 +0000 Subject: [PATCH 1/9] propify: Fix chaining to return original m.prop --- mithril.js | 3 ++- tests/mithril-tests.js | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/mithril.js b/mithril.js index e02b3049..0ae27a31 100644 --- a/mithril.js +++ b/mithril.js @@ -723,7 +723,8 @@ var m = (function app(window, undefined) { var prop = m.prop(); promise.then(prop); prop.then = function(resolve, reject) { - return propify(promise.then(resolve, reject)) + promise = promise.then(resolve, reject).then(prop); + return prop; }; return prop } diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index a6c161ed..29416db3 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -1836,6 +1836,13 @@ function testMithril(mock) { xhr.onreadystatechange() return xhr.$headers["Content-Type"] === undefined }) + test(function() { + var prop = m.request({method: "POST", url: "test", initialValue: "foo"}).then(function(data) { return data; }) + var initialValue = prop(); + mock.XMLHttpRequest.$instances.pop().onreadystatechange() + + return initialValue === "foo" + }) test(function() { var prop = m.request({method: "POST", url: "test", initialValue: "foo"}) var initialValue = prop(); From 105a936a06e7dafacb36e0aa1e2be77d7cb06a1e Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Thu, 12 Feb 2015 22:02:44 -0500 Subject: [PATCH 2/9] #320 fix routing bug in IE9 --- mithril.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/mithril.js b/mithril.js index 3dcfb4b4..5e8e7a44 100644 --- a/mithril.js +++ b/mithril.js @@ -605,13 +605,19 @@ var m = (function app(window, undefined) { window[listener]() } //config: m.route - else if (arguments[0].addEventListener) { + else if (arguments[0].addEventListener || arguments[0].attachEvent) { var element = arguments[0]; var isInitialized = arguments[1]; var context = arguments[2]; element.href = (m.route.mode !== 'pathname' ? $location.pathname : '') + modes[m.route.mode] + this.attrs.href; - element.removeEventListener("click", routeUnobtrusive); - element.addEventListener("click", routeUnobtrusive) + if (element.addEventListener) { + element.removeEventListener("click", routeUnobtrusive); + element.addEventListener("click", routeUnobtrusive) + } + else { + element.detachEvent("onclick", routeUnobtrusive); + element.attachEvent("onclick", routeUnobtrusive) + } } //m.route(route, params) else if (type.call(arguments[0]) === STRING) { @@ -634,7 +640,10 @@ var m = (function app(window, undefined) { }; redirect(modes[m.route.mode] + currentRoute) } - else $location[m.route.mode] = currentRoute + else { + $location[m.route.mode] = currentRoute + redirect(modes[m.route.mode] + currentRoute) + } } }; m.route.param = function(key) { @@ -687,8 +696,9 @@ var m = (function app(window, undefined) { if (e.ctrlKey || e.metaKey || e.which === 2) return; if (e.preventDefault) e.preventDefault(); else e.returnValue = false; - var currentTarget = e.currentTarget || this; + var currentTarget = e.currentTarget || e.srcElement; var args = m.route.mode === "pathname" && currentTarget.search ? parseQueryString(currentTarget.search.slice(1)) : {}; + while (currentTarget && currentTarget.nodeName.toUpperCase() != "A") currentTarget = currentTarget.parentNode m.route(currentTarget[m.route.mode].slice(modes[m.route.mode].length), args) } function setScroll() { From 8ac72911a83e6178d3acda07dcdc923865a61e3d Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Thu, 12 Feb 2015 22:15:42 -0500 Subject: [PATCH 3/9] update docs and change log --- docs/change-log.md | 18 ++++++++++++++++++ docs/mithril.request.md | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/change-log.md b/docs/change-log.md index 3a281aa0..8fb182f8 100644 --- a/docs/change-log.md +++ b/docs/change-log.md @@ -1,5 +1,21 @@ ## Change Log +[v0.1.31](/mithril/archive/v0.1.31) - maintenance + +### News: + +- Typescript definitions are more strongly typed +- m.request's `unwrapSuccess` and `unwrapError` callbacks now receive the XMLHttpRequest instance as a second parameter +- 3rd parameter for `m.route(route, params, shouldReplaceHistory)` is now public +- exact routes now have higher precedence than routes w/ variables [#452](https://github.com/lhorie/mithril.js/issues/452) + +### Bug Fixes: + +- fix routing bug in IE9 [#320](https://github.com/lhorie/mithril.js/issues/320) +- fix ordering bug in m.trust when using HTML entities [#453](https://github.com/lhorie/mithril.js/issues/453) + +--- + [v0.1.30](/mithril/archive/v0.1.30) - maintenance ### Bug Fixes: @@ -8,6 +24,8 @@ - fix module.view's `this` association regression in Haxe environment [#434](https://github.com/lhorie/mithril.js/issues/434) - fix array serialization syntax in querystrings [#440](https://github.com/lhorie/mithril.js/issues/440) +--- + [v0.1.29](/mithril/archive/v0.1.29) - maintenance ### News: diff --git a/docs/mithril.request.md b/docs/mithril.request.md index 1f45ccdb..c133a0b3 100644 --- a/docs/mithril.request.md +++ b/docs/mithril.request.md @@ -507,7 +507,7 @@ where: The value that populates the returned getter-setter before the request completes. This is useful when using the `background` option, in order to avoid the need for null checks in views that may be attempting to access the returned getter-setter before the asynchronous request resolves. - - **any unwrapSuccess(any data)** (optional) + - **any unwrapSuccess(any data, XMLHttpRequest xhr)** (optional) A preprocessor function to unwrap the data from a success response in case the response contains metadata wrapping the data. @@ -523,7 +523,7 @@ where: The unwrapped data - - **any unwrapError(any data)** (optional) + - **any unwrapError(any data, XMLHttpRequest xhr)** (optional) A preprocessor function to unwrap the data from an error response in case the response contains metadata wrapping the data. From a48cf080f497df47f843b38b0307d7eed0e7b51c Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Fri, 13 Feb 2015 13:42:04 -0500 Subject: [PATCH 4/9] fix return value in doc --- docs/mithril.request.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/mithril.request.md b/docs/mithril.request.md index c133a0b3..ad89a482 100644 --- a/docs/mithril.request.md +++ b/docs/mithril.request.md @@ -164,6 +164,7 @@ In the example below, we take advantage of queuing to debug the AJAX response da //a FP-friendly console.log var log = function(value) { console.log(value) + return value } var users = m.request({method: "GET", url: "/user"}) From a5667ff3413c3ca25541b1f8167e931579d5573b Mon Sep 17 00:00:00 2001 From: Chris Bowdon Date: Sat, 14 Feb 2015 13:31:50 +0000 Subject: [PATCH 5/9] Made it possible to use TypeScript class as a controller --- mithril.d.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mithril.d.ts b/mithril.d.ts index 3279b8cc..43575f08 100644 --- a/mithril.d.ts +++ b/mithril.d.ts @@ -83,16 +83,19 @@ interface MithrilEvent { } interface MithrilController { - (): any; onunload?(evt: Event): any; } +interface MithrilControllerFunction extends MithrilController { + (): any; +} + interface MithrilView { (ctrl: T): string|MithrilVirtualElement; } interface MithrilModule { - controller: T; + controller: MithrilControllerFunction|{ new(): T }; view: MithrilView; } From 130a075a919bb413fa0499031f9f9f9f5a7217b5 Mon Sep 17 00:00:00 2001 From: Chris Bowdon Date: Sat, 14 Feb 2015 13:32:34 +0000 Subject: [PATCH 6/9] Fixed weird 7-space indentation in d.ts (now 4) --- mithril.d.ts | 176 +++++++++++++++++++++++++-------------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/mithril.d.ts b/mithril.d.ts index 43575f08..06264c71 100644 --- a/mithril.d.ts +++ b/mithril.d.ts @@ -2,164 +2,164 @@ interface MithrilStatic { - (selector: string, attributes: MithrilAttributes, ...children: Array): MithrilVirtualElement; - (selector: string, ...children: Array): MithrilVirtualElement; + (selector: string, attributes: MithrilAttributes, ...children: Array): MithrilVirtualElement; + (selector: string, ...children: Array): MithrilVirtualElement; - prop(promise: MithrilPromise) : MithrilPromiseProperty; - prop(value: T): MithrilProperty; - prop(): MithrilProperty; // might be that this should be Property + prop(promise: MithrilPromise) : MithrilPromiseProperty; + prop(value: T): MithrilProperty; + prop(): MithrilProperty; // might be that this should be Property - withAttr(property: string, callback: (value: any) => void): (e: MithrilEvent) => any; + withAttr(property: string, callback: (value: any) => void): (e: MithrilEvent) => any; - module(rootElement: Node, module: MithrilModule): T; - module(rootElement: Node): T; + module(rootElement: Node, module: MithrilModule): T; + module(rootElement: Node): T; - trust(html: string): string; + trust(html: string): string; - render(rootElement: Element|HTMLDocument): void; - render(rootElement: Element|HTMLDocument, children: MithrilVirtualElement, forceRecreation?: boolean): void; - render(rootElement: Element|HTMLDocument, children: MithrilVirtualElement[], forceRecreation?: boolean): void; + render(rootElement: Element|HTMLDocument): void; + render(rootElement: Element|HTMLDocument, children: MithrilVirtualElement, forceRecreation?: boolean): void; + render(rootElement: Element|HTMLDocument, children: MithrilVirtualElement[], forceRecreation?: boolean): void; - redraw: { - (force?: boolean): void; - strategy: MithrilProperty; - } + redraw: { + (force?: boolean): void; + strategy: MithrilProperty; + } - route: { - (rootElement: HTMLDocument, defaultRoute: string, routes: MithrilRoutes): void; - (rootElement: Element, defaultRoute: string, routes: MithrilRoutes): void; + route: { + (rootElement: HTMLDocument, defaultRoute: string, routes: MithrilRoutes): void; + (rootElement: Element, defaultRoute: string, routes: MithrilRoutes): void; - (element: Element, isInitialized: boolean): void; - (path: string, params?: any, shouldReplaceHistory?: boolean): void; - (): string; + (element: Element, isInitialized: boolean): void; + (path: string, params?: any, shouldReplaceHistory?: boolean): void; + (): string; - param(key: string): string; - mode: string; - } + param(key: string): string; + mode: string; + } - request(options: MithrilXHROptions): MithrilPromise; + request(options: MithrilXHROptions): MithrilPromise; - deferred: { - onerror(e: Error): void; - (): MithrilDeferred; - } + deferred: { + onerror(e: Error): void; + (): MithrilDeferred; + } - sync(promises: MithrilPromise[]): MithrilPromise; + sync(promises: MithrilPromise[]): MithrilPromise; - startComputation(): void; - endComputation(): void; + startComputation(): void; + endComputation(): void; - // For test suite - deps: { - (mockWindow: Window): Window; - factory: Object; - } + // For test suite + deps: { + (mockWindow: Window): Window; + factory: Object; + } } interface MithrilVirtualElement { - key?: number; - tag?: string; - attrs?: MithrilAttributes; - children?: any[]; + key?: number; + tag?: string; + attrs?: MithrilAttributes; + children?: any[]; } // Configuration function for an element interface MithrilElementConfig { - (element: Element, isInitialized: boolean, context?: any): void; + (element: Element, isInitialized: boolean, context?: any): void; } // Attributes on a virtual element interface MithrilAttributes { - title?: string; - className?: string; - class?: string; - config?: MithrilElementConfig; + title?: string; + className?: string; + class?: string; + config?: MithrilElementConfig; } // Defines the subset of Event that Mithril needs interface MithrilEvent { - currentTarget: Element; + currentTarget: Element; } interface MithrilController { - onunload?(evt: Event): any; + onunload?(evt: Event): any; } interface MithrilControllerFunction extends MithrilController { - (): any; + (): any; } interface MithrilView { - (ctrl: T): string|MithrilVirtualElement; + (ctrl: T): string|MithrilVirtualElement; } interface MithrilModule { - controller: MithrilControllerFunction|{ new(): T }; - view: MithrilView; + controller: MithrilControllerFunction|{ new(): T }; + view: MithrilView; } interface MithrilProperty { - (): T; - (value: T): T; - toJSON(): T; + (): T; + (value: T): T; + toJSON(): T; } interface MithrilPromiseProperty extends MithrilPromise { - (): T; - (value: T): T; - toJSON(): T; + (): T; + (value: T): T; + toJSON(): T; } interface MithrilRoutes { - [key: string]: MithrilModule; + [key: string]: MithrilModule; } interface MithrilDeferred { - resolve(value?: T): void; - reject(value?: any): void; - promise: MithrilPromise; + resolve(value?: T): void; + reject(value?: any): void; + promise: MithrilPromise; } interface MithrilSuccessCallback { - (value: T): U; - (value: T): MithrilPromise; + (value: T): U; + (value: T): MithrilPromise; } interface MithrilErrorCallback { - (value: Error): U; - (value: string): U; + (value: Error): U; + (value: string): U; } interface MithrilPromise { - (): T; - (value: T): T; - then(success: (value: T) => U): MithrilPromise; - then(success: (value: T) => MithrilPromise): MithrilPromise; - then(success: (value: T) => U, error: (value: Error) => V): MithrilPromise|MithrilPromise; - then(success: (value: T) => MithrilPromise, error: (value: Error) => V): MithrilPromise|MithrilPromise; + (): T; + (value: T): T; + then(success: (value: T) => U): MithrilPromise; + then(success: (value: T) => MithrilPromise): MithrilPromise; + then(success: (value: T) => U, error: (value: Error) => V): MithrilPromise|MithrilPromise; + then(success: (value: T) => MithrilPromise, error: (value: Error) => V): MithrilPromise|MithrilPromise; } interface MithrilXHROptions { - method?: string; - url: string; - user?: string; - password?: string; - data?: any; - background?: boolean; - unwrapSuccess?(data: any): any; - unwrapError?(data: any): any; - serialize?(dataToSerialize: any): string; - deserialize?(dataToDeserialize: string): any; - extract?(xhr: XMLHttpRequest, options: MithrilXHROptions): string; - type?(data: Object): void; - config?(xhr: XMLHttpRequest, options: MithrilXHROptions): XMLHttpRequest; - dataType?: string; + method?: string; + url: string; + user?: string; + password?: string; + data?: any; + background?: boolean; + unwrapSuccess?(data: any): any; + unwrapError?(data: any): any; + serialize?(dataToSerialize: any): string; + deserialize?(dataToDeserialize: string): any; + extract?(xhr: XMLHttpRequest, options: MithrilXHROptions): string; + type?(data: Object): void; + config?(xhr: XMLHttpRequest, options: MithrilXHROptions): XMLHttpRequest; + dataType?: string; } declare var Mithril: MithrilStatic; declare var m: MithrilStatic; declare module 'mithril' { - export = m; + export = m; } From 46e5a24d82a796064f4190cdf13541b22eab38c7 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Wed, 18 Feb 2015 22:09:43 -0500 Subject: [PATCH 7/9] fix polyfill.io link --- docs/tools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tools.md b/docs/tools.md index 4cd78210..99833267 100644 --- a/docs/tools.md +++ b/docs/tools.md @@ -68,7 +68,7 @@ The easiest way to polyfill these features is to include this script: This will provide all the polyfills required for the browser. You can alternatively include only specific polyfills: ```markup - + ``` You can also use other polyfills to support these features in IE7. From 165303174761b34153ceffbeb1236d01164d1953 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Wed, 18 Feb 2015 22:24:46 -0500 Subject: [PATCH 8/9] fix m.request options signature --- docs/change-log.md | 1 + docs/mithril.request.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/change-log.md b/docs/change-log.md index 8fb182f8..273cd0b1 100644 --- a/docs/change-log.md +++ b/docs/change-log.md @@ -13,6 +13,7 @@ - fix routing bug in IE9 [#320](https://github.com/lhorie/mithril.js/issues/320) - fix ordering bug in m.trust when using HTML entities [#453](https://github.com/lhorie/mithril.js/issues/453) +- set promise's default value to initialValue if coming from m.request [#454](https://github.com/lhorie/mithril.js/issues/454) --- diff --git a/docs/mithril.request.md b/docs/mithril.request.md index ad89a482..2b474861 100644 --- a/docs/mithril.request.md +++ b/docs/mithril.request.md @@ -433,8 +433,8 @@ where: [Object data,] [Boolean background,] [any initialValue,] - [any unwrapSuccess(any data),] - [any unwrapError(any data),] + [any unwrapSuccess(any data, XMLHttpRequest xhr),] + [any unwrapError(any data, XMLHttpRequest xhr),] [String serialize(any dataToSerialize),] [any deserialize(String dataToDeserialize),] [any extract(XMLHttpRequest xhr, XHROptions options),] From d7373a050c7c040fc58e8016c6f411433eaeaf68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rory=20O=E2=80=99Kane?= Date: Mon, 23 Feb 2015 00:39:05 -0500 Subject: [PATCH 9/9] tools.md: explicitly say IE8 needs polyfills MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before adding this sentene, the first paragraph required me to look up `Array::indexOf` and those other functions to see what versions of Internet Explorer they were first supported in. Now, the relevance of that list is clear. I also fixed the capitalization of “ECMAScript”. --- docs/tools.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tools.md b/docs/tools.md index 99833267..a0c0ae76 100644 --- a/docs/tools.md +++ b/docs/tools.md @@ -57,7 +57,7 @@ You can use it by adding a reference to your Typescript files. This will allow t ### Internet Explorer Compatibility -Mithril relies on some Ecmascript 5 features, namely: `Array::indexOf`, `Array::map` and `Object::keys`, as well as the `JSON` object. +Mithril relies on some ECMAScript 5 features, namely: `Array::indexOf`, `Array::map` and `Object::keys`, as well as the `JSON` object. Internet Explorer 8 lacks native support for some of these features. The easiest way to polyfill these features is to include this script: @@ -79,4 +79,4 @@ You can also use other polyfills to support these features in IE7. Mithril also has a dependency on XMLHttpRequest. If you wish to support IE6, you'll need [a shim for it](https://gist.github.com/Contra/2709462). IE7 and lower do not support cross-domain AJAX requests. -In addition, note that most `m.route` modes rely on `history.pushState` in order to allow moving from one page to another without a browser refresh. [IE9 and lower](http://caniuse.com/#search=pushstate) do not support this feature and will gracefully degrade to page refreshes instead. \ No newline at end of file +In addition, note that most `m.route` modes rely on `history.pushState` in order to allow moving from one page to another without a browser refresh. [IE9 and lower](http://caniuse.com/#search=pushstate) do not support this feature and will gracefully degrade to page refreshes instead.