{"version":3,"file":"index.mjs","sources":["../src/assetUtil.js","../src/serverRenderer.js","../src/index.js"],"sourcesContent":["function normalizeAssets(assets) {\n  return Array.isArray(assets) ? assets : [assets];\n}\n\nexport function generateAssets({ expressCtx, assetUrl }) {\n  let vendor;\n  let app;\n  let appStyle;\n  let vendorStyle;\n\n  if (process.env.NODE_ENV === 'development') {\n    let devAssets = {\n      appJs: '',\n      vendorJs: '',\n      appCss: ''\n    };\n    const assetsByChunkName = expressCtx.res.locals.webpackStats.toJson()\n      .assetsByChunkName;\n    devAssets.appJs = normalizeAssets(assetsByChunkName.app).find(f =>\n      /^app(\\.[a-z0-9]+)?\\.js$/.test(f)\n    );\n    devAssets.appCss = normalizeAssets(assetsByChunkName.app).find(f =>\n      /^app(\\.[a-z0-9]+)?\\.css$/.test(f)\n    );\n    devAssets.vendorJs = normalizeAssets(assetsByChunkName['vendor~app']).find(\n      f => /^vendor(\\.[a-z0-9]+)?\\.js$/.test(f)\n    );\n    devAssets.vendorCss = normalizeAssets(assetsByChunkName['vendor~app']).find(\n      f => /^vendor(\\.[a-z0-9]+)?\\.css$/.test(f)\n    );\n\n    vendor = assetUrl + devAssets.vendorJs;\n    app = assetUrl + devAssets.appJs;\n    appStyle = devAssets.appCss ? assetUrl + devAssets.appCss : null;\n    vendorStyle = devAssets.vendorCss ? assetUrl + devAssets.vendorCss : null;\n  } else {\n    const path = require('path');\n    const cwd = process.cwd();\n    const manifest = require(path.resolve(cwd, 'dist/build-manifest.json'));\n    vendor = manifest['vendor~app.js'];\n    app = manifest['app.js'];\n    appStyle = manifest['app.css'];\n    vendorStyle = manifest['vendor~app.css'];\n  }\n\n  return {\n    vendor,\n    app,\n    appStyle,\n    vendorStyle\n  };\n}\n","import React from 'react';\nimport serialize from 'serialize-javascript';\nimport { StaticRouter } from 'react-router-dom';\nimport { renderToString } from 'react-dom/server';\nimport { Provider } from 'react-redux';\nimport { ChunkExtractor } from '@loadable/server';\n\nimport { HelmetProvider } from 'react-helmet-async';\nimport { ApolloProvider, getDataFromTree } from 'react-apollo';\nimport { generateAssets } from './assetUtil';\n\nlet app;\nlet vendor;\nlet appStyle;\nlet vendorStyle;\n\nconst fs = require('fs');\nconst path = require('path');\nconst cwd = process.cwd();\nfunction resolveCwd(name) {\n  return path.resolve(cwd, name);\n}\n\nexport default async ({\n  expressCtx,\n  store,\n  context,\n  onRender,\n  mapAppString = str => str,\n  assetUrl = '/',\n  createApolloClient,\n  template = {\n    renderBottom: () => ''\n  }\n}) => {\n  const reqUrl = expressCtx.req.url;\n  const shell = typeof expressCtx.req.query['rkit-shell'] !== 'undefined';\n\n  const assetData = generateAssets({ expressCtx, assetUrl });\n  vendor = assetData.vendor;\n  app = assetData.app;\n  appStyle = assetData.appStyle;\n  vendorStyle = assetData.vendorStyle;\n\n  const appStyleTag = appStyle\n    ? `<link rel='stylesheet' href='${appStyle}'>`\n    : '';\n  const vendorStyleTag = vendorStyle\n    ? `<link rel='stylesheet' href='${vendorStyle}'>`\n    : '';\n  let dllScript = '';\n\n  if (process.env.NODE_ENV === 'development') {\n    if (fs.existsSync(resolveCwd('dist/vendorDll.js'))) {\n      dllScript = `<script src='${assetUrl}vendorDll.js'></script>`;\n    }\n  }\n\n  const elementData = onRender({ expressCtx, store });\n  const promiseOfEl =\n    elementData instanceof Promise ? elementData : Promise.resolve(elementData);\n  const reactEl = await promiseOfEl;\n  let helmetCtx = {};\n\n  const BasicApp = () => (\n    <HelmetProvider context={helmetCtx}>\n      <Provider store={store}>\n        <StaticRouter location={reqUrl} context={context}>\n          {reactEl}\n        </StaticRouter>\n      </Provider>\n    </HelmetProvider>\n  );\n  let App = BasicApp;\n\n  let apolloClient;\n  let apolloScript = '';\n  if (createApolloClient) {\n    apolloClient = createApolloClient(expressCtx);\n    App = () => (\n      <ApolloProvider client={apolloClient}>\n        <BasicApp />\n      </ApolloProvider>\n    );\n\n    if (process.env.NODE_ENV === 'development') {\n      console.log('=> Apollo client detected on server.');\n    }\n  }\n\n  const appEl = <App />;\n  return getDataFromTree(appEl)\n    .then(() => {\n      return renderApp();\n    })\n    .catch(err => {\n      return renderApp(err);\n    });\n\n  async function renderApp(apolloErr) {\n    const statsFile = resolveCwd('dist/loadable-stats.json');\n    const extractor = new ChunkExtractor({ statsFile, entrypoints: ['app'] });\n    const jsx = extractor.collectChunks(appEl);\n    let content = mapAppString(renderToString(jsx));\n\n    const { helmet } = helmetCtx;\n\n    if (apolloClient) {\n      const cacheStr = serialize(apolloClient.extract());\n      apolloScript = `<script type=\"text/javascript\">window.__APOLLO_STATE__ = ${cacheStr};</script>`;\n    }\n\n    let helmetTitle = helmet.title.toString();\n    let helmetMeta = helmet.meta.toString();\n    let helmetLink = helmet.link.toString();\n    let helmetScript = helmet.script.toString();\n    let initScript = `<script type=\"text/javascript\">window.INITIAL_STATE = ${serialize(\n      store.getState()\n    )};</script>`;\n\n    if (shell) {\n      content = '';\n      helmetTitle = '';\n      helmetLink = '';\n      helmetMeta = '';\n      helmetScript = '';\n      apolloScript = '';\n      initScript = '';\n    }\n\n    let html = `<!doctype html>\n    <html>\n    <head>\n      ${helmetTitle}\n      <meta name=\"mobile-web-app-capable\" content=\"yes\">\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\" />\n      ${[\n        helmetMeta,\n        vendorStyleTag,\n        appStyleTag,\n        extractor.getLinkTags(),\n        extractor.getStyleTags(),\n        helmetLink\n      ]\n        .filter(s => s !== '')\n        .join('\\n')}\n    </head>\n    <body>\n      <div id=\"root\">${content}</div>\n      ${[helmetScript, template.renderBottom({ expressCtx, store })]\n        .filter(s => s !== '')\n        .join('\\n')}\n      <script type=\"text/javascript\">window.__shell__ = ${shell};</script>\n      ${[initScript, apolloScript, dllScript, extractor.getScriptTags()]\n        .filter(s => s !== '')\n        .join('\\n')}\n    </body>\n    </html>`;\n    return { html, apolloErr };\n  }\n};\n","import express from 'express';\nimport morgan from 'morgan';\nimport path from 'path';\n\nimport serverRender from './serverRenderer';\n\nexport function createRouter() {\n  return express.Router();\n}\n\nexport function createReactServer(config) {\n  const {\n    createStore,\n    getInitialData,\n    homePath,\n    handleGqlError = () => 500,\n    customMiddleware = () => {}\n  } = config;\n  let context;\n  const app = express();\n  const loggerEnv = process.env.NODE_ENV === 'development' ? 'dev' : 'combined';\n  const logger = morgan(loggerEnv, {\n    skip: function(req, res) {\n      if (process.env.NODE_ENV === 'development') {\n        return false;\n      }\n      return res.statusCode < 400;\n    }\n  });\n\n  app.use(logger);\n\n  if (process.env.NODE_ENV === 'development') {\n    const { devMiddleware } = require('@finfe/react-kits/lib/express-dev');\n    devMiddleware(app);\n  }\n\n  app.set('view engine', 'ejs');\n  const ampPath =\n    process.env.NODE_ENV === 'development' ? 'src/amp/views' : 'dist/views';\n  const ampV = path.resolve(process.cwd(), ampPath);\n  app.set('views', ampV);\n\n  app.use(homePath, express.static('dist'));\n  customMiddleware(app);\n  app.get(homePath + '(*)', (req, res) => {\n    const store = createStore();\n    // attach cookies to store object as a way to let cookies to be passed into server fetching\n    req.headers.cookie && (store['cookies'] = req.headers.cookie);\n    const promises = getInitialData(req, store);\n    Promise.all(promises)\n      .catch(err => {\n        console.error('Error getInitialData:\\n', err);\n      })\n      .then(() => {\n        context = {};\n        const data = {\n          ...config,\n          expressCtx: { req, res },\n          store,\n          context\n        };\n        return serverRender(data);\n      })\n      .then(({ html, apolloErr }) => {\n        if (apolloErr) {\n          console.error('Apollo ERR: ', apolloErr);\n          const status = handleGqlError({ req, res }, apolloErr);\n          return res.status(status).send(html);\n        }\n        if (context.status) {\n          console.log('Context status: ', context.status);\n          return res.status(context.status).send(html);\n        }\n        if (context.url) {\n          return res.redirect(302, context.url);\n        }\n        res.send(html);\n      })\n      .catch(err => {\n        console.error(err);\n        return res.sendStatus(500);\n      });\n  });\n\n  return app;\n}\n"],"names":["normalizeAssets","assets","Array","isArray","let","appStyle","vendorStyle","fs","require","path","cwd","process","resolveCwd","name","resolve","ref","str","renderBottom","renderApp","apolloErr","const","statsFile","extractor","ChunkExtractor","entrypoints","jsx","collectChunks","appEl","content","mapAppString","renderToString","apolloClient","cacheStr","serialize","extract","apolloScript","helmetTitle","helmet","title","toString","helmetMeta","meta","helmetLink","link","helmetScript","script","initScript","store","getState","shell","$return","vendorStyleTag","vendor","app","env","NODE_ENV","devAssets","appJs","vendorJs","appCss","assetsByChunkName","res","locals","webpackStats","toJson","find","f","test","vendorCss","assetUrl","manifest","dllScript","createRouter","express","Router","createReactServer","config","context","loggerEnv","logger","morgan","skip","req","statusCode","use","devMiddleware","set","ampPath","ampV","homePath","static","customMiddleware","get","createStore","headers","cookie","promises","getInitialData","Promise","all","catch","err","console","error","then","serverRender","Object","expressCtx","status","handleGqlError","send","html","log","url","redirect","sendStatus"],"mappings":"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"}