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

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

255 lines
5.4 KiB
TypeScript
Raw Normal View History

2023-12-01 23:30:21 +08:00
import type {
BindingTypes,
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,
TemplateChildNode,
2023-12-01 23:30:21 +08:00
} from '@vue/compiler-dom'
import type { Prettify } from '@vue/shared'
import type {
DirectiveTransform,
DirectiveTransformResult,
NodeTransform,
} from './transform'
2023-11-29 22:09:46 +08:00
export enum IRNodeTypes {
ROOT,
BLOCK,
2024-01-31 17:00:19 +08:00
SET_PROP,
SET_DYNAMIC_PROPS,
SET_TEXT,
SET_EVENT,
SET_DYNAMIC_EVENTS,
2023-11-24 14:44:57 +08:00
SET_HTML,
2024-01-20 23:48:10 +08:00
SET_REF,
2024-01-21 02:16:30 +08:00
SET_MODEL_VALUE,
INSERT_NODE,
PREPEND_NODE,
CREATE_TEXT_NODE,
CREATE_COMPONENT_NODE,
2023-12-03 18:36:01 +08:00
WITH_DIRECTIVE,
IF,
2024-01-31 17:00:19 +08:00
FOR,
}
2023-12-01 23:30:21 +08:00
export interface BaseIRNode {
type: IRNodeTypes
}
export type VaporHelper = keyof typeof import('@vue/runtime-vapor')
2023-12-01 05:18:20 +08:00
export interface BlockIRNode extends BaseIRNode {
type: IRNodeTypes.BLOCK
node: RootNode | TemplateChildNode
2023-12-01 23:30:21 +08:00
dynamic: IRDynamicInfo
effect: IREffect[]
2023-11-24 15:02:47 +08:00
operation: OperationNode[]
returns: number[]
}
export interface RootIRNode {
type: IRNodeTypes.ROOT
node: RootNode
source: string
template: string[]
block: BlockIRNode
}
export interface IfIRNode extends BaseIRNode {
type: IRNodeTypes.IF
id: number
condition: SimpleExpressionNode
positive: BlockIRNode
negative?: BlockIRNode | IfIRNode
}
2024-01-31 17:00:19 +08:00
export interface ForIRNode extends BaseIRNode {
type: IRNodeTypes.FOR
id: number
source: SimpleExpressionNode
2024-01-31 17:00:19 +08:00
value?: SimpleExpressionNode
key?: SimpleExpressionNode
index?: SimpleExpressionNode
keyProp?: SimpleExpressionNode
render: BlockIRNode
2024-01-31 17:00:19 +08:00
}
export interface IRProp extends Omit<DirectiveTransformResult, 'value'> {
values: SimpleExpressionNode[]
}
export type IRProps = IRProp[] | SimpleExpressionNode
2023-12-01 23:30:21 +08:00
export interface SetPropIRNode extends BaseIRNode {
type: IRNodeTypes.SET_PROP
element: number
prop: IRProp
}
export interface SetDynamicPropsIRNode extends BaseIRNode {
type: IRNodeTypes.SET_DYNAMIC_PROPS
element: number
props: IRProps[]
}
export interface SetDynamicEventsIRNode extends BaseIRNode {
type: IRNodeTypes.SET_DYNAMIC_EVENTS
element: number
event: SimpleExpressionNode
}
2023-12-01 23:30:21 +08:00
export interface SetTextIRNode extends BaseIRNode {
type: IRNodeTypes.SET_TEXT
element: number
values: SimpleExpressionNode[]
}
2023-12-10 00:06:20 +08:00
export type KeyOverride = [find: string, replacement: string]
2023-12-01 23:30:21 +08:00
export interface SetEventIRNode extends BaseIRNode {
type: IRNodeTypes.SET_EVENT
element: number
key: SimpleExpressionNode
2023-12-10 00:06:20 +08:00
value?: SimpleExpressionNode
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-10 00:06:20 +08:00
keyOverride?: KeyOverride
delegate: boolean
/** Whether it's in effect */
effect: boolean
}
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
value: SimpleExpressionNode
2023-11-24 14:44:57 +08:00
}
2024-01-20 23:48:10 +08:00
export interface SetRefIRNode extends BaseIRNode {
type: IRNodeTypes.SET_REF
element: number
value: SimpleExpressionNode
2024-01-20 23:48:10 +08:00
}
2024-01-21 02:16:30 +08:00
export interface SetModelValueIRNode extends BaseIRNode {
type: IRNodeTypes.SET_MODEL_VALUE
element: number
key: SimpleExpressionNode
value: SimpleExpressionNode
bindingType?: BindingTypes
2024-01-21 02:16:30 +08:00
isComponent: boolean
}
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
export interface InsertNodeIRNode extends BaseIRNode {
type: IRNodeTypes.INSERT_NODE
elements: 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-03 18:36:01 +08:00
export interface WithDirectiveIRNode extends BaseIRNode {
type: IRNodeTypes.WITH_DIRECTIVE
element: number
dir: VaporDirectiveNode
builtin?: VaporHelper
2023-12-03 18:36:01 +08:00
}
export interface CreateComponentIRNode extends BaseIRNode {
type: IRNodeTypes.CREATE_COMPONENT_NODE
id: number
tag: string
props: IRProps[]
// TODO slots
resolve: boolean
root: boolean
}
export type IRNode = OperationNode | RootIRNode
2023-11-24 15:25:34 +08:00
export type OperationNode =
| SetPropIRNode
| SetDynamicPropsIRNode
2023-11-24 15:25:34 +08:00
| SetTextIRNode
| SetEventIRNode
| SetDynamicEventsIRNode
2023-11-24 15:25:34 +08:00
| SetHtmlIRNode
2024-01-20 23:48:10 +08:00
| SetRefIRNode
2024-01-21 02:16:30 +08:00
| SetModelValueIRNode
| CreateTextNodeIRNode
2023-11-24 15:25:34 +08:00
| InsertNodeIRNode
| PrependNodeIRNode
2023-12-03 18:36:01 +08:00
| WithDirectiveIRNode
| IfIRNode
2024-01-31 17:00:19 +08:00
| ForIRNode
| CreateComponentIRNode
2024-01-29 22:08:57 +08:00
export enum DynamicFlag {
NONE = 0,
/**
* This node is referenced and needs to be saved as a variable.
*/
REFERENCED = 1,
/**
* This node is not generated from template, but is generated dynamically.
*/
NON_TEMPLATE = 1 << 1,
/**
* This node needs to be inserted back into the template.
*/
INSERT = 1 << 2,
}
2023-12-01 23:30:21 +08:00
export interface IRDynamicInfo {
id?: number
flags: DynamicFlag
anchor?: number
children: IRDynamicInfo[]
template?: number
2023-12-01 23:30:21 +08:00
}
export interface IREffect {
expressions: SimpleExpressionNode[]
2023-12-01 23:30:21 +08:00
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
}
>