2023-11-24 11:07:31 +08:00
|
|
|
import type { SourceLocation } from '@vue/compiler-dom'
|
|
|
|
|
|
|
|
export const enum IRNodeTypes {
|
|
|
|
ROOT,
|
|
|
|
TEMPLATE_GENERATOR,
|
|
|
|
SET_PROP,
|
|
|
|
SET_TEXT,
|
|
|
|
SET_EVENT,
|
2023-11-24 14:44:57 +08:00
|
|
|
SET_HTML,
|
2023-11-24 11:07:31 +08:00
|
|
|
|
|
|
|
INSERT_NODE,
|
2023-11-26 03:12:02 +08:00
|
|
|
CREATE_TEXT_NODE,
|
2023-11-24 11:07:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface IRNode {
|
|
|
|
type: IRNodeTypes
|
|
|
|
loc: SourceLocation
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface RootIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.ROOT
|
|
|
|
template: Array<TemplateGeneratorIRNode>
|
2023-11-26 02:13:59 +08:00
|
|
|
children: DynamicChild
|
2023-11-24 15:25:34 +08:00
|
|
|
// TODO multi-expression effect
|
|
|
|
effect: Record<string /* expr */, OperationNode[]>
|
2023-11-24 15:02:47 +08:00
|
|
|
operation: OperationNode[]
|
2023-11-24 11:07:31 +08:00
|
|
|
helpers: Set<string>
|
|
|
|
vaporHelpers: Set<string>
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface TemplateGeneratorIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.TEMPLATE_GENERATOR
|
|
|
|
template: string
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface SetPropIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.SET_PROP
|
|
|
|
element: number
|
|
|
|
name: string
|
2023-11-24 15:25:34 +08:00
|
|
|
value: string
|
2023-11-24 11:07:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface SetTextIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.SET_TEXT
|
|
|
|
element: number
|
2023-11-24 15:25:34 +08:00
|
|
|
value: string
|
2023-11-24 11:07:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface SetEventIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.SET_EVENT
|
|
|
|
element: number
|
|
|
|
name: string
|
2023-11-24 15:25:34 +08:00
|
|
|
value: string
|
2023-11-24 11:07:31 +08:00
|
|
|
}
|
|
|
|
|
2023-11-24 14:44:57 +08:00
|
|
|
export interface SetHtmlIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.SET_HTML
|
|
|
|
element: number
|
2023-11-24 15:25:34 +08:00
|
|
|
value: string
|
2023-11-24 14:44:57 +08:00
|
|
|
}
|
|
|
|
|
2023-11-26 03:12:02 +08:00
|
|
|
export interface CreateTextNodeIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.CREATE_TEXT_NODE
|
2023-11-24 11:07:31 +08:00
|
|
|
id: number
|
2023-11-24 15:25:34 +08:00
|
|
|
value: string
|
2023-11-24 11:07:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface InsertNodeIRNode extends IRNode {
|
|
|
|
type: IRNodeTypes.INSERT_NODE
|
|
|
|
element: number
|
|
|
|
parent: number
|
|
|
|
anchor: number | 'first' | 'last'
|
|
|
|
}
|
|
|
|
|
2023-11-24 15:25:34 +08:00
|
|
|
export type OperationNode =
|
|
|
|
| SetPropIRNode
|
|
|
|
| SetTextIRNode
|
|
|
|
| SetEventIRNode
|
|
|
|
| SetHtmlIRNode
|
2023-11-26 03:12:02 +08:00
|
|
|
| CreateTextNodeIRNode
|
2023-11-24 15:25:34 +08:00
|
|
|
| InsertNodeIRNode
|
2023-11-24 11:07:31 +08:00
|
|
|
|
|
|
|
export interface DynamicChild {
|
|
|
|
id: number | null
|
|
|
|
store: boolean
|
2023-11-26 03:08:35 +08:00
|
|
|
ghost: boolean
|
2023-11-24 11:07:31 +08:00
|
|
|
children: DynamicChildren
|
|
|
|
}
|
|
|
|
export type DynamicChildren = Record<number, DynamicChild>
|