vue3-core/packages/compiler-vapor/src/ir.ts

114 lines
2.2 KiB
TypeScript
Raw Normal View History

import type { SourceLocation } from '@vue/compiler-dom'
2023-11-29 22:09:46 +08:00
export enum IRNodeTypes {
ROOT,
2023-11-26 03:53:47 +08:00
TEMPLATE_FACTORY,
FRAGMENT_FACTORY,
SET_PROP,
SET_TEXT,
SET_EVENT,
2023-11-24 14:44:57 +08:00
SET_HTML,
INSERT_NODE,
PREPEND_NODE,
2023-11-27 05:16:21 +08:00
APPEND_NODE,
CREATE_TEXT_NODE,
}
export interface IRNode {
type: IRNodeTypes
loc: SourceLocation
}
export interface RootIRNode extends IRNode {
type: IRNodeTypes.ROOT
2023-11-26 03:53:47 +08:00
template: Array<TemplateFactoryIRNode | FragmentFactoryIRNode>
2023-11-27 05:16:21 +08:00
dynamic: DynamicInfo
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[]
helpers: Set<string>
vaporHelpers: Set<string>
}
2023-11-26 03:53:47 +08:00
export interface TemplateFactoryIRNode extends IRNode {
type: IRNodeTypes.TEMPLATE_FACTORY
template: string
}
2023-11-26 03:53:47 +08:00
export interface FragmentFactoryIRNode extends IRNode {
type: IRNodeTypes.FRAGMENT_FACTORY
}
export interface SetPropIRNode extends IRNode {
type: IRNodeTypes.SET_PROP
element: number
name: string
2023-11-24 15:25:34 +08:00
value: string
}
export interface SetTextIRNode extends IRNode {
type: IRNodeTypes.SET_TEXT
element: number
2023-11-24 15:25:34 +08:00
value: string
}
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 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
}
export interface CreateTextNodeIRNode extends IRNode {
type: IRNodeTypes.CREATE_TEXT_NODE
id: number
2023-11-24 15:25:34 +08:00
value: string
}
export interface InsertNodeIRNode extends IRNode {
type: IRNodeTypes.INSERT_NODE
element: number | number[]
parent: number
anchor: number
}
export interface PrependNodeIRNode extends IRNode {
type: IRNodeTypes.PREPEND_NODE
elements: number[]
parent: number
2023-11-27 05:16:21 +08:00
}
export interface AppendNodeIRNode extends IRNode {
type: IRNodeTypes.APPEND_NODE
elements: number[]
parent: number
}
2023-11-24 15:25:34 +08:00
export type OperationNode =
| SetPropIRNode
| SetTextIRNode
| SetEventIRNode
| SetHtmlIRNode
| CreateTextNodeIRNode
2023-11-24 15:25:34 +08:00
| InsertNodeIRNode
| PrependNodeIRNode
2023-11-27 05:16:21 +08:00
| AppendNodeIRNode
2023-11-27 05:16:21 +08:00
export interface DynamicInfo {
id: number | null
2023-11-27 05:16:21 +08:00
referenced: boolean
/** created by DOM API */
2023-11-26 03:08:35 +08:00
ghost: boolean
2023-11-27 05:16:21 +08:00
placeholder: number | null
children: DynamicChildren
}
2023-11-27 05:16:21 +08:00
export type DynamicChildren = Record<number, DynamicInfo>