ErrorCodes,
} from '@vue/compiler-dom'
import { extend, isString } from '@vue/shared'
-import { DirectiveTransform, NodeTransform, transform } from './transform'
+import {
+ type DirectiveTransform,
+ type NodeTransform,
+ transform,
+} from './transform'
import { generate } from './generate'
-import { HackOptions } from './hack'
import { transformOnce } from './transforms/vOnce'
import { transformElement } from './transforms/transformElement'
import { transformVHtml } from './transforms/vHtml'
import { transformVText } from './transforms/vText'
import { transformVOn } from './transforms/vOn'
+import { transformInterpolation } from './transforms/transformInterpolation'
+import type { HackOptions } from './ir'
export type CompilerOptions = HackOptions<BaseCompilerOptions>
prefixIdentifiers?: boolean,
): TransformPreset {
return [
- [transformOnce, transformElement],
+ [transformOnce, transformInterpolation, transformElement],
{
on: transformVOn,
html: transformVHtml,
+++ /dev/null
-import type { Prettify } from '@vue/shared'
-import type { DirectiveTransform, NodeTransform } from './transform'
-
-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>
- }
- >
->
RootNode,
SourceLocation,
} from '@vue/compiler-dom'
+import type { Prettify } from '@vue/shared'
+import type { DirectiveTransform, NodeTransform } from './transform'
export enum IRNodeTypes {
ROOT,
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>
+ }
+ >
+>
type RootNode,
type TemplateChildNode,
type ElementNode,
- type InterpolationNode,
type TransformOptions as BaseTransformOptions,
type ParentNode,
type AllNode,
type IRExpression,
IRNodeTypes,
} from './ir'
-import type { HackOptions } from './hack'
+import type { HackOptions } from './ir'
export type NodeTransform = (
node: RootNode | TemplateChildNode,
function transformNode(
context: TransformContext<RootNode | TemplateChildNode>,
) {
- let { node, index } = context
+ let { node } = context
// apply transform plugins
const { nodeTransforms } = context.options
}
}
- const parentChildren = context.parent ? context.parent.node.children : []
- const isFirst = index === 0
- const isLast = index === parentChildren.length - 1
-
switch (node.type) {
case NodeTypes.ROOT:
case NodeTypes.ELEMENT: {
context.template += `<!--${node.content}-->`
break
}
- case NodeTypes.INTERPOLATION: {
- transformInterpolation(
- context as TransformContext<InterpolationNode>,
- isFirst,
- isLast,
- )
- break
- }
- case NodeTypes.TEXT_CALL:
- // never
- break
- default: {
- // TODO handle other types
- // CompoundExpressionNode
- // IfNode
- // IfBranchNode
- // ForNode
- context.template += `[type: ${node.type}]`
- }
}
// exit transforms
}
}
}
-
-function transformInterpolation(
- ctx: TransformContext<InterpolationNode>,
- isFirst: boolean,
- isLast: boolean,
-) {
- const { node } = ctx
-
- const expr = node.content
-
- if (isFirst && isLast) {
- const parent = ctx.parent!
- const parentId = parent.reference()
- ctx.registerEffect(
- [expr],
- [
- {
- type: IRNodeTypes.SET_TEXT,
- loc: node.loc,
- element: parentId,
- value: expr,
- },
- ],
- )
- } else {
- const id = ctx.reference()
- ctx.dynamic.ghost = true
- ctx.registerOperation({
- type: IRNodeTypes.CREATE_TEXT_NODE,
- loc: node.loc,
- id,
- value: expr,
- })
- ctx.registerEffect(
- [expr],
- [
- {
- type: IRNodeTypes.SET_TEXT,
- loc: node.loc,
- element: id,
- value: expr,
- },
- ],
- )
- }
-}
--- /dev/null
+import { NodeTypes } from '@vue/compiler-dom'
+import { NodeTransform } from '../transform'
+import { IRNodeTypes } from '../ir'
+
+export const transformInterpolation: NodeTransform = (node, ctx) => {
+ if (node.type !== NodeTypes.INTERPOLATION) return
+
+ const expr = node.content
+ const parentChildren = ctx.parent ? ctx.parent.node.children : []
+ const isFirst = ctx.index === 0
+ const isLast = ctx.index === parentChildren.length - 1
+
+ if (isFirst && isLast) {
+ const parent = ctx.parent!
+ const parentId = parent.reference()
+ ctx.registerEffect(
+ [expr],
+ [
+ {
+ type: IRNodeTypes.SET_TEXT,
+ loc: node.loc,
+ element: parentId,
+ value: expr,
+ },
+ ],
+ )
+ } else {
+ const id = ctx.reference()
+ ctx.dynamic.ghost = true
+ ctx.registerOperation({
+ type: IRNodeTypes.CREATE_TEXT_NODE,
+ loc: node.loc,
+ id,
+ value: expr,
+ })
+ ctx.registerEffect(
+ [expr],
+ [
+ {
+ type: IRNodeTypes.SET_TEXT,
+ loc: node.loc,
+ element: id,
+ value: expr,
+ },
+ ],
+ )
+ }
+}