1. /**
    
  2.  * Copyright (c) Meta Platforms, Inc. and affiliates.
    
  3.  *
    
  4.  * This source code is licensed under the MIT license found in the
    
  5.  * LICENSE file in the root directory of this source tree.
    
  6.  *
    
  7.  * @emails react-core
    
  8.  */
    
  9. 
    
  10. 'use strict';
    
  11. 
    
  12. // Polyfills for test environment
    
  13. global.ReadableStream =
    
  14.   require('web-streams-polyfill/ponyfill/es6').ReadableStream;
    
  15. global.TextEncoder = require('util').TextEncoder;
    
  16. global.TextDecoder = require('util').TextDecoder;
    
  17. 
    
  18. // Don't wait before processing work on the server.
    
  19. // TODO: we can replace this with FlightServer.act().
    
  20. global.setTimeout = cb => cb();
    
  21. 
    
  22. let clientExports;
    
  23. let turbopackMap;
    
  24. let turbopackModules;
    
  25. let React;
    
  26. let ReactDOMServer;
    
  27. let ReactServerDOMServer;
    
  28. let ReactServerDOMClient;
    
  29. let use;
    
  30. 
    
  31. describe('ReactFlightDOMEdge', () => {
    
  32.   beforeEach(() => {
    
  33.     jest.resetModules();
    
  34. 
    
  35.     // Simulate the condition resolution
    
  36.     jest.mock('react', () => require('react/react.shared-subset'));
    
  37.     jest.mock('react-server-dom-turbopack/server', () =>
    
  38.       require('react-server-dom-turbopack/server.edge'),
    
  39.     );
    
  40. 
    
  41.     const TurbopackMock = require('./utils/TurbopackMock');
    
  42.     clientExports = TurbopackMock.clientExports;
    
  43.     turbopackMap = TurbopackMock.turbopackMap;
    
  44.     turbopackModules = TurbopackMock.turbopackModules;
    
  45. 
    
  46.     ReactServerDOMServer = require('react-server-dom-turbopack/server.edge');
    
  47. 
    
  48.     jest.resetModules();
    
  49.     __unmockReact();
    
  50. 
    
  51.     React = require('react');
    
  52.     ReactDOMServer = require('react-dom/server.edge');
    
  53.     ReactServerDOMClient = require('react-server-dom-turbopack/client.edge');
    
  54.     use = React.use;
    
  55.   });
    
  56. 
    
  57.   async function readResult(stream) {
    
  58.     const reader = stream.getReader();
    
  59.     let result = '';
    
  60.     while (true) {
    
  61.       const {done, value} = await reader.read();
    
  62.       if (done) {
    
  63.         return result;
    
  64.       }
    
  65.       result += Buffer.from(value).toString('utf8');
    
  66.     }
    
  67.   }
    
  68. 
    
  69.   it('should allow an alternative module mapping to be used for SSR', async () => {
    
  70.     function ClientComponent() {
    
  71.       return <span>Client Component</span>;
    
  72.     }
    
  73.     // The Client build may not have the same IDs as the Server bundles for the same
    
  74.     // component.
    
  75.     const ClientComponentOnTheClient = clientExports(ClientComponent);
    
  76.     const ClientComponentOnTheServer = clientExports(ClientComponent);
    
  77. 
    
  78.     // In the SSR bundle this module won't exist. We simulate this by deleting it.
    
  79.     const clientId = turbopackMap[ClientComponentOnTheClient.$$id].id;
    
  80.     delete turbopackModules[clientId];
    
  81. 
    
  82.     // Instead, we have to provide a translation from the client meta data to the SSR
    
  83.     // meta data.
    
  84.     const ssrMetadata = turbopackMap[ClientComponentOnTheServer.$$id];
    
  85.     const translationMap = {
    
  86.       [clientId]: {
    
  87.         '*': ssrMetadata,
    
  88.       },
    
  89.     };
    
  90. 
    
  91.     function App() {
    
  92.       return <ClientComponentOnTheClient />;
    
  93.     }
    
  94. 
    
  95.     const stream = ReactServerDOMServer.renderToReadableStream(
    
  96.       <App />,
    
  97.       turbopackMap,
    
  98.     );
    
  99.     const response = ReactServerDOMClient.createFromReadableStream(stream, {
    
  100.       ssrManifest: {
    
  101.         moduleMap: translationMap,
    
  102.         moduleLoading: null,
    
  103.       },
    
  104.     });
    
  105. 
    
  106.     function ClientRoot() {
    
  107.       return use(response);
    
  108.     }
    
  109. 
    
  110.     const ssrStream = await ReactDOMServer.renderToReadableStream(
    
  111.       <ClientRoot />,
    
  112.     );
    
  113.     const result = await readResult(ssrStream);
    
  114.     expect(result).toEqual('<span>Client Component</span>');
    
  115.   });
    
  116. });