}"
`)
+ expect(
+ compileWithWrapper(
+ `<select v-model="model"><option v-for="i in items" :value="i"></option></select>`,
+ ).code,
+ ).toMatchInlineSnapshot(`
+ "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs, ssrRenderList: _ssrRenderList } = require("vue/server-renderer")
+
+ return function ssrRender(_ctx, _push, _parent, _attrs) {
+ _push(\`<div\${_ssrRenderAttrs(_attrs)}><select><!--[-->\`)
+ _ssrRenderList(_ctx.items, (i) => {
+ _push(\`<option\${
+ _ssrRenderAttr("value", i)
+ }\${
+ (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
+ ? _ssrLooseContain(_ctx.model, i)
+ : _ssrLooseEqual(_ctx.model, i))) ? " selected" : ""
+ }></option>\`)
+ })
+ _push(\`<!--]--></select></div>\`)
+ }"
+ `)
+
+ expect(
+ compileWithWrapper(
+ `<select v-model="model"><option v-if="true" :value="i"></option></select>`,
+ ).code,
+ ).toMatchInlineSnapshot(`
+ "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
+
+ return function ssrRender(_ctx, _push, _parent, _attrs) {
+ _push(\`<div\${_ssrRenderAttrs(_attrs)}><select>\`)
+ if (true) {
+ _push(\`<option\${
+ _ssrRenderAttr("value", _ctx.i)
+ }\${
+ (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
+ ? _ssrLooseContain(_ctx.model, _ctx.i)
+ : _ssrLooseEqual(_ctx.model, _ctx.i))) ? " selected" : ""
+ }></option>\`)
+ } else {
+ _push(\`<!---->\`)
+ }
+ _push(\`</select></div>\`)
+ }"
+ `)
+
expect(
compileWithWrapper(
`<select multiple v-model="model"><option value="1" selected></option><option value="2"></option></select>`,
type ExpressionNode,
NodeTypes,
type PlainElementNode,
+ type TemplateChildNode,
createCallExpression,
createConditionalExpression,
createDOMCompilerError,
checkDuplicatedValue()
node.children = [createInterpolation(model, model.loc)]
} else if (node.tag === 'select') {
- node.children.forEach(child => {
- if (child.type === NodeTypes.ELEMENT) {
- processOption(child as PlainElementNode)
- }
- })
+ const processChildren = (children: TemplateChildNode[]) => {
+ children.forEach(child => {
+ if (child.type === NodeTypes.ELEMENT) {
+ processOption(child as PlainElementNode)
+ } else if (child.type === NodeTypes.FOR) {
+ processChildren(child.children)
+ } else if (child.type === NodeTypes.IF) {
+ child.branches.forEach(b => processChildren(b.children))
+ }
+ })
+ }
+ processChildren(node.children)
} else {
context.onError(
createDOMCompilerError(