webStream.spec.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { createApp, defineAsyncComponent, h } from 'vue'
  2. import { ReadableStream, TransformStream } from 'node:stream/web'
  3. import { pipeToWebWritable, renderToWebStream } from '../src'
  4. beforeEach(() => {
  5. // @ts-expect-error
  6. global.ReadableStream = ReadableStream
  7. })
  8. afterEach(() => {
  9. // @ts-expect-error
  10. delete global.ReadableStream
  11. })
  12. test('renderToWebStream', async () => {
  13. const Async = defineAsyncComponent(() =>
  14. Promise.resolve({
  15. render: () => h('div', 'async'),
  16. }),
  17. )
  18. const App = {
  19. render: () => [h('div', 'parent'), h(Async)],
  20. }
  21. const stream = renderToWebStream(createApp(App))
  22. const reader = stream.getReader()
  23. const decoder = new TextDecoder()
  24. let res = ''
  25. await reader.read().then(function read({ done, value }): any {
  26. if (!done) {
  27. res += decoder.decode(value)
  28. return reader.read().then(read)
  29. }
  30. })
  31. expect(res).toBe(`<!--[--><div>parent</div><div>async</div><!--]-->`)
  32. })
  33. test('pipeToWebWritable', async () => {
  34. const Async = defineAsyncComponent(() =>
  35. Promise.resolve({
  36. render: () => h('div', 'async'),
  37. }),
  38. )
  39. const App = {
  40. render: () => [h('div', 'parent'), h(Async)],
  41. }
  42. const { readable, writable } = new TransformStream()
  43. pipeToWebWritable(createApp(App), {}, writable as any)
  44. const reader = readable.getReader()
  45. const decoder = new TextDecoder()
  46. let res = ''
  47. await reader.read().then(function read({ done, value }): any {
  48. if (!done) {
  49. res += decoder.decode(value)
  50. return reader.read().then(read)
  51. }
  52. })
  53. expect(res).toBe(`<!--[--><div>parent</div><div>async</div><!--]-->`)
  54. })