ssrVModel.spec.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. import { compile } from '../src'
  2. function compileWithWrapper(src: string) {
  3. return compile(`<div>${src}</div>`)
  4. }
  5. describe('ssr: v-model', () => {
  6. test('<input> (text types)', () => {
  7. expect(compileWithWrapper(`<input v-model="bar">`).code)
  8. .toMatchInlineSnapshot(`
  9. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  10. return function ssrRender(_ctx, _push, _parent, _attrs) {
  11. _push(\`<div\${
  12. _ssrRenderAttrs(_attrs)
  13. }><input\${
  14. _ssrRenderAttr("value", _ctx.bar)
  15. }></div>\`)
  16. }"
  17. `)
  18. expect(compileWithWrapper(`<input type="email" v-model="bar">`).code)
  19. .toMatchInlineSnapshot(`
  20. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  21. return function ssrRender(_ctx, _push, _parent, _attrs) {
  22. _push(\`<div\${
  23. _ssrRenderAttrs(_attrs)
  24. }><input type="email"\${
  25. _ssrRenderAttr("value", _ctx.bar)
  26. }></div>\`)
  27. }"
  28. `)
  29. })
  30. test('<select v-model>', () => {
  31. expect(
  32. compileWithWrapper(
  33. `<select v-model="model"><option value="1"></option></select>`
  34. ).code
  35. ).toMatchInlineSnapshot(`
  36. "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  37. return function ssrRender(_ctx, _push, _parent, _attrs) {
  38. _push(\`<div\${
  39. _ssrRenderAttrs(_attrs)
  40. }><select><option value="1"\${
  41. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
  42. ? _ssrLooseContain(_ctx.model, "1")
  43. : _ssrLooseEqual(_ctx.model, "1"))) ? " selected" : ""
  44. }></option></select></div>\`)
  45. }"
  46. `)
  47. expect(
  48. compileWithWrapper(
  49. `<select multiple v-model="model"><option value="1" selected></option><option value="2"></option></select>`
  50. ).code
  51. ).toMatchInlineSnapshot(`
  52. "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  53. return function ssrRender(_ctx, _push, _parent, _attrs) {
  54. _push(\`<div\${
  55. _ssrRenderAttrs(_attrs)
  56. }><select multiple><option value="1" selected></option><option value="2"\${
  57. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
  58. ? _ssrLooseContain(_ctx.model, "2")
  59. : _ssrLooseEqual(_ctx.model, "2"))) ? " selected" : ""
  60. }></option></select></div>\`)
  61. }"
  62. `)
  63. expect(
  64. compileWithWrapper(`<select multiple v-model="model"><slot/></select>`)
  65. .code
  66. ).toMatchInlineSnapshot(`
  67. "const { ssrRenderSlot: _ssrRenderSlot, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  68. return function ssrRender(_ctx, _push, _parent, _attrs) {
  69. _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple>\`)
  70. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
  71. _push(\`</select></div>\`)
  72. }"
  73. `)
  74. expect(
  75. compileWithWrapper(`
  76. <select multiple v-model="model">
  77. <optgroup label="foo">
  78. <option value="bar">bar</option>
  79. </optgroup>
  80. </select>`).code
  81. ).toMatchInlineSnapshot(`
  82. "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  83. return function ssrRender(_ctx, _push, _parent, _attrs) {
  84. _push(\`<div\${
  85. _ssrRenderAttrs(_attrs)
  86. }><select multiple><optgroup label="foo"><option value="bar"\${
  87. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
  88. ? _ssrLooseContain(_ctx.model, "bar")
  89. : _ssrLooseEqual(_ctx.model, "bar"))) ? " selected" : ""
  90. }>bar</option></optgroup></select></div>\`)
  91. }"
  92. `)
  93. expect(
  94. compileWithWrapper(`
  95. <select multiple v-model="model">
  96. <optgroup label="foo">
  97. <slot/>
  98. </optgroup>
  99. </select>`).code
  100. ).toMatchInlineSnapshot(`
  101. "const { ssrRenderSlot: _ssrRenderSlot, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  102. return function ssrRender(_ctx, _push, _parent, _attrs) {
  103. _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple><optgroup label="foo">\`)
  104. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
  105. _push(\`</optgroup></select></div>\`)
  106. }"
  107. `)
  108. })
  109. test('<input type="radio">', () => {
  110. expect(
  111. compileWithWrapper(`<input type="radio" value="foo" v-model="bar">`).code
  112. ).toMatchInlineSnapshot(`
  113. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  114. return function ssrRender(_ctx, _push, _parent, _attrs) {
  115. _push(\`<div\${
  116. _ssrRenderAttrs(_attrs)
  117. }><input type="radio" value="foo"\${
  118. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.bar, "foo"))) ? " checked" : ""
  119. }></div>\`)
  120. }"
  121. `)
  122. })
  123. test('<input type="checkbox">', () => {
  124. expect(compileWithWrapper(`<input type="checkbox" v-model="bar">`).code)
  125. .toMatchInlineSnapshot(`
  126. "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  127. return function ssrRender(_ctx, _push, _parent, _attrs) {
  128. _push(\`<div\${
  129. _ssrRenderAttrs(_attrs)
  130. }><input type="checkbox"\${
  131. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
  132. ? _ssrLooseContain(_ctx.bar, null)
  133. : _ctx.bar)) ? " checked" : ""
  134. }></div>\`)
  135. }"
  136. `)
  137. expect(
  138. compileWithWrapper(`<input type="checkbox" value="foo" v-model="bar">`)
  139. .code
  140. ).toMatchInlineSnapshot(`
  141. "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  142. return function ssrRender(_ctx, _push, _parent, _attrs) {
  143. _push(\`<div\${
  144. _ssrRenderAttrs(_attrs)
  145. }><input type="checkbox" value="foo"\${
  146. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
  147. ? _ssrLooseContain(_ctx.bar, "foo")
  148. : _ctx.bar)) ? " checked" : ""
  149. }></div>\`)
  150. }"
  151. `)
  152. expect(
  153. compileWithWrapper(
  154. `<input type="checkbox" :true-value="foo" :false-value="bar" v-model="baz">`
  155. ).code
  156. ).toMatchInlineSnapshot(`
  157. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  158. return function ssrRender(_ctx, _push, _parent, _attrs) {
  159. _push(\`<div\${
  160. _ssrRenderAttrs(_attrs)
  161. }><input type="checkbox"\${
  162. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, _ctx.foo))) ? " checked" : ""
  163. }></div>\`)
  164. }"
  165. `)
  166. expect(
  167. compileWithWrapper(
  168. `<input type="checkbox" true-value="foo" false-value="bar" v-model="baz">`
  169. ).code
  170. ).toMatchInlineSnapshot(`
  171. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  172. return function ssrRender(_ctx, _push, _parent, _attrs) {
  173. _push(\`<div\${
  174. _ssrRenderAttrs(_attrs)
  175. }><input type="checkbox"\${
  176. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, "foo"))) ? " checked" : ""
  177. }></div>\`)
  178. }"
  179. `)
  180. })
  181. test('<textarea>', () => {
  182. expect(compileWithWrapper(`<textarea v-model="foo">bar</textarea>`).code)
  183. .toMatchInlineSnapshot(`
  184. "const { ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require("vue/server-renderer")
  185. return function ssrRender(_ctx, _push, _parent, _attrs) {
  186. _push(\`<div\${
  187. _ssrRenderAttrs(_attrs)
  188. }><textarea>\${
  189. _ssrInterpolate(_ctx.foo)
  190. }</textarea></div>\`)
  191. }"
  192. `)
  193. })
  194. test('<input :type="x">', () => {
  195. expect(compileWithWrapper(`<input :type="x" v-model="foo">`).code)
  196. .toMatchInlineSnapshot(`
  197. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  198. return function ssrRender(_ctx, _push, _parent, _attrs) {
  199. _push(\`<div\${
  200. _ssrRenderAttrs(_attrs)
  201. }><input\${
  202. _ssrRenderAttr("type", _ctx.x)
  203. }\${
  204. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, null)
  205. }></div>\`)
  206. }"
  207. `)
  208. expect(
  209. compileWithWrapper(`<input :type="x" v-model="foo" value="bar">`).code
  210. ).toMatchInlineSnapshot(`
  211. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  212. return function ssrRender(_ctx, _push, _parent, _attrs) {
  213. _push(\`<div\${
  214. _ssrRenderAttrs(_attrs)
  215. }><input\${
  216. _ssrRenderAttr("type", _ctx.x)
  217. }\${
  218. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, "bar")
  219. } value="bar"></div>\`)
  220. }"
  221. `)
  222. expect(
  223. compileWithWrapper(`<input :type="x" v-model="foo" :value="bar">`).code
  224. ).toMatchInlineSnapshot(`
  225. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  226. return function ssrRender(_ctx, _push, _parent, _attrs) {
  227. _push(\`<div\${
  228. _ssrRenderAttrs(_attrs)
  229. }><input\${
  230. _ssrRenderAttr("type", _ctx.x)
  231. }\${
  232. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, _ctx.bar)
  233. }\${
  234. _ssrRenderAttr("value", _ctx.bar)
  235. }></div>\`)
  236. }"
  237. `)
  238. })
  239. test('<input v-bind="obj">', () => {
  240. expect(compileWithWrapper(`<input v-bind="obj" v-model="foo">`).code)
  241. .toMatchInlineSnapshot(`
  242. "const { mergeProps: _mergeProps } = require("vue")
  243. const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require("vue/server-renderer")
  244. return function ssrRender(_ctx, _push, _parent, _attrs) {
  245. let _temp0
  246. _push(\`<div\${
  247. _ssrRenderAttrs(_attrs)
  248. }><input\${
  249. _ssrRenderAttrs((_temp0 = _ctx.obj, _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
  250. }></div>\`)
  251. }"
  252. `)
  253. expect(
  254. compileWithWrapper(`<input id="x" v-bind="obj" v-model="foo" class="y">`)
  255. .code
  256. ).toMatchInlineSnapshot(`
  257. "const { mergeProps: _mergeProps } = require("vue")
  258. const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require("vue/server-renderer")
  259. return function ssrRender(_ctx, _push, _parent, _attrs) {
  260. let _temp0
  261. _push(\`<div\${
  262. _ssrRenderAttrs(_attrs)
  263. }><input\${
  264. _ssrRenderAttrs((_temp0 = _mergeProps({ id: "x" }, _ctx.obj, { class: "y" }), _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
  265. }></div>\`)
  266. }"
  267. `)
  268. })
  269. })