| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480 |
- import { compile } from '../src'
- function compileWithWrapper(src: string) {
- return compile(`<div>${src}</div>`)
- }
- describe('ssr: v-model', () => {
- test('<input> (text types)', () => {
- expect(compileWithWrapper(`<input v-model="bar">`).code)
- .toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input\${
- _ssrRenderAttr("value", _ctx.bar)
- }></div>\`)
- }"
- `)
- expect(compileWithWrapper(`<input type="email" v-model="bar">`).code)
- .toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input type="email"\${
- _ssrRenderAttr("value", _ctx.bar)
- }></div>\`)
- }"
- `)
- })
- test('<select v-model>', () => {
- expect(
- compileWithWrapper(
- `<select v-model="model"><option value="1"></option></select>`,
- ).code,
- ).toMatchInlineSnapshot(`
- "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><select><option value="1"\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
- ? _ssrLooseContain(_ctx.model, "1")
- : _ssrLooseEqual(_ctx.model, "1"))) ? " selected" : ""
- }></option></select></div>\`)
- }"
- `)
- 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>`,
- ).code,
- ).toMatchInlineSnapshot(`
- "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><select multiple><option value="1" selected></option><option value="2"\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
- ? _ssrLooseContain(_ctx.model, "2")
- : _ssrLooseEqual(_ctx.model, "2"))) ? " selected" : ""
- }></option></select></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`<select multiple v-model="model"><slot/></select>`)
- .code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderSlot: _ssrRenderSlot, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple>\`)
- _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
- _push(\`</select></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`
- <select multiple v-model="model">
- <optgroup label="foo">
- <option value="bar">bar</option>
- </optgroup>
- </select>`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><select multiple><optgroup label="foo"><option value="bar"\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
- ? _ssrLooseContain(_ctx.model, "bar")
- : _ssrLooseEqual(_ctx.model, "bar"))) ? " selected" : ""
- }>bar</option></optgroup></select></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`
- <select multiple v-model="model">
- <optgroup label="foo">
- <slot/>
- </optgroup>
- </select>`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderSlot: _ssrRenderSlot, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple><optgroup label="foo">\`)
- _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
- _push(\`</optgroup></select></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`
- <select multiple v-model="model">
- <optgroup>
- <option v-for="item in items" :value="item">{{item}}</option>
- </optgroup>
- </select>`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate, ssrRenderList: _ssrRenderList } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple><optgroup><!--[-->\`)
- _ssrRenderList(_ctx.items, (item) => {
- _push(\`<option\${
- _ssrRenderAttr("value", item)
- }\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
- ? _ssrLooseContain(_ctx.model, item)
- : _ssrLooseEqual(_ctx.model, item))) ? " selected" : ""
- }>\${
- _ssrInterpolate(item)
- }</option>\`)
- })
- _push(\`<!--]--></optgroup></select></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`
- <select multiple v-model="model">
- <optgroup>
- <option v-if="true" :value="item">{{item}}</option>
- </optgroup>
- </select>`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple><optgroup>\`)
- if (true) {
- _push(\`<option\${
- _ssrRenderAttr("value", _ctx.item)
- }\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
- ? _ssrLooseContain(_ctx.model, _ctx.item)
- : _ssrLooseEqual(_ctx.model, _ctx.item))) ? " selected" : ""
- }>\${
- _ssrInterpolate(_ctx.item)
- }</option>\`)
- } else {
- _push(\`<!---->\`)
- }
- _push(\`</optgroup></select></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`
- <select multiple v-model="model">
- <optgroup>
- <template v-if="ok">
- <option v-for="item in items" :value="item">{{item}}</option>
- </template>
- </optgroup>
- </select>`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate, ssrRenderList: _ssrRenderList } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple><optgroup>\`)
- if (_ctx.ok) {
- _push(\`<!--[-->\`)
- _ssrRenderList(_ctx.items, (item) => {
- _push(\`<option\${
- _ssrRenderAttr("value", item)
- }\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
- ? _ssrLooseContain(_ctx.model, item)
- : _ssrLooseEqual(_ctx.model, item))) ? " selected" : ""
- }>\${
- _ssrInterpolate(item)
- }</option>\`)
- })
- _push(\`<!--]-->\`)
- } else {
- _push(\`<!---->\`)
- }
- _push(\`</optgroup></select></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`
- <select multiple v-model="model">
- <optgroup>
- <template v-for="item in items" :value="item">
- <option v-if="item===1" :value="item">{{item}}</option>
- </template>
- </optgroup>
- </select>`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate, ssrRenderList: _ssrRenderList } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple><optgroup><!--[-->\`)
- _ssrRenderList(_ctx.items, (item) => {
- _push(\`<!--[-->\`)
- if (item===1) {
- _push(\`<option\${
- _ssrRenderAttr("value", item)
- }\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
- ? _ssrLooseContain(_ctx.model, item)
- : _ssrLooseEqual(_ctx.model, item))) ? " selected" : ""
- }>\${
- _ssrInterpolate(item)
- }</option>\`)
- } else {
- _push(\`<!---->\`)
- }
- _push(\`<!--]-->\`)
- })
- _push(\`<!--]--></optgroup></select></div>\`)
- }"
- `)
- })
- test('<input type="radio">', () => {
- expect(
- compileWithWrapper(`<input type="radio" value="foo" v-model="bar">`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input type="radio" value="foo"\${
- (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.bar, "foo"))) ? " checked" : ""
- }></div>\`)
- }"
- `)
- })
- test('<input type="checkbox">', () => {
- expect(compileWithWrapper(`<input type="checkbox" v-model="bar">`).code)
- .toMatchInlineSnapshot(`
- "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input type="checkbox"\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
- ? _ssrLooseContain(_ctx.bar, null)
- : _ctx.bar)) ? " checked" : ""
- }></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`<input type="checkbox" value="foo" v-model="bar">`)
- .code,
- ).toMatchInlineSnapshot(`
- "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input type="checkbox" value="foo"\${
- (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
- ? _ssrLooseContain(_ctx.bar, "foo")
- : _ctx.bar)) ? " checked" : ""
- }></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(
- `<input type="checkbox" :true-value="foo" :false-value="bar" v-model="baz">`,
- ).code,
- ).toMatchInlineSnapshot(`
- "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input type="checkbox"\${
- (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, _ctx.foo))) ? " checked" : ""
- }></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(
- `<input type="checkbox" true-value="foo" false-value="bar" v-model="baz">`,
- ).code,
- ).toMatchInlineSnapshot(`
- "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input type="checkbox"\${
- (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, "foo"))) ? " checked" : ""
- }></div>\`)
- }"
- `)
- })
- test('<textarea>', () => {
- expect(compileWithWrapper(`<textarea v-model="foo">bar</textarea>`).code)
- .toMatchInlineSnapshot(`
- "const { ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><textarea>\${
- _ssrInterpolate(_ctx.foo)
- }</textarea></div>\`)
- }"
- `)
- })
- test('<input :type="x">', () => {
- expect(compileWithWrapper(`<input :type="x" v-model="foo">`).code)
- .toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input\${
- _ssrRenderAttr("type", _ctx.x)
- }\${
- _ssrRenderDynamicModel(_ctx.x, _ctx.foo, null)
- }></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`<input :type="x" v-model="foo" value="bar">`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input\${
- _ssrRenderAttr("type", _ctx.x)
- }\${
- _ssrRenderDynamicModel(_ctx.x, _ctx.foo, "bar")
- } value="bar"></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`<input :type="x" v-model="foo" :value="bar">`).code,
- ).toMatchInlineSnapshot(`
- "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input\${
- _ssrRenderAttr("type", _ctx.x)
- }\${
- _ssrRenderDynamicModel(_ctx.x, _ctx.foo, _ctx.bar)
- }\${
- _ssrRenderAttr("value", _ctx.bar)
- }></div>\`)
- }"
- `)
- })
- test('<input v-bind="obj">', () => {
- expect(compileWithWrapper(`<input v-bind="obj" v-model="foo">`).code)
- .toMatchInlineSnapshot(`
- "const { mergeProps: _mergeProps } = require("vue")
- const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- let _temp0
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input\${
- _ssrRenderAttrs((_temp0 = _ctx.obj, _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
- }></div>\`)
- }"
- `)
- expect(
- compileWithWrapper(`<input id="x" v-bind="obj" v-model="foo" class="y">`)
- .code,
- ).toMatchInlineSnapshot(`
- "const { mergeProps: _mergeProps } = require("vue")
- const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require("vue/server-renderer")
- return function ssrRender(_ctx, _push, _parent, _attrs) {
- let _temp0
- _push(\`<div\${
- _ssrRenderAttrs(_attrs)
- }><input\${
- _ssrRenderAttrs((_temp0 = _mergeProps({ id: "x" }, _ctx.obj, { class: "y" }), _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
- }></div>\`)
- }"
- `)
- })
- })
|