ssrVModel.spec.ts 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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('<input type="radio">', () => {
  31. expect(
  32. compileWithWrapper(`<input type="radio" value="foo" v-model="bar">`).code
  33. ).toMatchInlineSnapshot(`
  34. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  35. return function ssrRender(_ctx, _push, _parent, _attrs) {
  36. _push(\`<div\${
  37. _ssrRenderAttrs(_attrs)
  38. }><input type=\\"radio\\" value=\\"foo\\"\${
  39. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.bar, \\"foo\\"))) ? \\" checked\\" : \\"\\"
  40. }></div>\`)
  41. }"
  42. `)
  43. })
  44. test('<input type="checkbox">', () => {
  45. expect(compileWithWrapper(`<input type="checkbox" v-model="bar">`).code)
  46. .toMatchInlineSnapshot(`
  47. "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  48. return function ssrRender(_ctx, _push, _parent, _attrs) {
  49. _push(\`<div\${
  50. _ssrRenderAttrs(_attrs)
  51. }><input type=\\"checkbox\\"\${
  52. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
  53. ? _ssrLooseContain(_ctx.bar, null)
  54. : _ctx.bar)) ? \\" checked\\" : \\"\\"
  55. }></div>\`)
  56. }"
  57. `)
  58. expect(
  59. compileWithWrapper(`<input type="checkbox" value="foo" v-model="bar">`)
  60. .code
  61. ).toMatchInlineSnapshot(`
  62. "const { ssrLooseContain: _ssrLooseContain, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  63. return function ssrRender(_ctx, _push, _parent, _attrs) {
  64. _push(\`<div\${
  65. _ssrRenderAttrs(_attrs)
  66. }><input type=\\"checkbox\\" value=\\"foo\\"\${
  67. (_ssrIncludeBooleanAttr((Array.isArray(_ctx.bar))
  68. ? _ssrLooseContain(_ctx.bar, \\"foo\\")
  69. : _ctx.bar)) ? \\" checked\\" : \\"\\"
  70. }></div>\`)
  71. }"
  72. `)
  73. expect(
  74. compileWithWrapper(
  75. `<input type="checkbox" :true-value="foo" :false-value="bar" v-model="baz">`
  76. ).code
  77. ).toMatchInlineSnapshot(`
  78. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  79. return function ssrRender(_ctx, _push, _parent, _attrs) {
  80. _push(\`<div\${
  81. _ssrRenderAttrs(_attrs)
  82. }><input type=\\"checkbox\\"\${
  83. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, _ctx.foo))) ? \\" checked\\" : \\"\\"
  84. }></div>\`)
  85. }"
  86. `)
  87. expect(
  88. compileWithWrapper(
  89. `<input type="checkbox" true-value="foo" false-value="bar" v-model="baz">`
  90. ).code
  91. ).toMatchInlineSnapshot(`
  92. "const { ssrLooseEqual: _ssrLooseEqual, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  93. return function ssrRender(_ctx, _push, _parent, _attrs) {
  94. _push(\`<div\${
  95. _ssrRenderAttrs(_attrs)
  96. }><input type=\\"checkbox\\"\${
  97. (_ssrIncludeBooleanAttr(_ssrLooseEqual(_ctx.baz, \\"foo\\"))) ? \\" checked\\" : \\"\\"
  98. }></div>\`)
  99. }"
  100. `)
  101. })
  102. test('<textarea>', () => {
  103. expect(compileWithWrapper(`<textarea v-model="foo">bar</textarea>`).code)
  104. .toMatchInlineSnapshot(`
  105. "const { ssrRenderAttrs: _ssrRenderAttrs, ssrInterpolate: _ssrInterpolate } = require(\\"vue/server-renderer\\")
  106. return function ssrRender(_ctx, _push, _parent, _attrs) {
  107. _push(\`<div\${
  108. _ssrRenderAttrs(_attrs)
  109. }><textarea>\${
  110. _ssrInterpolate(_ctx.foo)
  111. }</textarea></div>\`)
  112. }"
  113. `)
  114. })
  115. test('<input :type="x">', () => {
  116. expect(compileWithWrapper(`<input :type="x" v-model="foo">`).code)
  117. .toMatchInlineSnapshot(`
  118. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  119. return function ssrRender(_ctx, _push, _parent, _attrs) {
  120. _push(\`<div\${
  121. _ssrRenderAttrs(_attrs)
  122. }><input\${
  123. _ssrRenderAttr(\\"type\\", _ctx.x)
  124. }\${
  125. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, null)
  126. }></div>\`)
  127. }"
  128. `)
  129. expect(
  130. compileWithWrapper(`<input :type="x" v-model="foo" value="bar">`).code
  131. ).toMatchInlineSnapshot(`
  132. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  133. return function ssrRender(_ctx, _push, _parent, _attrs) {
  134. _push(\`<div\${
  135. _ssrRenderAttrs(_attrs)
  136. }><input\${
  137. _ssrRenderAttr(\\"type\\", _ctx.x)
  138. }\${
  139. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, \\"bar\\")
  140. } value=\\"bar\\"></div>\`)
  141. }"
  142. `)
  143. expect(
  144. compileWithWrapper(`<input :type="x" v-model="foo" :value="bar">`).code
  145. ).toMatchInlineSnapshot(`
  146. "const { ssrRenderAttr: _ssrRenderAttr, ssrRenderDynamicModel: _ssrRenderDynamicModel, ssrRenderAttrs: _ssrRenderAttrs } = require(\\"vue/server-renderer\\")
  147. return function ssrRender(_ctx, _push, _parent, _attrs) {
  148. _push(\`<div\${
  149. _ssrRenderAttrs(_attrs)
  150. }><input\${
  151. _ssrRenderAttr(\\"type\\", _ctx.x)
  152. }\${
  153. _ssrRenderDynamicModel(_ctx.x, _ctx.foo, _ctx.bar)
  154. }\${
  155. _ssrRenderAttr(\\"value\\", _ctx.bar)
  156. }></div>\`)
  157. }"
  158. `)
  159. })
  160. test('<input v-bind="obj">', () => {
  161. expect(compileWithWrapper(`<input v-bind="obj" v-model="foo">`).code)
  162. .toMatchInlineSnapshot(`
  163. "const { mergeProps: _mergeProps } = require(\\"vue\\")
  164. const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require(\\"vue/server-renderer\\")
  165. return function ssrRender(_ctx, _push, _parent, _attrs) {
  166. let _temp0
  167. _push(\`<div\${
  168. _ssrRenderAttrs(_attrs)
  169. }><input\${
  170. _ssrRenderAttrs((_temp0 = _ctx.obj, _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
  171. }></div>\`)
  172. }"
  173. `)
  174. expect(
  175. compileWithWrapper(`<input id="x" v-bind="obj" v-model="foo" class="y">`)
  176. .code
  177. ).toMatchInlineSnapshot(`
  178. "const { mergeProps: _mergeProps } = require(\\"vue\\")
  179. const { ssrRenderAttrs: _ssrRenderAttrs, ssrGetDynamicModelProps: _ssrGetDynamicModelProps } = require(\\"vue/server-renderer\\")
  180. return function ssrRender(_ctx, _push, _parent, _attrs) {
  181. let _temp0
  182. _push(\`<div\${
  183. _ssrRenderAttrs(_attrs)
  184. }><input\${
  185. _ssrRenderAttrs((_temp0 = _mergeProps({ id: \\"x\\" }, _ctx.obj, { class: \\"y\\" }), _mergeProps(_temp0, _ssrGetDynamicModelProps(_temp0, _ctx.foo))))
  186. }></div>\`)
  187. }"
  188. `)
  189. })
  190. })