ssrSlotOutlet.spec.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import { compile } from '../src'
  2. import { SSR_RENDER_SLOT_INNER, ssrHelpers } from '../src/runtimeHelpers'
  3. describe('ssr: <slot>', () => {
  4. test('basic', () => {
  5. expect(compile(`<slot/>`).code).toMatchInlineSnapshot(`
  6. "const { ssrRenderSlot: _ssrRenderSlot } = require("vue/server-renderer")
  7. return function ssrRender(_ctx, _push, _parent, _attrs) {
  8. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
  9. }"
  10. `)
  11. })
  12. test('with name', () => {
  13. expect(compile(`<slot name="foo" />`).code).toMatchInlineSnapshot(`
  14. "const { ssrRenderSlot: _ssrRenderSlot } = require("vue/server-renderer")
  15. return function ssrRender(_ctx, _push, _parent, _attrs) {
  16. _ssrRenderSlot(_ctx.$slots, "foo", {}, null, _push, _parent)
  17. }"
  18. `)
  19. })
  20. test('with dynamic name', () => {
  21. expect(compile(`<slot :name="bar.baz" />`).code).toMatchInlineSnapshot(`
  22. "const { ssrRenderSlot: _ssrRenderSlot } = require("vue/server-renderer")
  23. return function ssrRender(_ctx, _push, _parent, _attrs) {
  24. _ssrRenderSlot(_ctx.$slots, _ctx.bar.baz, {}, null, _push, _parent)
  25. }"
  26. `)
  27. })
  28. test('with props', () => {
  29. expect(compile(`<slot name="foo" :p="1" bar="2" />`).code)
  30. .toMatchInlineSnapshot(`
  31. "const { ssrRenderSlot: _ssrRenderSlot } = require("vue/server-renderer")
  32. return function ssrRender(_ctx, _push, _parent, _attrs) {
  33. _ssrRenderSlot(_ctx.$slots, "foo", {
  34. p: 1,
  35. bar: "2"
  36. }, null, _push, _parent)
  37. }"
  38. `)
  39. })
  40. test('with fallback', () => {
  41. expect(compile(`<slot>some {{ fallback }} content</slot>`).code)
  42. .toMatchInlineSnapshot(`
  43. "const { ssrRenderSlot: _ssrRenderSlot, ssrInterpolate: _ssrInterpolate } = require("vue/server-renderer")
  44. return function ssrRender(_ctx, _push, _parent, _attrs) {
  45. _ssrRenderSlot(_ctx.$slots, "default", {}, () => {
  46. _push(\`some \${_ssrInterpolate(_ctx.fallback)} content\`)
  47. }, _push, _parent)
  48. }"
  49. `)
  50. })
  51. test('with scopeId', async () => {
  52. expect(
  53. compile(`<slot/>`, {
  54. scopeId: 'hello',
  55. }).code,
  56. ).toMatchInlineSnapshot(`
  57. "const { ssrRenderSlot: _ssrRenderSlot } = require("vue/server-renderer")
  58. return function ssrRender(_ctx, _push, _parent, _attrs) {
  59. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent, "hello-s")
  60. }"
  61. `)
  62. })
  63. test('with scopeId + slotted:false', async () => {
  64. expect(
  65. compile(`<slot/>`, {
  66. scopeId: 'hello',
  67. slotted: false,
  68. }).code,
  69. ).toMatchInlineSnapshot(`
  70. "const { ssrRenderSlot: _ssrRenderSlot } = require("vue/server-renderer")
  71. return function ssrRender(_ctx, _push, _parent, _attrs) {
  72. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent)
  73. }"
  74. `)
  75. })
  76. test('with forwarded scopeId', async () => {
  77. expect(
  78. compile(`<Comp><slot/></Comp>`, {
  79. scopeId: 'hello',
  80. }).code,
  81. ).toMatchInlineSnapshot(`
  82. "const { resolveComponent: _resolveComponent, withCtx: _withCtx, renderSlot: _renderSlot } = require("vue")
  83. const { ssrRenderSlot: _ssrRenderSlot, ssrRenderComponent: _ssrRenderComponent } = require("vue/server-renderer")
  84. return function ssrRender(_ctx, _push, _parent, _attrs) {
  85. const _component_Comp = _resolveComponent("Comp")
  86. _push(_ssrRenderComponent(_component_Comp, _attrs, {
  87. default: _withCtx((_, _push, _parent, _scopeId) => {
  88. if (_push) {
  89. _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent, "hello-s" + _scopeId)
  90. } else {
  91. return [
  92. _renderSlot(_ctx.$slots, "default")
  93. ]
  94. }
  95. }),
  96. _: 3 /* FORWARDED */
  97. }, _parent))
  98. }"
  99. `)
  100. })
  101. test('inside transition', () => {
  102. const { code } = compile(`<transition><slot/></transition>`)
  103. expect(code).toMatch(ssrHelpers[SSR_RENDER_SLOT_INNER])
  104. expect(code).toMatchInlineSnapshot(`
  105. "const { ssrRenderSlotInner: _ssrRenderSlotInner } = require("vue/server-renderer")
  106. return function ssrRender(_ctx, _push, _parent, _attrs) {
  107. _ssrRenderSlotInner(_ctx.$slots, "default", {}, null, _push, _parent, null, true)
  108. }"
  109. `)
  110. })
  111. test('inside transition-group', () => {
  112. const { code } = compile(
  113. `<TransitionGroup tag="div"><slot/></TransitionGroup>`,
  114. )
  115. expect(code).toMatch(ssrHelpers[SSR_RENDER_SLOT_INNER])
  116. expect(code).toMatchInlineSnapshot(`
  117. "const { ssrRenderSlotInner: _ssrRenderSlotInner, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  118. return function ssrRender(_ctx, _push, _parent, _attrs) {
  119. _push(\`<div\${_ssrRenderAttrs(_attrs)}>\`)
  120. _ssrRenderSlotInner(_ctx.$slots, "default", {}, null, _push, _parent, null, true)
  121. _push(\`</div>\`)
  122. }"
  123. `)
  124. })
  125. test('with v-if inside transition', () => {
  126. const { code } = compile(`<transition><slot v-if="true"/></transition>`)
  127. expect(code).toMatch(ssrHelpers[SSR_RENDER_SLOT_INNER])
  128. expect(code).toMatchInlineSnapshot(`
  129. "const { ssrRenderSlotInner: _ssrRenderSlotInner } = require("vue/server-renderer")
  130. return function ssrRender(_ctx, _push, _parent, _attrs) {
  131. if (true) {
  132. _ssrRenderSlotInner(_ctx.$slots, "default", {}, null, _push, _parent, null, true)
  133. } else {
  134. _push(\`<!---->\`)
  135. }
  136. }"
  137. `)
  138. })
  139. })