UNPKG

jsviews

Version:

Next-generation MVVM and MVP framework - built on top of JsRender templates. Bringing templates to life...

779 lines (633 loc) 23 kB
// Type definitions for JsViews 1.0 // Version: "v1.0.16" // Project: http://www.jsviews.com/#jsviews // Definitions by: Boris Moore <https://github.com/borismoore> // Definitions: https://www.jsviews.com/download/typescript/jsviews/index.d.ts // TypeScript Version: 2.3 /// <reference types="jquery" /> declare module 'jsviews' { export = jsviews; } declare const jsviews: ((jquery?: JQueryStatic) => JQueryStatic) & JQueryStatic; // ********************************** JsRender ********************************** interface JQueryStatic { /* var htmlString = $.render.templateName(data, myHelpersObject); // Render named template */ render: { [tmplName: string]: JsViews.TemplateRender; }; /* $.views.xxx ... // JsRender/JsViews APIs */ views: JsViews.Views; /* $.templates(...) or $.templates.templateName: Compile/get template */ templates: JsViews.Templates; } interface JQuery { /* var htmlString = $("#template").render(data, myHelpersObject); // Render template, and pass in helpers or context */ render: JsViews.TemplateRender; } declare namespace JsViews { /* Generic hash of objects of type T */ interface Hash<T> { [option: string]: T; } /* $.views*/ interface Views { /* $.views.templates() */ templates: Templates; /* $.views.converters() */ converters: Store<Converter, Converter>; /* $.views.tags() */ tags: Store<Tag, TagSetter>; /* $.views.helpers() */ helpers: Store<any, any>; /* $.views.viewModels() */ viewModels: ViewModels; /* $.views.settings */ settings: Settings; /* $.views.sub.xxx */ sub: Hash<any>; /* $.views.map() */ map(any: any): any; } /* $.views.settings*/ interface Settings { /** * Set delimiters * $.views.settings.delimiters(...) * * @param {string} openChars * @param {string} [closeChars] * @param {string} [link] * @returns {Settings} */ delimiters(openChars: string, closeChars?: string, link?: string): Settings; delimiters(chars: string[]): Settings; /** * Get delimiters * delimsArray = $.views.settings.delimiters() * * @returns {string[]} */ delimiters(): string[]; /** * Set debug mode * $.views.settings.debugMode(true) * * @param {boolean} debugMode * @returns {Settings} */ debugMode(debugMode: boolean | ((e?: any, fallback?: string, view?: View) => any)): Settings; /** * Get debug mode setting * debugMode = $.views.settings.debugMode() * * @returns {boolean} */ debugMode(): boolean; /** * Set allowCode mode * $.views.settings.allowCode(true) * * @param {boolean} allowCode * @returns {Settings} */ allowCode(allowCode: boolean): Settings; /** * Get allowCode mode setting * allowCode = $.views.settings.allowCode() * * @returns {boolean} */ allowCode(): boolean; /** * Set advanced settings (useViews, _jsv ...) * $.views.settings.advanced({useViews: true}) * * @param {object} settings * @returns {Settings} */ advanced(settings: Hash < any>): Settings; /** * Get advanced settings * advancedSettings = $.views.settings.advanced() * * @returns {object} */ advanced(): Hash < any>; } interface Store<T, TO> { /** * Generic store() function to register item, named item, or hash of items * Also used as hash to store the registered items * Used as implementation of $.templates(), $.views.templates(), $.views.tags(), $.views.helpers() and $.views.converters() * * @param {string|hash} name name - or selector, in case of $.templates(). Or hash of items * @param {any} [item] (e.g. markup for named template) * @param {Template} [parentTmpl] For item being registered as private resource of template * @returns {any|Views} e.g. compiled template - or $.views in case of registering hash of items */ (name: string, item?: TO, parentTmpl?: Template): T; // named item (namedItems: Hash<TO>, parentTmpl?: Template): Views; // Multiple named items /** * var template = $.templates.templateName; // Get compiled named template - or similar for named tags, converters, helpers, viewModels */ [itemName: string]: T; } // Templates interface Templates extends Store<Template, TemplateSetter> { /** * Additional $.templates() signature for compiling unnamed template * * @param {string|TemplateOptions} markup or selector * @param {Template} [parentTmpl] For compling template as private resource of parent template * @returns {Template} compiled template */ (markupOrSelectorOrOptions: string | TemplateOptions, parentTmpl?: Template): Template; // Unnamed template } interface TemplateOptions { /* Template options hash */ tags?: Hash<TagSetter>; templates?: Hash<TemplateSetter>; markup: any; converters?: Hash<Converter>; helpers?: Hash<any>; useViews?: boolean; } type TemplateSetter = TemplateOptions | string; interface Template extends TemplateRender { /* Compiled template object */ tmplName: string; tags?: Hash<Tag>; templates?: Hash<Template>; render: TemplateRender; fn?: (...args: any[]) => string; _is: string; markup: string; converters?: Hash<Converter>; helpers?: Hash<any>; useViews?: boolean; } interface TemplateRender { /** * Template render method: render the template as a string, using the specified data and helpers/context * var htmlString = template(data, myHelpersObject); * var htmlString = template.render(data, myHelpersObject); * * $("#tmpl").render(), tmpl.render(), tagCtx.render(), $.render.namedTmpl() * * @param {any} data * @param {hash} [helpersOrContext] * @param {boolean} [noIteration] * @returns {string} rendered template */ (data?: any, helpersOrContext?: Hash<any>, noIteration?: boolean): string; (data?: any, noIteration?: boolean): string; } // ViewModels interface ViewModelOptions { /* ViewModel options hash */ // getters?: string[] | ; getters?: any[]; extend?: Hash<any>; id?: string | ((a: any, b: any) => boolean); } interface ViewModel { /* ViewModel options hash */ getters: string[]; extend: Hash<any>; map(data: any): any; (...args: any[]): any; [prop: string]: any; } interface ViewModels extends Hash<ViewModel> { /* $.views.viewModels() */ (viewModel: ViewModelOptions): ViewModel; (name: string, viewModel: ViewModelOptions, viewModels?: Hash<ViewModel>): ViewModel; (namedItems: Hash<ViewModelOptions>, viewModels?: Hash<ViewModel>): Hash<ViewModel>; } // Converters interface Converter { /* Converter function */ (value: any, ...restArgs: any[]): any; } // Tags interface TagOptionProps { /* Properties that can be set as tag options, and retrieved as Tag properties */ init?: (this: TagInst, tagCtx?: TagCtx, linkCtx?: LinkCtx, ctx?: Context) => void ; render?: (this: TagInst, ...args: any[]) => string |void ; baseTag?: string | Tag; contentCtx?: boolean | ((this: TagInst, arg0: any) => any); convert?: string | Converter; argDefault?: boolean; bindTo?: number | string | Array < number |string>; bindFrom?: number | string | Array < number |string>; flow?: boolean; ctx?: Hash < any>; [prop: string]: any; } interface TagOptions extends TagOptionProps { /* Tag options hash */ template?: TemplateSetter; } type TagSetter = TagOptions | string | ((...args: any[]) => any); interface Tag extends TagOptionProps { /* Tag object */ tagCtx: TagCtx; tagCtxs: TagCtx[]; tagName: string; parent?: Tag; parents?: Hash<Tag>; rendering?: Hash<any>; ctxPrm(name: string, value?: any): any; // get/set in JsViews but get only in JsRender cvtArgs(elseBlock?: number): any[] | void ; bndArgs(elseBlock?: number): any[] | void ; base?: (...args: any[]) => any; baseApply?: (args: any[]|IArguments) => any; } interface TagInst extends Tag { template?: TemplateSetter; } interface Context { /* ctx object */ /* Root data object or array */ root: any; /* This tag */ tag?: Tag; /* Ancestor tags */ parentTags?: Hash<Tag>; /* tagCtx object */ tagCtx?: any; [prop: string]: any; } interface TagCtxParams { /* tagCtx.params object */ args: string[]; props: Hash<string>; ctx: Hash<string>; } interface TagCtx { /* tagCtx object */ /* Arguments passed declaratively */ args: any[]; /* Properties passed declaratively */ props: Hash<any>; /* Declarative tag params object */ params: TagCtxParams; /* External tmpl, or else template for wrapped content. Otherwise, false */ tmpl: Template; /* Template for wrapped content, or else external template. Otherwise, false */ content: Template; /* Tag instance index (if siblings rendered against array data) */ index: number; /* JsViews view containing this tag instance */ view: View; /* View context for tag */ ctx: Context; /* This tag instance */ tag: Tag; /* Tag render method */ render: TagRenderMethod; /* tagCtx.ctxPrm() method */ ctxPrm(name: string, value?: any): any; // get/set in JsViews but get only in JsRender /* tagCtx.cvtArgs() method */ cvtArgs(): any[]| void ; /* tagCtx.bndArgs() method */ bndArgs(): any[] | void; } interface LinkCtx { /* linkCtx object, null in JsRender */ } interface TagRenderMethod { /* tag render method */ (...arguments: any[]): string; } interface View { /* Template rendered by view */ tmpl: Template; /* Block content template (for block tags) */ content?: Template; /* Child views */ views: View[] & Hash<View>; /* Parent view */ parent: View; /* View context (helpers and parameters from parent views) */ ctx: Context; /* View type */ type: string; /* view.get() method: find parent or child views */ get(type?: string): View; get(inner: boolean, type?: string): View; /* view.getIndex() method: get index of parent "item" view */ getIndex(): number; /* view.ctxPrm() method: get/set contextual parameter or helper */ ctxPrm(name: string, value?: any): any; // get/set in JsViews but get only in JsRender /* Find contextual template resource */ getRsc(namedCollection: string, itemName: string): any; /* Index of this view in parent views collection */ index: number; /* tag (for tag views) */ tag: Tag; /* contextual data */ data: any; /* root View (top-level) */ root: View; scope: View; } } // end namespace // ********************************** JsObservable ********************************** interface JQueryStatic { /* $.observable() */ observable: JsViews.Observable; /* $.observe() */ observe: JsViews.Observe; /* $.unobserve() */ unobserve: JsViews.Unobserve; } declare namespace JsViews { interface Observable { /* $.observable(array) */ (data: any[]): ArrayObservable; (ns: string, data: any[]): ArrayObservable; /* $.observable(object) */ (data: any): ObjectObservable; (ns: string, data: any): ObjectObservable; } interface Observe { /* $.observe(...) */ (object: any[], handler: ChangeHandler<ArrayEvtArgs>): any; (object: object, path: string, handler: ChangeHandler<EvtArgs>): any; (object: object, path: string, path2: string, handler: ChangeHandler<EvtArgs>): any; (object: object, path: string, path2: string, path3: string, handler: ChangeHandler<EvtArgs>): any; (object: object, path: string, path2: string, path3: string, path4: string, handler: ChangeHandler<EvtArgs>): any; (object: object, ...restOf: any[]): any; (ns: string, object: any[], handler: ChangeHandler<ArrayEvtArgs>): any; (ns: string, object: object, path: string, handler: ChangeHandler<EvtArgs>): any; (ns: string, object: object, ...restOf: any[]): any; } interface Unobserve { /* $.unobserve(...) */ (object: any[], handler?: ChangeHandler<ArrayEvtArgs>): any; (object: object, path?: string, handler?: ChangeHandler<EvtArgs>): any; (object: object, handler: ChangeHandler<EvtArgs>): any; (object: object, ...restOf: any[]): any; (handler?: ChangeHandler<EvtArgs>): any; (ns: string, object: any[], handler?: ChangeHandler<ArrayEvtArgs>): any; (ns: string, object: object, path?: string, handler?: ChangeHandler<EvtArgs>): any; (ns: string, object: object, handler: ChangeHandler<EvtArgs>): any; (ns: string, object: object, ...restOf: any[]): any; (ns: string, handler?: ChangeHandler<EvtArgs>): any; } interface ObjectObservable { /* Observable object, returned by $.observable(object) */ setProperty(path: string, value: any): ObjectObservable; setProperty(values: Hash<any>): ObjectObservable; observeAll(handler: ChangeHandler<EvtArgs>, filter?: FilterHandler): void; unobserveAll(handler?: ChangeHandler<EvtArgs>, filter?: FilterHandler): void; removeProperty(path: string): ObjectObservable; } interface ArrayObservable { /* Observable array, returned by $.observable(array) */ insert(index: number, data: any): ArrayObservable; insert(data: any): ArrayObservable; refresh(newItems: any[]): ArrayObservable; remove(index?: number, numToRemove?: number): ArrayObservable; move(oldIndex: number, newIndex: number, numToRemove?: number): ArrayObservable; observeAll(handler: ChangeHandler<EvtArgs>, filter?: FilterHandler): void; unobserveAll(handler?: ChangeHandler<EvtArgs>, filter?: FilterHandler): void; } interface FilterHandler { /* Filter function (callback handler) passed to observeAll(...) */ (path: string, ob: any, parentObs: Array<{ [prop: string]: any }>): void; } interface ChangeHandler<T> { /* Change handler function passed to $.observe() or $.observable.observeAll() */ (ev: EventObject, eventArgs: T): void; } interface EventObject { /* jQuery event object, ev, passed to observable change handler */ target: any; data: EventMetaData; type: string; [propName: string]: any; } interface PropEvtArgs { /* JsViews event object, eventArgs, passed to observable change handler for property change */ change: string; path?: string; value?: any; oldValue?: any; remove?: boolean; } interface ArrayEvtArgs { /* JsViews event object, eventArgs, passed to observable change handler for array change */ change: string; index?: number; oldIndex?: number; items?: any[]; numToRemove?: number; oldItems?: any[]; refresh?: boolean; } interface EvtArgs extends PropEvtArgs, ArrayEvtArgs { /* JsViews event object, eventArgs, passed to observable change handler for either object or array change */ } interface EventMetaData { /* JsViews metadata on jQuery event object, ev.data, passed to change handler for $.observe() */ ns: string; fullPath: string; prop: string; paths: string[]; observeAll?: ObserveAllMeta; [propName: string]: any; } interface ObserveAllMeta { /* JsViews metadata on jQuery event object, ev.data, passed to change handler for $.observable().observeAll() */ path: () => string; parents: () => any[]; [propName: string]: any; } } // end namespace // ********************************** JsViews ********************************** interface JQueryStatic { /* var view = $.view(elemOrSelector); // Get view object from DOM node */ view: JsViews.GetView; /* $.link(template, container, data) // Render and link contents */ link: JsViews.Link; /* $.unlink(container) // Unlink contents */ unlink(container?: any): void; } interface JQuery { /* var view = $(elemOrSelector).view(); // Get view object from DOM node */ /* $(elemOrSelector).view("array"); // Get parent view object of chosen type, from DOM node */ view(type?: string): JsViews.View; /* $(elemOrSelector).view(true, "array"); // Get inner view object of chosen type, from DOM node */ view(inner: boolean, type?: string): JsViews.View; /* $(elemOrSelector).link(template, data ...) // Render and link contents - Undocumented */ link(tmpl: JsViews.Template, data?: any, helpersOrContext?: JsViews.Hash<any>, noIteration?: boolean): JQuery; link(tmpl: JsViews.Template, data: any, noIteration: boolean): JQuery; // Undocumented /* $(elemOrSelector).link(true, data ...) // Render and link contents */ /* $(elemOrSelector).link(true, data ...) // Render and link contents */ link(expression: boolean|string, data?: any, helpersOrContext?: JsViews.Hash<any>): JQuery; /* $(elemOrSelector).unlink() // Unlink contents */ unlink(): void; } declare namespace JsViews { /* $.views.settings*/ interface Settings { /** * Set trigger mode * $.views.settings.trigger(true) * * @param {boolean} trigger * @returns {Settings} */ trigger(trigger: boolean): Settings; /** * Get trigger setting * trigger = $.views.settings.trigger() * * @returns {boolean} */ trigger(): boolean; } interface dependsFunction { /* tag depends option, handler function */ (data: any, callback: ChangeHandler<EvtArgs>): string | any[] | void; } interface TagOptions { /* Tag options hash */ dataBoundOnly?: boolean; boundProps?: string[]; depends?: string | any[] | dependsFunction; mapProps?: string[]; mapDepends?: string | any[] | dependsFunction; setSize?: boolean; height?: string | number; width?: string | number; className?: string; linkedElement?: string | string[]; linkedCtxParam?: string | string[]; mainElement?: string; displayElement?: string; trigger?: boolean | string; attr?: string; dataMap?: any; lateRender?: boolean; onBind?: (this: TagInst, tagCtx: TagCtx, linkCtx: LinkCtx, ctx: Context, ev: EventObject, eventArgs: EvtArgs) => void ; onAfterLink?: (this: TagInst, tagCtx: TagCtx, linkCtx: LinkCtx, ctx: Context, ev: EventObject, eventArgs: EvtArgs) => void ; onUpdate?: boolean | ((this: TagInst, ev: EventObject, eventArgs: EvtArgs, tagCtxs: TagCtx[]) => any); onDispose?: (this: TagInst) => void ; convertBack?: string | Converter; onUnbind?: (this: TagInst, tagCtx: TagCtx, linkCtx: LinkCtx, ctx: Context, ev: EventObject, eventArgs: EvtArgs) => void ; onBeforeUpdateVal?: (this: TagInst, ev: EventObject, eventArgs: EvtArgs) => boolean | void ; onBeforeChange?: (this: TagInst, ev: EventObject, eventArgs: EvtArgs) => boolean | void ; onAfterChange?: (this: TagInst, ev: EventObject, eventArgs: EvtArgs) => void ; onArrayChange?: (this: TagInst, ev: EventObject, eventArgs: EvtArgs) => void ; setValue?: (this: TagInst, value: any, index?: number, elseBlock?: number, ev?: EventObject, eventArgs?: EvtArgs) => void ; domChange?: (this: TagInst, ...args: any[]) => void; } interface Tag { /* Tag object */ init?: (this: Tag, tagCtx?: TagCtx, linkCtx?: LinkCtx, ctx?: Context) => void ; linkCtx?: LinkCtx; parentElem: HTMLElement; linkedElems: JQuery[]; linkedElem: JQuery; mainElem: JQuery; displayElem: JQuery; inline: boolean; refresh(): Tag; nodes(): any[]; contents(deep?: boolean, selectorOrNode?: string | Node | JQuery): JQuery; contents(selectorOrNode?: string | Node | JQuery): JQuery; childTags(deep?: boolean, tagName?: string): Tag[]; childTags(tagName?: string): Tag[]; setValue(newValue: any, index?: number, elseBlock?: number): Tag; setValues(...args: any[]): Tag; updateValue(newValue: any, index?: number, elseBlock?: number): Tag; updateValues(...args: any[]): Tag; } interface TagCtx { /* tagCtx object */ linkedElems: JQuery[]; mainElem: JQuery; displayElem: JQuery; contentView: View; nodes(): any[]; contents(deep?: boolean, selectorOrNode?: string|Node|JQuery): JQuery; contents(selectorOrNode?: string|Node|JQuery): JQuery; childTags(deep?: boolean, tagName?: string): Tag[]; childTags(tagName?: string): Tag[]; setValues(...args: any[]): void; } interface LinkCtx { /* linkCtx object */ /* Current data item */ data: any; /* Data-linked element */ elem: HTMLElement; /* Current view (containing this data-linked element) */ view: View; /* Target attribute or property on HTML element */ attr: string; /* Data-link expression */ expr?: string; /* Tag instance (for data-link tag expressions) */ tag?: Tag; /* Tag instance (for data-link tag expressions) */ ctx: Context; /* "inline" "link" "top" "expr" */ type: string; } interface View { /* view object */ addViews(index: number, dataItems: any[], tmpl?: Template): View; removeViews(index?: number, itemsCount?: number, keepNodes?: boolean): View; refresh(): View; nodes(): any[]; contents(deep?: boolean, selectorOrNode?: string|Node|JQuery): JQuery; contents(selectorOrNode?: string|Node|JQuery): JQuery; childTags(deep?: boolean, tagName?: string): Tag[]; childTags(tagName?: string): Tag[]; // link(data: any, parentNode: any, prevNode: any, nextNode: any, html: string, refresh?: boolean): any[]; // Undocumented... } interface GetView { // $.view() returns top view // $.view(node) returns view that contains node // $.view(selector) returns view that contains first selected element // $.view(nodeOrSelector, type) returns nearest containing view of given type // $.view(nodeOrSelector, "root") returns root containing view (child of top view) // $.view(nodeOrSelector, true, type) returns nearest inner (contained) view of given type (selectorOrNode?: string|Node|JQuery, type?: string): View; (selectorOrNode: string|Node|JQuery, inner: boolean, type?: string): View; } interface Link { /* $.link(template, container, data ...) // Render and link contents - Undocumented */ (tmpl: Template, container: string|Node|JQuery, data?: any, helpersOrContext?: Hash<any>, noIteration?: boolean): JQuery; (tmpl: Template, container: string|Node|JQuery, data: any, noIteration: boolean): JQuery; /* $.link(true, container, data) // Link existing contents */ /* $.link(expression, container, data) // Link existing contents */ (expression: boolean|string, container: string|Node|JQuery, data?: any, helpersOrContext?: Hash<any>): JQuery; /* $.link.templateName("#container", data); // Link named template */ [tmplName: string]: TemplateLink; } interface TemplateLink { /* $.link.templateName("#container", data); // Link named template */ (container: string|Node|JQuery, data?: any, helpersOrContext?: Hash<any>, noIteration?: boolean): JQuery; (container: string|Node|JQuery, data: any, noIteration: boolean): JQuery; } interface Template { /* template.link(container, data); // Render and link contents */ link: TemplateLink; } interface GetSet { /* Interface for casting a function to a JsViews get/set computed function, as in: * * var fullName = function() { ... } as JsViews.GetSet; * fullName.depends = ...; * fullName.set = ...; */ (...args: any[]): any; set: any; depends: any; } } // end namespace