Merge branch 'next' into components

Conflicts:
	mithril.d.ts
This commit is contained in:
Leo Horie 2015-03-25 22:07:11 -04:00
commit 9ada8111d7
4 changed files with 205 additions and 160 deletions

View file

@ -8,6 +8,14 @@ Go to the [Learn Mithril site](http://lhorie.github.io/mithril-blog)
--- ---
### Gitter
There's a [Gitter chat room](https://gitter.im/lhorie/mithril.js). This is a great place to ask questions, discuss ideas and connect with Mithril users.
You can sign in with your Github credentials.
---
### Mailing List ### Mailing List
Looking for a place to talk about Mithril? Suggestions? Looking for a place to talk about Mithril? Suggestions?
@ -27,11 +35,6 @@ Want to help fellow Mithril developers and gain karma while at it? [Keep an eye
### IRC ### IRC
Join the #mithriljs IRC channel on [Freenode](http://webchat.freenode.net). Join the #mithriljs IRC channel on [Freenode](http://webchat.freenode.net).
---
### Gitter
There's also a [Gitter chat room](https://gitter.im/lhorie/mithril.js).
--- ---

285
mithril.d.ts vendored
View file

@ -1,165 +1,166 @@
//Mithril type definitions for Typescript //Mithril type definitions for Typescript
declare module _mithril {
interface MithrilStatic {
interface MithrilStatic { (selector: string, attributes: MithrilAttributes, ...children: Array<string|MithrilVirtualElement|MithrilModule>): MithrilVirtualElement;
(selector: string, ...children: Array<string|MithrilVirtualElement|MithrilModule>): MithrilVirtualElement;
(selector: string, attributes: MithrilAttributes, ...children: Array<string|MithrilVirtualElement|MithrilModule>): MithrilVirtualElement; prop<T>(promise: MithrilPromise<T>) : MithrilPromiseProperty<T>;
(selector: string, ...children: Array<string|MithrilVirtualElement|MithrilModule>): MithrilVirtualElement; prop<T>(value: T): MithrilProperty<T>;
prop(): MithrilProperty<Object>; // might be that this should be Property<any>
prop<T>(promise: MithrilPromise<T>) : MithrilPromiseProperty<T>; withAttr(property: string, callback: (value: any) => void): (e: MithrilEvent) => any;
prop<T>(value: T): MithrilProperty<T>;
prop(): MithrilProperty<Object>; // might be that this should be Property<any>
withAttr(property: string, callback: (value: any) => void): (e: MithrilEvent) => any; module<T extends MithrilController>(rootElement: Node, module: MithrilModule<T>): T;
module<T extends MithrilController>(rootElement: Node): T;
module<T extends MithrilController>(rootElement: Node, module: MithrilModule<T>): T; trust(html: string): string;
module<T extends MithrilController>(rootElement: Node): T;
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; redraw: {
render(rootElement: Element|HTMLDocument, children: MithrilVirtualElement, forceRecreation?: boolean): void; (force?: boolean): void;
render(rootElement: Element|HTMLDocument, children: MithrilVirtualElement[], forceRecreation?: boolean): void; strategy: MithrilProperty<string>;
}
redraw: { route: {
(force?: boolean): void; <T extends MithrilController>(rootElement: HTMLDocument, defaultRoute: string, routes: MithrilRoutes<T>): void;
strategy: MithrilProperty<string>; <T extends MithrilController>(rootElement: Element, defaultRoute: string, routes: MithrilRoutes<T>): void;
}
route: { (element: Element, isInitialized: boolean): void;
<T extends MithrilController>(rootElement: HTMLDocument, defaultRoute: string, routes: MithrilRoutes<T>): void; (path: string, params?: any, shouldReplaceHistory?: boolean): void;
<T extends MithrilController>(rootElement: Element, defaultRoute: string, routes: MithrilRoutes<T>): void; (): string;
(element: Element, isInitialized: boolean): void; param(key: string): string;
(path: string, params?: any, shouldReplaceHistory?: boolean): void; mode: string;
(): string; }
param(key: string): string; request<T>(options: MithrilXHROptions): MithrilPromise<T>;
mode: string;
}
request<T>(options: MithrilXHROptions): MithrilPromise<T>; deferred: {
onerror(e: Error): void;
<T>(): MithrilDeferred<T>;
}
deferred: { sync<T>(promises: MithrilPromise<T>[]): MithrilPromise<T[]>;
onerror(e: Error): void;
<T>(): MithrilDeferred<T>;
}
sync<T>(promises: MithrilPromise<T>[]): MithrilPromise<T[]>; startComputation(): void;
endComputation(): void;
startComputation(): void; // For test suite
endComputation(): void; 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[];
}
// Configuration function for an element
interface MithrilElementConfig {
(element: Element, isInitialized: boolean, context?: any): void;
}
// Attributes on a virtual element
interface MithrilAttributes {
title?: string;
className?: string;
class?: string;
config?: MithrilElementConfig;
}
// Defines the subset of Event that Mithril needs
interface MithrilEvent {
currentTarget: Element;
}
interface MithrilController {
onunload?(evt: Event): any;
}
interface MithrilControllerFunction extends MithrilController {
(): any;
}
interface MithrilView<T extends MithrilController> {
(ctrl: T): string|MithrilVirtualElement;
}
interface MithrilModule<T extends MithrilController> {
controller: MithrilControllerFunction|{ new(): T };
view: MithrilView<T>;
}
interface MithrilProperty<T> {
(): T;
(value: T): T;
toJSON(): T;
}
interface MithrilPromiseProperty<T> extends MithrilPromise<T> {
(): T;
(value: T): T;
toJSON(): T;
}
interface MithrilRoutes<T extends MithrilController> {
[key: string]: MithrilModule<T>;
}
interface MithrilDeferred<T> {
resolve(value?: T): void;
reject(value?: any): void;
promise: MithrilPromise<T>;
}
interface MithrilSuccessCallback<T, U> {
(value: T): U;
(value: T): MithrilPromise<U>;
}
interface MithrilErrorCallback<U> {
(value: Error): U;
(value: string): U;
}
interface MithrilPromise<T> {
(): T;
(value: T): T;
then<U>(success: (value: T) => U): MithrilPromise<U>;
then<U>(success: (value: T) => MithrilPromise<U>): MithrilPromise<U>;
then<U,V>(success: (value: T) => U, error: (value: Error) => V): MithrilPromise<U>|MithrilPromise<V>;
then<U,V>(success: (value: T) => MithrilPromise<U>, error: (value: Error) => V): MithrilPromise<U>|MithrilPromise<V>;
}
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;
}
} }
interface MithrilVirtualElement { declare var Mithril: _mithril.MithrilStatic;
key?: number; declare var m: _mithril.MithrilStatic;
tag?: string;
attrs?: MithrilAttributes;
children?: any[];
}
// Configuration function for an element declare module "mithril" {
interface MithrilElementConfig {
(element: Element, isInitialized: boolean, context?: any): void;
}
// Attributes on a virtual element
interface MithrilAttributes {
title?: string;
className?: string;
class?: string;
config?: MithrilElementConfig;
}
// Defines the subset of Event that Mithril needs
interface MithrilEvent {
currentTarget: Element;
}
interface MithrilController {
onunload?(evt: Event): any;
}
interface MithrilControllerFunction extends MithrilController {
(): any;
}
interface MithrilView<T extends MithrilController> {
(ctrl: T): string|MithrilVirtualElement;
}
interface MithrilModule<T extends MithrilController> {
controller: MithrilControllerFunction|{ new(): T };
view: MithrilView<T>;
}
interface MithrilProperty<T> {
(): T;
(value: T): T;
toJSON(): T;
}
interface MithrilPromiseProperty<T> extends MithrilPromise<T> {
(): T;
(value: T): T;
toJSON(): T;
}
interface MithrilRoutes<T extends MithrilController> {
[key: string]: MithrilModule<T>;
}
interface MithrilDeferred<T> {
resolve(value?: T): void;
reject(value?: any): void;
promise: MithrilPromise<T>;
}
interface MithrilSuccessCallback<T, U> {
(value: T): U;
(value: T): MithrilPromise<U>;
}
interface MithrilErrorCallback<U> {
(value: Error): U;
(value: string): U;
}
interface MithrilPromise<T> {
(): T;
(value: T): T;
then<U>(success: (value: T) => U): MithrilPromise<U>;
then<U>(success: (value: T) => MithrilPromise<U>): MithrilPromise<U>;
then<U,V>(success: (value: T) => U, error: (value: Error) => V): MithrilPromise<U>|MithrilPromise<V>;
then<U,V>(success: (value: T) => MithrilPromise<U>, error: (value: Error) => V): MithrilPromise<U>|MithrilPromise<V>;
}
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;
}
declare var Mithril: MithrilStatic;
declare var m: MithrilStatic;
declare module 'mithril' {
export = m; export = m;
} }

