diff --git a/package.json b/package.json index add9997..c0a5eb2 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.5.0", "description": "A virtual DOM library with focus on simplicity, modularity, powerful features and performance.", "main": "snabbdom.js", + "typgings": "type-definitions/snabbdom.d.ts", "directories": { "example": "examples", "test": "test" diff --git a/type-definitions/snabbdom.d.ts b/type-definitions/snabbdom.d.ts new file mode 100644 index 0000000..da51aa8 --- /dev/null +++ b/type-definitions/snabbdom.d.ts @@ -0,0 +1,148 @@ +export interface VNodeData { + // modules - use any because Object type is useless + props?: any; + attrs?: any; + class?: any; + style?: any; + dataset?: any; + on?: any; + hero?: any; + // end of modules + hook?: Hooks; + key?: string | number; + ns?: string; // for SVGs + fn?: () => VNode; // for thunks + args?: Array; // for thunks +} + +export interface VNode { + sel: string; + data?: VNodeData; + children?: Array; + elm?: Element | Text; + text?: string; + key?: string | number; +} + +export interface ThunkData extends VNodeData { + fn: () => VNode; + args: Array; +} + +export interface Thunk extends VNode { + data: ThunkData; +} + +export type PreHook = () => any; +export type InitHook = (vNode: VNode) => any; +export type CreateHook = (emptyVNode: VNode, vNode: VNode) => any; +export type InsertHook = (vNode: VNode) => any; +export type PrePatchHook = (oldVNode: VNode, vNode: VNode) => any; +export type UpdateHook = (oldVNode: VNode, vNode: VNode) => any; +export type PostPatchHook = (oldVNode: VNode, vNode: VNode) => any; +export type DestroyHook = (vNode: VNode) => any; +export type RemoveHook = (vNode: VNode, removeCallback: () => void) => any; +export type PostHook = () => any; + +export interface Hooks { + pre?: PreHook; + init?: InitHook; + create?: CreateHook; + insert?: InsertHook; + prepatch?: PrePatchHook; + update?: UpdateHook; + postpatch?: PostPatchHook; + destroy?: DestroyHook; + remove?: RemoveHook; + post?: PostHook; +} + +export interface Module { + pre?: PreHook; + create?: CreateHook; + update?: UpdateHook; + destroy?: DestroyHook; + remove?: RemoveHook; + post?: PostHook; +} + +export interface SnabbdomAPI { + createElement(tagName: string): T; + createElementNS(namespaceURI: string, qualifiedName: string): T; + createTextNode(text: string): T; + insertBefore(parentNode: T, newNode: T, referenceNode: T): void; + removeChild(node: T, child: T): void; + appendChild(node: T, child: T): void; + parentNode(node: T): T; + nextSibling(node: T): T; + tagName(node: T): string; + setTextContent(node: T, text: string): void; +} + +declare module "snabbdom" { + export interface PatchFunction { + (oldVNode: VNode, vnode: VNode): VNode; + } + + export function init(modules: Object, api?: SnabbdomAPI): PatchFunction; +} + +declare module "snabbdom/vnode" { + export default function vnode(sel: string, + data: VNodeData, + children: Array, + text: string, + elm: any): VNode; +} + +declare module "snabbdom/is" { + export function array(x: any): boolean; + export function primitive(x: any): boolean; +} + +declare module "snabbdom/thunk" { + export default function thunk(sel: string, + key: string, + render: (...state: Array) => VNode, + ...state: Array): Thunk; +} + +declare module "snabbdom/htmldomapi" { + let api: SnabbdomAPI; + export = api; +} + +declare module "snabbdom/modules/class" { + let ClassModule: Module; + export = ClassModule; +} + +declare module "snabbdom/modules/props" { + let PropsModule: Module; + export = PropsModule; +} + +declare module "snabbdom/modules/attributes" { + let AttrsModule: Module; + export = AttrsModule; +} + +declare module "snabbdom/modules/eventlisteners" { + let EventsModule: Module; + export = EventsModule; +} + +declare module "snabbdom/modules/hero" { + let HeroModule: Module; + export = HeroModule; +} + +declare module "snabbdom/modules/style" { + let StyleModule: Module; + export = StyleModule; +} + +declare module "snabbdom/modules/dataset" { + let DatasetModule: Module; + export = DatasetModule; +}