ssrInjectCssVars.spec.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { BindingTypes } from '@vue/compiler-dom'
  2. import { compile } from '../src'
  3. describe('ssr: inject <style vars>', () => {
  4. test('basic', () => {
  5. expect(
  6. compile(`<div/>`, {
  7. ssrCssVars: `{ color }`,
  8. }).code,
  9. ).toMatchInlineSnapshot(`
  10. "const { mergeProps: _mergeProps } = require("vue")
  11. const { ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  12. return function ssrRender(_ctx, _push, _parent, _attrs) {
  13. const _cssVars = { style: { color: _ctx.color }}
  14. _push(\`<div\${_ssrRenderAttrs(_mergeProps(_attrs, _cssVars))}></div>\`)
  15. }"
  16. `)
  17. })
  18. test('fragment', () => {
  19. expect(
  20. compile(`<div/><div/>`, {
  21. ssrCssVars: `{ color }`,
  22. }).code,
  23. ).toMatchInlineSnapshot(`
  24. "const { ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  25. return function ssrRender(_ctx, _push, _parent, _attrs) {
  26. const _cssVars = { style: { color: _ctx.color }}
  27. _push(\`<!--[--><div\${
  28. _ssrRenderAttrs(_cssVars)
  29. }></div><div\${
  30. _ssrRenderAttrs(_cssVars)
  31. }></div><!--]-->\`)
  32. }"
  33. `)
  34. })
  35. test('passing on to components', () => {
  36. expect(
  37. compile(`<div/><foo/>`, {
  38. ssrCssVars: `{ color }`,
  39. }).code,
  40. ).toMatchInlineSnapshot(`
  41. "const { resolveComponent: _resolveComponent } = require("vue")
  42. const { ssrRenderAttrs: _ssrRenderAttrs, ssrRenderComponent: _ssrRenderComponent } = require("vue/server-renderer")
  43. return function ssrRender(_ctx, _push, _parent, _attrs) {
  44. const _component_foo = _resolveComponent("foo")
  45. const _cssVars = { style: { color: _ctx.color }}
  46. _push(\`<!--[--><div\${_ssrRenderAttrs(_cssVars)}></div>\`)
  47. _push(_ssrRenderComponent(_component_foo, _cssVars, null, _parent))
  48. _push(\`<!--]-->\`)
  49. }"
  50. `)
  51. })
  52. test('v-if branches', () => {
  53. expect(
  54. compile(`<div v-if="ok"/><template v-else><div/><div/></template>`, {
  55. ssrCssVars: `{ color }`,
  56. }).code,
  57. ).toMatchInlineSnapshot(`
  58. "const { mergeProps: _mergeProps } = require("vue")
  59. const { ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
  60. return function ssrRender(_ctx, _push, _parent, _attrs) {
  61. const _cssVars = { style: { color: _ctx.color }}
  62. if (_ctx.ok) {
  63. _push(\`<div\${_ssrRenderAttrs(_mergeProps(_attrs, _cssVars))}></div>\`)
  64. } else {
  65. _push(\`<!--[--><div\${
  66. _ssrRenderAttrs(_cssVars)
  67. }></div><div\${
  68. _ssrRenderAttrs(_cssVars)
  69. }></div><!--]-->\`)
  70. }
  71. }"
  72. `)
  73. })
  74. test('w/ suspense', () => {
  75. expect(
  76. compile(
  77. `<Suspense>
  78. <div>ok</div>
  79. <template #fallback>
  80. <div>fallback</div>
  81. </template>
  82. </Suspense>`,
  83. {
  84. ssrCssVars: `{ color }`,
  85. },
  86. ).code,
  87. ).toMatchInlineSnapshot(`
  88. "const { withCtx: _withCtx } = require("vue")
  89. const { ssrRenderAttrs: _ssrRenderAttrs, ssrRenderSuspense: _ssrRenderSuspense } = require("vue/server-renderer")
  90. return function ssrRender(_ctx, _push, _parent, _attrs) {
  91. const _cssVars = { style: { color: _ctx.color }}
  92. _ssrRenderSuspense(_push, {
  93. fallback: () => {
  94. _push(\`<div\${_ssrRenderAttrs(_cssVars)}>fallback</div>\`)
  95. },
  96. default: () => {
  97. _push(\`<div\${_ssrRenderAttrs(_cssVars)}>ok</div>\`)
  98. },
  99. _: 1 /* STABLE */
  100. })
  101. }"
  102. `)
  103. })
  104. test('inject helpers', () => {
  105. const result = compile(`<div/>`, {
  106. inline: true,
  107. bindingMetadata: { dynamic: BindingTypes.SETUP_MAYBE_REF },
  108. ssrCssVars: '{ "--hash": (dynamic) }',
  109. })
  110. expect(result.code).toMatchInlineSnapshot(`
  111. "(_ctx, _push, _parent, _attrs) => {
  112. const _cssVars = { style: { "--hash": (_unref(dynamic)) }}
  113. _push(\`<div\${_ssrRenderAttrs(_mergeProps(_attrs, _cssVars))}></div>\`)
  114. }"
  115. `)
  116. expect(result.ast.helpers).toMatchInlineSnapshot(`
  117. Set {
  118. Symbol(mergeProps),
  119. Symbol(unref),
  120. }
  121. `)
  122. })
  123. })