View file

@ -789,28 +789,44 @@ var m = (function app(window, undefined) {
else window.scrollTo(0, 0) else window.scrollTo(0, 0)
} }
function buildQueryString(object, prefix) { function buildQueryString(object, prefix) {
var str = []; var duplicates = {}
for(var prop in object) { var str = []
var key = prefix ? prefix + "[" + prop + "]" : prop, value = object[prop]; for (var prop in object) {
var key = prefix ? prefix + "[" + prop + "]" : prop
var value = object[prop]
var valueType = type.call(value) var valueType = type.call(value)
var pair = value != null && (valueType === OBJECT) ? var pair = (value === null) ? encodeURIComponent(key) :
buildQueryString(value, key) : valueType === OBJECT ? buildQueryString(value, key) :
valueType === ARRAY ? valueType === ARRAY ? value.reduce(function(memo, item) {
value.map(function(item) {return encodeURIComponent(key + "[]") + "=" + encodeURIComponent(item)}).join("&") : if (!duplicates[key]) duplicates[key] = {}
encodeURIComponent(key) + "=" + encodeURIComponent(value) if (!duplicates[key][item]) {
str.push(pair) duplicates[key][item] = true
return memo.concat(encodeURIComponent(key) + "=" + encodeURIComponent(item))
}
return memo
}, []).join("&") :
encodeURIComponent(key) + "=" + encodeURIComponent(value)
if (value !== undefined) str.push(pair)
} }
return str.join("&") return str.join("&")
} }
function parseQueryString(str) { function parseQueryString(str) {
var pairs = str.split("&"), params = {}; var pairs = str.split("&"), params = {};
for (var i = 0, len = pairs.length; i < len; i++) { for (var i = 0, len = pairs.length; i < len; i++) {
var pair = pairs[i].split("="); var pair = pairs[i].split("=");
params[decodeURIComponent(pair[0])] = pair[1] ? decodeURIComponent(pair[1]) : "" var key = decodeURIComponent(pair[0])
var value = pair.length == 2 ? decodeURIComponent(pair[1]) : null
if (params[key] != null) {
if (type.call(params[key]) !== ARRAY) params[key] = [params[key]]
params[key].push(value)
}
else params[key] = value
} }
return params return params
} }
m.route.buildQueryString = buildQueryString
m.route.parseQueryString = parseQueryString
function reset(root) { function reset(root) {
var cacheKey = getCellCacheKey(root); var cacheKey = getCellCacheKey(root);
clear(root.childNodes, cellCache[cacheKey]); clear(root.childNodes, cellCache[cacheKey]);

View file

@ -1965,7 +1965,7 @@ function testMithril(mock) {
mock.requestAnimationFrame.$resolve() mock.requestAnimationFrame.$resolve()
m.route("/test14?test&test2=") m.route("/test14?test&test2=")
mock.requestAnimationFrame.$resolve() //teardown mock.requestAnimationFrame.$resolve() //teardown
return mock.location.search == "?/test14?test=&test2=" && m.route.param("test") === "" && m.route.param("test2") === "" return mock.location.search == "?/test14?test&test2=" && m.route.param("test") === null && m.route.param("test2") === ""
}) })
test(function() { test(function() {
mock.requestAnimationFrame.$resolve() //setup mock.requestAnimationFrame.$resolve() //setup
@ -3067,6 +3067,31 @@ function testMithril(mock) {
}) })
//end m.route //end m.route
//m.route.parseQueryString
test(function() {
var args = m.route.parseQueryString("foo=bar&hello%5B%5D=world&hello%5B%5D=mars&hello%5B%5D=pluto")
return args["hello[]"] instanceof Array && args["hello[]"].indexOf("world") > -1 && args["hello[]"].indexOf("mars") > -1 && args["hello[]"].indexOf("pluto") > -1
})
test(function() {
var args = m.route.parseQueryString("foo=bar&hello=world&hello=mars&bam=&yup")
return args.foo === "bar" && args.hello[0] === "world" && args.hello[1] === "mars" && args.bam === "" && args.yup === null
})
//m.route.buildQueryString
test(function() {
var string = m.route.buildQueryString({
foo: "bar",
hello: ["world", "mars", "mars"],
world: {
test:3
},
bam: "",
yup: null,
removed: undefined
})
return string === "foo=bar&hello=world&hello=mars&world%5Btest%5D=3&bam=&yup"
})
//m.prop //m.prop
test(function() { test(function() {
var prop = m.prop("test") var prop = m.prop("test")
@ -3187,7 +3212,7 @@ function testMithril(mock) {
test(function() { test(function() {
var prop = m.request({method: "GET", url: "test", data: {foo: [1, 2]}}) var prop = m.request({method: "GET", url: "test", data: {foo: [1, 2]}})
mock.XMLHttpRequest.$instances.pop().onreadystatechange() mock.XMLHttpRequest.$instances.pop().onreadystatechange()
return prop().url === "test?foo%5B%5D=1&foo%5B%5D=2" return prop().url === "test?foo=1&foo=2"
}) })
// m.request over jsonp // m.request over jsonp