ssrVModel.spec.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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 v-model="model"><option v-for="i in items" :value="i"></option></select>`,
  50. ).code,
  51. ).toMatchInlineSnapshot(`
  52. "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs, ssrRenderList: _ssrRenderList } = require("vue/server-renderer")
  53. return function ssrRender(_ctx, _push, _parent, _attrs) {
  54. _push(\`<div\${_ssrRenderAttrs(_attrs)}><select><!--[-->\`)
  55. _ssrRenderList(_ctx.items, (i) => {
  56. _push(\`<option\${
  57. _ssrRenderAttr("value", i)
  58. }\${
  59. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
  60. ? _ssrLooseContain(_ctx.model, i)
  61. : _ssrLooseEqual(_ctx.model, i))) ? " selected" : ""
  62. }></option>\`)
  63. })
  64. _push(\`<!--]--></select></div>\`)
  65. }"
  66. `)
  67. expect(
  68. compileWithWrapper(
  69. `<select v-model="model"><option v-if="true" :value="i"></option></select>`,
  70. ).code,
  71. ).toMatchInlineSnapshot(`
  72. "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  73. return function ssrRender(_ctx, _push, _parent, _attrs) {
  74. _push(\`<div\${_ssrRenderAttrs(_attrs)}><select>\`)
  75. if (true) {
  76. _push(\`<option\${
  77. _ssrRenderAttr("value", _ctx.i)
  78. }\${
  79. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
  80. ? _ssrLooseContain(_ctx.model, _ctx.i)
  81. : _ssrLooseEqual(_ctx.model, _ctx.i))) ? " selected" : ""
  82. }></option>\`)
  83. } else {
  84. _push(\`<!---->\`)
  85. }
  86. _push(\`</select></div>\`)
  87. }"
  88. `)
  89. expect(
  90. compileWithWrapper(
  91. `<select multiple v-model="model"><option value="1" selected></option><option value="2"></option></select>`,
  92. ).code,
  93. ).toMatchInlineSnapshot(`
  94. "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  95. return function ssrRender(_ctx, _push, _parent, _attrs) {
  96. _push(\`<div\${
  97. _ssrRenderAttrs(_attrs)
  98. }><select multiple><option value="1" selected></option><option value="2"\${
  99. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
  100. ? _ssrLooseContain(_ctx.model, "2")
  101. : _ssrLooseEqual(_ctx.model, "2"))) ? " selected" : ""
  102. }></option></select></div>\`)
  103. }"
  104. `)
  105. expect(
  106. compileWithWrapper(`<select multiple v-model="model"><slot/></select>`)
  107. .code,
  108. ).toMatchInlineSnapshot(`
  109. "const { ssrRenderSlot: _ssrRenderSlot, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  110. return function ssrRender(_ctx, _push, _parent, _attrs) {
  111. _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple>\`)
  112. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
  113. _push(\`</select></div>\`)
  114. }"
  115. `)
  116. expect(
  117. compileWithWrapper(`
  118. <select multiple v-model="model">
  119. <optgroup label="foo">
  120. <option value="bar">bar</option>
  121. </optgroup>
  122. </select>`).code,
  123. ).toMatchInlineSnapshot(`
  124. "const { ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  125. return function ssrRender(_ctx, _push, _parent, _attrs) {
  126. _push(\`<div\${
  127. _ssrRenderAttrs(_attrs)
  128. }><select multiple><optgroup label="foo"><option value="bar"\${
  129. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.model))
  130. ? _ssrLooseContain(_ctx.model, "bar")
  131. : _ssrLooseEqual(_ctx.model, "bar"))) ? " selected" : ""
  132. }>bar</option></optgroup></select></div>\`)
  133. }"
  134. `)
  135. expect(
  136. compileWithWrapper(`
  137. <select multiple v-model="model">
  138. <optgroup label="foo">
  139. <slot/>
  140. </optgroup>
  141. </select>`).code,
  142. ).toMatchInlineSnapshot(`
  143. "const { ssrRenderSlot: _ssrRenderSlot, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  144. return function ssrRender(_ctx, _push, _parent, _attrs) {
  145. _push(\`<div\${_ssrRenderAttrs(_attrs)}><select multiple><optgroup label="foo">\`)
  146. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
  147. _push(\`</optgroup></select></div>\`)
  148. }"
  149. `)
  150. })
  151. test('<input type="radio">', () => {
  152. expect(
  153. compileWithWrapper(`<input type="radio" value="foo" v-model="bar">`).code,
  154. ).toMatchInlineSnapshot(`
  155. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  156. return function ssrRender(_ctx, _push, _parent, _attrs) {
  157. _push(\`<div\${
  158. _ssrRenderAttrs(_attrs)
  159. }><input type="radio" value="foo"\${
  160. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.bar, "foo"))) ? " checked" : ""
  161. }></div>\`)
  162. }"
  163. `)
  164. })
  165. test('<input type="checkbox">', () => {
  166. expect(compileWithWrapper(`<input type="checkbox" v-model="bar">`).code)
  167. .toMatchInlineSnapshot(`
  168. "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  169. return function ssrRender(_ctx, _push, _parent, _attrs) {
  170. _push(\`<div\${
  171. _ssrRenderAttrs(_attrs)
  172. }><input type="checkbox"\${
  173. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
  174. ? _ssrLooseContain(_ctx.bar, null)
  175. : _ctx.bar)) ? " checked" : ""
  176. }></div>\`)
  177. }"
  178. `)
  179. expect(
  180. compileWithWrapper(`<input type="checkbox" value="foo" v-model="bar">`)
  181. .code,
  182. ).toMatchInlineSnapshot(`
  183. "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  184. return function ssrRender(_ctx, _push, _parent, _attrs) {
  185. _push(\`<div\${
  186. _ssrRenderAttrs(_attrs)
  187. }><input type="checkbox" value="foo"\${
  188. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
  189. ? _ssrLooseContain(_ctx.bar, "foo")
  190. : _ctx.bar)) ? " checked" : ""
  191. }></div>\`)
  192. }"
  193. `)
  194. expect(
  195. compileWithWrapper(
  196. `<input type="checkbox" :true-value="foo" :false-value="bar" v-model="baz">`,
  197. ).code,
  198. ).toMatchInlineSnapshot(`
  199. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  200. return function ssrRender(_ctx, _push, _parent, _attrs) {
  201. _push(\`<div\${
  202. _ssrRenderAttrs(_attrs)
  203. }><input type="checkbox"\${
  204. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, _ctx.foo))) ? " checked" : ""
  205. }></div>\`)
  206. }"
  207. `)
  208. expect(
  209. compileWithWrapper(
  210. `<input type="checkbox" true-value="foo" false-value="bar" v-model="baz">`,
  211. ).code,
  212. ).toMatchInlineSnapshot(`
  213. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  214. return function ssrRender(_ctx, _push, _parent, _attrs) {
  215. _push(\`<div\${
  216. _ssrRenderAttrs(_attrs)
  217. }><input type="checkbox"\${
  218. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, "foo"))) ? " checked" : ""
  219. }></div>\`)
  220. }"
  221. `)
  222. })
  223. test('<textarea>', () => {
  224. expect(compileWithWrapper(`<textarea v-model="foo">bar</textarea>`).code)
  225. .toMatchInlineSnapshot(`
  226. "const { ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require("vue/server-renderer")
  227. return function ssrRender(_ctx, _push, _parent, _attrs) {
  228. _push(\`<div\${
  229. _ssrRenderAttrs(_attrs)
  230. }><textarea>\${
  231. _ssrInterpolate(_ctx.foo)
  232. }</textarea></div>\`)
  233. }"
  234. `)
  235. })
  236. test('<input :type="x">', () => {
  237. expect(compileWithWrapper(`<input :type="x" v-model="foo">`).code)
  238. .toMatchInlineSnapshot(`
  239. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  240. return function ssrRender(_ctx, _push, _parent, _attrs) {
  241. _push(\`<div\${
  242. _ssrRenderAttrs(_attrs)
  243. }><input\${
  244. _ssrRenderAttr("type", _ctx.x)
  245. }\${
  246. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, null)
  247. }></div>\`)
  248. }"
  249. `)
  250. expect(
  251. compileWithWrapper(`<input :type="x" v-model="foo" value="bar">`).code,
  252. ).toMatchInlineSnapshot(`
  253. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  254. return function ssrRender(_ctx, _push, _parent, _attrs) {
  255. _push(\`<div\${
  256. _ssrRenderAttrs(_attrs)
  257. }><input\${
  258. _ssrRenderAttr("type", _ctx.x)
  259. }\${
  260. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, "bar")
  261. } value="bar"></div>\`)
  262. }"
  263. `)
  264. expect(
  265. compileWithWrapper(`<input :type="x" v-model="foo" :value="bar">`).code,
  266. ).toMatchInlineSnapshot(`
  267. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  268. return function ssrRender(_ctx, _push, _parent, _attrs) {
  269. _push(\`<div\${
  270. _ssrRenderAttrs(_attrs)
  271. }><input\${
  272. _ssrRenderAttr("type", _ctx.x)
  273. }\${
  274. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, _ctx.bar)
  275. }\${
  276. _ssrRenderAttr("value", _ctx.bar)
  277. }></div>\`)
  278. }"
  279. `)
  280. })
  281. test('<input v-bind="obj">', () => {
  282. expect(compileWithWrapper(`<input v-bind="obj" v-model="foo">`).code)
  283. .toMatchInlineSnapshot(`
  284. "const { mergeProps: _mergeProps } = require("vue")
  285. const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require("vue/server-renderer")
  286. return function ssrRender(_ctx, _push, _parent, _attrs) {
  287. let _temp0
  288. _push(\`<div\${
  289. _ssrRenderAttrs(_attrs)
  290. }><input\${
  291. _ssrRenderAttrs((_temp0 = _ctx.obj, _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
  292. }></div>\`)
  293. }"
  294. `)
  295. expect(
  296. compileWithWrapper(`<input id="x" v-bind="obj" v-model="foo" class="y">`)
  297. .code,
  298. ).toMatchInlineSnapshot(`
  299. "const { mergeProps: _mergeProps } = require("vue")
  300. const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require("vue/server-renderer")
  301. return function ssrRender(_ctx, _push, _parent, _attrs) {
  302. let _temp0
  303. _push(\`<div\${
  304. _ssrRenderAttrs(_attrs)
  305. }><input\${
  306. _ssrRenderAttrs((_temp0 = _mergeProps({ id: "x" }, _ctx.obj, { class: "y" }), _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
  307. }></div>\`)
  308. }"
  309. `)
  310. })
  311. })