import { renderToString } from 'react-dom/server'; import * as React from 'react'; import { ServerStyleSheet } from 'styled-components'; import { Redoc, createStore } from '../../'; import { readFileSync } from 'fs'; import { resolve } from 'path'; const yaml = require('js-yaml'); const http = require('http'); const fs = require('fs'); const PORT = 9999; const server = http.createServer(async (request, response) => { console.time('request ' + request.url); if (request.url === '/redoc.standalone.js') { fs.createReadStream('bundles/redoc.standalone.js', 'utf8').pipe(response); } else if (request.url === '/') { const spec = yaml.load(readFileSync(resolve(__dirname, '../openapi.yaml'), 'utf-8')); const store = await createStore(spec, 'path/to/spec.yaml'); const sheet = new ServerStyleSheet(); const html = renderToString(sheet.collectStyles(React.createElement(Redoc, { store }))); const css = sheet.getStyleTags(); const res = `<html> <head> <meta charset="utf8" /> <title>ReDoc</title> <!-- needed for adaptive design --> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> body { padding: 0; margin: 0; } </style> <script src="redoc.standalone.js"></script> <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet"> ${css} </head> <body> <script> document.addEventListener('DOMContentLoaded', function() { const state = ${JSON.stringify(await store.toJS())}; Redoc.hydrate(state, document.getElementById('redoc')); }); </script> <div id="redoc">${html}</div> </body> </html>`; response.writeHead(200, { 'Content-Length': res.length }); response.write(res); response.end(); } else { response.writeHead(404); response.write('Not found'); response.end(); } console.timeEnd('request ' + request.url); }); server.listen(PORT, () => console.log(`Server started: http://127.0.0.1:${PORT}`));