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

176 lines
3.8 KiB
TypeScript
Raw Normal View History

2023-12-01 23:30:21 +08:00
import type {
2023-12-06 00:15:57 +08:00
CompoundExpressionNode,
2023-12-05 17:13:25 +08:00
DirectiveNode,
2023-12-01 23:30:21 +08:00
RootNode,
2023-12-05 17:13:25 +08:00
SimpleExpressionNode,
2023-12-01 23:30:21 +08:00
SourceLocation,
} from '@vue/compiler-dom'
import type { Prettify } from '@vue/shared'
import type { DirectiveTransform, NodeTransform } from './transform'
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,
2023-12-03 18:36:01 +08:00
WITH_DIRECTIVE,
}
2023-12-01 23:30:21 +08:00
export interface BaseIRNode {
type: IRNodeTypes
loc: SourceLocation
}
2023-12-01 05:18:20 +08:00
// TODO refactor
export type VaporHelper = keyof typeof import('../../runtime-vapor/src')
2023-12-01 23:30:21 +08:00
export interface RootIRNode extends BaseIRNode {
type: IRNodeTypes.ROOT
2023-12-01 22:12:19 +08:00
source: string
2023-12-01 23:30:21 +08:00
node: RootNode
2023-11-26 03:53:47 +08:00
template: Array<TemplateFactoryIRNode | FragmentFactoryIRNode>
2023-12-01 23:30:21 +08:00
dynamic: IRDynamicInfo
effect: IREffect[]
2023-11-24 15:02:47 +08:00
operation: OperationNode[]
helpers: Set<string>
2023-12-01 05:18:20 +08:00
vaporHelpers: Set<VaporHelper>
}
2023-12-01 23:30:21 +08:00
export interface TemplateFactoryIRNode extends BaseIRNode {
2023-11-26 03:53:47 +08:00
type: IRNodeTypes.TEMPLATE_FACTORY
template: string
}
2023-12-01 23:30:21 +08:00
export interface FragmentFactoryIRNode extends BaseIRNode {
2023-11-26 03:53:47 +08:00
type: IRNodeTypes.FRAGMENT_FACTORY
}
2023-12-01 23:30:21 +08:00
export interface SetPropIRNode extends BaseIRNode {
type: IRNodeTypes.SET_PROP
element: number
2023-12-01 23:30:21 +08:00
name: IRExpression
value: IRExpression
}
2023-12-01 23:30:21 +08:00
export interface SetTextIRNode extends BaseIRNode {
type: IRNodeTypes.SET_TEXT
element: number
2023-12-01 23:30:21 +08:00
value: IRExpression
}
2023-12-01 23:30:21 +08:00
export interface SetEventIRNode extends BaseIRNode {
type: IRNodeTypes.SET_EVENT
element: number
2023-12-01 23:30:21 +08:00
name: IRExpression
value: IRExpression
modifiers: {
// modifiers for addEventListener() options, e.g. .passive & .capture
options: string[]
// modifiers that needs runtime guards, withKeys
keys: string[]
// modifiers that needs runtime guards, withModifiers
nonKeys: string[]
}
}
2023-12-01 23:30:21 +08:00
export interface SetHtmlIRNode extends BaseIRNode {
2023-11-24 14:44:57 +08:00
type: IRNodeTypes.SET_HTML
element: number
2023-12-01 23:30:21 +08:00
value: IRExpression
2023-11-24 14:44:57 +08:00
}
2023-12-01 23:30:21 +08:00
export interface CreateTextNodeIRNode extends BaseIRNode {
type: IRNodeTypes.CREATE_TEXT_NODE
id: number
2023-12-01 23:30:21 +08:00
value: IRExpression
}
2023-12-01 23:30:21 +08:00
export interface InsertNodeIRNode extends BaseIRNode {
type: IRNodeTypes.INSERT_NODE
element: number | number[]
parent: number
anchor: number
}
2023-12-01 23:30:21 +08:00
export interface PrependNodeIRNode extends BaseIRNode {
type: IRNodeTypes.PREPEND_NODE
elements: number[]
parent: number
2023-11-27 05:16:21 +08:00
}
2023-12-01 23:30:21 +08:00
export interface AppendNodeIRNode extends BaseIRNode {
2023-11-27 05:16:21 +08:00
type: IRNodeTypes.APPEND_NODE
elements: number[]
parent: number
}
2023-12-03 18:36:01 +08:00
export interface WithDirectiveIRNode extends BaseIRNode {
type: IRNodeTypes.WITH_DIRECTIVE
element: number
dir: VaporDirectiveNode
2023-12-03 18:36:01 +08:00
}
2023-12-01 23:30:21 +08:00
export type IRNode =
| OperationNode
| RootIRNode
| TemplateFactoryIRNode
| FragmentFactoryIRNode
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-12-03 18:36:01 +08:00
| WithDirectiveIRNode
2023-12-01 23:30:21 +08:00
export interface IRDynamicInfo {
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
2023-12-01 23:30:21 +08:00
children: IRDynamicChildren
}
export type IRDynamicChildren = Record<number, IRDynamicInfo>
2023-12-05 17:13:25 +08:00
export type IRExpression = SimpleExpressionNode | string
2023-12-01 23:30:21 +08:00
export interface IREffect {
// TODO multi-expression effect
expressions: IRExpression[]
operations: OperationNode[]
}
type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> &
Pick<U, Extract<keyof U, keyof T>>
export type HackOptions<T> = Prettify<
Overwrite<
T,
{
nodeTransforms?: NodeTransform[]
directiveTransforms?: Record<string, DirectiveTransform | undefined>
}
>
>
2023-12-05 17:13:25 +08:00
2023-12-06 00:15:57 +08:00
export type VaporDirectiveNode = Overwrite<
2023-12-05 17:13:25 +08:00
DirectiveNode,
{
2023-12-06 00:15:57 +08:00
exp: Exclude<DirectiveNode['exp'], CompoundExpressionNode>
arg: Exclude<DirectiveNode['arg'], CompoundExpressionNode>
2023-12-05 17:13:25 +08:00
}
>