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
124 lines
3.2 KiB
// 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
|
|
|