@zengenti/contensis-react-base 3.0.0-beta.4 → 3.0.0-beta.43
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.
- package/README.md +4 -4
- package/cjs/{App-581b6653.js → App-2ff001f6.js} +139 -124
- package/cjs/App-2ff001f6.js.map +1 -0
- package/cjs/{RouteLoader-282c03ab.js → RouteLoader-2ed14766.js} +44 -30
- package/cjs/RouteLoader-2ed14766.js.map +1 -0
- package/cjs/ToJs-09204afd.js +129 -0
- package/cjs/ToJs-09204afd.js.map +1 -0
- package/cjs/{actions-12871aca.js → actions-6b9ef168.js} +9 -8
- package/cjs/actions-6b9ef168.js.map +1 -0
- package/cjs/client.js +43 -22
- package/cjs/client.js.map +1 -1
- package/cjs/contensis-react-base.js +46 -49
- package/cjs/contensis-react-base.js.map +1 -1
- package/cjs/forms.js +275 -275
- package/cjs/forms.js.map +1 -1
- package/cjs/fromJSLeaveImmer-65d26804.js +28 -0
- package/cjs/fromJSLeaveImmer-65d26804.js.map +1 -0
- package/cjs/{login-81d7f9ef.js → login-d67b82aa.js} +113 -79
- package/cjs/login-d67b82aa.js.map +1 -0
- package/cjs/{reducers-fde41d6b.js → reducers-3a4f8971.js} +26 -25
- package/cjs/reducers-3a4f8971.js.map +1 -0
- package/cjs/redux.js +13 -14
- package/cjs/redux.js.map +1 -1
- package/cjs/routing.js +9 -8
- package/cjs/routing.js.map +1 -1
- package/cjs/search.js +418 -256
- package/cjs/search.js.map +1 -1
- package/cjs/{selectors-ed26ed97.js → selectors-2c1b1183.js} +8 -4
- package/cjs/selectors-2c1b1183.js.map +1 -0
- package/cjs/user.js +32 -23
- package/cjs/user.js.map +1 -1
- package/cjs/util.js +49 -46
- package/cjs/util.js.map +1 -1
- package/cjs/{version-f061e409.js → version-951bc80c.js} +58 -52
- package/cjs/version-951bc80c.js.map +1 -0
- package/cjs/{version-0c190929.js → version-dcfdafd9.js} +5 -5
- package/cjs/{version-0c190929.js.map → version-dcfdafd9.js.map} +1 -1
- package/esm/{App-122f28a3.js → App-7b3aee16.js} +120 -124
- package/esm/App-7b3aee16.js.map +1 -0
- package/esm/{RouteLoader-c2faac87.js → RouteLoader-d4b4d320.js} +37 -23
- package/esm/RouteLoader-d4b4d320.js.map +1 -0
- package/esm/ToJs-2627ce21.js +99 -0
- package/esm/ToJs-2627ce21.js.map +1 -0
- package/esm/{actions-3cc39599.js → actions-5437f43d.js} +8 -7
- package/esm/actions-5437f43d.js.map +1 -0
- package/esm/client.js +22 -20
- package/esm/client.js.map +1 -1
- package/esm/contensis-react-base.js +28 -31
- package/esm/contensis-react-base.js.map +1 -1
- package/esm/forms.js +5 -5
- package/esm/forms.js.map +1 -1
- package/esm/fromJSLeaveImmer-e2f0f331.js +26 -0
- package/esm/fromJSLeaveImmer-e2f0f331.js.map +1 -0
- package/esm/{login-92db44d1.js → login-f6dfbe1b.js} +97 -60
- package/esm/login-f6dfbe1b.js.map +1 -0
- package/esm/{reducers-d6c0edb1.js → reducers-8e5d6232.js} +26 -25
- package/esm/reducers-8e5d6232.js.map +1 -0
- package/esm/redux.js +14 -13
- package/esm/redux.js.map +1 -1
- package/esm/routing.js +9 -8
- package/esm/routing.js.map +1 -1
- package/esm/search.js +387 -244
- package/esm/search.js.map +1 -1
- package/esm/{selectors-82e71d8e.js → selectors-65f0f31c.js} +9 -6
- package/esm/selectors-65f0f31c.js.map +1 -0
- package/esm/user.js +31 -22
- package/esm/user.js.map +1 -1
- package/esm/util.js +18 -11
- package/esm/util.js.map +1 -1
- package/esm/version-696796d7.js +15 -0
- package/esm/{version-59c8f9be.js.map → version-696796d7.js.map} +1 -1
- package/esm/{version-cb9cd09d.js → version-b2ca1dab.js} +38 -31
- package/esm/version-b2ca1dab.js.map +1 -0
- package/models/redux/appstate.d.ts +5 -10
- package/models/redux/reducers/navigation.d.ts +1 -6
- package/models/redux/reducers/version.d.ts +1 -5
- package/models/redux/selectors/navigation.d.ts +2 -1
- package/models/routing/redux/actions.d.ts +1 -1
- package/models/routing/redux/reducers.d.ts +1 -21
- package/models/routing/redux/selectors.d.ts +1 -1
- package/models/routing/routes.d.ts +3 -2
- package/models/routing/util/expressions.d.ts +3 -2
- package/models/routing/util/queries.d.ts +1 -1
- package/models/search/containers/withListing.d.ts +1 -1
- package/models/search/containers/withSearch.d.ts +1 -1
- package/models/search/hooks/useListing.hook.d.ts +3 -0
- package/models/search/hooks/useMinilist.hook.d.ts +2 -9
- package/models/search/index.d.ts +1 -0
- package/models/search/models/Queries.d.ts +8 -5
- package/models/search/models/Search.d.ts +58 -26
- package/models/search/models/SearchActions.d.ts +4 -3
- package/models/search/models/SearchProps.d.ts +25 -2
- package/models/search/models/SearchState.d.ts +5 -1
- package/models/search/models/index.d.ts +2 -1
- package/models/search/redux/actions.d.ts +2 -1
- package/models/search/redux/reducers.d.ts +230 -314
- package/models/search/redux/sagas.d.ts +5 -5
- package/models/search/redux/selectors.d.ts +5 -10
- package/models/search/search/expressions.d.ts +2 -6
- package/models/search/transformations/entry-to-filteritem.mapper.d.ts +2 -1
- package/models/search/transformations/filter-to-filterexpression.mapper.d.ts +6 -0
- package/models/search/transformations/filters-to-filterexpressions.mapper.d.ts +3 -0
- package/models/search/transformations/index.d.ts +3 -0
- package/models/search/transformations/state-to-searchuri.d.ts +2 -13
- package/models/server/util/headers.d.ts +3 -2
- package/models/testImmer/redux/reducer.d.ts +1 -7
- package/models/user/components/Login.d.ts +1 -2
- package/models/user/components/LoginForm.d.ts +1 -2
- package/models/user/hocs/withLogin.d.ts +2 -2
- package/models/user/hooks/useChangePassword.d.ts +5 -5
- package/models/user/hooks/useForgotPassword.d.ts +6 -6
- package/models/user/hooks/useLogin.d.ts +9 -45
- package/models/user/hooks/useRegistration.d.ts +4 -4
- package/models/user/redux/reducers.d.ts +5 -32
- package/models/user/redux/sagas/login.d.ts +11 -8
- package/models/user/redux/selectors.d.ts +33 -71
- package/models/user/util/LoginHelper.class.d.ts +4 -3
- package/models/util/json-mapper.d.ts +9 -3
- package/models/util/merge.d.ts +1 -0
- package/package-lock.json +2006 -4796
- package/package.json +47 -48
- package/cjs/App-581b6653.js.map +0 -1
- package/cjs/RouteLoader-282c03ab.js.map +0 -1
- package/cjs/ToJs-87edc45d.js +0 -230
- package/cjs/ToJs-87edc45d.js.map +0 -1
- package/cjs/actions-12871aca.js.map +0 -1
- package/cjs/fromJSLeaveImmer-9b550c8e.js +0 -40
- package/cjs/fromJSLeaveImmer-9b550c8e.js.map +0 -1
- package/cjs/login-81d7f9ef.js.map +0 -1
- package/cjs/reducers-fde41d6b.js.map +0 -1
- package/cjs/selectors-ed26ed97.js.map +0 -1
- package/cjs/version-f061e409.js.map +0 -1
- package/esm/App-122f28a3.js.map +0 -1
- package/esm/RouteLoader-c2faac87.js.map +0 -1
- package/esm/ToJs-52fee252.js +0 -199
- package/esm/ToJs-52fee252.js.map +0 -1
- package/esm/actions-3cc39599.js.map +0 -1
- package/esm/fromJSLeaveImmer-e44d1a91.js +0 -38
- package/esm/fromJSLeaveImmer-e44d1a91.js.map +0 -1
- package/esm/login-92db44d1.js.map +0 -1
- package/esm/reducers-d6c0edb1.js.map +0 -1
- package/esm/selectors-82e71d8e.js.map +0 -1
- package/esm/version-59c8f9be.js +0 -15
- package/esm/version-cb9cd09d.js.map +0 -1
- package/models/search/transformations/filters-to-filterexpression.d.ts +0 -1
- package/models/search/transformations/filters-to-filterexpression.mapper.d.ts +0 -2
- package/models/server/features/caching/cacheHashing.d.ts +0 -1
|
@@ -19,28 +19,30 @@ var serialize = require('serialize-javascript');
|
|
|
19
19
|
var minifyCssString = require('minify-css-string');
|
|
20
20
|
var mapJson = require('jsonpath-mapper');
|
|
21
21
|
var server = require('@loadable/server');
|
|
22
|
+
var version = require('./version-951bc80c.js');
|
|
23
|
+
var App = require('./App-2ff001f6.js');
|
|
24
|
+
var actions = require('./actions-6b9ef168.js');
|
|
25
|
+
var selectors = require('./selectors-2c1b1183.js');
|
|
26
|
+
require('@redux-saga/core/effects');
|
|
22
27
|
require('redux');
|
|
23
28
|
require('redux-thunk');
|
|
24
29
|
require('redux-saga');
|
|
25
30
|
require('redux-injectors');
|
|
26
31
|
require('immer');
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
require('./reducers-fde41d6b.js');
|
|
32
|
+
require('deepmerge');
|
|
33
|
+
require('./reducers-3a4f8971.js');
|
|
30
34
|
require('history');
|
|
31
|
-
var App = require('./App-581b6653.js');
|
|
32
|
-
require('@redux-saga/core/effects');
|
|
33
35
|
require('contensis-delivery-api');
|
|
34
|
-
|
|
35
|
-
require('./version-0c190929.js');
|
|
36
|
-
require('query-string');
|
|
36
|
+
require('./version-dcfdafd9.js');
|
|
37
37
|
require('loglevel');
|
|
38
|
-
require('./
|
|
39
|
-
require('./
|
|
38
|
+
require('./login-d67b82aa.js');
|
|
39
|
+
require('./ToJs-09204afd.js');
|
|
40
40
|
require('await-to-js');
|
|
41
41
|
require('js-cookie');
|
|
42
42
|
require('react-hot-loader');
|
|
43
|
-
require('
|
|
43
|
+
require('query-string');
|
|
44
|
+
require('./RouteLoader-2ed14766.js');
|
|
45
|
+
require('reselect');
|
|
44
46
|
|
|
45
47
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
46
48
|
|
|
@@ -53,7 +55,7 @@ var serialize__default = /*#__PURE__*/_interopDefaultLegacy(serialize);
|
|
|
53
55
|
var minifyCssString__default = /*#__PURE__*/_interopDefaultLegacy(minifyCssString);
|
|
54
56
|
var mapJson__default = /*#__PURE__*/_interopDefaultLegacy(mapJson);
|
|
55
57
|
|
|
56
|
-
const servers = SERVERS;
|
|
58
|
+
const servers$1 = SERVERS;
|
|
57
59
|
/* global SERVERS */
|
|
58
60
|
|
|
59
61
|
const projects = PROJECTS;
|
|
@@ -63,7 +65,7 @@ const DisplayStartupConfiguration = config => {
|
|
|
63
65
|
/* eslint-disable no-console */
|
|
64
66
|
console.log();
|
|
65
67
|
console.log(`Configured servers:
|
|
66
|
-
`, JSON.stringify(servers, null, 2));
|
|
68
|
+
`, JSON.stringify(servers$1, null, 2));
|
|
67
69
|
console.log();
|
|
68
70
|
console.log(`Configured projects:
|
|
69
71
|
`, JSON.stringify(projects, null, 2));
|
|
@@ -73,15 +75,15 @@ const DisplayStartupConfiguration = config => {
|
|
|
73
75
|
/* eslint-enable no-console */
|
|
74
76
|
};
|
|
75
77
|
|
|
76
|
-
const servers
|
|
78
|
+
const servers = SERVERS;
|
|
77
79
|
/* global SERVERS */
|
|
78
80
|
|
|
79
|
-
const apiProxy = httpProxy__default[
|
|
81
|
+
const apiProxy = httpProxy__default["default"].createProxyServer();
|
|
80
82
|
|
|
81
83
|
const reverseProxies = (app, reverseProxyPaths = []) => {
|
|
82
84
|
deliveryApiProxy(apiProxy, app);
|
|
83
85
|
app.all(reverseProxyPaths, (req, res) => {
|
|
84
|
-
const target = req.hostname.indexOf('preview-') || req.hostname.indexOf('preview.') || req.hostname === 'localhost' ? servers
|
|
86
|
+
const target = req.hostname.indexOf('preview-') || req.hostname.indexOf('preview.') || req.hostname === 'localhost' ? servers.previewIis || servers.iis : servers.iis;
|
|
85
87
|
apiProxy.web(req, res, {
|
|
86
88
|
target,
|
|
87
89
|
changeOrigin: true
|
|
@@ -98,8 +100,8 @@ const deliveryApiProxy = (apiProxy, app) => {
|
|
|
98
100
|
// This is just here to stop cors requests on localhost. In Production this is mapped using varnish.
|
|
99
101
|
app.all(['/api/delivery/*', '/api/image/*'], (req, res) => {
|
|
100
102
|
/* eslint-disable no-console */
|
|
101
|
-
const target = servers
|
|
102
|
-
console.log(`Proxying api request to ${servers
|
|
103
|
+
const target = servers.cms;
|
|
104
|
+
console.log(`Proxying api request to ${servers.alias}`);
|
|
103
105
|
apiProxy.web(req, res, {
|
|
104
106
|
target,
|
|
105
107
|
changeOrigin: true
|
|
@@ -132,15 +134,15 @@ const bundleManipulationMiddleware = ({
|
|
|
132
134
|
maxage,
|
|
133
135
|
staticRoutePath
|
|
134
136
|
}) => (req, res, next) => {
|
|
135
|
-
const filename = path__default[
|
|
137
|
+
const filename = path__default["default"].basename(req.path);
|
|
136
138
|
const modernBundle = filename.endsWith('.mjs');
|
|
137
139
|
const legacyBundle = filename.endsWith('.js');
|
|
138
140
|
|
|
139
141
|
if ((legacyBundle || modernBundle) && filename.startsWith('runtime.')) {
|
|
140
|
-
const jsRuntimeLocation = path__default[
|
|
142
|
+
const jsRuntimeLocation = path__default["default"].resolve(appRootPath, `dist/static/${modernBundle ? 'modern/js' : 'legacy/js'}/${filename}`);
|
|
141
143
|
|
|
142
144
|
try {
|
|
143
|
-
const jsRuntimeBundle = fs__default[
|
|
145
|
+
const jsRuntimeBundle = fs__default["default"].readFileSync(jsRuntimeLocation, 'utf8');
|
|
144
146
|
const modifiedBundle = replaceStaticPath(jsRuntimeBundle, staticRoutePath);
|
|
145
147
|
if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);
|
|
146
148
|
res.type('.js').send(modifiedBundle);
|
|
@@ -170,7 +172,7 @@ const resolveStartupMiddleware = ({
|
|
|
170
172
|
}) => (req, res, next) => {
|
|
171
173
|
if (startupScriptFilename !== 'startup.js' && req.path === `/${startupScriptFilename}`) {
|
|
172
174
|
const startupFilePath = `dist/${staticFolderPath}/startup.js`;
|
|
173
|
-
const startupFileLocation = path__default[
|
|
175
|
+
const startupFileLocation = path__default["default"].resolve(appRootPath, startupFilePath);
|
|
174
176
|
if (maxage) res.set('Cache-Control', `public, max-age=${maxage}`);
|
|
175
177
|
|
|
176
178
|
try {
|
|
@@ -206,7 +208,7 @@ const staticAssets = (app, {
|
|
|
206
208
|
startupScriptFilename: scripts.startup || startupScriptFilename,
|
|
207
209
|
staticFolderPath
|
|
208
210
|
}), // eslint-disable-next-line import/no-named-as-default-member
|
|
209
|
-
express__default[
|
|
211
|
+
express__default["default"].static(`dist/${staticFolderPath}`, {
|
|
210
212
|
// these maxage values are different in config but the same in runtime,
|
|
211
213
|
// this one is somehow converted and should end up being the same as CacheDuration.static
|
|
212
214
|
maxAge: CacheDuration.expressStatic
|
|
@@ -230,7 +232,7 @@ const handleResponse = (request, response, content, send = 'send') => {
|
|
|
230
232
|
response[send](content);
|
|
231
233
|
};
|
|
232
234
|
|
|
233
|
-
const readFileSync = path => fs__default[
|
|
235
|
+
const readFileSync = path => fs__default["default"].readFileSync(path, 'utf8');
|
|
234
236
|
|
|
235
237
|
const loadableBundleData = ({
|
|
236
238
|
stats,
|
|
@@ -263,12 +265,12 @@ const loadableChunkExtractors = () => {
|
|
|
263
265
|
const modern = new server.ChunkExtractor({
|
|
264
266
|
entrypoints: ['app'],
|
|
265
267
|
namespace: 'modern',
|
|
266
|
-
statsFile: path__default[
|
|
268
|
+
statsFile: path__default["default"].resolve('dist/modern/loadable-stats.json')
|
|
267
269
|
});
|
|
268
270
|
const legacy = new server.ChunkExtractor({
|
|
269
271
|
entrypoints: ['app'],
|
|
270
272
|
namespace: 'legacy',
|
|
271
|
-
statsFile: path__default[
|
|
273
|
+
statsFile: path__default["default"].resolve('dist/legacy/loadable-stats.json')
|
|
272
274
|
});
|
|
273
275
|
const commonLoadableExtractor = {
|
|
274
276
|
addChunk(chunk) {
|
|
@@ -307,7 +309,8 @@ const getBundleTags = (loadableExtractor, scripts, staticRoutePath = 'static') =
|
|
|
307
309
|
const modernScriptTags = loadableExtractor === null || loadableExtractor === void 0 ? void 0 : loadableExtractor.modern.getScriptTags({
|
|
308
310
|
type: 'module'
|
|
309
311
|
});
|
|
310
|
-
|
|
312
|
+
const scriptTags = `${startupTag}${legacyScriptTags || ''}${modernScriptTags || ''}`.replace(/"\/static\//g, `"/${staticRoutePath}/`);
|
|
313
|
+
return scriptTags;
|
|
311
314
|
}
|
|
312
315
|
|
|
313
316
|
return startupTag;
|
|
@@ -317,7 +320,7 @@ const addStandardHeaders = (state, response, packagejson, groups) => {
|
|
|
317
320
|
if (state) {
|
|
318
321
|
try {
|
|
319
322
|
console.info('About to add headers');
|
|
320
|
-
const routingSurrogateKeys = selectors.
|
|
323
|
+
const routingSurrogateKeys = selectors.selectSurrogateKeys(state);
|
|
321
324
|
const surrogateKeyHeader = ` ${packagejson.name}-app ${routingSurrogateKeys}`;
|
|
322
325
|
response.header('surrogate-key', surrogateKeyHeader);
|
|
323
326
|
addVarnishAuthenticationHeaders(state, response, groups);
|
|
@@ -371,7 +374,7 @@ const webApp = (app, ReactApp, config) => {
|
|
|
371
374
|
const attributes = stringifyAttributes(scripts.attributes);
|
|
372
375
|
scripts.startup = scripts.startup || startupScriptFilename;
|
|
373
376
|
const responseHandler = typeof handleResponses === 'function' ? handleResponses : handleResponse;
|
|
374
|
-
const versionInfo = JSON.parse(fs__default[
|
|
377
|
+
const versionInfo = JSON.parse(fs__default["default"].readFileSync(`dist/${staticFolderPath}/version.json`, 'utf8'));
|
|
375
378
|
app.get('/*', async (request, response) => {
|
|
376
379
|
const {
|
|
377
380
|
url
|
|
@@ -389,7 +392,7 @@ const webApp = (app, ReactApp, config) => {
|
|
|
389
392
|
const normaliseQs = q => q && q.toLowerCase() === 'true' ? true : false; // Determine functional params from QueryString and set access methods
|
|
390
393
|
|
|
391
394
|
|
|
392
|
-
const accessMethod = mapJson__default[
|
|
395
|
+
const accessMethod = mapJson__default["default"](request.query, {
|
|
393
396
|
DYNAMIC: ({
|
|
394
397
|
dynamic
|
|
395
398
|
}) => normaliseQs(dynamic) || onlyDynamic,
|
|
@@ -419,14 +422,14 @@ const webApp = (app, ReactApp, config) => {
|
|
|
419
422
|
const groups = allowedGroups && allowedGroups[project];
|
|
420
423
|
store.dispatch(actions.setCurrentProject(project, groups, request.hostname));
|
|
421
424
|
const loadableExtractor = loadableChunkExtractors();
|
|
422
|
-
const jsx = /*#__PURE__*/React__default[
|
|
425
|
+
const jsx = /*#__PURE__*/React__default["default"].createElement(server.ChunkExtractorManager, {
|
|
423
426
|
extractor: loadableExtractor === null || loadableExtractor === void 0 ? void 0 : loadableExtractor.commonLoadableExtractor
|
|
424
|
-
}, /*#__PURE__*/React__default[
|
|
427
|
+
}, /*#__PURE__*/React__default["default"].createElement(reactRedux.Provider, {
|
|
425
428
|
store: store
|
|
426
|
-
}, /*#__PURE__*/React__default[
|
|
429
|
+
}, /*#__PURE__*/React__default["default"].createElement(reactRouterDom.StaticRouter, {
|
|
427
430
|
context: context,
|
|
428
431
|
location: url
|
|
429
|
-
}, /*#__PURE__*/React__default[
|
|
432
|
+
}, /*#__PURE__*/React__default["default"].createElement(ReactApp, {
|
|
430
433
|
routes: routes,
|
|
431
434
|
withEvents: withEvents
|
|
432
435
|
}))));
|
|
@@ -441,7 +444,7 @@ const webApp = (app, ReactApp, config) => {
|
|
|
441
444
|
server$1.renderToString(jsx); // Dynamic page render has only the necessary bundles to start up the app
|
|
442
445
|
// and does not include any react-loadable code-split bundles
|
|
443
446
|
|
|
444
|
-
const bundleTags = getBundleTags(loadableExtractor, scripts);
|
|
447
|
+
const bundleTags = getBundleTags(loadableExtractor, scripts, staticRoutePath);
|
|
445
448
|
const isDynamicHint = `<script ${attributes}>window.isDynamic = true;</script>`;
|
|
446
449
|
const responseHtmlDynamic = templateHTML.replace('{{TITLE}}', '').replace('{{SEO_CRITICAL_METADATA}}', '').replace('{{CRITICAL_CSS}}', '').replace('{{APP}}', '').replace('{{LOADABLE_CHUNKS}}', bundleTags).replace('{{REDUX_DATA}}', isDynamicHint); // Dynamic pages always return a 200 so we can run
|
|
447
450
|
// the app and serve up all errors inside the client
|
|
@@ -459,7 +462,7 @@ const webApp = (app, ReactApp, config) => {
|
|
|
459
462
|
reactHelmet.Helmet.rewind();
|
|
460
463
|
const htmlAttributes = helmet.htmlAttributes.toString();
|
|
461
464
|
let title = helmet.title.toString();
|
|
462
|
-
const metadata = helmet.meta.toString();
|
|
465
|
+
const metadata = helmet.meta.toString().concat(helmet.link.toString());
|
|
463
466
|
|
|
464
467
|
if (context.url) {
|
|
465
468
|
return response.redirect(302, context.url);
|
|
@@ -469,15 +472,12 @@ const webApp = (app, ReactApp, config) => {
|
|
|
469
472
|
const styleTags = sheet.getStyleTags(); // After running rootSaga there should be an additional react-loadable
|
|
470
473
|
// code-split bundles for any page components as well as core app bundles
|
|
471
474
|
|
|
472
|
-
const bundleTags = getBundleTags(loadableExtractor, scripts);
|
|
473
|
-
let serialisedReduxData =
|
|
475
|
+
const bundleTags = getBundleTags(loadableExtractor, scripts, staticRoutePath);
|
|
476
|
+
let serialisedReduxData = serialize__default["default"](reduxState);
|
|
474
477
|
|
|
475
478
|
if (context.statusCode !== 404) {
|
|
476
479
|
// For a request that returns a redux state object as a response
|
|
477
480
|
if (accessMethod.REDUX) {
|
|
478
|
-
serialisedReduxData = serialize__default['default'](reduxState, {
|
|
479
|
-
ignoreFunction: true
|
|
480
|
-
});
|
|
481
481
|
addStandardHeaders(reduxState, response, packagejson, {
|
|
482
482
|
allowedGroups,
|
|
483
483
|
globalGroups
|
|
@@ -487,9 +487,6 @@ const webApp = (app, ReactApp, config) => {
|
|
|
487
487
|
}
|
|
488
488
|
|
|
489
489
|
if (!disableSsrRedux) {
|
|
490
|
-
serialisedReduxData = serialize__default['default'](reduxState, {
|
|
491
|
-
ignoreFunction: true
|
|
492
|
-
});
|
|
493
490
|
serialisedReduxData = `<script ${attributes}>window.REDUX_DATA = ${serialisedReduxData}</script>`;
|
|
494
491
|
}
|
|
495
492
|
}
|
|
@@ -503,17 +500,17 @@ const webApp = (app, ReactApp, config) => {
|
|
|
503
500
|
if (context.statusCode === 404) title = '<title>404 page not found</title>'; // Static page served as a fragment
|
|
504
501
|
|
|
505
502
|
if (accessMethod.FRAGMENT && accessMethod.STATIC) {
|
|
506
|
-
responseHTML = minifyCssString__default[
|
|
503
|
+
responseHTML = minifyCssString__default["default"](styleTags) + html;
|
|
507
504
|
} // Page fragment served with client scripts and redux data that hydrate the app client side
|
|
508
505
|
|
|
509
506
|
|
|
510
507
|
if (accessMethod.FRAGMENT && !accessMethod.STATIC) {
|
|
511
|
-
responseHTML = templateHTMLFragment.replace('{{TITLE}}', title).replace('{{SEO_CRITICAL_METADATA}}', metadata).replace('{{CRITICAL_CSS}}', minifyCssString__default[
|
|
508
|
+
responseHTML = templateHTMLFragment.replace('{{TITLE}}', title).replace('{{SEO_CRITICAL_METADATA}}', metadata).replace('{{CRITICAL_CSS}}', minifyCssString__default["default"](styleTags)).replace('{{APP}}', html).replace('{{LOADABLE_CHUNKS}}', bundleTags).replace('{{REDUX_DATA}}', serialisedReduxData);
|
|
512
509
|
} // Full HTML page served statically
|
|
513
510
|
|
|
514
511
|
|
|
515
512
|
if (!accessMethod.FRAGMENT && accessMethod.STATIC) {
|
|
516
|
-
responseHTML = templateHTMLStatic.replace('{{TITLE}}', title).replace('{{SEO_CRITICAL_METADATA}}', metadata).replace('{{CRITICAL_CSS}}', minifyCssString__default[
|
|
513
|
+
responseHTML = templateHTMLStatic.replace('{{TITLE}}', title).replace('{{SEO_CRITICAL_METADATA}}', metadata).replace('{{CRITICAL_CSS}}', minifyCssString__default["default"](styleTags)).replace('{{APP}}', html).replace('{{LOADABLE_CHUNKS}}', '');
|
|
517
514
|
} // Full HTML page served with client scripts and redux data that hydrate the app client side
|
|
518
515
|
|
|
519
516
|
|
|
@@ -553,7 +550,7 @@ const webApp = (app, ReactApp, config) => {
|
|
|
553
550
|
});
|
|
554
551
|
};
|
|
555
552
|
|
|
556
|
-
const app = express__default[
|
|
553
|
+
const app = express__default["default"]();
|
|
557
554
|
|
|
558
555
|
const start = (ReactApp, config, ServerFeatures) => {
|
|
559
556
|
global.PACKAGE_JSON = config.packagejson;
|
|
@@ -593,5 +590,5 @@ var internalServer = {
|
|
|
593
590
|
};
|
|
594
591
|
|
|
595
592
|
exports.ReactApp = App.AppRoot;
|
|
596
|
-
exports
|
|
593
|
+
exports["default"] = internalServer;
|
|
597
594
|
//# sourceMappingURL=contensis-react-base.js.map
|
|
@@ -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 return `${startupTag}${legacyScriptTags || ''}${modernScriptTags || ''}`;\n }\n return startupTag;\n};\n","import { Response } from 'express';\nimport {\n selectCurrentProject,\n selectRouteEntry,\n} from '~/routing/redux/selectors';\nimport { getImmutableOrJS as getIn } from '~/redux/util';\n\nimport { getCacheDuration } from '../features/caching/cacheDuration.schema';\n\nexport const addStandardHeaders = (\n state: any,\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 = getIn(\n state,\n ['routing', 'surrogateKeys'],\n ''\n );\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: any,\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(loadableExtractor, scripts);\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.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(loadableExtractor, scripts);\n\n let serialisedReduxData = '';\n if (context.statusCode !== 404) {\n // For a request that returns a redux state object as a response\n if (accessMethod.REDUX) {\n serialisedReduxData = serialize(reduxState, {\n ignoreFunction: true,\n });\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 = serialize(reduxState, {\n ignoreFunction: true,\n });\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","addStandardHeaders","state","packagejson","groups","routingSurrogateKeys","getIn","surrogateKeyHeader","name","header","addVarnishAuthenticationHeaders","setHeader","statusCode","message","stateEntry","selectRouteEntry","project","selectCurrentProject","globalGroups","allowedGroups","allGroups","Array","from","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","redirect","reduxState","getState","styleTags","getStyleTags","serialisedReduxData","serialize","ignoreFunction","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\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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"}
|