@zengenti/contensis-react-base 3.0.0-beta.45 → 3.0.0-beta.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -72,6 +72,7 @@ const DisplayStartupConfiguration = config => {
72
72
  console.log();
73
73
  console.log('Reverse proxy paths: ', JSON.stringify(config.reverseProxyPaths, null, 2));
74
74
  console.log();
75
+ if (config.staticFolderPath) console.log(`Serving static assets from: "/dist/${config.staticFolderPath}/"`);
75
76
  /* eslint-enable no-console */
76
77
  };
77
78
 
@@ -132,6 +133,7 @@ const replaceStaticPath = (str, staticFolderPath = 'static') => str.replace(/sta
132
133
  const bundleManipulationMiddleware = ({
133
134
  appRootPath,
134
135
  maxage,
136
+ staticFolderPath,
135
137
  staticRoutePath
136
138
  }) => (req, res, next) => {
137
139
  const filename = path__default["default"].basename(req.path);
@@ -139,7 +141,7 @@ const bundleManipulationMiddleware = ({
139
141
  const legacyBundle = filename.endsWith('.js');
140
142
 
141
143
  if ((legacyBundle || modernBundle) && filename.startsWith('runtime.')) {
142
- const jsRuntimeLocation = path__default["default"].resolve(appRootPath, `dist/static/${modernBundle ? 'modern/js' : 'legacy/js'}/${filename}`);
144
+ const jsRuntimeLocation = path__default["default"].resolve(appRootPath, `dist/${staticFolderPath}/${modernBundle ? 'modern/js' : 'legacy/js'}/${filename}`);
143
145
 
144
146
  try {
145
147
  const jsRuntimeBundle = fs__default["default"].readFileSync(jsRuntimeLocation, 'utf8');
@@ -169,13 +171,22 @@ const resolveStartupMiddleware = ({
169
171
  maxage,
170
172
  staticFolderPath,
171
173
  startupScriptFilename
172
- }) => (req, res, next) => {
174
+ }) => async (req, res, next) => {
173
175
  if (startupScriptFilename !== 'startup.js' && req.path === `/${startupScriptFilename}`) {
174
- const startupFilePath = `dist/${staticFolderPath}/startup.js`;
175
- const startupFileLocation = path__default["default"].resolve(appRootPath, startupFilePath);
176
- if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);
176
+ let startupFileLocation = '';
177
177
 
178
178
  try {
179
+ const startupFilePaths = [`dist/static/startup.js`, `dist/${staticFolderPath}/startup.js`];
180
+ let startupFilePath = '';
181
+ startupFilePaths.forEach(async testPath => {
182
+ try {
183
+ fs__default["default"].accessSync(testPath);
184
+ startupFilePath = testPath;
185
+ } catch (ex) {// Do nothing
186
+ }
187
+ });
188
+ startupFileLocation = path__default["default"].resolve(appRootPath, startupFilePath);
189
+ if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);
179
190
  res.sendFile(startupFileLocation);
180
191
  } catch (sendFileError) {
181
192
  // eslint-disable-next-line no-console
@@ -201,6 +212,7 @@ const staticAssets = (app, {
201
212
  // these maxage values are different in config but the same in runtime,
202
213
  // this one is the true value in seconds
203
214
  maxage: CacheDuration.static,
215
+ staticFolderPath,
204
216
  staticRoutePath
205
217
  }), resolveStartupMiddleware({
206
218
  appRootPath: appRootPath$1,
@@ -1 +1 @@
1
- {"version":3,"file":"contensis-react-base.js","sources":["../src/server/util/displayStartupConfiguration.ts","../src/server/features/reverse-proxy/index.ts","../src/server/features/caching/cacheDuration.schema.ts","../src/server/util/staticPaths.ts","../src/server/middleware/bundleManipulation.ts","../src/server/middleware/resolveStartup.ts","../src/server/features/static-assets/index.ts","../src/server/util/stringifyAttributes.ts","../src/server/features/response-handler/index.ts","../src/server/util/bundles.ts","../src/server/util/headers.ts","../src/server/webApp.tsx","../src/server/internalServer.ts"],"sourcesContent":["const servers = SERVERS; /* global SERVERS */\nconst projects = PROJECTS; /* global PROJECTS */\n\nconst DisplayStartupConfiguration = config => {\n /* eslint-disable no-console */\n console.log();\n console.log(\n `Configured servers:\n`,\n JSON.stringify(servers, null, 2)\n );\n console.log();\n console.log(\n `Configured projects:\n`,\n JSON.stringify(projects, null, 2)\n );\n console.log();\n console.log(\n 'Reverse proxy paths: ',\n JSON.stringify(config.reverseProxyPaths, null, 2)\n );\n console.log();\n\n /* eslint-enable no-console */\n};\n\nexport default DisplayStartupConfiguration;\n","import { Express } from 'express';\nimport httpProxy from 'http-proxy';\n\nconst servers = SERVERS; /* global SERVERS */\nexport const apiProxy = httpProxy.createProxyServer();\n\nconst reverseProxies = (app: Express, reverseProxyPaths: string[] = []) => {\n deliveryApiProxy(apiProxy, app);\n\n app.all(reverseProxyPaths, (req, res) => {\n const target =\n req.hostname.indexOf('preview-') ||\n req.hostname.indexOf('preview.') ||\n req.hostname === 'localhost'\n ? servers.previewIis || servers.iis\n : servers.iis;\n\n apiProxy.web(req, res, { target, changeOrigin: true });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy Request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nconst deliveryApiProxy = (apiProxy, app) => {\n // This is just here to stop cors requests on localhost. In Production this is mapped using varnish.\n app.all(['/api/delivery/*', '/api/image/*'], (req, res) => {\n /* eslint-disable no-console */\n const target = servers.cms;\n console.log(`Proxying api request to ${servers.alias}`);\n apiProxy.web(req, res, {\n target,\n changeOrigin: true,\n });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nexport default reverseProxies;\n","export const CacheDuration = {\n 200: '3600',\n 404: '5',\n static: '31536000', // Believe it or not these two max ages are the same in runtime\n expressStatic: '31557600h', // Believe it or not these two max ages are the same in runtime\n};\n\nexport const getCacheDuration = (status = 200) => {\n if (status > 400) return CacheDuration[404];\n return CacheDuration[200];\n};\n","export const replaceStaticPath = (str: string, staticFolderPath = 'static') =>\n str.replace(/static\\//g, `${staticFolderPath}/`);\n","import { RequestHandler } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { replaceStaticPath } from '../util/staticPaths';\n\nexport const bundleManipulationMiddleware =\n ({\n appRootPath,\n maxage,\n staticRoutePath,\n }: {\n appRootPath: string;\n maxage: string;\n staticRoutePath: string;\n }): RequestHandler =>\n (req, res, next) => {\n const filename = path.basename(req.path);\n const modernBundle = filename.endsWith('.mjs');\n const legacyBundle = filename.endsWith('.js');\n if ((legacyBundle || modernBundle) && filename.startsWith('runtime.')) {\n const jsRuntimeLocation = path.resolve(\n appRootPath,\n `dist/static/${modernBundle ? 'modern/js' : 'legacy/js'}/${filename}`\n );\n try {\n const jsRuntimeBundle = fs.readFileSync(jsRuntimeLocation, 'utf8');\n const modifiedBundle = replaceStaticPath(\n jsRuntimeBundle,\n staticRoutePath\n );\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n res.type('.js').send(modifiedBundle);\n return;\n } catch (readError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to find js runtime bundle at '${jsRuntimeLocation}'`,\n readError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import { RequestHandler } from 'express';\nimport path from 'path';\n\n/**\n *\n * @param { appRootPath: string; maxage: number; staticFolderPath: string, startupScriptFilename: string } args\n * @returns Response | next()\n * A middleware function to resolve /dist/static/startup.js under a supplied startupScriptFilename variable\n */\nexport const resolveStartupMiddleware =\n ({\n appRootPath,\n maxage,\n staticFolderPath,\n startupScriptFilename,\n }: {\n appRootPath: string;\n maxage: string;\n staticFolderPath: string;\n startupScriptFilename: string;\n }): RequestHandler =>\n (req, res, next) => {\n if (\n startupScriptFilename !== 'startup.js' &&\n req.path === `/${startupScriptFilename}`\n ) {\n const startupFilePath = `dist/${staticFolderPath}/startup.js`;\n const startupFileLocation = path.resolve(appRootPath, startupFilePath);\n\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n\n try {\n res.sendFile(startupFileLocation);\n } catch (sendFileError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to send file startup.js at '${startupFileLocation}'`,\n sendFileError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import express from 'express';\nimport { CacheDuration } from '~/server/features/caching/cacheDuration.schema';\nimport { bundleManipulationMiddleware } from '~/server/middleware/bundleManipulation';\nimport { resolveStartupMiddleware } from '~/server/middleware/resolveStartup';\n\nimport { path as appPath } from 'app-root-path';\nimport { ServerConfig } from '~/config';\n// Serving static assets\nconst staticAssets = (\n app,\n {\n appRootPath = appPath,\n scripts = {} as NonNullable<ServerConfig['scripts']>,\n startupScriptFilename = 'startup.js',\n staticFolderPath = 'static',\n staticRoutePath = 'static',\n staticRoutePaths = [] as string[],\n }\n) => {\n app.use(\n [\n `/${staticRoutePath}`,\n ...staticRoutePaths.map(p => `/${p}`),\n `/${staticFolderPath}`,\n ],\n bundleManipulationMiddleware({\n appRootPath,\n // these maxage values are different in config but the same in runtime,\n // this one is the true value in seconds\n maxage: CacheDuration.static,\n staticRoutePath,\n }),\n resolveStartupMiddleware({\n appRootPath,\n maxage: CacheDuration.static,\n startupScriptFilename: scripts.startup || startupScriptFilename,\n staticFolderPath,\n }),\n // eslint-disable-next-line import/no-named-as-default-member\n express.static(`dist/${staticFolderPath}`, {\n // these maxage values are different in config but the same in runtime,\n // this one is somehow converted and should end up being the same as CacheDuration.static\n maxAge: CacheDuration.expressStatic,\n })\n );\n};\n\nexport default staticAssets;\n","export default (attributes = {}) =>\n Object.entries(attributes)\n .map(\n ([key, value], idx) =>\n `${idx !== 0 ? ' ' : ''}${key}${value ? `=\"${value}\"` : ''}`\n )\n .join(' ');\n","/* eslint-disable no-console */\nimport { Request, Response } from 'express';\nimport { ResponseMethod } from './types';\n\n/**\n * Web Application Response handler, sends a prepared express js response\n * with the supplied content sending in the specified manner\n * @param {response} request express js request object\n * @param {response} response express js response object\n * @param {string | object} content the content to send in the response body\n * @param {\"send\" | \"json\" | \"end\"} send the response function to call e.g res.send() res.json() res.end()\n */\nconst handleResponse = (\n request: Request,\n response: Response,\n content: any,\n send: keyof typeof ResponseMethod = 'send'\n) => {\n // console.log('---', response.statusCode, '---');\n response[send](content);\n};\n\nexport default handleResponse;\n","import fs from 'fs';\nimport path from 'path';\nimport { ChunkExtractor } from '@loadable/server';\nimport { replaceStaticPath } from './staticPaths';\nimport { ServerConfig } from '~/config';\nimport stringifyAttributes from './stringifyAttributes';\n\nconst readFileSync = path => fs.readFileSync(path, 'utf8');\n\nexport const loadableBundleData = (\n { stats, templates },\n staticRoutePath: string,\n build?: string\n) => {\n const bundle: {\n stats?: string | null;\n templates?: {\n templateHTML;\n templateHTMLStatic;\n templateHTMLFragment;\n } | null;\n } = {};\n try {\n bundle.stats = JSON.parse(\n readFileSync(stats.replace('/target', build ? `/${build}` : ''))\n );\n } catch (ex) {\n // console.info(ex);\n bundle.stats = null;\n }\n try {\n bundle.templates = {\n templateHTML: replaceStaticPath(\n readFileSync(\n templates.html.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLStatic: replaceStaticPath(\n readFileSync(\n templates.static.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLFragment: replaceStaticPath(\n readFileSync(\n templates.fragment.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n };\n } catch (ex) {\n // console.info(ex);\n bundle.templates = null;\n }\n return bundle;\n};\n\ntype LoadableChunkExtractors =\n | {\n legacy: ChunkExtractor;\n modern: ChunkExtractor;\n commonLoadableExtractor: ChunkExtractor;\n }\n | undefined;\n\nexport const loadableChunkExtractors = () => {\n try {\n const modern = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'modern',\n statsFile: path.resolve('dist/modern/loadable-stats.json'),\n });\n const legacy = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'legacy',\n statsFile: path.resolve('dist/legacy/loadable-stats.json'),\n });\n const commonLoadableExtractor: ChunkExtractor = {\n addChunk(chunk) {\n modern.addChunk(chunk);\n if (typeof legacy.stats.assetsByChunkName[chunk] !== 'undefined')\n legacy.addChunk(chunk);\n },\n };\n\n return {\n commonLoadableExtractor,\n modern,\n legacy,\n } as LoadableChunkExtractors;\n } catch (e) {\n console.info('@loadable/server ChunkExtractor not available');\n }\n};\n\nexport const getBundleData = (config, staticRoutePath) => {\n const bundleData = {\n default: loadableBundleData(config, staticRoutePath),\n legacy: loadableBundleData(config, staticRoutePath, 'legacy'),\n modern: loadableBundleData(config, staticRoutePath, 'modern'),\n };\n if (!bundleData.default || bundleData.default === {})\n bundleData.default = bundleData.legacy || bundleData.modern;\n return bundleData;\n};\n\nexport const buildBundleTags = (\n bundles,\n differentialBundles = false,\n staticRoutePath = 'static',\n attributes = ''\n) => {\n // Take the bundles returned from Loadable.Capture\n const bundleTags = bundles\n .filter(b => b)\n .map(bundle => {\n if (bundle.publicPath.includes('/modern/'))\n return differentialBundles\n ? `<script ${attributes} type=\"module\" src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`\n : null;\n return `<script ${attributes}${\n differentialBundles ? ' nomodule' : ''\n } src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`;\n })\n .filter(f => f);\n\n return bundleTags;\n};\n\nexport const getBundleTags = (\n loadableExtractor: LoadableChunkExtractors,\n scripts: ServerConfig['scripts'],\n staticRoutePath = 'static'\n) => {\n let startupTag = '';\n // Add the static startup script to the bundleTags\n if (scripts?.startup)\n startupTag = `<script ${stringifyAttributes(\n scripts.attributes\n )} src=\"/${staticRoutePath}/${scripts.startup}\"></script>`;\n\n // Get the script tags from their respective extractor instances\n if (loadableExtractor) {\n const legacyScriptTags = loadableExtractor?.legacy.getScriptTags({\n noModule: true,\n });\n const modernScriptTags = loadableExtractor?.modern.getScriptTags({\n type: 'module',\n });\n const scriptTags = `${startupTag}${legacyScriptTags || ''}${\n modernScriptTags || ''\n }`.replace(/\"\\/static\\//g, `\"/${staticRoutePath}/`);\n return scriptTags;\n }\n return startupTag;\n};\n","import { Response } from 'express';\nimport {\n selectCurrentProject,\n selectRouteEntry,\n selectSurrogateKeys,\n} from '~/routing/redux/selectors';\nimport { getImmutableOrJS as getIn } from '~/redux/util';\n\nimport { getCacheDuration } from '../features/caching/cacheDuration.schema';\nimport { AppState } from '~/redux/appstate';\n\nexport const addStandardHeaders = (\n state: AppState,\n response: Response,\n packagejson: any,\n groups: { globalGroups?: any[]; allowedGroups?: any[] }\n) => {\n if (state) {\n try {\n console.info('About to add headers');\n const routingSurrogateKeys = selectSurrogateKeys(state);\n\n const surrogateKeyHeader = ` ${packagejson.name}-app ${routingSurrogateKeys}`;\n\n response.header('surrogate-key', surrogateKeyHeader);\n\n addVarnishAuthenticationHeaders(state, response, groups);\n\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(response.statusCode)}`\n );\n } catch (e: any) {\n console.info('Error Adding headers', e.message);\n }\n }\n};\n\nexport const addVarnishAuthenticationHeaders = (\n state: AppState,\n response: Response,\n groups: { globalGroups?: any[]; allowedGroups?: any[] } = {}\n) => {\n if (state) {\n try {\n const stateEntry = selectRouteEntry(state);\n const project = selectCurrentProject(state);\n const { globalGroups, allowedGroups } = groups;\n // console.info(globalGroups, allowedGroups);\n let allGroups = Array.from((globalGroups && globalGroups[project]) || {});\n if (\n stateEntry &&\n getIn(stateEntry, ['authentication', 'isLoginRequired']) &&\n allowedGroups &&\n allowedGroups[project]\n ) {\n allGroups = [...allGroups, ...allowedGroups[project]];\n }\n response.header('x-contensis-viewer-groups', allGroups.join('|'));\n } catch (e) {\n console.info('Error adding authentication header', e);\n }\n }\n};\n","import fs from 'fs';\nimport React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { StaticRouter } from 'react-router-dom';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { matchRoutes } from 'react-router-config';\nimport { Helmet } from 'react-helmet';\nimport { ServerStyleSheet } from 'styled-components';\nimport serialize from 'serialize-javascript';\nimport minifyCssString from 'minify-css-string';\nimport mapJson from 'jsonpath-mapper';\nimport { Express } from 'express';\nimport { StaticRouterContext } from 'react-router';\nimport { ChunkExtractorManager } from '@loadable/server';\n\nimport createStore from '~/redux/store/store';\nimport { history } from '~/redux/store/history';\nimport rootSaga from '~/redux/sagas';\n\nimport { setVersion, setVersionStatus } from '~/redux/actions/version';\nimport { setCurrentProject } from '~/routing/redux/actions';\n\nimport { deliveryApi } from '~/util/ContensisDeliveryApi';\nimport pickProject from '~/util/pickProject';\nimport stringifyAttributes from './util/stringifyAttributes';\n\nimport { getCacheDuration } from './features/caching/cacheDuration.schema';\nimport handleResponse from './features/response-handler';\n\nimport {\n getBundleData,\n getBundleTags,\n loadableChunkExtractors,\n} from './util/bundles';\nimport { addStandardHeaders } from './util/headers';\n\nimport { ServerConfig } from '~/config';\nimport { AppState } from '~/redux/appstate';\n\nconst webApp = (\n app: Express,\n ReactApp: React.ComponentType<any>,\n config: ServerConfig & {\n allowedGroups?: string[];\n globalGroups?: string[];\n startupScriptFilename?: string;\n }\n) => {\n const {\n stateType = 'immutable',\n routes,\n withReducers,\n withSagas,\n withEvents,\n packagejson,\n scripts = {},\n staticFolderPath = 'static',\n startupScriptFilename,\n allowedGroups,\n globalGroups,\n disableSsrRedux,\n handleResponses,\n } = config;\n const staticRoutePath = config.staticRoutePath || staticFolderPath;\n\n const bundleData = getBundleData(config, staticRoutePath);\n\n const attributes = stringifyAttributes(scripts.attributes);\n scripts.startup = scripts.startup || startupScriptFilename;\n\n const responseHandler =\n typeof handleResponses === 'function' ? handleResponses : handleResponse;\n\n const versionInfo = JSON.parse(\n fs.readFileSync(`dist/${staticFolderPath}/version.json`, 'utf8')\n );\n\n app.get('/*', async (request, response) => {\n const { url } = request;\n\n const matchedStaticRoute = () =>\n matchRoutes(routes.StaticRoutes, request.path);\n const isStaticRoute = () => matchedStaticRoute().length > 0;\n const staticRoute = isStaticRoute() && matchedStaticRoute()[0];\n\n // Allow certain routes to avoid SSR\n const onlyDynamic = staticRoute && staticRoute.route.ssr === false;\n const onlySSR = staticRoute && staticRoute.route.ssrOnly === true;\n\n const normaliseQs = q => (q && q.toLowerCase() === 'true' ? true : false);\n\n // Determine functional params from QueryString and set access methods\n const accessMethod = mapJson<\n any,\n { DYNAMIC: boolean; REDUX: boolean; FRAGMENT: boolean; STATIC: boolean }\n >(request.query, {\n DYNAMIC: ({ dynamic }) => normaliseQs(dynamic) || onlyDynamic,\n REDUX: ({ redux }) => normaliseQs(redux),\n FRAGMENT: ({ fragment }) => normaliseQs(fragment),\n STATIC: ({ static: value }) => normaliseQs(value) || onlySSR,\n });\n\n const context: StaticRouterContext = {};\n // Track the current statusCode via the response object\n response.status(200);\n\n // Create a store (with a memory history) from our current url\n const store = await createStore(\n withReducers,\n {} as AppState,\n history({\n initialEntries: [url],\n }),\n stateType\n );\n\n // dispatch any global and non-saga related actions before calling our JSX\n const versionStatusFromHostname = deliveryApi.getVersionStatusFromHostname(\n request.hostname\n );\n\n console.info(\n `Request for ${request.path} hostname: ${request.hostname} versionStatus: ${versionStatusFromHostname}`\n );\n\n store.dispatch(\n setVersionStatus(request.query.versionStatus || versionStatusFromHostname)\n );\n store.dispatch(setVersion(versionInfo.commitRef, versionInfo.buildNo));\n\n const project = pickProject(request.hostname, request.query);\n\n const groups = allowedGroups && allowedGroups[project];\n store.dispatch(setCurrentProject(project, groups, request.hostname));\n\n const loadableExtractor = loadableChunkExtractors();\n\n const jsx = (\n <ChunkExtractorManager\n extractor={loadableExtractor?.commonLoadableExtractor}\n >\n <ReduxProvider store={store}>\n <StaticRouter context={context} location={url}>\n <ReactApp routes={routes} withEvents={withEvents} />\n </StaticRouter>\n </ReduxProvider>\n </ChunkExtractorManager>\n );\n\n const { templateHTML, templateHTMLFragment, templateHTMLStatic } =\n bundleData.default.templates || bundleData.legacy.templates || {};\n\n // Serve a blank HTML page with client scripts to load the app in the browser\n if (accessMethod.DYNAMIC) {\n // Dynamic doesn't need sagas\n renderToString(jsx);\n\n // Dynamic page render has only the necessary bundles to start up the app\n // and does not include any react-loadable code-split bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n const isDynamicHint = `<script ${attributes}>window.isDynamic = true;</script>`;\n\n const responseHtmlDynamic = templateHTML\n .replace('{{TITLE}}', '')\n .replace('{{SEO_CRITICAL_METADATA}}', '')\n .replace('{{CRITICAL_CSS}}', '')\n .replace('{{APP}}', '')\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', isDynamicHint);\n // Dynamic pages always return a 200 so we can run\n // the app and serve up all errors inside the client\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(200)}`\n );\n responseHandler(request, response, responseHtmlDynamic);\n }\n\n // Render the JSX server side and send response as per access method options\n if (!accessMethod.DYNAMIC) {\n store\n .runSaga(rootSaga(withSagas))\n .toPromise()\n .then(() => {\n const sheet = new ServerStyleSheet();\n\n const html = renderToString(sheet.collectStyles(jsx));\n\n const helmet = Helmet.renderStatic();\n Helmet.rewind();\n const htmlAttributes = helmet.htmlAttributes.toString();\n let title = helmet.title.toString();\n const metadata = helmet.meta\n .toString()\n .concat(helmet.link.toString());\n\n if (context.url) {\n return response.redirect(302, context.url);\n }\n\n const reduxState = store.getState();\n\n const styleTags = sheet.getStyleTags();\n\n // After running rootSaga there should be an additional react-loadable\n // code-split bundles for any page components as well as core app bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n let serialisedReduxData = serialize(reduxState);\n if (context.statusCode !== 404) {\n // For a request that returns a redux state object as a response\n if (accessMethod.REDUX) {\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n responseHandler(request, response, serialisedReduxData, 'json');\n return true;\n }\n if (!disableSsrRedux) {\n serialisedReduxData = `<script ${attributes}>window.REDUX_DATA = ${serialisedReduxData}</script>`;\n }\n }\n if ((context.statusCode || 200) > 400) {\n accessMethod.STATIC = true;\n }\n\n // Responses\n let responseHTML = '';\n\n if (context.statusCode === 404)\n title = '<title>404 page not found</title>';\n\n // Static page served as a fragment\n if (accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = minifyCssString(styleTags) + html;\n }\n\n // Page fragment served with client scripts and redux data that hydrate the app client side\n if (accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTMLFragment\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Full HTML page served statically\n if (!accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = templateHTMLStatic\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', '');\n }\n\n // Full HTML page served with client scripts and redux data that hydrate the app client side\n if (!accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTML\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', styleTags)\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Set response.status from React StaticRouter\n if (typeof context.statusCode === 'number')\n response.status(context.statusCode);\n\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n try {\n // If react-helmet htmlAttributes are being used,\n // replace the html tag with those attributes sepcified\n // e.g. (lang, dir etc.)\n if (htmlAttributes) {\n responseHTML = responseHTML.replace(\n /<html?.+?>/,\n `<html ${htmlAttributes}>`\n );\n }\n responseHandler(request, response, responseHTML);\n } catch (err: any) {\n console.info(err.message);\n }\n })\n .catch(err => {\n // Handle any error that occurred in any of the previous\n // promises in the chain.\n console.info(err);\n response.status(500);\n responseHandler(\n request,\n response,\n `Error occurred: <br />${err.stack} <br />${JSON.stringify(err)}`\n );\n });\n renderToString(jsx);\n\n store.close();\n }\n });\n};\n\nexport default webApp;\n","import 'isomorphic-fetch';\nimport express, { Express } from 'express';\nimport React from 'react';\n\nimport DisplayStartupConfiguration from './util/displayStartupConfiguration';\nimport ConfigureReverseProxies, { apiProxy } from './features/reverse-proxy';\nimport ServeStaticAssets from './features/static-assets';\nimport ConfigureWebApp from './webApp';\nimport { ServerConfig } from '~/config';\n\ndeclare let global: typeof globalThis & {\n DISABLE_SSR_REDUX: boolean | undefined;\n PACKAGE_JSON: any;\n PROXY_DELIVERY_API: boolean | undefined;\n REVERSE_PROXY_PATHS: string[];\n};\n\nconst app: Express = express();\n\nconst start = (\n ReactApp: React.ComponentType<any>,\n config: ServerConfig,\n ServerFeatures: (app: Express) => void\n) => {\n global.PACKAGE_JSON = config.packagejson;\n global.DISABLE_SSR_REDUX = config.disableSsrRedux;\n global.PROXY_DELIVERY_API = config.proxyDeliveryApi;\n global.REVERSE_PROXY_PATHS = Object(config.reverseProxyPaths);\n\n app.disable('x-powered-by');\n\n // Output some information about the used build/startup configuration\n DisplayStartupConfiguration(config);\n\n ServerFeatures(app);\n // Set-up local proxy for images from cms, and delivery api requests\n // to save doing rewrites and extra code\n ConfigureReverseProxies(app, config.reverseProxyPaths);\n ServeStaticAssets(app, config);\n ConfigureWebApp(app, ReactApp, config);\n\n app.on('ready', async () => {\n // Configure DNS to make life easier\n // await ConfigureLocalDNS();\n\n const server = app.listen(3001, () => {\n console.info(`HTTP server is listening @ port 3001`);\n setTimeout(function () {\n app.emit('app_started');\n }, 500);\n });\n app.on('stop', () => {\n server.close(function () {\n console.info('GoodBye :(');\n });\n });\n });\n};\n\nexport default { app, apiProxy, start };\n"],"names":["servers","SERVERS","projects","PROJECTS","DisplayStartupConfiguration","config","console","log","JSON","stringify","reverseProxyPaths","apiProxy","httpProxy","createProxyServer","reverseProxies","app","deliveryApiProxy","all","req","res","target","hostname","indexOf","previewIis","iis","web","changeOrigin","on","e","path","cms","alias","CacheDuration","static","expressStatic","getCacheDuration","status","replaceStaticPath","str","staticFolderPath","replace","bundleManipulationMiddleware","appRootPath","maxage","staticRoutePath","next","filename","basename","modernBundle","endsWith","legacyBundle","startsWith","jsRuntimeLocation","resolve","jsRuntimeBundle","fs","readFileSync","modifiedBundle","set","type","send","readError","resolveStartupMiddleware","startupScriptFilename","startupFilePath","startupFileLocation","sendFile","sendFileError","staticAssets","appPath","scripts","staticRoutePaths","use","map","p","startup","express","maxAge","attributes","Object","entries","key","value","idx","join","handleResponse","request","response","content","loadableBundleData","stats","templates","build","bundle","parse","ex","templateHTML","html","templateHTMLStatic","templateHTMLFragment","fragment","loadableChunkExtractors","modern","ChunkExtractor","entrypoints","namespace","statsFile","legacy","commonLoadableExtractor","addChunk","chunk","assetsByChunkName","info","getBundleData","bundleData","default","getBundleTags","loadableExtractor","startupTag","stringifyAttributes","legacyScriptTags","getScriptTags","noModule","modernScriptTags","scriptTags","addStandardHeaders","state","packagejson","groups","routingSurrogateKeys","selectSurrogateKeys","surrogateKeyHeader","name","header","addVarnishAuthenticationHeaders","setHeader","statusCode","message","stateEntry","selectRouteEntry","project","selectCurrentProject","globalGroups","allowedGroups","allGroups","Array","from","getIn","webApp","ReactApp","stateType","routes","withReducers","withSagas","withEvents","disableSsrRedux","handleResponses","responseHandler","versionInfo","get","url","matchedStaticRoute","matchRoutes","StaticRoutes","isStaticRoute","length","staticRoute","onlyDynamic","route","ssr","onlySSR","ssrOnly","normaliseQs","q","toLowerCase","accessMethod","mapJson","query","DYNAMIC","dynamic","REDUX","redux","FRAGMENT","STATIC","context","store","createStore","history","initialEntries","versionStatusFromHostname","deliveryApi","getVersionStatusFromHostname","dispatch","setVersionStatus","versionStatus","setVersion","commitRef","buildNo","pickProject","setCurrentProject","jsx","React","ChunkExtractorManager","ReduxProvider","StaticRouter","renderToString","bundleTags","isDynamicHint","responseHtmlDynamic","runSaga","rootSaga","toPromise","then","sheet","ServerStyleSheet","collectStyles","helmet","Helmet","renderStatic","rewind","htmlAttributes","toString","title","metadata","meta","concat","link","redirect","reduxState","getState","styleTags","getStyleTags","serialisedReduxData","serialize","responseHTML","minifyCssString","err","catch","stack","close","start","ServerFeatures","global","PACKAGE_JSON","DISABLE_SSR_REDUX","PROXY_DELIVERY_API","proxyDeliveryApi","REVERSE_PROXY_PATHS","disable","ConfigureReverseProxies","ServeStaticAssets","ConfigureWebApp","server","listen","setTimeout","emit"],"mappings":"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"}
1
+ {"version":3,"file":"contensis-react-base.js","sources":["../src/server/util/displayStartupConfiguration.ts","../src/server/features/reverse-proxy/index.ts","../src/server/features/caching/cacheDuration.schema.ts","../src/server/util/staticPaths.ts","../src/server/middleware/bundleManipulation.ts","../src/server/middleware/resolveStartup.ts","../src/server/features/static-assets/index.ts","../src/server/util/stringifyAttributes.ts","../src/server/features/response-handler/index.ts","../src/server/util/bundles.ts","../src/server/util/headers.ts","../src/server/webApp.tsx","../src/server/internalServer.ts"],"sourcesContent":["const servers = SERVERS; /* global SERVERS */\nconst projects = PROJECTS; /* global PROJECTS */\n\nconst DisplayStartupConfiguration = config => {\n /* eslint-disable no-console */\n console.log();\n console.log(\n `Configured servers:\n`,\n JSON.stringify(servers, null, 2)\n );\n console.log();\n console.log(\n `Configured projects:\n`,\n JSON.stringify(projects, null, 2)\n );\n console.log();\n console.log(\n 'Reverse proxy paths: ',\n JSON.stringify(config.reverseProxyPaths, null, 2)\n );\n console.log();\n if (config.staticFolderPath)\n console.log(\n `Serving static assets from: \"/dist/${config.staticFolderPath}/\"`\n );\n /* eslint-enable no-console */\n};\n\nexport default DisplayStartupConfiguration;\n","import { Express } from 'express';\nimport httpProxy from 'http-proxy';\n\nconst servers = SERVERS; /* global SERVERS */\nexport const apiProxy = httpProxy.createProxyServer();\n\nconst reverseProxies = (app: Express, reverseProxyPaths: string[] = []) => {\n deliveryApiProxy(apiProxy, app);\n\n app.all(reverseProxyPaths, (req, res) => {\n const target =\n req.hostname.indexOf('preview-') ||\n req.hostname.indexOf('preview.') ||\n req.hostname === 'localhost'\n ? servers.previewIis || servers.iis\n : servers.iis;\n\n apiProxy.web(req, res, { target, changeOrigin: true });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy Request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nconst deliveryApiProxy = (apiProxy, app) => {\n // This is just here to stop cors requests on localhost. In Production this is mapped using varnish.\n app.all(['/api/delivery/*', '/api/image/*'], (req, res) => {\n /* eslint-disable no-console */\n const target = servers.cms;\n console.log(`Proxying api request to ${servers.alias}`);\n apiProxy.web(req, res, {\n target,\n changeOrigin: true,\n });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nexport default reverseProxies;\n","export const CacheDuration = {\n 200: '3600',\n 404: '5',\n static: '31536000', // Believe it or not these two max ages are the same in runtime\n expressStatic: '31557600h', // Believe it or not these two max ages are the same in runtime\n};\n\nexport const getCacheDuration = (status = 200) => {\n if (status > 400) return CacheDuration[404];\n return CacheDuration[200];\n};\n","export const replaceStaticPath = (str: string, staticFolderPath = 'static') =>\n str.replace(/static\\//g, `${staticFolderPath}/`);\n","import { RequestHandler } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { replaceStaticPath } from '../util/staticPaths';\n\nexport const bundleManipulationMiddleware =\n ({\n appRootPath,\n maxage,\n staticFolderPath,\n staticRoutePath,\n }: {\n appRootPath: string;\n maxage: string;\n staticFolderPath: string;\n staticRoutePath: string;\n }): RequestHandler =>\n (req, res, next) => {\n const filename = path.basename(req.path);\n const modernBundle = filename.endsWith('.mjs');\n const legacyBundle = filename.endsWith('.js');\n if ((legacyBundle || modernBundle) && filename.startsWith('runtime.')) {\n const jsRuntimeLocation = path.resolve(\n appRootPath,\n `dist/${staticFolderPath}/${\n modernBundle ? 'modern/js' : 'legacy/js'\n }/${filename}`\n );\n try {\n const jsRuntimeBundle = fs.readFileSync(jsRuntimeLocation, 'utf8');\n const modifiedBundle = replaceStaticPath(\n jsRuntimeBundle,\n staticRoutePath\n );\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n res.type('.js').send(modifiedBundle);\n return;\n } catch (readError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to find js runtime bundle at '${jsRuntimeLocation}'`,\n readError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import { RequestHandler } from 'express';\nimport fs from 'fs';\nimport path from 'path';\n\n/**\n *\n * @param { appRootPath: string; maxage: number; staticFolderPath: string, startupScriptFilename: string } args\n * @returns Response | next()\n * A middleware function to resolve /dist/static/startup.js under a supplied startupScriptFilename variable\n */\nexport const resolveStartupMiddleware =\n ({\n appRootPath,\n maxage,\n staticFolderPath,\n startupScriptFilename,\n }: {\n appRootPath: string;\n maxage: string;\n staticFolderPath: string;\n startupScriptFilename: string;\n }): RequestHandler =>\n async (req, res, next) => {\n if (\n startupScriptFilename !== 'startup.js' &&\n req.path === `/${startupScriptFilename}`\n ) {\n let startupFileLocation = '';\n try {\n const startupFilePaths = [\n `dist/static/startup.js`,\n `dist/${staticFolderPath}/startup.js`,\n ];\n let startupFilePath = '';\n startupFilePaths.forEach(async testPath => {\n try {\n fs.accessSync(testPath);\n startupFilePath = testPath;\n } catch (ex) {\n // Do nothing\n }\n });\n startupFileLocation = path.resolve(appRootPath, startupFilePath);\n\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n\n res.sendFile(startupFileLocation);\n } catch (sendFileError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to send file startup.js at '${startupFileLocation}'`,\n sendFileError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import express from 'express';\nimport { CacheDuration } from '~/server/features/caching/cacheDuration.schema';\nimport { bundleManipulationMiddleware } from '~/server/middleware/bundleManipulation';\nimport { resolveStartupMiddleware } from '~/server/middleware/resolveStartup';\n\nimport { path as appPath } from 'app-root-path';\nimport { ServerConfig } from '~/config';\n// Serving static assets\nconst staticAssets = (\n app,\n {\n appRootPath = appPath,\n scripts = {} as NonNullable<ServerConfig['scripts']>,\n startupScriptFilename = 'startup.js',\n staticFolderPath = 'static',\n staticRoutePath = 'static',\n staticRoutePaths = [] as string[],\n }\n) => {\n app.use(\n [\n `/${staticRoutePath}`,\n ...staticRoutePaths.map(p => `/${p}`),\n `/${staticFolderPath}`,\n ],\n bundleManipulationMiddleware({\n appRootPath,\n // these maxage values are different in config but the same in runtime,\n // this one is the true value in seconds\n maxage: CacheDuration.static,\n staticFolderPath,\n staticRoutePath,\n }),\n resolveStartupMiddleware({\n appRootPath,\n maxage: CacheDuration.static,\n startupScriptFilename: scripts.startup || startupScriptFilename,\n staticFolderPath,\n }),\n // eslint-disable-next-line import/no-named-as-default-member\n express.static(`dist/${staticFolderPath}`, {\n // these maxage values are different in config but the same in runtime,\n // this one is somehow converted and should end up being the same as CacheDuration.static\n maxAge: CacheDuration.expressStatic,\n })\n );\n};\n\nexport default staticAssets;\n","export default (attributes = {}) =>\n Object.entries(attributes)\n .map(\n ([key, value], idx) =>\n `${idx !== 0 ? ' ' : ''}${key}${value ? `=\"${value}\"` : ''}`\n )\n .join(' ');\n","/* eslint-disable no-console */\nimport { Request, Response } from 'express';\nimport { ResponseMethod } from './types';\n\n/**\n * Web Application Response handler, sends a prepared express js response\n * with the supplied content sending in the specified manner\n * @param {response} request express js request object\n * @param {response} response express js response object\n * @param {string | object} content the content to send in the response body\n * @param {\"send\" | \"json\" | \"end\"} send the response function to call e.g res.send() res.json() res.end()\n */\nconst handleResponse = (\n request: Request,\n response: Response,\n content: any,\n send: keyof typeof ResponseMethod = 'send'\n) => {\n // console.log('---', response.statusCode, '---');\n response[send](content);\n};\n\nexport default handleResponse;\n","import fs from 'fs';\nimport path from 'path';\nimport { ChunkExtractor } from '@loadable/server';\nimport { replaceStaticPath } from './staticPaths';\nimport { ServerConfig } from '~/config';\nimport stringifyAttributes from './stringifyAttributes';\n\nconst readFileSync = path => fs.readFileSync(path, 'utf8');\n\nexport const loadableBundleData = (\n { stats, templates },\n staticRoutePath: string,\n build?: string\n) => {\n const bundle: {\n stats?: string | null;\n templates?: {\n templateHTML;\n templateHTMLStatic;\n templateHTMLFragment;\n } | null;\n } = {};\n try {\n bundle.stats = JSON.parse(\n readFileSync(stats.replace('/target', build ? `/${build}` : ''))\n );\n } catch (ex) {\n // console.info(ex);\n bundle.stats = null;\n }\n try {\n bundle.templates = {\n templateHTML: replaceStaticPath(\n readFileSync(\n templates.html.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLStatic: replaceStaticPath(\n readFileSync(\n templates.static.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLFragment: replaceStaticPath(\n readFileSync(\n templates.fragment.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n };\n } catch (ex) {\n // console.info(ex);\n bundle.templates = null;\n }\n return bundle;\n};\n\ntype LoadableChunkExtractors =\n | {\n legacy: ChunkExtractor;\n modern: ChunkExtractor;\n commonLoadableExtractor: ChunkExtractor;\n }\n | undefined;\n\nexport const loadableChunkExtractors = () => {\n try {\n const modern = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'modern',\n statsFile: path.resolve('dist/modern/loadable-stats.json'),\n });\n const legacy = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'legacy',\n statsFile: path.resolve('dist/legacy/loadable-stats.json'),\n });\n const commonLoadableExtractor: ChunkExtractor = {\n addChunk(chunk) {\n modern.addChunk(chunk);\n if (typeof legacy.stats.assetsByChunkName[chunk] !== 'undefined')\n legacy.addChunk(chunk);\n },\n };\n\n return {\n commonLoadableExtractor,\n modern,\n legacy,\n } as LoadableChunkExtractors;\n } catch (e) {\n console.info('@loadable/server ChunkExtractor not available');\n }\n};\n\nexport const getBundleData = (config, staticRoutePath) => {\n const bundleData = {\n default: loadableBundleData(config, staticRoutePath),\n legacy: loadableBundleData(config, staticRoutePath, 'legacy'),\n modern: loadableBundleData(config, staticRoutePath, 'modern'),\n };\n if (!bundleData.default || bundleData.default === {})\n bundleData.default = bundleData.legacy || bundleData.modern;\n return bundleData;\n};\n\nexport const buildBundleTags = (\n bundles,\n differentialBundles = false,\n staticRoutePath = 'static',\n attributes = ''\n) => {\n // Take the bundles returned from Loadable.Capture\n const bundleTags = bundles\n .filter(b => b)\n .map(bundle => {\n if (bundle.publicPath.includes('/modern/'))\n return differentialBundles\n ? `<script ${attributes} type=\"module\" src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`\n : null;\n return `<script ${attributes}${\n differentialBundles ? ' nomodule' : ''\n } src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`;\n })\n .filter(f => f);\n\n return bundleTags;\n};\n\nexport const getBundleTags = (\n loadableExtractor: LoadableChunkExtractors,\n scripts: ServerConfig['scripts'],\n staticRoutePath = 'static'\n) => {\n let startupTag = '';\n // Add the static startup script to the bundleTags\n if (scripts?.startup)\n startupTag = `<script ${stringifyAttributes(\n scripts.attributes\n )} src=\"/${staticRoutePath}/${scripts.startup}\"></script>`;\n\n // Get the script tags from their respective extractor instances\n if (loadableExtractor) {\n const legacyScriptTags = loadableExtractor?.legacy.getScriptTags({\n noModule: true,\n });\n const modernScriptTags = loadableExtractor?.modern.getScriptTags({\n type: 'module',\n });\n const scriptTags = `${startupTag}${legacyScriptTags || ''}${\n modernScriptTags || ''\n }`.replace(/\"\\/static\\//g, `\"/${staticRoutePath}/`);\n return scriptTags;\n }\n return startupTag;\n};\n","import { Response } from 'express';\nimport {\n selectCurrentProject,\n selectRouteEntry,\n selectSurrogateKeys,\n} from '~/routing/redux/selectors';\nimport { getImmutableOrJS as getIn } from '~/redux/util';\n\nimport { getCacheDuration } from '../features/caching/cacheDuration.schema';\nimport { AppState } from '~/redux/appstate';\n\nexport const addStandardHeaders = (\n state: AppState,\n response: Response,\n packagejson: any,\n groups: { globalGroups?: any[]; allowedGroups?: any[] }\n) => {\n if (state) {\n try {\n console.info('About to add headers');\n const routingSurrogateKeys = selectSurrogateKeys(state);\n\n const surrogateKeyHeader = ` ${packagejson.name}-app ${routingSurrogateKeys}`;\n\n response.header('surrogate-key', surrogateKeyHeader);\n\n addVarnishAuthenticationHeaders(state, response, groups);\n\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(response.statusCode)}`\n );\n } catch (e: any) {\n console.info('Error Adding headers', e.message);\n }\n }\n};\n\nexport const addVarnishAuthenticationHeaders = (\n state: AppState,\n response: Response,\n groups: { globalGroups?: any[]; allowedGroups?: any[] } = {}\n) => {\n if (state) {\n try {\n const stateEntry = selectRouteEntry(state);\n const project = selectCurrentProject(state);\n const { globalGroups, allowedGroups } = groups;\n // console.info(globalGroups, allowedGroups);\n let allGroups = Array.from((globalGroups && globalGroups[project]) || {});\n if (\n stateEntry &&\n getIn(stateEntry, ['authentication', 'isLoginRequired']) &&\n allowedGroups &&\n allowedGroups[project]\n ) {\n allGroups = [...allGroups, ...allowedGroups[project]];\n }\n response.header('x-contensis-viewer-groups', allGroups.join('|'));\n } catch (e) {\n console.info('Error adding authentication header', e);\n }\n }\n};\n","import fs from 'fs';\nimport React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { StaticRouter } from 'react-router-dom';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { matchRoutes } from 'react-router-config';\nimport { Helmet } from 'react-helmet';\nimport { ServerStyleSheet } from 'styled-components';\nimport serialize from 'serialize-javascript';\nimport minifyCssString from 'minify-css-string';\nimport mapJson from 'jsonpath-mapper';\nimport { Express } from 'express';\nimport { StaticRouterContext } from 'react-router';\nimport { ChunkExtractorManager } from '@loadable/server';\n\nimport createStore from '~/redux/store/store';\nimport { history } from '~/redux/store/history';\nimport rootSaga from '~/redux/sagas';\n\nimport { setVersion, setVersionStatus } from '~/redux/actions/version';\nimport { setCurrentProject } from '~/routing/redux/actions';\n\nimport { deliveryApi } from '~/util/ContensisDeliveryApi';\nimport pickProject from '~/util/pickProject';\nimport stringifyAttributes from './util/stringifyAttributes';\n\nimport { getCacheDuration } from './features/caching/cacheDuration.schema';\nimport handleResponse from './features/response-handler';\n\nimport {\n getBundleData,\n getBundleTags,\n loadableChunkExtractors,\n} from './util/bundles';\nimport { addStandardHeaders } from './util/headers';\n\nimport { ServerConfig } from '~/config';\nimport { AppState } from '~/redux/appstate';\n\nconst webApp = (\n app: Express,\n ReactApp: React.ComponentType<any>,\n config: ServerConfig & {\n allowedGroups?: string[];\n globalGroups?: string[];\n startupScriptFilename?: string;\n }\n) => {\n const {\n stateType = 'immutable',\n routes,\n withReducers,\n withSagas,\n withEvents,\n packagejson,\n scripts = {},\n staticFolderPath = 'static',\n startupScriptFilename,\n allowedGroups,\n globalGroups,\n disableSsrRedux,\n handleResponses,\n } = config;\n const staticRoutePath = config.staticRoutePath || staticFolderPath;\n\n const bundleData = getBundleData(config, staticRoutePath);\n\n const attributes = stringifyAttributes(scripts.attributes);\n scripts.startup = scripts.startup || startupScriptFilename;\n\n const responseHandler =\n typeof handleResponses === 'function' ? handleResponses : handleResponse;\n\n const versionInfo = JSON.parse(\n fs.readFileSync(`dist/${staticFolderPath}/version.json`, 'utf8')\n );\n\n app.get('/*', async (request, response) => {\n const { url } = request;\n\n const matchedStaticRoute = () =>\n matchRoutes(routes.StaticRoutes, request.path);\n const isStaticRoute = () => matchedStaticRoute().length > 0;\n const staticRoute = isStaticRoute() && matchedStaticRoute()[0];\n\n // Allow certain routes to avoid SSR\n const onlyDynamic = staticRoute && staticRoute.route.ssr === false;\n const onlySSR = staticRoute && staticRoute.route.ssrOnly === true;\n\n const normaliseQs = q => (q && q.toLowerCase() === 'true' ? true : false);\n\n // Determine functional params from QueryString and set access methods\n const accessMethod = mapJson<\n any,\n { DYNAMIC: boolean; REDUX: boolean; FRAGMENT: boolean; STATIC: boolean }\n >(request.query, {\n DYNAMIC: ({ dynamic }) => normaliseQs(dynamic) || onlyDynamic,\n REDUX: ({ redux }) => normaliseQs(redux),\n FRAGMENT: ({ fragment }) => normaliseQs(fragment),\n STATIC: ({ static: value }) => normaliseQs(value) || onlySSR,\n });\n\n const context: StaticRouterContext = {};\n // Track the current statusCode via the response object\n response.status(200);\n\n // Create a store (with a memory history) from our current url\n const store = await createStore(\n withReducers,\n {} as AppState,\n history({\n initialEntries: [url],\n }),\n stateType\n );\n\n // dispatch any global and non-saga related actions before calling our JSX\n const versionStatusFromHostname = deliveryApi.getVersionStatusFromHostname(\n request.hostname\n );\n\n console.info(\n `Request for ${request.path} hostname: ${request.hostname} versionStatus: ${versionStatusFromHostname}`\n );\n\n store.dispatch(\n setVersionStatus(request.query.versionStatus || versionStatusFromHostname)\n );\n store.dispatch(setVersion(versionInfo.commitRef, versionInfo.buildNo));\n\n const project = pickProject(request.hostname, request.query);\n\n const groups = allowedGroups && allowedGroups[project];\n store.dispatch(setCurrentProject(project, groups, request.hostname));\n\n const loadableExtractor = loadableChunkExtractors();\n\n const jsx = (\n <ChunkExtractorManager\n extractor={loadableExtractor?.commonLoadableExtractor}\n >\n <ReduxProvider store={store}>\n <StaticRouter context={context} location={url}>\n <ReactApp routes={routes} withEvents={withEvents} />\n </StaticRouter>\n </ReduxProvider>\n </ChunkExtractorManager>\n );\n\n const { templateHTML, templateHTMLFragment, templateHTMLStatic } =\n bundleData.default.templates || bundleData.legacy.templates || {};\n\n // Serve a blank HTML page with client scripts to load the app in the browser\n if (accessMethod.DYNAMIC) {\n // Dynamic doesn't need sagas\n renderToString(jsx);\n\n // Dynamic page render has only the necessary bundles to start up the app\n // and does not include any react-loadable code-split bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n const isDynamicHint = `<script ${attributes}>window.isDynamic = true;</script>`;\n\n const responseHtmlDynamic = templateHTML\n .replace('{{TITLE}}', '')\n .replace('{{SEO_CRITICAL_METADATA}}', '')\n .replace('{{CRITICAL_CSS}}', '')\n .replace('{{APP}}', '')\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', isDynamicHint);\n // Dynamic pages always return a 200 so we can run\n // the app and serve up all errors inside the client\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(200)}`\n );\n responseHandler(request, response, responseHtmlDynamic);\n }\n\n // Render the JSX server side and send response as per access method options\n if (!accessMethod.DYNAMIC) {\n store\n .runSaga(rootSaga(withSagas))\n .toPromise()\n .then(() => {\n const sheet = new ServerStyleSheet();\n\n const html = renderToString(sheet.collectStyles(jsx));\n\n const helmet = Helmet.renderStatic();\n Helmet.rewind();\n const htmlAttributes = helmet.htmlAttributes.toString();\n let title = helmet.title.toString();\n const metadata = helmet.meta\n .toString()\n .concat(helmet.link.toString());\n\n if (context.url) {\n return response.redirect(302, context.url);\n }\n\n const reduxState = store.getState();\n\n const styleTags = sheet.getStyleTags();\n\n // After running rootSaga there should be an additional react-loadable\n // code-split bundles for any page components as well as core app bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n let serialisedReduxData = serialize(reduxState);\n if (context.statusCode !== 404) {\n // For a request that returns a redux state object as a response\n if (accessMethod.REDUX) {\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n responseHandler(request, response, serialisedReduxData, 'json');\n return true;\n }\n if (!disableSsrRedux) {\n serialisedReduxData = `<script ${attributes}>window.REDUX_DATA = ${serialisedReduxData}</script>`;\n }\n }\n if ((context.statusCode || 200) > 400) {\n accessMethod.STATIC = true;\n }\n\n // Responses\n let responseHTML = '';\n\n if (context.statusCode === 404)\n title = '<title>404 page not found</title>';\n\n // Static page served as a fragment\n if (accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = minifyCssString(styleTags) + html;\n }\n\n // Page fragment served with client scripts and redux data that hydrate the app client side\n if (accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTMLFragment\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Full HTML page served statically\n if (!accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = templateHTMLStatic\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', '');\n }\n\n // Full HTML page served with client scripts and redux data that hydrate the app client side\n if (!accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTML\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', styleTags)\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Set response.status from React StaticRouter\n if (typeof context.statusCode === 'number')\n response.status(context.statusCode);\n\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n try {\n // If react-helmet htmlAttributes are being used,\n // replace the html tag with those attributes sepcified\n // e.g. (lang, dir etc.)\n if (htmlAttributes) {\n responseHTML = responseHTML.replace(\n /<html?.+?>/,\n `<html ${htmlAttributes}>`\n );\n }\n responseHandler(request, response, responseHTML);\n } catch (err: any) {\n console.info(err.message);\n }\n })\n .catch(err => {\n // Handle any error that occurred in any of the previous\n // promises in the chain.\n console.info(err);\n response.status(500);\n responseHandler(\n request,\n response,\n `Error occurred: <br />${err.stack} <br />${JSON.stringify(err)}`\n );\n });\n renderToString(jsx);\n\n store.close();\n }\n });\n};\n\nexport default webApp;\n","import 'isomorphic-fetch';\nimport express, { Express } from 'express';\nimport React from 'react';\n\nimport DisplayStartupConfiguration from './util/displayStartupConfiguration';\nimport ConfigureReverseProxies, { apiProxy } from './features/reverse-proxy';\nimport ServeStaticAssets from './features/static-assets';\nimport ConfigureWebApp from './webApp';\nimport { ServerConfig } from '~/config';\n\ndeclare let global: typeof globalThis & {\n DISABLE_SSR_REDUX: boolean | undefined;\n PACKAGE_JSON: any;\n PROXY_DELIVERY_API: boolean | undefined;\n REVERSE_PROXY_PATHS: string[];\n};\n\nconst app: Express = express();\n\nconst start = (\n ReactApp: React.ComponentType<any>,\n config: ServerConfig,\n ServerFeatures: (app: Express) => void\n) => {\n global.PACKAGE_JSON = config.packagejson;\n global.DISABLE_SSR_REDUX = config.disableSsrRedux;\n global.PROXY_DELIVERY_API = config.proxyDeliveryApi;\n global.REVERSE_PROXY_PATHS = Object(config.reverseProxyPaths);\n\n app.disable('x-powered-by');\n\n // Output some information about the used build/startup configuration\n DisplayStartupConfiguration(config);\n\n ServerFeatures(app);\n // Set-up local proxy for images from cms, and delivery api requests\n // to save doing rewrites and extra code\n ConfigureReverseProxies(app, config.reverseProxyPaths);\n ServeStaticAssets(app, config);\n ConfigureWebApp(app, ReactApp, config);\n\n app.on('ready', async () => {\n // Configure DNS to make life easier\n // await ConfigureLocalDNS();\n\n const server = app.listen(3001, () => {\n console.info(`HTTP server is listening @ port 3001`);\n setTimeout(function () {\n app.emit('app_started');\n }, 500);\n });\n app.on('stop', () => {\n server.close(function () {\n console.info('GoodBye :(');\n });\n });\n });\n};\n\nexport default { app, apiProxy, start };\n"],"names":["servers","SERVERS","projects","PROJECTS","DisplayStartupConfiguration","config","console","log","JSON","stringify","reverseProxyPaths","staticFolderPath","apiProxy","httpProxy","createProxyServer","reverseProxies","app","deliveryApiProxy","all","req","res","target","hostname","indexOf","previewIis","iis","web","changeOrigin","on","e","path","cms","alias","CacheDuration","static","expressStatic","getCacheDuration","status","replaceStaticPath","str","replace","bundleManipulationMiddleware","appRootPath","maxage","staticRoutePath","next","filename","basename","modernBundle","endsWith","legacyBundle","startsWith","jsRuntimeLocation","resolve","jsRuntimeBundle","fs","readFileSync","modifiedBundle","set","type","send","readError","resolveStartupMiddleware","startupScriptFilename","startupFileLocation","startupFilePaths","startupFilePath","forEach","testPath","accessSync","ex","sendFile","sendFileError","staticAssets","appPath","scripts","staticRoutePaths","use","map","p","startup","express","maxAge","attributes","Object","entries","key","value","idx","join","handleResponse","request","response","content","loadableBundleData","stats","templates","build","bundle","parse","templateHTML","html","templateHTMLStatic","templateHTMLFragment","fragment","loadableChunkExtractors","modern","ChunkExtractor","entrypoints","namespace","statsFile","legacy","commonLoadableExtractor","addChunk","chunk","assetsByChunkName","info","getBundleData","bundleData","default","getBundleTags","loadableExtractor","startupTag","stringifyAttributes","legacyScriptTags","getScriptTags","noModule","modernScriptTags","scriptTags","addStandardHeaders","state","packagejson","groups","routingSurrogateKeys","selectSurrogateKeys","surrogateKeyHeader","name","header","addVarnishAuthenticationHeaders","setHeader","statusCode","message","stateEntry","selectRouteEntry","project","selectCurrentProject","globalGroups","allowedGroups","allGroups","Array","from","getIn","webApp","ReactApp","stateType","routes","withReducers","withSagas","withEvents","disableSsrRedux","handleResponses","responseHandler","versionInfo","get","url","matchedStaticRoute","matchRoutes","StaticRoutes","isStaticRoute","length","staticRoute","onlyDynamic","route","ssr","onlySSR","ssrOnly","normaliseQs","q","toLowerCase","accessMethod","mapJson","query","DYNAMIC","dynamic","REDUX","redux","FRAGMENT","STATIC","context","store","createStore","history","initialEntries","versionStatusFromHostname","deliveryApi","getVersionStatusFromHostname","dispatch","setVersionStatus","versionStatus","setVersion","commitRef","buildNo","pickProject","setCurrentProject","jsx","React","ChunkExtractorManager","ReduxProvider","StaticRouter","renderToString","bundleTags","isDynamicHint","responseHtmlDynamic","runSaga","rootSaga","toPromise","then","sheet","ServerStyleSheet","collectStyles","helmet","Helmet","renderStatic","rewind","htmlAttributes","toString","title","metadata","meta","concat","link","redirect","reduxState","getState","styleTags","getStyleTags","serialisedReduxData","serialize","responseHTML","minifyCssString","err","catch","stack","close","start","ServerFeatures","global","PACKAGE_JSON","DISABLE_SSR_REDUX","PROXY_DELIVERY_API","proxyDeliveryApi","REVERSE_PROXY_PATHS","disable","ConfigureReverseProxies","ServeStaticAssets","ConfigureWebApp","server","listen","setTimeout","emit"],"mappings":"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"}
@@ -58,6 +58,7 @@ const DisplayStartupConfiguration = config => {
58
58
  console.log();
59
59
  console.log('Reverse proxy paths: ', JSON.stringify(config.reverseProxyPaths, null, 2));
60
60
  console.log();
61
+ if (config.staticFolderPath) console.log(`Serving static assets from: "/dist/${config.staticFolderPath}/"`);
61
62
  /* eslint-enable no-console */
62
63
  };
63
64
 
@@ -118,6 +119,7 @@ const replaceStaticPath = (str, staticFolderPath = 'static') => str.replace(/sta
118
119
  const bundleManipulationMiddleware = ({
119
120
  appRootPath,
120
121
  maxage,
122
+ staticFolderPath,
121
123
  staticRoutePath
122
124
  }) => (req, res, next) => {
123
125
  const filename = path.basename(req.path);
@@ -125,7 +127,7 @@ const bundleManipulationMiddleware = ({
125
127
  const legacyBundle = filename.endsWith('.js');
126
128
 
127
129
  if ((legacyBundle || modernBundle) && filename.startsWith('runtime.')) {
128
- const jsRuntimeLocation = path.resolve(appRootPath, `dist/static/${modernBundle ? 'modern/js' : 'legacy/js'}/${filename}`);
130
+ const jsRuntimeLocation = path.resolve(appRootPath, `dist/${staticFolderPath}/${modernBundle ? 'modern/js' : 'legacy/js'}/${filename}`);
129
131
 
130
132
  try {
131
133
  const jsRuntimeBundle = fs.readFileSync(jsRuntimeLocation, 'utf8');
@@ -155,13 +157,22 @@ const resolveStartupMiddleware = ({
155
157
  maxage,
156
158
  staticFolderPath,
157
159
  startupScriptFilename
158
- }) => (req, res, next) => {
160
+ }) => async (req, res, next) => {
159
161
  if (startupScriptFilename !== 'startup.js' && req.path === `/${startupScriptFilename}`) {
160
- const startupFilePath = `dist/${staticFolderPath}/startup.js`;
161
- const startupFileLocation = path.resolve(appRootPath, startupFilePath);
162
- if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);
162
+ let startupFileLocation = '';
163
163
 
164
164
  try {
165
+ const startupFilePaths = [`dist/static/startup.js`, `dist/${staticFolderPath}/startup.js`];
166
+ let startupFilePath = '';
167
+ startupFilePaths.forEach(async testPath => {
168
+ try {
169
+ fs.accessSync(testPath);
170
+ startupFilePath = testPath;
171
+ } catch (ex) {// Do nothing
172
+ }
173
+ });
174
+ startupFileLocation = path.resolve(appRootPath, startupFilePath);
175
+ if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);
165
176
  res.sendFile(startupFileLocation);
166
177
  } catch (sendFileError) {
167
178
  // eslint-disable-next-line no-console
@@ -187,6 +198,7 @@ const staticAssets = (app, {
187
198
  // these maxage values are different in config but the same in runtime,
188
199
  // this one is the true value in seconds
189
200
  maxage: CacheDuration.static,
201
+ staticFolderPath,
190
202
  staticRoutePath
191
203
  }), resolveStartupMiddleware({
192
204
  appRootPath,
@@ -1 +1 @@
1
- {"version":3,"file":"contensis-react-base.js","sources":["../src/server/util/displayStartupConfiguration.ts","../src/server/features/reverse-proxy/index.ts","../src/server/features/caching/cacheDuration.schema.ts","../src/server/util/staticPaths.ts","../src/server/middleware/bundleManipulation.ts","../src/server/middleware/resolveStartup.ts","../src/server/features/static-assets/index.ts","../src/server/util/stringifyAttributes.ts","../src/server/features/response-handler/index.ts","../src/server/util/bundles.ts","../src/server/util/headers.ts","../src/server/webApp.tsx","../src/server/internalServer.ts"],"sourcesContent":["const servers = SERVERS; /* global SERVERS */\nconst projects = PROJECTS; /* global PROJECTS */\n\nconst DisplayStartupConfiguration = config => {\n /* eslint-disable no-console */\n console.log();\n console.log(\n `Configured servers:\n`,\n JSON.stringify(servers, null, 2)\n );\n console.log();\n console.log(\n `Configured projects:\n`,\n JSON.stringify(projects, null, 2)\n );\n console.log();\n console.log(\n 'Reverse proxy paths: ',\n JSON.stringify(config.reverseProxyPaths, null, 2)\n );\n console.log();\n\n /* eslint-enable no-console */\n};\n\nexport default DisplayStartupConfiguration;\n","import { Express } from 'express';\nimport httpProxy from 'http-proxy';\n\nconst servers = SERVERS; /* global SERVERS */\nexport const apiProxy = httpProxy.createProxyServer();\n\nconst reverseProxies = (app: Express, reverseProxyPaths: string[] = []) => {\n deliveryApiProxy(apiProxy, app);\n\n app.all(reverseProxyPaths, (req, res) => {\n const target =\n req.hostname.indexOf('preview-') ||\n req.hostname.indexOf('preview.') ||\n req.hostname === 'localhost'\n ? servers.previewIis || servers.iis\n : servers.iis;\n\n apiProxy.web(req, res, { target, changeOrigin: true });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy Request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nconst deliveryApiProxy = (apiProxy, app) => {\n // This is just here to stop cors requests on localhost. In Production this is mapped using varnish.\n app.all(['/api/delivery/*', '/api/image/*'], (req, res) => {\n /* eslint-disable no-console */\n const target = servers.cms;\n console.log(`Proxying api request to ${servers.alias}`);\n apiProxy.web(req, res, {\n target,\n changeOrigin: true,\n });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nexport default reverseProxies;\n","export const CacheDuration = {\n 200: '3600',\n 404: '5',\n static: '31536000', // Believe it or not these two max ages are the same in runtime\n expressStatic: '31557600h', // Believe it or not these two max ages are the same in runtime\n};\n\nexport const getCacheDuration = (status = 200) => {\n if (status > 400) return CacheDuration[404];\n return CacheDuration[200];\n};\n","export const replaceStaticPath = (str: string, staticFolderPath = 'static') =>\n str.replace(/static\\//g, `${staticFolderPath}/`);\n","import { RequestHandler } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { replaceStaticPath } from '../util/staticPaths';\n\nexport const bundleManipulationMiddleware =\n ({\n appRootPath,\n maxage,\n staticRoutePath,\n }: {\n appRootPath: string;\n maxage: string;\n staticRoutePath: string;\n }): RequestHandler =>\n (req, res, next) => {\n const filename = path.basename(req.path);\n const modernBundle = filename.endsWith('.mjs');\n const legacyBundle = filename.endsWith('.js');\n if ((legacyBundle || modernBundle) && filename.startsWith('runtime.')) {\n const jsRuntimeLocation = path.resolve(\n appRootPath,\n `dist/static/${modernBundle ? 'modern/js' : 'legacy/js'}/${filename}`\n );\n try {\n const jsRuntimeBundle = fs.readFileSync(jsRuntimeLocation, 'utf8');\n const modifiedBundle = replaceStaticPath(\n jsRuntimeBundle,\n staticRoutePath\n );\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n res.type('.js').send(modifiedBundle);\n return;\n } catch (readError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to find js runtime bundle at '${jsRuntimeLocation}'`,\n readError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import { RequestHandler } from 'express';\nimport path from 'path';\n\n/**\n *\n * @param { appRootPath: string; maxage: number; staticFolderPath: string, startupScriptFilename: string } args\n * @returns Response | next()\n * A middleware function to resolve /dist/static/startup.js under a supplied startupScriptFilename variable\n */\nexport const resolveStartupMiddleware =\n ({\n appRootPath,\n maxage,\n staticFolderPath,\n startupScriptFilename,\n }: {\n appRootPath: string;\n maxage: string;\n staticFolderPath: string;\n startupScriptFilename: string;\n }): RequestHandler =>\n (req, res, next) => {\n if (\n startupScriptFilename !== 'startup.js' &&\n req.path === `/${startupScriptFilename}`\n ) {\n const startupFilePath = `dist/${staticFolderPath}/startup.js`;\n const startupFileLocation = path.resolve(appRootPath, startupFilePath);\n\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n\n try {\n res.sendFile(startupFileLocation);\n } catch (sendFileError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to send file startup.js at '${startupFileLocation}'`,\n sendFileError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import express from 'express';\nimport { CacheDuration } from '~/server/features/caching/cacheDuration.schema';\nimport { bundleManipulationMiddleware } from '~/server/middleware/bundleManipulation';\nimport { resolveStartupMiddleware } from '~/server/middleware/resolveStartup';\n\nimport { path as appPath } from 'app-root-path';\nimport { ServerConfig } from '~/config';\n// Serving static assets\nconst staticAssets = (\n app,\n {\n appRootPath = appPath,\n scripts = {} as NonNullable<ServerConfig['scripts']>,\n startupScriptFilename = 'startup.js',\n staticFolderPath = 'static',\n staticRoutePath = 'static',\n staticRoutePaths = [] as string[],\n }\n) => {\n app.use(\n [\n `/${staticRoutePath}`,\n ...staticRoutePaths.map(p => `/${p}`),\n `/${staticFolderPath}`,\n ],\n bundleManipulationMiddleware({\n appRootPath,\n // these maxage values are different in config but the same in runtime,\n // this one is the true value in seconds\n maxage: CacheDuration.static,\n staticRoutePath,\n }),\n resolveStartupMiddleware({\n appRootPath,\n maxage: CacheDuration.static,\n startupScriptFilename: scripts.startup || startupScriptFilename,\n staticFolderPath,\n }),\n // eslint-disable-next-line import/no-named-as-default-member\n express.static(`dist/${staticFolderPath}`, {\n // these maxage values are different in config but the same in runtime,\n // this one is somehow converted and should end up being the same as CacheDuration.static\n maxAge: CacheDuration.expressStatic,\n })\n );\n};\n\nexport default staticAssets;\n","export default (attributes = {}) =>\n Object.entries(attributes)\n .map(\n ([key, value], idx) =>\n `${idx !== 0 ? ' ' : ''}${key}${value ? `=\"${value}\"` : ''}`\n )\n .join(' ');\n","/* eslint-disable no-console */\nimport { Request, Response } from 'express';\nimport { ResponseMethod } from './types';\n\n/**\n * Web Application Response handler, sends a prepared express js response\n * with the supplied content sending in the specified manner\n * @param {response} request express js request object\n * @param {response} response express js response object\n * @param {string | object} content the content to send in the response body\n * @param {\"send\" | \"json\" | \"end\"} send the response function to call e.g res.send() res.json() res.end()\n */\nconst handleResponse = (\n request: Request,\n response: Response,\n content: any,\n send: keyof typeof ResponseMethod = 'send'\n) => {\n // console.log('---', response.statusCode, '---');\n response[send](content);\n};\n\nexport default handleResponse;\n","import fs from 'fs';\nimport path from 'path';\nimport { ChunkExtractor } from '@loadable/server';\nimport { replaceStaticPath } from './staticPaths';\nimport { ServerConfig } from '~/config';\nimport stringifyAttributes from './stringifyAttributes';\n\nconst readFileSync = path => fs.readFileSync(path, 'utf8');\n\nexport const loadableBundleData = (\n { stats, templates },\n staticRoutePath: string,\n build?: string\n) => {\n const bundle: {\n stats?: string | null;\n templates?: {\n templateHTML;\n templateHTMLStatic;\n templateHTMLFragment;\n } | null;\n } = {};\n try {\n bundle.stats = JSON.parse(\n readFileSync(stats.replace('/target', build ? `/${build}` : ''))\n );\n } catch (ex) {\n // console.info(ex);\n bundle.stats = null;\n }\n try {\n bundle.templates = {\n templateHTML: replaceStaticPath(\n readFileSync(\n templates.html.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLStatic: replaceStaticPath(\n readFileSync(\n templates.static.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLFragment: replaceStaticPath(\n readFileSync(\n templates.fragment.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n };\n } catch (ex) {\n // console.info(ex);\n bundle.templates = null;\n }\n return bundle;\n};\n\ntype LoadableChunkExtractors =\n | {\n legacy: ChunkExtractor;\n modern: ChunkExtractor;\n commonLoadableExtractor: ChunkExtractor;\n }\n | undefined;\n\nexport const loadableChunkExtractors = () => {\n try {\n const modern = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'modern',\n statsFile: path.resolve('dist/modern/loadable-stats.json'),\n });\n const legacy = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'legacy',\n statsFile: path.resolve('dist/legacy/loadable-stats.json'),\n });\n const commonLoadableExtractor: ChunkExtractor = {\n addChunk(chunk) {\n modern.addChunk(chunk);\n if (typeof legacy.stats.assetsByChunkName[chunk] !== 'undefined')\n legacy.addChunk(chunk);\n },\n };\n\n return {\n commonLoadableExtractor,\n modern,\n legacy,\n } as LoadableChunkExtractors;\n } catch (e) {\n console.info('@loadable/server ChunkExtractor not available');\n }\n};\n\nexport const getBundleData = (config, staticRoutePath) => {\n const bundleData = {\n default: loadableBundleData(config, staticRoutePath),\n legacy: loadableBundleData(config, staticRoutePath, 'legacy'),\n modern: loadableBundleData(config, staticRoutePath, 'modern'),\n };\n if (!bundleData.default || bundleData.default === {})\n bundleData.default = bundleData.legacy || bundleData.modern;\n return bundleData;\n};\n\nexport const buildBundleTags = (\n bundles,\n differentialBundles = false,\n staticRoutePath = 'static',\n attributes = ''\n) => {\n // Take the bundles returned from Loadable.Capture\n const bundleTags = bundles\n .filter(b => b)\n .map(bundle => {\n if (bundle.publicPath.includes('/modern/'))\n return differentialBundles\n ? `<script ${attributes} type=\"module\" src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`\n : null;\n return `<script ${attributes}${\n differentialBundles ? ' nomodule' : ''\n } src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`;\n })\n .filter(f => f);\n\n return bundleTags;\n};\n\nexport const getBundleTags = (\n loadableExtractor: LoadableChunkExtractors,\n scripts: ServerConfig['scripts'],\n staticRoutePath = 'static'\n) => {\n let startupTag = '';\n // Add the static startup script to the bundleTags\n if (scripts?.startup)\n startupTag = `<script ${stringifyAttributes(\n scripts.attributes\n )} src=\"/${staticRoutePath}/${scripts.startup}\"></script>`;\n\n // Get the script tags from their respective extractor instances\n if (loadableExtractor) {\n const legacyScriptTags = loadableExtractor?.legacy.getScriptTags({\n noModule: true,\n });\n const modernScriptTags = loadableExtractor?.modern.getScriptTags({\n type: 'module',\n });\n const scriptTags = `${startupTag}${legacyScriptTags || ''}${\n modernScriptTags || ''\n }`.replace(/\"\\/static\\//g, `\"/${staticRoutePath}/`);\n return scriptTags;\n }\n return startupTag;\n};\n","import { Response } from 'express';\nimport {\n selectCurrentProject,\n selectRouteEntry,\n selectSurrogateKeys,\n} from '~/routing/redux/selectors';\nimport { getImmutableOrJS as getIn } from '~/redux/util';\n\nimport { getCacheDuration } from '../features/caching/cacheDuration.schema';\nimport { AppState } from '~/redux/appstate';\n\nexport const addStandardHeaders = (\n state: AppState,\n response: Response,\n packagejson: any,\n groups: { globalGroups?: any[]; allowedGroups?: any[] }\n) => {\n if (state) {\n try {\n console.info('About to add headers');\n const routingSurrogateKeys = selectSurrogateKeys(state);\n\n const surrogateKeyHeader = ` ${packagejson.name}-app ${routingSurrogateKeys}`;\n\n response.header('surrogate-key', surrogateKeyHeader);\n\n addVarnishAuthenticationHeaders(state, response, groups);\n\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(response.statusCode)}`\n );\n } catch (e: any) {\n console.info('Error Adding headers', e.message);\n }\n }\n};\n\nexport const addVarnishAuthenticationHeaders = (\n state: AppState,\n response: Response,\n groups: { globalGroups?: any[]; allowedGroups?: any[] } = {}\n) => {\n if (state) {\n try {\n const stateEntry = selectRouteEntry(state);\n const project = selectCurrentProject(state);\n const { globalGroups, allowedGroups } = groups;\n // console.info(globalGroups, allowedGroups);\n let allGroups = Array.from((globalGroups && globalGroups[project]) || {});\n if (\n stateEntry &&\n getIn(stateEntry, ['authentication', 'isLoginRequired']) &&\n allowedGroups &&\n allowedGroups[project]\n ) {\n allGroups = [...allGroups, ...allowedGroups[project]];\n }\n response.header('x-contensis-viewer-groups', allGroups.join('|'));\n } catch (e) {\n console.info('Error adding authentication header', e);\n }\n }\n};\n","import fs from 'fs';\nimport React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { StaticRouter } from 'react-router-dom';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { matchRoutes } from 'react-router-config';\nimport { Helmet } from 'react-helmet';\nimport { ServerStyleSheet } from 'styled-components';\nimport serialize from 'serialize-javascript';\nimport minifyCssString from 'minify-css-string';\nimport mapJson from 'jsonpath-mapper';\nimport { Express } from 'express';\nimport { StaticRouterContext } from 'react-router';\nimport { ChunkExtractorManager } from '@loadable/server';\n\nimport createStore from '~/redux/store/store';\nimport { history } from '~/redux/store/history';\nimport rootSaga from '~/redux/sagas';\n\nimport { setVersion, setVersionStatus } from '~/redux/actions/version';\nimport { setCurrentProject } from '~/routing/redux/actions';\n\nimport { deliveryApi } from '~/util/ContensisDeliveryApi';\nimport pickProject from '~/util/pickProject';\nimport stringifyAttributes from './util/stringifyAttributes';\n\nimport { getCacheDuration } from './features/caching/cacheDuration.schema';\nimport handleResponse from './features/response-handler';\n\nimport {\n getBundleData,\n getBundleTags,\n loadableChunkExtractors,\n} from './util/bundles';\nimport { addStandardHeaders } from './util/headers';\n\nimport { ServerConfig } from '~/config';\nimport { AppState } from '~/redux/appstate';\n\nconst webApp = (\n app: Express,\n ReactApp: React.ComponentType<any>,\n config: ServerConfig & {\n allowedGroups?: string[];\n globalGroups?: string[];\n startupScriptFilename?: string;\n }\n) => {\n const {\n stateType = 'immutable',\n routes,\n withReducers,\n withSagas,\n withEvents,\n packagejson,\n scripts = {},\n staticFolderPath = 'static',\n startupScriptFilename,\n allowedGroups,\n globalGroups,\n disableSsrRedux,\n handleResponses,\n } = config;\n const staticRoutePath = config.staticRoutePath || staticFolderPath;\n\n const bundleData = getBundleData(config, staticRoutePath);\n\n const attributes = stringifyAttributes(scripts.attributes);\n scripts.startup = scripts.startup || startupScriptFilename;\n\n const responseHandler =\n typeof handleResponses === 'function' ? handleResponses : handleResponse;\n\n const versionInfo = JSON.parse(\n fs.readFileSync(`dist/${staticFolderPath}/version.json`, 'utf8')\n );\n\n app.get('/*', async (request, response) => {\n const { url } = request;\n\n const matchedStaticRoute = () =>\n matchRoutes(routes.StaticRoutes, request.path);\n const isStaticRoute = () => matchedStaticRoute().length > 0;\n const staticRoute = isStaticRoute() && matchedStaticRoute()[0];\n\n // Allow certain routes to avoid SSR\n const onlyDynamic = staticRoute && staticRoute.route.ssr === false;\n const onlySSR = staticRoute && staticRoute.route.ssrOnly === true;\n\n const normaliseQs = q => (q && q.toLowerCase() === 'true' ? true : false);\n\n // Determine functional params from QueryString and set access methods\n const accessMethod = mapJson<\n any,\n { DYNAMIC: boolean; REDUX: boolean; FRAGMENT: boolean; STATIC: boolean }\n >(request.query, {\n DYNAMIC: ({ dynamic }) => normaliseQs(dynamic) || onlyDynamic,\n REDUX: ({ redux }) => normaliseQs(redux),\n FRAGMENT: ({ fragment }) => normaliseQs(fragment),\n STATIC: ({ static: value }) => normaliseQs(value) || onlySSR,\n });\n\n const context: StaticRouterContext = {};\n // Track the current statusCode via the response object\n response.status(200);\n\n // Create a store (with a memory history) from our current url\n const store = await createStore(\n withReducers,\n {} as AppState,\n history({\n initialEntries: [url],\n }),\n stateType\n );\n\n // dispatch any global and non-saga related actions before calling our JSX\n const versionStatusFromHostname = deliveryApi.getVersionStatusFromHostname(\n request.hostname\n );\n\n console.info(\n `Request for ${request.path} hostname: ${request.hostname} versionStatus: ${versionStatusFromHostname}`\n );\n\n store.dispatch(\n setVersionStatus(request.query.versionStatus || versionStatusFromHostname)\n );\n store.dispatch(setVersion(versionInfo.commitRef, versionInfo.buildNo));\n\n const project = pickProject(request.hostname, request.query);\n\n const groups = allowedGroups && allowedGroups[project];\n store.dispatch(setCurrentProject(project, groups, request.hostname));\n\n const loadableExtractor = loadableChunkExtractors();\n\n const jsx = (\n <ChunkExtractorManager\n extractor={loadableExtractor?.commonLoadableExtractor}\n >\n <ReduxProvider store={store}>\n <StaticRouter context={context} location={url}>\n <ReactApp routes={routes} withEvents={withEvents} />\n </StaticRouter>\n </ReduxProvider>\n </ChunkExtractorManager>\n );\n\n const { templateHTML, templateHTMLFragment, templateHTMLStatic } =\n bundleData.default.templates || bundleData.legacy.templates || {};\n\n // Serve a blank HTML page with client scripts to load the app in the browser\n if (accessMethod.DYNAMIC) {\n // Dynamic doesn't need sagas\n renderToString(jsx);\n\n // Dynamic page render has only the necessary bundles to start up the app\n // and does not include any react-loadable code-split bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n const isDynamicHint = `<script ${attributes}>window.isDynamic = true;</script>`;\n\n const responseHtmlDynamic = templateHTML\n .replace('{{TITLE}}', '')\n .replace('{{SEO_CRITICAL_METADATA}}', '')\n .replace('{{CRITICAL_CSS}}', '')\n .replace('{{APP}}', '')\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', isDynamicHint);\n // Dynamic pages always return a 200 so we can run\n // the app and serve up all errors inside the client\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(200)}`\n );\n responseHandler(request, response, responseHtmlDynamic);\n }\n\n // Render the JSX server side and send response as per access method options\n if (!accessMethod.DYNAMIC) {\n store\n .runSaga(rootSaga(withSagas))\n .toPromise()\n .then(() => {\n const sheet = new ServerStyleSheet();\n\n const html = renderToString(sheet.collectStyles(jsx));\n\n const helmet = Helmet.renderStatic();\n Helmet.rewind();\n const htmlAttributes = helmet.htmlAttributes.toString();\n let title = helmet.title.toString();\n const metadata = helmet.meta\n .toString()\n .concat(helmet.link.toString());\n\n if (context.url) {\n return response.redirect(302, context.url);\n }\n\n const reduxState = store.getState();\n\n const styleTags = sheet.getStyleTags();\n\n // After running rootSaga there should be an additional react-loadable\n // code-split bundles for any page components as well as core app bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n let serialisedReduxData = serialize(reduxState);\n if (context.statusCode !== 404) {\n // For a request that returns a redux state object as a response\n if (accessMethod.REDUX) {\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n responseHandler(request, response, serialisedReduxData, 'json');\n return true;\n }\n if (!disableSsrRedux) {\n serialisedReduxData = `<script ${attributes}>window.REDUX_DATA = ${serialisedReduxData}</script>`;\n }\n }\n if ((context.statusCode || 200) > 400) {\n accessMethod.STATIC = true;\n }\n\n // Responses\n let responseHTML = '';\n\n if (context.statusCode === 404)\n title = '<title>404 page not found</title>';\n\n // Static page served as a fragment\n if (accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = minifyCssString(styleTags) + html;\n }\n\n // Page fragment served with client scripts and redux data that hydrate the app client side\n if (accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTMLFragment\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Full HTML page served statically\n if (!accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = templateHTMLStatic\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', '');\n }\n\n // Full HTML page served with client scripts and redux data that hydrate the app client side\n if (!accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTML\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', styleTags)\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Set response.status from React StaticRouter\n if (typeof context.statusCode === 'number')\n response.status(context.statusCode);\n\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n try {\n // If react-helmet htmlAttributes are being used,\n // replace the html tag with those attributes sepcified\n // e.g. (lang, dir etc.)\n if (htmlAttributes) {\n responseHTML = responseHTML.replace(\n /<html?.+?>/,\n `<html ${htmlAttributes}>`\n );\n }\n responseHandler(request, response, responseHTML);\n } catch (err: any) {\n console.info(err.message);\n }\n })\n .catch(err => {\n // Handle any error that occurred in any of the previous\n // promises in the chain.\n console.info(err);\n response.status(500);\n responseHandler(\n request,\n response,\n `Error occurred: <br />${err.stack} <br />${JSON.stringify(err)}`\n );\n });\n renderToString(jsx);\n\n store.close();\n }\n });\n};\n\nexport default webApp;\n","import 'isomorphic-fetch';\nimport express, { Express } from 'express';\nimport React from 'react';\n\nimport DisplayStartupConfiguration from './util/displayStartupConfiguration';\nimport ConfigureReverseProxies, { apiProxy } from './features/reverse-proxy';\nimport ServeStaticAssets from './features/static-assets';\nimport ConfigureWebApp from './webApp';\nimport { ServerConfig } from '~/config';\n\ndeclare let global: typeof globalThis & {\n DISABLE_SSR_REDUX: boolean | undefined;\n PACKAGE_JSON: any;\n PROXY_DELIVERY_API: boolean | undefined;\n REVERSE_PROXY_PATHS: string[];\n};\n\nconst app: Express = express();\n\nconst start = (\n ReactApp: React.ComponentType<any>,\n config: ServerConfig,\n ServerFeatures: (app: Express) => void\n) => {\n global.PACKAGE_JSON = config.packagejson;\n global.DISABLE_SSR_REDUX = config.disableSsrRedux;\n global.PROXY_DELIVERY_API = config.proxyDeliveryApi;\n global.REVERSE_PROXY_PATHS = Object(config.reverseProxyPaths);\n\n app.disable('x-powered-by');\n\n // Output some information about the used build/startup configuration\n DisplayStartupConfiguration(config);\n\n ServerFeatures(app);\n // Set-up local proxy for images from cms, and delivery api requests\n // to save doing rewrites and extra code\n ConfigureReverseProxies(app, config.reverseProxyPaths);\n ServeStaticAssets(app, config);\n ConfigureWebApp(app, ReactApp, config);\n\n app.on('ready', async () => {\n // Configure DNS to make life easier\n // await ConfigureLocalDNS();\n\n const server = app.listen(3001, () => {\n console.info(`HTTP server is listening @ port 3001`);\n setTimeout(function () {\n app.emit('app_started');\n }, 500);\n });\n app.on('stop', () => {\n server.close(function () {\n console.info('GoodBye :(');\n });\n });\n });\n};\n\nexport default { app, apiProxy, start };\n"],"names":["servers","SERVERS","projects","PROJECTS","DisplayStartupConfiguration","config","console","log","JSON","stringify","reverseProxyPaths","apiProxy","httpProxy","createProxyServer","reverseProxies","app","deliveryApiProxy","all","req","res","target","hostname","indexOf","previewIis","iis","web","changeOrigin","on","e","path","cms","alias","CacheDuration","static","expressStatic","getCacheDuration","status","replaceStaticPath","str","staticFolderPath","replace","bundleManipulationMiddleware","appRootPath","maxage","staticRoutePath","next","filename","basename","modernBundle","endsWith","legacyBundle","startsWith","jsRuntimeLocation","resolve","jsRuntimeBundle","fs","readFileSync","modifiedBundle","set","type","send","readError","resolveStartupMiddleware","startupScriptFilename","startupFilePath","startupFileLocation","sendFile","sendFileError","staticAssets","appPath","scripts","staticRoutePaths","use","map","p","startup","express","maxAge","attributes","Object","entries","key","value","idx","join","handleResponse","request","response","content","loadableBundleData","stats","templates","build","bundle","parse","ex","templateHTML","html","templateHTMLStatic","templateHTMLFragment","fragment","loadableChunkExtractors","modern","ChunkExtractor","entrypoints","namespace","statsFile","legacy","commonLoadableExtractor","addChunk","chunk","assetsByChunkName","info","getBundleData","bundleData","default","getBundleTags","loadableExtractor","startupTag","stringifyAttributes","legacyScriptTags","getScriptTags","noModule","modernScriptTags","scriptTags","addStandardHeaders","state","packagejson","groups","routingSurrogateKeys","selectSurrogateKeys","surrogateKeyHeader","name","header","addVarnishAuthenticationHeaders","setHeader","statusCode","message","stateEntry","selectRouteEntry","project","selectCurrentProject","globalGroups","allowedGroups","allGroups","Array","from","getIn","webApp","ReactApp","stateType","routes","withReducers","withSagas","withEvents","disableSsrRedux","handleResponses","responseHandler","versionInfo","get","url","matchedStaticRoute","matchRoutes","StaticRoutes","isStaticRoute","length","staticRoute","onlyDynamic","route","ssr","onlySSR","ssrOnly","normaliseQs","q","toLowerCase","accessMethod","mapJson","query","DYNAMIC","dynamic","REDUX","redux","FRAGMENT","STATIC","context","store","createStore","history","initialEntries","versionStatusFromHostname","deliveryApi","getVersionStatusFromHostname","dispatch","setVersionStatus","versionStatus","setVersion","commitRef","buildNo","pickProject","setCurrentProject","jsx","ReduxProvider","renderToString","bundleTags","isDynamicHint","responseHtmlDynamic","runSaga","rootSaga","toPromise","then","sheet","ServerStyleSheet","collectStyles","helmet","Helmet","renderStatic","rewind","htmlAttributes","toString","title","metadata","meta","concat","link","redirect","reduxState","getState","styleTags","getStyleTags","serialisedReduxData","serialize","responseHTML","minifyCssString","err","catch","stack","close","start","ServerFeatures","global","PACKAGE_JSON","DISABLE_SSR_REDUX","PROXY_DELIVERY_API","proxyDeliveryApi","REVERSE_PROXY_PATHS","disable","ConfigureReverseProxies","ServeStaticAssets","ConfigureWebApp","server","listen","setTimeout","emit"],"mappings":"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"}
1
+ {"version":3,"file":"contensis-react-base.js","sources":["../src/server/util/displayStartupConfiguration.ts","../src/server/features/reverse-proxy/index.ts","../src/server/features/caching/cacheDuration.schema.ts","../src/server/util/staticPaths.ts","../src/server/middleware/bundleManipulation.ts","../src/server/middleware/resolveStartup.ts","../src/server/features/static-assets/index.ts","../src/server/util/stringifyAttributes.ts","../src/server/features/response-handler/index.ts","../src/server/util/bundles.ts","../src/server/util/headers.ts","../src/server/webApp.tsx","../src/server/internalServer.ts"],"sourcesContent":["const servers = SERVERS; /* global SERVERS */\nconst projects = PROJECTS; /* global PROJECTS */\n\nconst DisplayStartupConfiguration = config => {\n /* eslint-disable no-console */\n console.log();\n console.log(\n `Configured servers:\n`,\n JSON.stringify(servers, null, 2)\n );\n console.log();\n console.log(\n `Configured projects:\n`,\n JSON.stringify(projects, null, 2)\n );\n console.log();\n console.log(\n 'Reverse proxy paths: ',\n JSON.stringify(config.reverseProxyPaths, null, 2)\n );\n console.log();\n if (config.staticFolderPath)\n console.log(\n `Serving static assets from: \"/dist/${config.staticFolderPath}/\"`\n );\n /* eslint-enable no-console */\n};\n\nexport default DisplayStartupConfiguration;\n","import { Express } from 'express';\nimport httpProxy from 'http-proxy';\n\nconst servers = SERVERS; /* global SERVERS */\nexport const apiProxy = httpProxy.createProxyServer();\n\nconst reverseProxies = (app: Express, reverseProxyPaths: string[] = []) => {\n deliveryApiProxy(apiProxy, app);\n\n app.all(reverseProxyPaths, (req, res) => {\n const target =\n req.hostname.indexOf('preview-') ||\n req.hostname.indexOf('preview.') ||\n req.hostname === 'localhost'\n ? servers.previewIis || servers.iis\n : servers.iis;\n\n apiProxy.web(req, res, { target, changeOrigin: true });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy Request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nconst deliveryApiProxy = (apiProxy, app) => {\n // This is just here to stop cors requests on localhost. In Production this is mapped using varnish.\n app.all(['/api/delivery/*', '/api/image/*'], (req, res) => {\n /* eslint-disable no-console */\n const target = servers.cms;\n console.log(`Proxying api request to ${servers.alias}`);\n apiProxy.web(req, res, {\n target,\n changeOrigin: true,\n });\n apiProxy.on('error', e => {\n /* eslint-disable no-console */\n console.log(\n `Proxy request for ${req.path} HostName:${req.hostname} failed with ${e}`\n );\n /* eslint-enable no-console */\n });\n });\n};\n\nexport default reverseProxies;\n","export const CacheDuration = {\n 200: '3600',\n 404: '5',\n static: '31536000', // Believe it or not these two max ages are the same in runtime\n expressStatic: '31557600h', // Believe it or not these two max ages are the same in runtime\n};\n\nexport const getCacheDuration = (status = 200) => {\n if (status > 400) return CacheDuration[404];\n return CacheDuration[200];\n};\n","export const replaceStaticPath = (str: string, staticFolderPath = 'static') =>\n str.replace(/static\\//g, `${staticFolderPath}/`);\n","import { RequestHandler } from 'express';\nimport fs from 'fs';\nimport path from 'path';\nimport { replaceStaticPath } from '../util/staticPaths';\n\nexport const bundleManipulationMiddleware =\n ({\n appRootPath,\n maxage,\n staticFolderPath,\n staticRoutePath,\n }: {\n appRootPath: string;\n maxage: string;\n staticFolderPath: string;\n staticRoutePath: string;\n }): RequestHandler =>\n (req, res, next) => {\n const filename = path.basename(req.path);\n const modernBundle = filename.endsWith('.mjs');\n const legacyBundle = filename.endsWith('.js');\n if ((legacyBundle || modernBundle) && filename.startsWith('runtime.')) {\n const jsRuntimeLocation = path.resolve(\n appRootPath,\n `dist/${staticFolderPath}/${\n modernBundle ? 'modern/js' : 'legacy/js'\n }/${filename}`\n );\n try {\n const jsRuntimeBundle = fs.readFileSync(jsRuntimeLocation, 'utf8');\n const modifiedBundle = replaceStaticPath(\n jsRuntimeBundle,\n staticRoutePath\n );\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n res.type('.js').send(modifiedBundle);\n return;\n } catch (readError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to find js runtime bundle at '${jsRuntimeLocation}'`,\n readError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import { RequestHandler } from 'express';\nimport fs from 'fs';\nimport path from 'path';\n\n/**\n *\n * @param { appRootPath: string; maxage: number; staticFolderPath: string, startupScriptFilename: string } args\n * @returns Response | next()\n * A middleware function to resolve /dist/static/startup.js under a supplied startupScriptFilename variable\n */\nexport const resolveStartupMiddleware =\n ({\n appRootPath,\n maxage,\n staticFolderPath,\n startupScriptFilename,\n }: {\n appRootPath: string;\n maxage: string;\n staticFolderPath: string;\n startupScriptFilename: string;\n }): RequestHandler =>\n async (req, res, next) => {\n if (\n startupScriptFilename !== 'startup.js' &&\n req.path === `/${startupScriptFilename}`\n ) {\n let startupFileLocation = '';\n try {\n const startupFilePaths = [\n `dist/static/startup.js`,\n `dist/${staticFolderPath}/startup.js`,\n ];\n let startupFilePath = '';\n startupFilePaths.forEach(async testPath => {\n try {\n fs.accessSync(testPath);\n startupFilePath = testPath;\n } catch (ex) {\n // Do nothing\n }\n });\n startupFileLocation = path.resolve(appRootPath, startupFilePath);\n\n if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);\n\n res.sendFile(startupFileLocation);\n } catch (sendFileError) {\n // eslint-disable-next-line no-console\n console.log(\n `Unable to send file startup.js at '${startupFileLocation}'`,\n sendFileError\n );\n next();\n }\n } else {\n next();\n }\n };\n","import express from 'express';\nimport { CacheDuration } from '~/server/features/caching/cacheDuration.schema';\nimport { bundleManipulationMiddleware } from '~/server/middleware/bundleManipulation';\nimport { resolveStartupMiddleware } from '~/server/middleware/resolveStartup';\n\nimport { path as appPath } from 'app-root-path';\nimport { ServerConfig } from '~/config';\n// Serving static assets\nconst staticAssets = (\n app,\n {\n appRootPath = appPath,\n scripts = {} as NonNullable<ServerConfig['scripts']>,\n startupScriptFilename = 'startup.js',\n staticFolderPath = 'static',\n staticRoutePath = 'static',\n staticRoutePaths = [] as string[],\n }\n) => {\n app.use(\n [\n `/${staticRoutePath}`,\n ...staticRoutePaths.map(p => `/${p}`),\n `/${staticFolderPath}`,\n ],\n bundleManipulationMiddleware({\n appRootPath,\n // these maxage values are different in config but the same in runtime,\n // this one is the true value in seconds\n maxage: CacheDuration.static,\n staticFolderPath,\n staticRoutePath,\n }),\n resolveStartupMiddleware({\n appRootPath,\n maxage: CacheDuration.static,\n startupScriptFilename: scripts.startup || startupScriptFilename,\n staticFolderPath,\n }),\n // eslint-disable-next-line import/no-named-as-default-member\n express.static(`dist/${staticFolderPath}`, {\n // these maxage values are different in config but the same in runtime,\n // this one is somehow converted and should end up being the same as CacheDuration.static\n maxAge: CacheDuration.expressStatic,\n })\n );\n};\n\nexport default staticAssets;\n","export default (attributes = {}) =>\n Object.entries(attributes)\n .map(\n ([key, value], idx) =>\n `${idx !== 0 ? ' ' : ''}${key}${value ? `=\"${value}\"` : ''}`\n )\n .join(' ');\n","/* eslint-disable no-console */\nimport { Request, Response } from 'express';\nimport { ResponseMethod } from './types';\n\n/**\n * Web Application Response handler, sends a prepared express js response\n * with the supplied content sending in the specified manner\n * @param {response} request express js request object\n * @param {response} response express js response object\n * @param {string | object} content the content to send in the response body\n * @param {\"send\" | \"json\" | \"end\"} send the response function to call e.g res.send() res.json() res.end()\n */\nconst handleResponse = (\n request: Request,\n response: Response,\n content: any,\n send: keyof typeof ResponseMethod = 'send'\n) => {\n // console.log('---', response.statusCode, '---');\n response[send](content);\n};\n\nexport default handleResponse;\n","import fs from 'fs';\nimport path from 'path';\nimport { ChunkExtractor } from '@loadable/server';\nimport { replaceStaticPath } from './staticPaths';\nimport { ServerConfig } from '~/config';\nimport stringifyAttributes from './stringifyAttributes';\n\nconst readFileSync = path => fs.readFileSync(path, 'utf8');\n\nexport const loadableBundleData = (\n { stats, templates },\n staticRoutePath: string,\n build?: string\n) => {\n const bundle: {\n stats?: string | null;\n templates?: {\n templateHTML;\n templateHTMLStatic;\n templateHTMLFragment;\n } | null;\n } = {};\n try {\n bundle.stats = JSON.parse(\n readFileSync(stats.replace('/target', build ? `/${build}` : ''))\n );\n } catch (ex) {\n // console.info(ex);\n bundle.stats = null;\n }\n try {\n bundle.templates = {\n templateHTML: replaceStaticPath(\n readFileSync(\n templates.html.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLStatic: replaceStaticPath(\n readFileSync(\n templates.static.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n templateHTMLFragment: replaceStaticPath(\n readFileSync(\n templates.fragment.replace('/target', build ? `/${build}` : '')\n ),\n staticRoutePath\n ),\n };\n } catch (ex) {\n // console.info(ex);\n bundle.templates = null;\n }\n return bundle;\n};\n\ntype LoadableChunkExtractors =\n | {\n legacy: ChunkExtractor;\n modern: ChunkExtractor;\n commonLoadableExtractor: ChunkExtractor;\n }\n | undefined;\n\nexport const loadableChunkExtractors = () => {\n try {\n const modern = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'modern',\n statsFile: path.resolve('dist/modern/loadable-stats.json'),\n });\n const legacy = new ChunkExtractor({\n entrypoints: ['app'],\n namespace: 'legacy',\n statsFile: path.resolve('dist/legacy/loadable-stats.json'),\n });\n const commonLoadableExtractor: ChunkExtractor = {\n addChunk(chunk) {\n modern.addChunk(chunk);\n if (typeof legacy.stats.assetsByChunkName[chunk] !== 'undefined')\n legacy.addChunk(chunk);\n },\n };\n\n return {\n commonLoadableExtractor,\n modern,\n legacy,\n } as LoadableChunkExtractors;\n } catch (e) {\n console.info('@loadable/server ChunkExtractor not available');\n }\n};\n\nexport const getBundleData = (config, staticRoutePath) => {\n const bundleData = {\n default: loadableBundleData(config, staticRoutePath),\n legacy: loadableBundleData(config, staticRoutePath, 'legacy'),\n modern: loadableBundleData(config, staticRoutePath, 'modern'),\n };\n if (!bundleData.default || bundleData.default === {})\n bundleData.default = bundleData.legacy || bundleData.modern;\n return bundleData;\n};\n\nexport const buildBundleTags = (\n bundles,\n differentialBundles = false,\n staticRoutePath = 'static',\n attributes = ''\n) => {\n // Take the bundles returned from Loadable.Capture\n const bundleTags = bundles\n .filter(b => b)\n .map(bundle => {\n if (bundle.publicPath.includes('/modern/'))\n return differentialBundles\n ? `<script ${attributes} type=\"module\" src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`\n : null;\n return `<script ${attributes}${\n differentialBundles ? ' nomodule' : ''\n } src=\"${replaceStaticPath(\n bundle.publicPath,\n staticRoutePath\n )}\"></script>`;\n })\n .filter(f => f);\n\n return bundleTags;\n};\n\nexport const getBundleTags = (\n loadableExtractor: LoadableChunkExtractors,\n scripts: ServerConfig['scripts'],\n staticRoutePath = 'static'\n) => {\n let startupTag = '';\n // Add the static startup script to the bundleTags\n if (scripts?.startup)\n startupTag = `<script ${stringifyAttributes(\n scripts.attributes\n )} src=\"/${staticRoutePath}/${scripts.startup}\"></script>`;\n\n // Get the script tags from their respective extractor instances\n if (loadableExtractor) {\n const legacyScriptTags = loadableExtractor?.legacy.getScriptTags({\n noModule: true,\n });\n const modernScriptTags = loadableExtractor?.modern.getScriptTags({\n type: 'module',\n });\n const scriptTags = `${startupTag}${legacyScriptTags || ''}${\n modernScriptTags || ''\n }`.replace(/\"\\/static\\//g, `\"/${staticRoutePath}/`);\n return scriptTags;\n }\n return startupTag;\n};\n","import { Response } from 'express';\nimport {\n selectCurrentProject,\n selectRouteEntry,\n selectSurrogateKeys,\n} from '~/routing/redux/selectors';\nimport { getImmutableOrJS as getIn } from '~/redux/util';\n\nimport { getCacheDuration } from '../features/caching/cacheDuration.schema';\nimport { AppState } from '~/redux/appstate';\n\nexport const addStandardHeaders = (\n state: AppState,\n response: Response,\n packagejson: any,\n groups: { globalGroups?: any[]; allowedGroups?: any[] }\n) => {\n if (state) {\n try {\n console.info('About to add headers');\n const routingSurrogateKeys = selectSurrogateKeys(state);\n\n const surrogateKeyHeader = ` ${packagejson.name}-app ${routingSurrogateKeys}`;\n\n response.header('surrogate-key', surrogateKeyHeader);\n\n addVarnishAuthenticationHeaders(state, response, groups);\n\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(response.statusCode)}`\n );\n } catch (e: any) {\n console.info('Error Adding headers', e.message);\n }\n }\n};\n\nexport const addVarnishAuthenticationHeaders = (\n state: AppState,\n response: Response,\n groups: { globalGroups?: any[]; allowedGroups?: any[] } = {}\n) => {\n if (state) {\n try {\n const stateEntry = selectRouteEntry(state);\n const project = selectCurrentProject(state);\n const { globalGroups, allowedGroups } = groups;\n // console.info(globalGroups, allowedGroups);\n let allGroups = Array.from((globalGroups && globalGroups[project]) || {});\n if (\n stateEntry &&\n getIn(stateEntry, ['authentication', 'isLoginRequired']) &&\n allowedGroups &&\n allowedGroups[project]\n ) {\n allGroups = [...allGroups, ...allowedGroups[project]];\n }\n response.header('x-contensis-viewer-groups', allGroups.join('|'));\n } catch (e) {\n console.info('Error adding authentication header', e);\n }\n }\n};\n","import fs from 'fs';\nimport React from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { StaticRouter } from 'react-router-dom';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { matchRoutes } from 'react-router-config';\nimport { Helmet } from 'react-helmet';\nimport { ServerStyleSheet } from 'styled-components';\nimport serialize from 'serialize-javascript';\nimport minifyCssString from 'minify-css-string';\nimport mapJson from 'jsonpath-mapper';\nimport { Express } from 'express';\nimport { StaticRouterContext } from 'react-router';\nimport { ChunkExtractorManager } from '@loadable/server';\n\nimport createStore from '~/redux/store/store';\nimport { history } from '~/redux/store/history';\nimport rootSaga from '~/redux/sagas';\n\nimport { setVersion, setVersionStatus } from '~/redux/actions/version';\nimport { setCurrentProject } from '~/routing/redux/actions';\n\nimport { deliveryApi } from '~/util/ContensisDeliveryApi';\nimport pickProject from '~/util/pickProject';\nimport stringifyAttributes from './util/stringifyAttributes';\n\nimport { getCacheDuration } from './features/caching/cacheDuration.schema';\nimport handleResponse from './features/response-handler';\n\nimport {\n getBundleData,\n getBundleTags,\n loadableChunkExtractors,\n} from './util/bundles';\nimport { addStandardHeaders } from './util/headers';\n\nimport { ServerConfig } from '~/config';\nimport { AppState } from '~/redux/appstate';\n\nconst webApp = (\n app: Express,\n ReactApp: React.ComponentType<any>,\n config: ServerConfig & {\n allowedGroups?: string[];\n globalGroups?: string[];\n startupScriptFilename?: string;\n }\n) => {\n const {\n stateType = 'immutable',\n routes,\n withReducers,\n withSagas,\n withEvents,\n packagejson,\n scripts = {},\n staticFolderPath = 'static',\n startupScriptFilename,\n allowedGroups,\n globalGroups,\n disableSsrRedux,\n handleResponses,\n } = config;\n const staticRoutePath = config.staticRoutePath || staticFolderPath;\n\n const bundleData = getBundleData(config, staticRoutePath);\n\n const attributes = stringifyAttributes(scripts.attributes);\n scripts.startup = scripts.startup || startupScriptFilename;\n\n const responseHandler =\n typeof handleResponses === 'function' ? handleResponses : handleResponse;\n\n const versionInfo = JSON.parse(\n fs.readFileSync(`dist/${staticFolderPath}/version.json`, 'utf8')\n );\n\n app.get('/*', async (request, response) => {\n const { url } = request;\n\n const matchedStaticRoute = () =>\n matchRoutes(routes.StaticRoutes, request.path);\n const isStaticRoute = () => matchedStaticRoute().length > 0;\n const staticRoute = isStaticRoute() && matchedStaticRoute()[0];\n\n // Allow certain routes to avoid SSR\n const onlyDynamic = staticRoute && staticRoute.route.ssr === false;\n const onlySSR = staticRoute && staticRoute.route.ssrOnly === true;\n\n const normaliseQs = q => (q && q.toLowerCase() === 'true' ? true : false);\n\n // Determine functional params from QueryString and set access methods\n const accessMethod = mapJson<\n any,\n { DYNAMIC: boolean; REDUX: boolean; FRAGMENT: boolean; STATIC: boolean }\n >(request.query, {\n DYNAMIC: ({ dynamic }) => normaliseQs(dynamic) || onlyDynamic,\n REDUX: ({ redux }) => normaliseQs(redux),\n FRAGMENT: ({ fragment }) => normaliseQs(fragment),\n STATIC: ({ static: value }) => normaliseQs(value) || onlySSR,\n });\n\n const context: StaticRouterContext = {};\n // Track the current statusCode via the response object\n response.status(200);\n\n // Create a store (with a memory history) from our current url\n const store = await createStore(\n withReducers,\n {} as AppState,\n history({\n initialEntries: [url],\n }),\n stateType\n );\n\n // dispatch any global and non-saga related actions before calling our JSX\n const versionStatusFromHostname = deliveryApi.getVersionStatusFromHostname(\n request.hostname\n );\n\n console.info(\n `Request for ${request.path} hostname: ${request.hostname} versionStatus: ${versionStatusFromHostname}`\n );\n\n store.dispatch(\n setVersionStatus(request.query.versionStatus || versionStatusFromHostname)\n );\n store.dispatch(setVersion(versionInfo.commitRef, versionInfo.buildNo));\n\n const project = pickProject(request.hostname, request.query);\n\n const groups = allowedGroups && allowedGroups[project];\n store.dispatch(setCurrentProject(project, groups, request.hostname));\n\n const loadableExtractor = loadableChunkExtractors();\n\n const jsx = (\n <ChunkExtractorManager\n extractor={loadableExtractor?.commonLoadableExtractor}\n >\n <ReduxProvider store={store}>\n <StaticRouter context={context} location={url}>\n <ReactApp routes={routes} withEvents={withEvents} />\n </StaticRouter>\n </ReduxProvider>\n </ChunkExtractorManager>\n );\n\n const { templateHTML, templateHTMLFragment, templateHTMLStatic } =\n bundleData.default.templates || bundleData.legacy.templates || {};\n\n // Serve a blank HTML page with client scripts to load the app in the browser\n if (accessMethod.DYNAMIC) {\n // Dynamic doesn't need sagas\n renderToString(jsx);\n\n // Dynamic page render has only the necessary bundles to start up the app\n // and does not include any react-loadable code-split bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n const isDynamicHint = `<script ${attributes}>window.isDynamic = true;</script>`;\n\n const responseHtmlDynamic = templateHTML\n .replace('{{TITLE}}', '')\n .replace('{{SEO_CRITICAL_METADATA}}', '')\n .replace('{{CRITICAL_CSS}}', '')\n .replace('{{APP}}', '')\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', isDynamicHint);\n // Dynamic pages always return a 200 so we can run\n // the app and serve up all errors inside the client\n response.setHeader(\n 'Surrogate-Control',\n `max-age=${getCacheDuration(200)}`\n );\n responseHandler(request, response, responseHtmlDynamic);\n }\n\n // Render the JSX server side and send response as per access method options\n if (!accessMethod.DYNAMIC) {\n store\n .runSaga(rootSaga(withSagas))\n .toPromise()\n .then(() => {\n const sheet = new ServerStyleSheet();\n\n const html = renderToString(sheet.collectStyles(jsx));\n\n const helmet = Helmet.renderStatic();\n Helmet.rewind();\n const htmlAttributes = helmet.htmlAttributes.toString();\n let title = helmet.title.toString();\n const metadata = helmet.meta\n .toString()\n .concat(helmet.link.toString());\n\n if (context.url) {\n return response.redirect(302, context.url);\n }\n\n const reduxState = store.getState();\n\n const styleTags = sheet.getStyleTags();\n\n // After running rootSaga there should be an additional react-loadable\n // code-split bundles for any page components as well as core app bundles\n const bundleTags = getBundleTags(\n loadableExtractor,\n scripts,\n staticRoutePath\n );\n\n let serialisedReduxData = serialize(reduxState);\n if (context.statusCode !== 404) {\n // For a request that returns a redux state object as a response\n if (accessMethod.REDUX) {\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n responseHandler(request, response, serialisedReduxData, 'json');\n return true;\n }\n if (!disableSsrRedux) {\n serialisedReduxData = `<script ${attributes}>window.REDUX_DATA = ${serialisedReduxData}</script>`;\n }\n }\n if ((context.statusCode || 200) > 400) {\n accessMethod.STATIC = true;\n }\n\n // Responses\n let responseHTML = '';\n\n if (context.statusCode === 404)\n title = '<title>404 page not found</title>';\n\n // Static page served as a fragment\n if (accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = minifyCssString(styleTags) + html;\n }\n\n // Page fragment served with client scripts and redux data that hydrate the app client side\n if (accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTMLFragment\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Full HTML page served statically\n if (!accessMethod.FRAGMENT && accessMethod.STATIC) {\n responseHTML = templateHTMLStatic\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', minifyCssString(styleTags))\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', '');\n }\n\n // Full HTML page served with client scripts and redux data that hydrate the app client side\n if (!accessMethod.FRAGMENT && !accessMethod.STATIC) {\n responseHTML = templateHTML\n .replace('{{TITLE}}', title)\n .replace('{{SEO_CRITICAL_METADATA}}', metadata)\n .replace('{{CRITICAL_CSS}}', styleTags)\n .replace('{{APP}}', html)\n .replace('{{LOADABLE_CHUNKS}}', bundleTags)\n .replace('{{REDUX_DATA}}', serialisedReduxData);\n }\n\n // Set response.status from React StaticRouter\n if (typeof context.statusCode === 'number')\n response.status(context.statusCode);\n\n addStandardHeaders(reduxState, response, packagejson, {\n allowedGroups,\n globalGroups,\n });\n try {\n // If react-helmet htmlAttributes are being used,\n // replace the html tag with those attributes sepcified\n // e.g. (lang, dir etc.)\n if (htmlAttributes) {\n responseHTML = responseHTML.replace(\n /<html?.+?>/,\n `<html ${htmlAttributes}>`\n );\n }\n responseHandler(request, response, responseHTML);\n } catch (err: any) {\n console.info(err.message);\n }\n })\n .catch(err => {\n // Handle any error that occurred in any of the previous\n // promises in the chain.\n console.info(err);\n response.status(500);\n responseHandler(\n request,\n response,\n `Error occurred: <br />${err.stack} <br />${JSON.stringify(err)}`\n );\n });\n renderToString(jsx);\n\n store.close();\n }\n });\n};\n\nexport default webApp;\n","import 'isomorphic-fetch';\nimport express, { Express } from 'express';\nimport React from 'react';\n\nimport DisplayStartupConfiguration from './util/displayStartupConfiguration';\nimport ConfigureReverseProxies, { apiProxy } from './features/reverse-proxy';\nimport ServeStaticAssets from './features/static-assets';\nimport ConfigureWebApp from './webApp';\nimport { ServerConfig } from '~/config';\n\ndeclare let global: typeof globalThis & {\n DISABLE_SSR_REDUX: boolean | undefined;\n PACKAGE_JSON: any;\n PROXY_DELIVERY_API: boolean | undefined;\n REVERSE_PROXY_PATHS: string[];\n};\n\nconst app: Express = express();\n\nconst start = (\n ReactApp: React.ComponentType<any>,\n config: ServerConfig,\n ServerFeatures: (app: Express) => void\n) => {\n global.PACKAGE_JSON = config.packagejson;\n global.DISABLE_SSR_REDUX = config.disableSsrRedux;\n global.PROXY_DELIVERY_API = config.proxyDeliveryApi;\n global.REVERSE_PROXY_PATHS = Object(config.reverseProxyPaths);\n\n app.disable('x-powered-by');\n\n // Output some information about the used build/startup configuration\n DisplayStartupConfiguration(config);\n\n ServerFeatures(app);\n // Set-up local proxy for images from cms, and delivery api requests\n // to save doing rewrites and extra code\n ConfigureReverseProxies(app, config.reverseProxyPaths);\n ServeStaticAssets(app, config);\n ConfigureWebApp(app, ReactApp, config);\n\n app.on('ready', async () => {\n // Configure DNS to make life easier\n // await ConfigureLocalDNS();\n\n const server = app.listen(3001, () => {\n console.info(`HTTP server is listening @ port 3001`);\n setTimeout(function () {\n app.emit('app_started');\n }, 500);\n });\n app.on('stop', () => {\n server.close(function () {\n console.info('GoodBye :(');\n });\n });\n });\n};\n\nexport default { app, apiProxy, start };\n"],"names":["servers","SERVERS","projects","PROJECTS","DisplayStartupConfiguration","config","console","log","JSON","stringify","reverseProxyPaths","staticFolderPath","apiProxy","httpProxy","createProxyServer","reverseProxies","app","deliveryApiProxy","all","req","res","target","hostname","indexOf","previewIis","iis","web","changeOrigin","on","e","path","cms","alias","CacheDuration","static","expressStatic","getCacheDuration","status","replaceStaticPath","str","replace","bundleManipulationMiddleware","appRootPath","maxage","staticRoutePath","next","filename","basename","modernBundle","endsWith","legacyBundle","startsWith","jsRuntimeLocation","resolve","jsRuntimeBundle","fs","readFileSync","modifiedBundle","set","type","send","readError","resolveStartupMiddleware","startupScriptFilename","startupFileLocation","startupFilePaths","startupFilePath","forEach","testPath","accessSync","ex","sendFile","sendFileError","staticAssets","appPath","scripts","staticRoutePaths","use","map","p","startup","express","maxAge","attributes","Object","entries","key","value","idx","join","handleResponse","request","response","content","loadableBundleData","stats","templates","build","bundle","parse","templateHTML","html","templateHTMLStatic","templateHTMLFragment","fragment","loadableChunkExtractors","modern","ChunkExtractor","entrypoints","namespace","statsFile","legacy","commonLoadableExtractor","addChunk","chunk","assetsByChunkName","info","getBundleData","bundleData","default","getBundleTags","loadableExtractor","startupTag","stringifyAttributes","legacyScriptTags","getScriptTags","noModule","modernScriptTags","scriptTags","addStandardHeaders","state","packagejson","groups","routingSurrogateKeys","selectSurrogateKeys","surrogateKeyHeader","name","header","addVarnishAuthenticationHeaders","setHeader","statusCode","message","stateEntry","selectRouteEntry","project","selectCurrentProject","globalGroups","allowedGroups","allGroups","Array","from","getIn","webApp","ReactApp","stateType","routes","withReducers","withSagas","withEvents","disableSsrRedux","handleResponses","responseHandler","versionInfo","get","url","matchedStaticRoute","matchRoutes","StaticRoutes","isStaticRoute","length","staticRoute","onlyDynamic","route","ssr","onlySSR","ssrOnly","normaliseQs","q","toLowerCase","accessMethod","mapJson","query","DYNAMIC","dynamic","REDUX","redux","FRAGMENT","STATIC","context","store","createStore","history","initialEntries","versionStatusFromHostname","deliveryApi","getVersionStatusFromHostname","dispatch","setVersionStatus","versionStatus","setVersion","commitRef","buildNo","pickProject","setCurrentProject","jsx","ReduxProvider","renderToString","bundleTags","isDynamicHint","responseHtmlDynamic","runSaga","rootSaga","toPromise","then","sheet","ServerStyleSheet","collectStyles","helmet","Helmet","renderStatic","rewind","htmlAttributes","toString","title","metadata","meta","concat","link","redirect","reduxState","getState","styleTags","getStyleTags","serialisedReduxData","serialize","responseHTML","minifyCssString","err","catch","stack","close","start","ServerFeatures","global","PACKAGE_JSON","DISABLE_SSR_REDUX","PROXY_DELIVERY_API","proxyDeliveryApi","REVERSE_PROXY_PATHS","disable","ConfigureReverseProxies","ServeStaticAssets","ConfigureWebApp","server","listen","setTimeout","emit"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { RequestHandler } from 'express';
2
- export declare const bundleManipulationMiddleware: ({ appRootPath, maxage, staticRoutePath, }: {
2
+ export declare const bundleManipulationMiddleware: ({ appRootPath, maxage, staticFolderPath, staticRoutePath, }: {
3
3
  appRootPath: string;
4
4
  maxage: string;
5
+ staticFolderPath: string;
5
6
  staticRoutePath: string;
6
7
  }) => RequestHandler;
package/package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zengenti/contensis-react-base",
3
- "version": "3.0.0-beta.45",
3
+ "version": "3.0.0-beta.46",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zengenti/contensis-react-base",
3
- "version": "3.0.0-beta.45",
3
+ "version": "3.0.0-beta.46",
4
4
  "repository": "https://github.com/zengenti/contensis-react-base",
5
5
  "license": "None",
6
6
  "description": "Turbocharge your React web apps with Contensis. This package handles all dependencies for creating full featured web apps in React with Contensis and Site View. Routing is driven by Site View, Redux is used for global state management and server-side rendering (SSR) is handled for you. Also taking care of intricate hosting issues such as cache invalidation and supporting authenticated content where required.",