`MithrilVirtualElement` was recently converted to be generic over `<T extends MithrilController>`. The element's `children` may then contain other `MithrilVirtualElement<T>` or `MithrilComponent<T>` elements. Unfortunately, in common usage of 'm()' this can cause problems with Mithril's type inference system. If a type is not explicitly provided to `m()`, the "T" of the returned MithrilVirtualElement<T> will be inferred from its children. The candidates for T will be the concrete types of the child MithrilComponent<T>; however, if no candidate type is a subset of *every* candidate type, then TypeScript will be unable to infer a valid type, and the call to `m()` will not compile. To improve this behavior, this commit makes MithrilVirtualElement non-generic; it's child collection can now contain MithrilComponent<MithrilController>, which matches all valid MithrilComponent. This the same underlying issue as the previous commit, which made MithrilRoutes non-generic. The motivation for fixing this is threefold: 1. Because `m()` has so many overloads, in the case where a call to `m()` will not compile due to the above issue, the syntax error provided by TypeScript is not helpful. 2. In many cases, users will be calling `m<MithrilController>()` in their code simply to get it to compile, which provides no additional utility over a non-generic type and adds significant boilerplate. 3. Explicitly specifying subtypes to `m()` calls provides little utility; at best, it can check that contained components implement some common interface. However, type assertions like that can be provided in other places without having to attach the information to the MithrilVirtualElement.
1115 lines
30 KiB
TypeScript
1115 lines
30 KiB
TypeScript
// Mithril type definitions for Typescript
|
|
|
|
/**
|
|
* This is the module containing all the types/declarations/etc. for Mithril
|
|
*/
|
|
declare module _mithril {
|
|
interface MithrilStatic {
|
|
/**
|
|
* Creates a virtual element for use with m.render, m.mount, etc.
|
|
*
|
|
* @param selector A simple CSS selector. May include SVG tags. Nested
|
|
* selectors are not supported.
|
|
* @param attributes Attributes to add. Any DOM attribute may be used
|
|
* as an attribute, although innerHTML and the like may be overwritten
|
|
* silently.
|
|
* @param children Child elements, components, and text to add.
|
|
* @return A virtual element.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
(
|
|
selector: string,
|
|
attributes: MithrilAttributes,
|
|
...children: Array<string |
|
|
MithrilVirtualElement |
|
|
MithrilComponent<MithrilController>>
|
|
): MithrilVirtualElement;
|
|
|
|
/**
|
|
* Creates a virtual element for use with m.render, m.mount, etc.
|
|
*
|
|
* @param selector A simple CSS selector. Nested selectors are not
|
|
* supported.
|
|
* @param children Child elements, components, and text to add.
|
|
* @return A virtual element.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
(
|
|
selector: string,
|
|
...children: Array<string |
|
|
MithrilVirtualElement |
|
|
MithrilComponent<MithrilController>>
|
|
): MithrilVirtualElement;
|
|
|
|
/**
|
|
* Initializes a component for use with m.render, m.mount, etc.
|
|
* Shorthand for m.component.
|
|
*
|
|
* @param component A mithril component.
|
|
* @return A mithril component.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
<TController extends MithrilController>(
|
|
component: MithrilComponent<TController>
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a component for use with m.render, m.mount, etc.
|
|
* Shorthand for m.component.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
<TController extends MithrilController, T1>(
|
|
component: ParameterizedMithrilComponent<TController, T1, void, void, void>,
|
|
arg1: T1
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a component for use with m.render, m.mount, etc.
|
|
* Shorthand for m.component.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
<TController extends MithrilController, T1, T2>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, void, void>,
|
|
arg1: T1,
|
|
arg2: T2
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a component for use with m.render, m.mount, etc.
|
|
* Shorthand for m.component.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @param arg3 Third argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
<TController extends MithrilController, T1, T2, T3>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, T3, void>,
|
|
arg1: T1,
|
|
arg2: T2,
|
|
arg3: T3
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a parameterized component for use with m.render, m.mount, etc.
|
|
* Shorthand for m.component.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @param arg3 Third argument to bind to the component.
|
|
* @param arg4 Fourth argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
<TController extends MithrilController, T1, T2, T3, T4>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, T3, T4>,
|
|
arg1: T1,
|
|
arg2: T2,
|
|
arg3: T3,
|
|
arg4: T4
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a parameterized component for use with m.render, m.mount, etc.
|
|
* Shorthand for m.component.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @param arg3 Third argument to bind to the component.
|
|
* @param arg4 Fourth argument to bind to the component.
|
|
* @param args Additional optional arguments which are not type checked.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m.component
|
|
*/
|
|
<TController extends MithrilController, T1, T2, T3, T4>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, T3, T4>,
|
|
arg1: T1,
|
|
arg2: T2,
|
|
arg3: T3,
|
|
arg4: T4,
|
|
...args:any[]
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Creates a getter-setter function that wraps a Mithril promise. Useful
|
|
* for uniform data access, m.withAttr, etc.
|
|
*
|
|
* @param promise A thennable to initialize the property with. It may
|
|
* optionally be a Mithril promise.
|
|
* @return A getter-setter function wrapping the promise.
|
|
*
|
|
* @see m.withAttr
|
|
*/
|
|
prop<T>(promise: Thennable<T>) : MithrilPromiseProperty<T>;
|
|
|
|
/**
|
|
* Creates a getter-setter function that wraps a simple value. Useful
|
|
* for uniform data access, m.withAttr, etc.
|
|
*
|
|
* @param value A value to initialize the property with
|
|
* @return A getter-setter function wrapping the value.
|
|
*
|
|
* @see m.withAttr
|
|
*/
|
|
prop<T>(value: T): MithrilBasicProperty<T>;
|
|
|
|
/**
|
|
* Creates a getter-setter function that wraps a simple value. Useful
|
|
* for uniform data access, m.withAttr, etc.
|
|
*
|
|
* @return A getter-setter function wrapping the value.
|
|
*
|
|
* @see m.withAttr
|
|
*/
|
|
prop<T>(): MithrilBasicProperty<T>;
|
|
|
|
/**
|
|
* Returns a event handler that can be bound to an element, firing with
|
|
* the specified property.
|
|
*
|
|
* @param property The property to get from the event.
|
|
* @param callback The handler to use the value from the event.
|
|
* @return A function suitable for listening to an event.
|
|
*/
|
|
withAttr(
|
|
property: string,
|
|
callback: (value: any) => void
|
|
): (e: Event) => any;
|
|
|
|
/**
|
|
* @deprecated Use m.mount instead
|
|
*/
|
|
module<T extends MithrilController>(
|
|
rootElement: Node,
|
|
component: MithrilComponent<T>
|
|
): T;
|
|
|
|
/**
|
|
* Mounts a component to a base DOM node.
|
|
*
|
|
* @param rootElement The base node.
|
|
* @param component The component to mount.
|
|
* @return An instance of the top-level component's controller
|
|
*/
|
|
mount<T extends MithrilController>(
|
|
rootElement: Node,
|
|
component: MithrilComponent<T>
|
|
): T;
|
|
|
|
/**
|
|
* Initializes a component for use with m.render, m.mount, etc.
|
|
*
|
|
* @param component A mithril component.
|
|
* @return A mithril component.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m
|
|
*/
|
|
component<TController extends MithrilController>(
|
|
component: MithrilComponent<TController>
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a parameterized component for use with m.render, m.mount, etc.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m
|
|
*/
|
|
component<TController extends MithrilController, T1>(
|
|
component: ParameterizedMithrilComponent<TController, T1, void, void, void>,
|
|
arg1: T1
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a parameterized component for use with m.render, m.mount, etc.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m
|
|
*/
|
|
component<TController extends MithrilController, T1, T2>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, void, void>,
|
|
arg1: T1,
|
|
arg2: T2
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a parameterized component for use with m.render, m.mount, etc.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @param arg3 Third argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m
|
|
*/
|
|
component<TController extends MithrilController, T1, T2, T3>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, T3, void>,
|
|
arg1: T1,
|
|
arg2: T2,
|
|
arg3: T3
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a parameterized component for use with m.render, m.mount, etc.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @param arg3 Third argument to bind to the component.
|
|
* @param arg4 Fourth argument to bind to the component.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m
|
|
*/
|
|
component<TController extends MithrilController, T1, T2, T3, T4>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, T3, T4>,
|
|
arg1: T1,
|
|
arg2: T2,
|
|
arg3: T3,
|
|
arg4: T4
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Initializes a parameterized component for use with m.render, m.mount, etc.
|
|
*
|
|
* @param component A parameterized component.
|
|
* @param arg1 First argument to bind to the component.
|
|
* @param arg2 Second argument to bind to the component.
|
|
* @param arg3 Third argument to bind to the component.
|
|
* @param arg4 Fourth argument to bind to the component.
|
|
* @param args Additional optional arguments which are not type checked.
|
|
* @return A component bound with the supplied arguments.
|
|
*
|
|
* @see m.render
|
|
* @see m.mount
|
|
* @see m
|
|
*/
|
|
component<TController extends MithrilController, T1, T2, T3, T4>(
|
|
component: ParameterizedMithrilComponent<TController, T1, T2, T3, T4>,
|
|
arg1: T1,
|
|
arg2: T2,
|
|
arg3: T3,
|
|
arg4: T4,
|
|
...args: any[]
|
|
): MithrilComponent<TController>;
|
|
|
|
/**
|
|
* Trust this string of HTML.
|
|
*
|
|
* @param html The HTML to trust
|
|
* @return A String object instance with an added internal flag to mark
|
|
* it as trusted.
|
|
*/
|
|
trust(html: string): MithrilTrustedString;
|
|
|
|
/**
|
|
* Render a virtual DOM tree.
|
|
*
|
|
* @param rootElement The base element/node to render the tree from.
|
|
* @param children One or more child nodes to add to the tree.
|
|
* @param forceRecreation If true, overwrite the entire tree without
|
|
* diffing against it.
|
|
*/
|
|
render(
|
|
rootElement: Element,
|
|
children: MithrilVirtualElement|MithrilVirtualElement[],
|
|
forceRecreation?: boolean
|
|
): void;
|
|
|
|
redraw: {
|
|
/**
|
|
* Force a redraw the active component. It redraws asynchronously by
|
|
* default to allow for simultaneous events to run before redrawing,
|
|
* such as the event combination keypress + input frequently used for
|
|
* input.
|
|
*
|
|
* @param force If true, redraw synchronously.
|
|
*/
|
|
(force?: boolean): void;
|
|
|
|
strategy: {
|
|
/**
|
|
* Gets the current redraw strategy, which returns one of the
|
|
* following:
|
|
*
|
|
* "all" - recreates the DOM tree from scratch
|
|
* "diff" - recreates the DOM tree from scratch
|
|
* "none" - leaves the DOM tree intact
|
|
*
|
|
* This is useful for event handlers, which may want to cancel
|
|
* the next redraw if the event doesn't update the UI.
|
|
*
|
|
* @return The current strategy
|
|
*/
|
|
(): string;
|
|
|
|
/**
|
|
* Sets the current redraw strategy. The parameter must be one of
|
|
* the following values:
|
|
*
|
|
* "all" - recreates the DOM tree from scratch
|
|
* "diff" - recreates the DOM tree from scratch
|
|
* "none" - leaves the DOM tree intact
|
|
*
|
|
* This is useful for event handlers, which may want to cancel
|
|
* the next redraw if the event doesn't update the UI.
|
|
*
|
|
* @param value The value to set
|
|
* @return The new strategy
|
|
*/
|
|
(value: string): string;
|
|
|
|
/**
|
|
* @private
|
|
* Implementation detail - it's a MithrilBasicProperty instance
|
|
*/
|
|
toJSON(): string;
|
|
}
|
|
}
|
|
|
|
route: {
|
|
/**
|
|
* Enable routing, mounting a controller based on the route. It
|
|
* automatically mounts the components for you, starting with the one
|
|
* specified by the default route.
|
|
*
|
|
* @param rootElement The element to mount the active controller to.
|
|
* @param defaultRoute The route to start with.
|
|
* @param routes A key-value mapping of pathname to controller.
|
|
*/
|
|
(
|
|
rootElement: Element,
|
|
defaultRoute: string,
|
|
routes: MithrilRoutes
|
|
): void;
|
|
|
|
/**
|
|
* This allows m.route to be used as the `config` attribute for a
|
|
* virtual element, particularly useful for cases like this:
|
|
*
|
|
* ```ts
|
|
* // Note that the '#' is not required in `href`, thanks to the
|
|
* `config` setting.
|
|
* m("a[href='/dashboard/alicesmith']", {config: m.route});
|
|
* ```
|
|
*/
|
|
(
|
|
element: Element,
|
|
isInitialized: boolean,
|
|
context?: MithrilContext,
|
|
vdom?: MithrilVirtualElement
|
|
): void;
|
|
|
|
/**
|
|
* Programmatically redirect to another route.
|
|
*
|
|
* @param path The route to go to.
|
|
* @param params Parameters to pass as a query string.
|
|
* @param shouldReplaceHistory Whether to replace the current history
|
|
* instead of adding a new one.
|
|
*/
|
|
(path: string, params?: any, shouldReplaceHistory?: boolean): void;
|
|
|
|
/**
|
|
* Gets the current route.
|
|
*
|
|
* @return The current route.
|
|
*/
|
|
(): string;
|
|
|
|
/**
|
|
* Gets a route parameter.
|
|
*
|
|
* @param key The key to get.
|
|
* @return The value associated with the parameter key.
|
|
*/
|
|
param(key: string): string;
|
|
|
|
/**
|
|
* The current routing mode. This may be changed before calling
|
|
* m.route to change the part of the URL used to perform the routing.
|
|
*
|
|
* The value can be set to one of the following, defaulting to
|
|
* "hash":
|
|
*
|
|
* "search" - Uses the query string. This allows for named anchors to
|
|
* work on the page, but changes cause IE8 and lower to refresh the
|
|
* page.
|
|
*
|
|
* "hash" - Uses the hash. This is the only routing mode that does
|
|
* not cause page refreshes on any browser, but it does not support
|
|
* named anchors.
|
|
*
|
|
* "pathname" - Uses the URL pathname. This requires server-side
|
|
* setup to support bookmarking and page refreshes. It always causes
|
|
* page refreshes on IE8 and lower. Note that this requires that the
|
|
* application to be run from the root of the URL.
|
|
*/
|
|
mode: string;
|
|
|
|
/**
|
|
* Serialize an object into a query string.
|
|
*
|
|
* @param data The data to serialize.
|
|
* @return The serialized string.
|
|
*/
|
|
buildQueryString(data: Object): String
|
|
|
|
/**
|
|
* Parse a query string into an object.
|
|
*
|
|
* @param data The data to parse.
|
|
* @return The parsed object data.
|
|
*/
|
|
parseQueryString(data: String): Object
|
|
}
|
|
|
|
/**
|
|
* Send a request to a server to server. Note that the `url` option is
|
|
* required.
|
|
*
|
|
* @param options The options to use
|
|
* @return A promise to the returned data for "GET" requests, or a void
|
|
* promise for any other request type.
|
|
*
|
|
* @see MithrilXHROptions for the available options.
|
|
*/
|
|
request<T>(options: MithrilXHROptions<T>): MithrilPromise<T>;
|
|
|
|
deferred: {
|
|
/**
|
|
* Create a Mithril deferred object. It behaves synchronously if
|
|
* possible, an intentional deviation from Promises/A+. Note that
|
|
* deferreds are completely separate from the redrawing system, and
|
|
* never trigger a redraw on their own.
|
|
*
|
|
* @return A new Mithril deferred instance.
|
|
*
|
|
* @see m.deferred.onerror for the error callback called for Error
|
|
* subclasses
|
|
*/
|
|
<T>(): MithrilDeferred<T>;
|
|
|
|
/**
|
|
* A callback for all uncaught native Error subclasses in deferreds.
|
|
* This defaults to synchronously rethrowing all errors, a deviation
|
|
* from Promises/A+, but the behavior is configurable. To restore
|
|
* Promises/A+-compatible behavior. simply set this to a no-op.
|
|
*/
|
|
onerror(e: Error): void;
|
|
}
|
|
|
|
/**
|
|
* Takes a list of promises or thennables and returns a Mithril promise
|
|
* that resolves once all in the list are resolved, or rejects if any of
|
|
* them reject.
|
|
*
|
|
* @param promises A list of promises to try to resolve.
|
|
* @return A promise that resolves to all the promises if all resolve, or
|
|
* rejects with the error contained in the first rejection.
|
|
*/
|
|
sync<T>(promises: Thennable<T>[]): MithrilPromise<T[]>;
|
|
|
|
/**
|
|
* Use this and endComputation if your views aren't redrawing after
|
|
* calls to third-party libraries. For integrating asynchronous code,
|
|
* this should be called before any asynchronous work is done. For
|
|
* synchronous code, this should be called at the beginning of the
|
|
* problematic segment. Note that these calls must be balanced, much like
|
|
* braces and parentheses. This is mostly used internally. Prefer
|
|
* m.redraw where possible, especially when making repeated calls.
|
|
*
|
|
* @see endComputation
|
|
* @see m.render
|
|
*/
|
|
startComputation(): void;
|
|
|
|
/**
|
|
* Use startComputation and this if your views aren't redrawing after
|
|
* calls to third-party libraries. For integrating asynchronous code,
|
|
* this should be called after all asynchronous work completes. For
|
|
* synchronous code, this should be called at the end of the problematic
|
|
* segment. Note that these calls must be balanced, much like braces and
|
|
* parentheses. This is mostly used internally. Prefer m.redraw where
|
|
* possible, especially when making repeated calls.
|
|
*
|
|
* @see startComputation
|
|
* @see m.render
|
|
*/
|
|
endComputation(): void;
|
|
|
|
/**
|
|
* This overwrites the internal version of window used by Mithril.
|
|
* It's mostly useful for testing, and is also used internally by
|
|
* Mithril to test itself. By default Mithril uses `window` for the
|
|
* dependency.
|
|
*
|
|
* @param mockWindow The mock to use for the window.
|
|
* @return The mock that was passed in.
|
|
*/
|
|
deps(mockWindow: Window): Window;
|
|
}
|
|
|
|
interface MithrilTrustedString extends String {
|
|
/** @private Implementation detail. Don't depend on it. */
|
|
$trusted: boolean;
|
|
}
|
|
|
|
/**
|
|
* The interface for a virtual element. It's best to consider this immutable
|
|
* for most use cases.
|
|
*
|
|
* @see m
|
|
*/
|
|
interface MithrilVirtualElement {
|
|
/**
|
|
* A key to optionally associate with this element.
|
|
*/
|
|
key?: number;
|
|
|
|
/**
|
|
* The tag name of this element.
|
|
*/
|
|
tag?: string;
|
|
|
|
/**
|
|
* The attributes of this element.
|
|
*/
|
|
attrs?: MithrilAttributes;
|
|
|
|
/**
|
|
* The children of this element.
|
|
*/
|
|
children?: Array<string|MithrilVirtualElement|MithrilComponent<MithrilController>>;
|
|
}
|
|
|
|
/**
|
|
* An event passed by Mithril to unload event handlers.
|
|
*/
|
|
interface MithrilEvent {
|
|
/**
|
|
* Prevent the default behavior of scrolling the page and updating the
|
|
* URL on next route change.
|
|
*/
|
|
preventDefault(): void;
|
|
}
|
|
|
|
/**
|
|
* A context object for configuration functions.
|
|
*
|
|
* @see MithrilElementConfig
|
|
*/
|
|
interface MithrilContext {
|
|
/**
|
|
* A function to call when the node is unloaded. Useful for cleanup.
|
|
*/
|
|
onunload?(): any;
|
|
|
|
/**
|
|
* Set true if the backing DOM node needs to be retained between route
|
|
* changes if possible. Set false if this node needs to be recreated
|
|
* every single time, regardless of how "different" it is.
|
|
*/
|
|
retain?: boolean;
|
|
}
|
|
|
|
/**
|
|
* This represents a callback function for a virtual element's config
|
|
* attribute. It's a low-level function useful for extra cleanup after
|
|
* removal from the tree, storing instances of third-party classes that
|
|
* need to be associated with the DOM, etc.
|
|
*
|
|
* @see MithrilAttributes
|
|
* @see MithrilContext
|
|
*/
|
|
interface MithrilElementConfig {
|
|
/**
|
|
* A callback function for a virtual element's config attribute.
|
|
*
|
|
* @param element The associated DOM element.
|
|
* @param isInitialized Whether this is the first call for the virtual
|
|
* element or not.
|
|
* @param context The associated context for this element.
|
|
* @param vdom The associated virtual element.
|
|
*/
|
|
(
|
|
element: Element,
|
|
isInitialized: boolean,
|
|
context: MithrilContext,
|
|
vdom: MithrilVirtualElement
|
|
): void;
|
|
}
|
|
|
|
/**
|
|
* This represents the attributes available for configuring virtual elements,
|
|
* beyond the applicable DOM attributes.
|
|
*
|
|
* @see m
|
|
*/
|
|
interface MithrilAttributes {
|
|
/**
|
|
* The class name(s) for this virtual element, as a space-separated list.
|
|
*/
|
|
className?: string;
|
|
|
|
/**
|
|
* The class name(s) for this virtual element, as a space-separated list.
|
|
*/
|
|
class?: string;
|
|
|
|
/**
|
|
* A custom, low-level configuration in case this element needs special
|
|
* cleanup after removal from the tree.
|
|
*
|
|
* @see MithrilElementConfig
|
|
*/
|
|
config?: MithrilElementConfig;
|
|
}
|
|
|
|
/**
|
|
* The basis of a Mithril controller instance.
|
|
*/
|
|
interface MithrilController {
|
|
/**
|
|
* An optional handler to call when the associated virtual element is
|
|
* destroyed.
|
|
*
|
|
* @param evt An associated event.
|
|
*/
|
|
onunload?(evt: MithrilEvent): any;
|
|
}
|
|
|
|
/**
|
|
* This represents a controller function.
|
|
*
|
|
* @see MithrilControllerConstructor
|
|
*/
|
|
interface MithrilControllerFunction<T extends MithrilController> {
|
|
(): T;
|
|
}
|
|
|
|
/**
|
|
* This represents a controller constructor.
|
|
*
|
|
* @see MithrilControllerFunction
|
|
*/
|
|
interface MithrilControllerConstructor<T extends MithrilController> {
|
|
new(): T;
|
|
}
|
|
|
|
/**
|
|
* This represents a view factory.
|
|
*/
|
|
interface MithrilView<T extends MithrilController> {
|
|
/**
|
|
* Creates a view out of virtual elements.
|
|
*/
|
|
(ctrl: T): MithrilVirtualElement;
|
|
}
|
|
|
|
/**
|
|
* This represents a Mithril component.
|
|
*
|
|
* @see m
|
|
* @see m.component
|
|
*/
|
|
interface MithrilComponent<T extends MithrilController> {
|
|
/**
|
|
* The component's controller.
|
|
*
|
|
* @see m.component
|
|
*/
|
|
controller: MithrilControllerFunction<T> |
|
|
MithrilControllerConstructor<T>;
|
|
|
|
/**
|
|
* Creates a view out of virtual elements.
|
|
*
|
|
* @see m.component
|
|
*/
|
|
view(ctrl: T): MithrilVirtualElement;
|
|
}
|
|
|
|
/**
|
|
* This represents a parameterized MithrilComponent with up to six parameters,
|
|
* intended to be instantiated via m.component().
|
|
*
|
|
* @see m
|
|
* @see m.component
|
|
*/
|
|
interface ParameterizedMithrilComponent<TController extends MithrilController, T1, T2, T3, T4> {
|
|
/**
|
|
* The component's controller.
|
|
*
|
|
* @see m.component
|
|
*/
|
|
controller: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, ...args: any[]) => TController;
|
|
|
|
|
|
/**
|
|
* creates a view out of virtual elements.
|
|
*
|
|
* @see m.component
|
|
*/
|
|
view(ctrl: TController, arg1: T1, arg2: T2, arg3: T3, arg4: T4, ...args:any[]): MithrilVirtualElement;
|
|
}
|
|
|
|
/**
|
|
* This is the base interface for property getter-setters
|
|
*
|
|
* @see m.prop
|
|
*/
|
|
interface MithrilProperty<T> {
|
|
/**
|
|
* Gets the contained value.
|
|
*
|
|
* @return The contained value.
|
|
*/
|
|
(): T;
|
|
|
|
/**
|
|
* Sets the contained value.
|
|
*
|
|
* @param value The new value to set.
|
|
* @return The newly set value.
|
|
*/
|
|
(value: T): T;
|
|
}
|
|
|
|
/**
|
|
* This represents a non-promise getter-setter functions.
|
|
*
|
|
* @see m.prop which returns objects that implement this interface.
|
|
*/
|
|
interface MithrilBasicProperty<T> extends MithrilProperty<T> {
|
|
/**
|
|
* Makes this serializable to JSON.
|
|
*/
|
|
toJSON(): T;
|
|
}
|
|
|
|
/**
|
|
* This represents a promise getter-setter function.
|
|
*
|
|
* @see m.prop which returns objects that implement this interface.
|
|
*/
|
|
interface MithrilPromiseProperty<T> extends MithrilPromise<T>,
|
|
MithrilProperty<MithrilPromise<T>> {
|
|
/**
|
|
* Gets the contained promise.
|
|
*
|
|
* @return The contained value.
|
|
*/
|
|
(): MithrilPromise<T>;
|
|
|
|
/**
|
|
* Sets the contained promise.
|
|
*
|
|
* @param value The new value to set.
|
|
* @return The newly set value.
|
|
*/
|
|
(value: MithrilPromise<T>): MithrilPromise<T>;
|
|
|
|
/**
|
|
* Sets the contained wrapped value.
|
|
*
|
|
* @param value The new value to set.
|
|
* @return The newly set value.
|
|
*/
|
|
(value: T): MithrilPromise<T>;
|
|
}
|
|
|
|
/**
|
|
* This represents a key-value mapping linking routes to components.
|
|
*/
|
|
interface MithrilRoutes {
|
|
/**
|
|
* The key represents the route. The value represents the corresponding
|
|
* component.
|
|
*/
|
|
[key: string]: MithrilComponent<MithrilController>;
|
|
}
|
|
|
|
/**
|
|
* This represents a Mithril deferred object.
|
|
*/
|
|
interface MithrilDeferred<T> {
|
|
/**
|
|
* Resolve this deferred's promise with a value.
|
|
*
|
|
* @param value The value to resolve the promise with.
|
|
*/
|
|
resolve(value?: T): void;
|
|
|
|
/**
|
|
* Reject this deferred with an error.
|
|
*
|
|
* @param value The reason for rejecting the promise.
|
|
*/
|
|
reject(reason?: any): void;
|
|
|
|
/**
|
|
* The backing promise.
|
|
*
|
|
* @see MithrilPromise
|
|
*/
|
|
promise: MithrilPromise<T>;
|
|
}
|
|
|
|
/**
|
|
* This represents a thennable success callback.
|
|
*/
|
|
interface MithrilSuccessCallback<T, U> {
|
|
(value: T): U | Thennable<U>;
|
|
}
|
|
|
|
/**
|
|
* This represents a thennable error callback.
|
|
*/
|
|
interface MithrilErrorCallback<T> {
|
|
(value: Error): T | Thennable<T>;
|
|
}
|
|
|
|
/**
|
|
* This represents a thennable.
|
|
*/
|
|
interface Thennable<T> {
|
|
then<U>(success: (value: T) => U): Thennable<U>;
|
|
then<U,V>(success: (value: T) => U, error: (value: Error) => V): Thennable<U>|Thennable<V>;
|
|
catch?: <U>(error: (value: Error) => U) => Thennable<U>;
|
|
}
|
|
|
|
/**
|
|
* This represents a Mithril promise object.
|
|
*/
|
|
interface MithrilPromise<T> extends Thennable<T>, MithrilProperty<MithrilPromise<T>> {
|
|
/**
|
|
* Chain this promise with a simple success callback, propogating
|
|
* rejections.
|
|
*
|
|
* @param success The callback to call when the promise is resolved.
|
|
* @return The chained promise.
|
|
*/
|
|
then<U>(success: MithrilSuccessCallback<T,U>): MithrilPromise<U>;
|
|
|
|
/**
|
|
* Chain this promise with a success callback and error callback, without
|
|
* propogating rejections.
|
|
*
|
|
* @param success The callback to call when the promise is resolved.
|
|
* @param error The callback to call when the promise is rejected.
|
|
* @return The chained promise.
|
|
*/
|
|
then<U, V>(
|
|
success: MithrilSuccessCallback<T, U>,
|
|
error: MithrilErrorCallback<V>
|
|
): MithrilPromise<U> | MithrilPromise<V>;
|
|
|
|
/**
|
|
* Chain this promise with a single error callback, without propogating
|
|
* rejections.
|
|
*
|
|
* @param error The callback to call when the promise is rejected.
|
|
* @return The chained promise.
|
|
*/
|
|
catch<U>(error: MithrilErrorCallback<U>): MithrilPromise<T> |
|
|
MithrilPromise<U>;
|
|
}
|
|
|
|
/**
|
|
* This represents the available options for configuring m.request.
|
|
*
|
|
* @see m.request
|
|
*/
|
|
interface MithrilXHROptions<T> {
|
|
/**
|
|
* This represents the HTTP method used, one of the following:
|
|
*
|
|
* - "GET" (default)
|
|
* - "POST"
|
|
* - "PUT"
|
|
* - "DELETE"
|
|
* - "HEAD"
|
|
* - "OPTIONS"
|
|
*/
|
|
method?: string;
|
|
|
|
/**
|
|
* The URL to send the request to.
|
|
*/
|
|
url: string;
|
|
|
|
/**
|
|
* The username for HTTP authentication.
|
|
*/
|
|
user?: string;
|
|
|
|
/**
|
|
* The password for HTTP authentication.
|
|
*/
|
|
password?: string;
|
|
|
|
/**
|
|
* The data to be sent. It's automatically serialized in the right format
|
|
* depending on the method (with exception of HTML5 FormData), and put in
|
|
* the appropriate section of the request.
|
|
*/
|
|
data?: any;
|
|
|
|
/**
|
|
* Whether to run it in the background, i.e. true if it doesn't affect
|
|
* template rendering.
|
|
*/
|
|
background?: boolean;
|
|
|
|
/**
|
|
* Set an initial value while the request is working, to populate the
|
|
* promise getter-setter.
|
|
*/
|
|
initialValue?: T;
|
|
|
|
/**
|
|
* An optional preprocessor function to unwrap a successful response, in
|
|
* case the response contains metadata wrapping the data.
|
|
*
|
|
* @param data The data to unwrap.
|
|
* @return The unwrapped result.
|
|
*/
|
|
unwrapSuccess?(data: any): T;
|
|
|
|
/**
|
|
* An optional preprocessor function to unwrap an unsuccessful response,
|
|
* in case the response contains metadata wrapping the data.
|
|
*
|
|
* @param data The data to unwrap.
|
|
* @return The unwrapped result.
|
|
*/
|
|
unwrapError?(data: any): T;
|
|
|
|
/**
|
|
* An optional function to serialize the data. This defaults to
|
|
* `JSON.stringify`.
|
|
*
|
|
* @param dataToSerialize The data to serialize.
|
|
* @return The serialized form as a string.
|
|
*/
|
|
serialize?(dataToSerialize: any): string;
|
|
|
|
/**
|
|
* An optional function to deserialize the data. This defaults to
|
|
* `JSON.parse`.
|
|
*
|
|
* @param dataToSerialize The data to parse.
|
|
* @return The parsed form.
|
|
*/
|
|
deserialize?(dataToDeserialize: string): any;
|
|
|
|
/**
|
|
* An optional function to extract the data from a raw XMLHttpRequest,
|
|
* useful if the relevant data is in a response header or the status
|
|
* field.
|
|
*
|
|
* @param xhr The associated XMLHttpRequest.
|
|
* @param options The options passed to this request.
|
|
* @return string The serialized format.
|
|
*/
|
|
extract?(xhr: XMLHttpRequest, options: MithrilXHROptions<T>): string;
|
|
|
|
/**
|
|
* The parsed data, or its children if it's an array, will be passed to
|
|
* this class constructor if it's given, to parse it into classes.
|
|
*
|
|
* @param data The data to parse.
|
|
* @return The new instance for the list.
|
|
*/
|
|
type?: new (data: Object) => any;
|
|
|
|
/**
|
|
* An optional function to run between `open` and `send`, useful for
|
|
* adding request headers or using XHR2 features such as the `upload`
|
|
* property. It is even possible to override the XHR altogether with a
|
|
* similar object, such as an XDomainRequest instance.
|
|
*
|
|
* @param xhr The associated XMLHttpRequest.
|
|
* @param options The options passed to this request.
|
|
* @return The new XMLHttpRequest, or nothing if the same one is kept.
|
|
*/
|
|
config?(xhr: XMLHttpRequest, options: MithrilXHROptions<T>): any;
|
|
|
|
/**
|
|
* For JSONP requests, this must be the string "jsonp". Otherwise, it's
|
|
* ignored.
|
|
*/
|
|
dataType?: string;
|
|
|
|
/**
|
|
* For JSONP requests, this is the query string key for the JSONP
|
|
* request. This is useful for APIs that don't use common conventions,
|
|
* such as `www.example.com/?jsonpCallback=doSomething`. It defaults to
|
|
* `callback` for JSONP requests, and is ignored for any other kind of
|
|
* request.
|
|
*/
|
|
callbackKey?: string;
|
|
}
|
|
}
|
|
|
|
declare var Mithril: _mithril.MithrilStatic;
|
|
declare var m: _mithril.MithrilStatic;
|
|
|
|
declare module "mithril" {
|
|
export = m;
|
|
}
|