Skip to content

Commit

Permalink
fix(compiler-core): properly transform replaced nodes (#2927)
Browse files Browse the repository at this point in the history
  • Loading branch information
Calvin-LL committed Mar 29, 2021
1 parent 5db2b14 commit 0fe567a
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import {
baseParse as parse,
transform,
ErrorCodes,
BindingTypes
BindingTypes,
NodeTransform
} from '../../src'
import {
RESOLVE_COMPONENT,
Expand Down Expand Up @@ -939,4 +940,35 @@ describe('compiler: element transform', () => {
isBlock: true
})
})

test('should process node when node has been replaced', () => {
// a NodeTransform that swaps out <div id="foo" /> with <span id="foo" />
const customNodeTransform: NodeTransform = (node, context) => {
if (
node.type === NodeTypes.ELEMENT &&
node.tag === 'div' &&
node.props.some(
prop =>
prop.type === NodeTypes.ATTRIBUTE &&
prop.name === 'id' &&
prop.value &&
prop.value.content === 'foo'
)
) {
context.replaceNode({
...node,
tag: 'span'
})
}
}
const ast = parse(`<div><div id="foo" /></div>`)
transform(ast, {
nodeTransforms: [transformElement, transformText, customNodeTransform]
})
expect((ast as any).children[0].children[0].codegenNode).toMatchObject({
type: NodeTypes.VNODE_CALL,
tag: '"span"',
isBlock: false
})
})
})
21 changes: 12 additions & 9 deletions packages/compiler-core/src/transforms/transformElement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,21 @@ const directiveImportMap = new WeakMap<DirectiveNode, symbol>()

// generate a JavaScript AST for this element's codegen
export const transformElement: NodeTransform = (node, context) => {
if (
!(
node.type === NodeTypes.ELEMENT &&
(node.tagType === ElementTypes.ELEMENT ||
node.tagType === ElementTypes.COMPONENT)
)
) {
return
}
// perform the work on exit, after all child expressions have been
// processed and merged.
return function postTransformElement() {
node = context.currentNode!

if (
!(
node.type === NodeTypes.ELEMENT &&
(node.tagType === ElementTypes.ELEMENT ||
node.tagType === ElementTypes.COMPONENT)
)
) {
return
}

const { tag, props } = node
const isComponent = node.tagType === ElementTypes.COMPONENT

Expand Down

0 comments on commit 0fe567a

Please sign in to comment.