}"
`;
+exports[`compiler: transform text element with custom directives and only one text child node 1`] = `
+"const _Vue = Vue
+
+return function render(_ctx, _cache) {
+ with (_ctx) {
+ const { toDisplayString: _toDisplayString, createTextVNode: _createTextVNode, resolveDirective: _resolveDirective, withDirectives: _withDirectives, openBlock: _openBlock, createBlock: _createBlock } = _Vue
+
+ const _directive_foo = _resolveDirective(\\"foo\\")
+
+ return _withDirectives((_openBlock(), _createBlock(\\"p\\", null, [
+ _createTextVNode(_toDisplayString(foo), 1 /* TEXT */)
+ ], 512 /* NEED_PATCH */)), [
+ [_directive_foo]
+ ])
+ }
+}"
+`;
+
exports[`compiler: transform text no consecutive text 1`] = `
"const _Vue = Vue
transform,
NodeTypes,
generate,
- ForNode
+ ForNode,
+ ElementNode
} from '../../src'
import { transformFor } from '../../src/transforms/vFor'
import { transformText } from '../../src/transforms/transformText'
nodeTransforms: [
transformFor,
...(options.prefixIdentifiers ? [transformExpression] : []),
- transformText,
- transformElement
+ transformElement,
+ transformText
],
...options
})
}).code
).toMatchSnapshot()
})
+
+ // #3756
+ test('element with custom directives and only one text child node', () => {
+ const root = transformWithTextOpt(`<p v-foo>{{ foo }}</p>`)
+ expect(root.children.length).toBe(1)
+ expect(root.children[0].type).toBe(NodeTypes.ELEMENT)
+ expect((root.children[0] as ElementNode).children[0]).toMatchObject({
+ type: NodeTypes.TEXT_CALL,
+ codegenNode: {
+ type: NodeTypes.JS_CALL_EXPRESSION,
+ callee: CREATE_TEXT,
+ arguments: [
+ {
+ type: NodeTypes.INTERPOLATION,
+ content: {
+ type: NodeTypes.SIMPLE_EXPRESSION,
+ content: 'foo'
+ }
+ },
+ genFlagText(PatchFlags.TEXT)
+ ]
+ }
+ })
+ expect(generate(root).code).toMatchSnapshot()
+ })
})
(node.type === NodeTypes.ROOT ||
(node.type === NodeTypes.ELEMENT &&
node.tagType === ElementTypes.ELEMENT &&
+ // #3756
+ // custom directives can potentially add DOM elements arbitrarily,
+ // we need to avoid setting textContent of the element at runtime
+ // to avoid accidentally overwriting the DOM elements added
+ // by the user through custom directives.
+ !node.props.find(
+ p =>
+ p.type === NodeTypes.DIRECTIVE &&
+ !context.directiveTransforms[p.name]
+ ) &&
// in compat mode, <template> tags with no special directives
// will be rendered as a fragment so its children must be
// converted into vnodes.