You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.2 KiB

4 years ago
// Expressions
export enum ExpressionType {
ATTRIBUTE,
EVENT,
TEXT,
VALUE,
}
export interface BaseExpressionData {
type: ExpressionType
evaluate(scope: any): any
}
export interface AttributeExpressionData extends BaseExpressionData {
name: string
}
export interface EventExpressionData extends BaseExpressionData {
name: string
}
export interface TextExpressionData extends BaseExpressionData {
childNodeIndex: number
}
export interface ValueExpressionData extends BaseExpressionData {}
export type ExpressionData = AttributeExpressionData | EventExpressionData | TextExpressionData | ValueExpressionData
export interface Expression<Scope = any> {
type: ExpressionType
node: HTMLElement
value: any
mount(scope: Scope): Expression
update(scope: Scope): Expression
unmount(scope: Scope): Expression
}
// Bindings
export enum BindingType {
EACH,
IF,
SIMPLE,
TAG,
SLOT,
}
export interface BaseBindingData {
selector?: string
redundantAttribute?: string
type?: BindingType
evaluate?(scope: any): any
}
export interface EachBindingData extends BaseBindingData {
itemName: string
indexName?: number
template: TemplateChunk
getKey?: ((scope: any) => any) | null
condition?: ((scope: any) => any) | null
}
export interface IfBindingData extends BaseBindingData {
template: TemplateChunk
}
export interface SimpleBindingData extends BaseBindingData {
expressions: ExpressionData[]
}
export interface SlotBindingData extends BaseBindingData {
id: string
html: string
bindings: BindingData
}
export interface TagBindingData extends BaseBindingData {
getComponent(name: string): TemplateChunk
attributes: AttributeExpressionData[]
slots: SlotBindingData[]
}
export type BindingData = IfBindingData | EachBindingData | SimpleBindingData | SlotBindingData | TagBindingData
export interface Binding<Scope = any, ParentScope = any> {
mount(el: HTMLElement, scope: Scope, parentScope: ParentScope, meta: TemplateChunkMeta): Binding
update(scope: Scope, parentScope: ParentScope): Binding
unmount(scope: Scope, parentScope: ParentScope, mustRemoveRoot: boolean): Binding
}
// Template Object
export interface TemplateChunkMeta {
fragment: DocumentFragment
children: HTMLCollection
avoidDOMInjection: boolean
}
export interface TemplateChunk<Scope = any, ParentScope = any> {
mount(el: HTMLElement, scope: Scope, parentScope: ParentScope, meta: TemplateChunkMeta): TemplateChunk
update(scope: Scope, parentScope: ParentScope): TemplateChunk
unmount(scope: Scope, parentScope: ParentScope, mustRemoveRoot: boolean): TemplateChunk
clone(): TemplateChunk
createDOM(el: HTMLElement): TemplateChunk
bindings?: Binding<Scope, ParentScope>[]
bindingsData?: BindingData[]
html?: string | null
isTemplateTag?: boolean
fragment?: DocumentFragment
children?: HTMLCollection
dom?: HTMLElement
el?: HTMLElement
}
// API
export function template(template: string, bindings: BindingData[]): TemplateChunk
export function createBinding(root: HTMLElement, binding: BindingData, templateTagOffset?: number | null): Binding
export function createExpression(node: HTMLElement, expression: ExpressionData): Expression
export const bindingTypes:BindingType
export const expressionTypes:ExpressionType