@salesforce/pwa-kit-react-sdk 3.0.0-preview.0

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.
Files changed (53) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/LICENSE +14 -0
  3. package/README.md +37 -0
  4. package/package.json +82 -0
  5. package/scripts/file-utils.js +80 -0
  6. package/scripts/file-utils.test.js +189 -0
  7. package/scripts/setup-jsdom.js +20 -0
  8. package/scripts/version.js +22 -0
  9. package/ssr/browser/main.js +122 -0
  10. package/ssr/browser/main.test.js +54 -0
  11. package/ssr/server/react-rendering.js +405 -0
  12. package/ssr/server/react-rendering.test.js +708 -0
  13. package/ssr/universal/compatibility.js +31 -0
  14. package/ssr/universal/components/_app/index.js +35 -0
  15. package/ssr/universal/components/_app/index.test.js +20 -0
  16. package/ssr/universal/components/_app-config/index.js +88 -0
  17. package/ssr/universal/components/_app-config/index.test.js +21 -0
  18. package/ssr/universal/components/_document/index.js +93 -0
  19. package/ssr/universal/components/_document/index.test.js +58 -0
  20. package/ssr/universal/components/_error/index.js +56 -0
  21. package/ssr/universal/components/_error/index.test.js +28 -0
  22. package/ssr/universal/components/app-error-boundary/index.js +115 -0
  23. package/ssr/universal/components/app-error-boundary/index.test.js +109 -0
  24. package/ssr/universal/components/fetch-strategy/index.js +42 -0
  25. package/ssr/universal/components/route-component/index.js +409 -0
  26. package/ssr/universal/components/route-component/index.test.js +375 -0
  27. package/ssr/universal/components/switch/index.js +63 -0
  28. package/ssr/universal/components/throw-404/index.js +37 -0
  29. package/ssr/universal/components/throw-404/index.test.js +26 -0
  30. package/ssr/universal/components/with-correlation-id/index.js +36 -0
  31. package/ssr/universal/components/with-legacy-get-props/index.js +86 -0
  32. package/ssr/universal/components/with-legacy-get-props/index.test.js +35 -0
  33. package/ssr/universal/components/with-react-query/index.js +103 -0
  34. package/ssr/universal/components/with-react-query/index.test.js +44 -0
  35. package/ssr/universal/contexts/index.js +71 -0
  36. package/ssr/universal/contexts/index.test.js +101 -0
  37. package/ssr/universal/errors.js +34 -0
  38. package/ssr/universal/errors.test.js +20 -0
  39. package/ssr/universal/events.js +40 -0
  40. package/ssr/universal/events.test.js +39 -0
  41. package/ssr/universal/hooks/index.js +52 -0
  42. package/ssr/universal/routes.js +16 -0
  43. package/ssr/universal/utils.client.test.js +46 -0
  44. package/ssr/universal/utils.js +60 -0
  45. package/ssr/universal/utils.server.test.js +24 -0
  46. package/utils/assets.js +120 -0
  47. package/utils/assets.test.js +106 -0
  48. package/utils/url.js +39 -0
  49. package/utils/url.test.js +47 -0
  50. package/utils/uuidv4.client.js +21 -0
  51. package/utils/uuidv4.client.test.js +27 -0
  52. package/utils/warnings.js +81 -0
  53. package/utils/warnings.test.js +48 -0
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _main = require("./main");
5
+ var _react2 = require("@testing-library/react");
6
+ var _routeComponent = require("../universal/components/route-component");
7
+ var errors = _interopRequireWildcard(require("../universal/errors"));
8
+ var _uuidv = require("../../utils/uuidv4.client");
9
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ /*
13
+ * Copyright (c) 2022, salesforce.com, inc.
14
+ * All rights reserved.
15
+ * SPDX-License-Identifier: BSD-3-Clause
16
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
17
+ */
18
+
19
+ jest.mock('../../utils/uuidv4.client');
20
+ describe('main', function () {
21
+ test('OuterApp renders without error', () => {
22
+ _uuidv.uuidv4.mockReturnValueOnce('7f21aea5-6962-4162-8204-9da85c802022');
23
+ const oldPreloadedState = window.__PRELOADED_STATE__;
24
+ window.__PRELOADED_STATE__ = {
25
+ appProps: {}
26
+ };
27
+ const App = () => /*#__PURE__*/_react.default.createElement("div", null, "App");
28
+ const locals = {};
29
+ const props = {
30
+ error: undefined,
31
+ locals,
32
+ routes: (0, _routeComponent.getRoutes)(locals),
33
+ WrappedApp: (0, _routeComponent.routeComponent)(App, false, locals)
34
+ };
35
+ (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_main.OuterApp, props));
36
+ expect(_react2.screen.getByText('App')).toBeInTheDocument();
37
+ window.__PRELOADED_STATE__ = oldPreloadedState;
38
+ });
39
+ test('OuterApp triggers the error page when there is an error', () => {
40
+ const oldWindowError = window.__ERROR__;
41
+ window.__ERROR__ = new errors.HTTPNotFound('Not found');
42
+ const App = () => /*#__PURE__*/_react.default.createElement("div", null, "App");
43
+ const locals = {};
44
+ const props = {
45
+ error: window.__ERROR__,
46
+ locals,
47
+ routes: (0, _routeComponent.getRoutes)(locals),
48
+ WrappedApp: (0, _routeComponent.routeComponent)(App, false, locals)
49
+ };
50
+ (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_main.OuterApp, props));
51
+ expect(_react2.screen.getByText('Error Status: 404')).toBeInTheDocument();
52
+ window.__ERROR__ = oldWindowError;
53
+ });
54
+ });
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.render = exports.default = exports.ALLOWLISTED_INLINE_SCRIPTS = void 0;
7
+ var _path = _interopRequireDefault(require("path"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _server = _interopRequireDefault(require("react-dom/server"));
10
+ var _reactHelmet = require("react-helmet");
11
+ var _server2 = require("@loadable/server");
12
+ var _reactRouterDom = require("react-router-dom");
13
+ var _serializeJavascript = _interopRequireDefault(require("serialize-javascript"));
14
+ var _utils = require("../universal/utils");
15
+ var _contexts = require("../universal/contexts");
16
+ var _document = _interopRequireDefault(require("../universal/components/_document"));
17
+ var _app = _interopRequireDefault(require("../universal/components/_app"));
18
+ var _throw2 = _interopRequireDefault(require("../universal/components/throw-404"));
19
+ var _compatibility = require("../universal/compatibility");
20
+ var _switch = _interopRequireDefault(require("../universal/components/switch"));
21
+ var _routeComponent = require("../universal/components/route-component");
22
+ var errors = _interopRequireWildcard(require("../universal/errors"));
23
+ var _ssrServer = require("@salesforce/pwa-kit-runtime/utils/ssr-server");
24
+ var _ssrShared = require("@salesforce/pwa-kit-runtime/utils/ssr-shared");
25
+ var _ssrConfig = require("@salesforce/pwa-kit-runtime/utils/ssr-config");
26
+ var _sprite = _interopRequireDefault(require("svg-sprite-loader/runtime/sprite.build"));
27
+ var _propTypes = _interopRequireDefault(require("prop-types"));
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
32
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
33
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
34
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
35
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
36
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
37
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } /*
38
+ * Copyright (c) 2021, salesforce.com, inc.
39
+ * All rights reserved.
40
+ * SPDX-License-Identifier: BSD-3-Clause
41
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
42
+ */ /**
43
+ * @module progressive-web-sdk/ssr/server/react-rendering
44
+ */
45
+ const CWD = process.cwd();
46
+ const BUNDLES_PATH = _path.default.resolve(CWD, 'build/loadable-stats.json');
47
+ const VALID_TAG_NAMES = ['base', 'body', 'head', 'html', 'link', 'meta', 'noscript', 'script', 'style', 'title'];
48
+ const ALLOWLISTED_INLINE_SCRIPTS = [];
49
+
50
+ /**
51
+ * Convert from thrown Error or String to {message, status} that we need for
52
+ * rendering.
53
+ * @private
54
+ * @param err - Error to be converted
55
+ * @function
56
+ * @return {Object}
57
+ */
58
+ exports.ALLOWLISTED_INLINE_SCRIPTS = ALLOWLISTED_INLINE_SCRIPTS;
59
+ const logAndFormatError = err => {
60
+ if (err instanceof errors.HTTPError) {
61
+ // These are safe to display – we expect end-users to throw them
62
+ return {
63
+ message: err.message,
64
+ status: err.status,
65
+ stack: err.stack
66
+ };
67
+ } else {
68
+ const cause = err.stack || err.toString();
69
+ console.error(cause);
70
+ const safeMessage = 'Internal Server Error';
71
+ return {
72
+ message: safeMessage,
73
+ status: 500,
74
+ stack: err.stack
75
+ };
76
+ }
77
+ };
78
+
79
+ // Because multi-value params are not supported in `aws-serverless-express` create a proper
80
+ // search string using the `query` property. We pay special attention to the order the params
81
+ // as best as we can.
82
+ const getLocationSearch = req => {
83
+ const [_, search] = req.originalUrl.split('?');
84
+ const params = new URLSearchParams(search);
85
+ const newParams = new URLSearchParams();
86
+ const orderedKeys = [...new Set(params.keys())];
87
+
88
+ // Maintain the original order of the parameters by iterating the
89
+ // ordered list of keys, and using the `req.query` object as the source of values.
90
+ orderedKeys.forEach(key => {
91
+ const value = req.query[key];
92
+ const values = Array.isArray(value) ? value : [value];
93
+ values.forEach(v => {
94
+ newParams.append(key, v);
95
+ });
96
+ });
97
+ const searchString = newParams.toString();
98
+
99
+ // Update the location objects reference.
100
+ return searchString ? `?${searchString}` : '';
101
+ };
102
+
103
+ /**
104
+ * This is the main react-rendering function for SSR. It is an Express handler.
105
+ *
106
+ * @param req - Request
107
+ * @param res - Response
108
+ *
109
+ * @function
110
+ *
111
+ * @return {Promise}
112
+ */
113
+ const render = /*#__PURE__*/function () {
114
+ var _ref = _asyncToGenerator(function* (req, res, next) {
115
+ const AppConfig = (0, _compatibility.getAppConfig)();
116
+ // Get the application config which should have been stored at this point.
117
+ const config = (0, _ssrConfig.getConfig)();
118
+ AppConfig.restore(res.locals);
119
+ const routes = (0, _routeComponent.getRoutes)(res.locals);
120
+ const WrappedApp = (0, _routeComponent.routeComponent)(_app.default, false, res.locals);
121
+ const [pathname] = req.originalUrl.split('?');
122
+ const location = {
123
+ pathname,
124
+ search: getLocationSearch(req)
125
+ };
126
+
127
+ // Step 1 - Find the match.
128
+ let route;
129
+ let match;
130
+ routes.some(_route => {
131
+ const _match = (0, _reactRouterDom.matchPath)(req.path, _route);
132
+ if (_match) {
133
+ match = _match;
134
+ route = _route;
135
+ }
136
+ return !!match;
137
+ });
138
+
139
+ // Step 2 - Get the component
140
+ const component = yield route.component.getComponent();
141
+
142
+ // Step 3 - Init the app state
143
+ const props = {
144
+ error: null,
145
+ appState: {},
146
+ routerContext: {},
147
+ req,
148
+ res,
149
+ App: WrappedApp,
150
+ routes,
151
+ location
152
+ };
153
+ let appJSX = /*#__PURE__*/_react.default.createElement(OuterApp, props);
154
+ let appState, appStateError;
155
+ if (component === _throw2.default) {
156
+ appState = {};
157
+ appStateError = new errors.HTTPNotFound('Not found');
158
+ } else {
159
+ const ret = yield AppConfig.initAppState({
160
+ App: WrappedApp,
161
+ component,
162
+ match,
163
+ route,
164
+ req,
165
+ res,
166
+ location,
167
+ appJSX
168
+ });
169
+ appState = _objectSpread(_objectSpread({}, ret.appState), {}, {
170
+ __STATE_MANAGEMENT_LIBRARY: AppConfig.freeze(res.locals)
171
+ });
172
+ appStateError = ret.error;
173
+ }
174
+ appJSX = /*#__PURE__*/_react.default.cloneElement(appJSX, {
175
+ error: appStateError,
176
+ appState
177
+ });
178
+
179
+ // Step 4 - Render the App
180
+ let renderResult;
181
+ try {
182
+ renderResult = renderApp({
183
+ App: WrappedApp,
184
+ appState,
185
+ appStateError: appStateError && logAndFormatError(appStateError),
186
+ routes,
187
+ req,
188
+ res,
189
+ location,
190
+ config,
191
+ appJSX
192
+ });
193
+ } catch (e) {
194
+ // This is an unrecoverable error.
195
+ // (errors handled by the AppErrorBoundary are considered recoverable)
196
+ // Here, we use Express's convention to invoke error middleware.
197
+ // Note, we don't have an error handling middleware yet! This is calling the
198
+ // default error handling middleware provided by Express
199
+ return next(e);
200
+ }
201
+
202
+ // Step 5 - Determine what is going to happen, redirect, or send html with
203
+ // the correct status code.
204
+ const {
205
+ html,
206
+ routerContext,
207
+ error
208
+ } = renderResult;
209
+ const redirectUrl = routerContext.url;
210
+ const status = error && error.status || res.statusCode;
211
+ if (redirectUrl) {
212
+ res.redirect(302, redirectUrl);
213
+ } else {
214
+ res.status(status).send(html);
215
+ }
216
+ });
217
+ return function render(_x, _x2, _x3) {
218
+ return _ref.apply(this, arguments);
219
+ };
220
+ }();
221
+ exports.render = render;
222
+ const OuterApp = ({
223
+ req,
224
+ res,
225
+ error,
226
+ App,
227
+ appState,
228
+ routes,
229
+ routerContext,
230
+ location
231
+ }) => {
232
+ const AppConfig = (0, _compatibility.getAppConfig)();
233
+ return /*#__PURE__*/_react.default.createElement(_contexts.ServerContext.Provider, {
234
+ value: {
235
+ req,
236
+ res
237
+ }
238
+ }, /*#__PURE__*/_react.default.createElement(_reactRouterDom.StaticRouter, {
239
+ location: location,
240
+ context: routerContext
241
+ }, /*#__PURE__*/_react.default.createElement(_contexts.CorrelationIdProvider, {
242
+ correlationId: res.locals.requestId,
243
+ resetOnPageChange: false
244
+ }, /*#__PURE__*/_react.default.createElement(AppConfig, {
245
+ locals: res.locals
246
+ }, /*#__PURE__*/_react.default.createElement(_switch.default, {
247
+ error: error,
248
+ appState: appState,
249
+ routes: routes,
250
+ App: App
251
+ })))));
252
+ };
253
+ OuterApp.propTypes = {
254
+ req: _propTypes.default.object,
255
+ res: _propTypes.default.object,
256
+ error: _propTypes.default.object,
257
+ App: _propTypes.default.elementType,
258
+ appState: _propTypes.default.object,
259
+ routes: _propTypes.default.array,
260
+ routerContext: _propTypes.default.object,
261
+ location: _propTypes.default.object
262
+ };
263
+ const renderToString = (jsx, extractor) => _server.default.renderToString(extractor.collectChunks(jsx));
264
+ const renderApp = args => {
265
+ const {
266
+ req,
267
+ res,
268
+ appStateError,
269
+ appJSX,
270
+ appState,
271
+ config
272
+ } = args;
273
+ const extractor = new _server2.ChunkExtractor({
274
+ statsFile: BUNDLES_PATH,
275
+ publicPath: (0, _utils.getAssetUrl)()
276
+ });
277
+ const ssrOnly = 'mobify_server_only' in req.query || '__server_only' in req.query;
278
+ const prettyPrint = 'mobify_pretty' in req.query || '__pretty_print' in req.query;
279
+ const indent = prettyPrint ? 8 : 0;
280
+ let routerContext;
281
+ let appHtml;
282
+ let renderError;
283
+ // It's important that we render the App before extracting the script elements,
284
+ // otherwise it won't return the correct chunks.
285
+
286
+ try {
287
+ routerContext = {};
288
+ appHtml = renderToString( /*#__PURE__*/_react.default.cloneElement(appJSX, {
289
+ routerContext
290
+ }), extractor);
291
+ } catch (e) {
292
+ // This will catch errors thrown from the app and pass the error
293
+ // to the AppErrorBoundary component, and renders the error page.
294
+ routerContext = {};
295
+ renderError = logAndFormatError(e);
296
+ appHtml = renderToString( /*#__PURE__*/_react.default.cloneElement(appJSX, {
297
+ routerContext,
298
+ error: renderError
299
+ }), extractor);
300
+ }
301
+
302
+ // Setting type: 'application/json' stops the browser from executing the code.
303
+ const scriptProps = ssrOnly ? {
304
+ type: 'application/json'
305
+ } : {};
306
+ let bundles = [];
307
+ /* istanbul ignore next */
308
+ if (extractor) {
309
+ bundles = extractor.getScriptElements().map(el => /*#__PURE__*/_react.default.cloneElement(el, _objectSpread(_objectSpread({}, el.props), scriptProps)));
310
+ }
311
+ const helmet = _reactHelmet.Helmet.renderStatic();
312
+
313
+ // Return the first error encountered during the rendering pipeline.
314
+ const error = appStateError || renderError;
315
+ // Remove the stacktrace when executing remotely as to not leak any important
316
+ // information to users about our system.
317
+ if (error && (0, _ssrServer.isRemote)()) {
318
+ delete error.stack;
319
+ }
320
+
321
+ // Do not include *dynamic*, executable inline scripts – these cause issues with
322
+ // strict CSP headers that customers often want to use. Avoid inline scripts,
323
+ // full-stop, whenever possible.
324
+
325
+ // Each key in `windowGlobals` is expected to be set on the window
326
+ // object, client-side, by code in ssr/browser/main.jsx.
327
+ //
328
+ // Do *not* add to these without a very good reason - globals are a liability.
329
+ const windowGlobals = {
330
+ __INITIAL_CORRELATION_ID__: res.locals.requestId,
331
+ __CONFIG__: config,
332
+ __PRELOADED_STATE__: appState,
333
+ __ERROR__: error,
334
+ // `window.Progressive` has a long history at Mobify and some
335
+ // client-side code depends on it. Maintain its name out of tradition.
336
+ Progressive: getWindowProgressive(req, res)
337
+ };
338
+ const scripts = [/*#__PURE__*/_react.default.createElement("script", {
339
+ id: "mobify-data",
340
+ key: "mobify-data",
341
+ type: "application/json" // Not executable
342
+ ,
343
+ dangerouslySetInnerHTML: {
344
+ __html: (0, _serializeJavascript.default)(windowGlobals, {
345
+ isJSON: true,
346
+ space: indent
347
+ })
348
+ }
349
+ }), ...bundles];
350
+ const svgs = [/*#__PURE__*/_react.default.createElement("div", {
351
+ key: "svg_sprite",
352
+ dangerouslySetInnerHTML: {
353
+ __html: _sprite.default.stringify()
354
+ }
355
+ })];
356
+ const helmetHeadTags = VALID_TAG_NAMES.map(tag => helmet[tag] && helmet[tag].toComponent()).filter(tag => tag);
357
+ const html = _server.default.renderToString( /*#__PURE__*/_react.default.createElement(_document.default, {
358
+ head: [...helmetHeadTags],
359
+ html: appHtml,
360
+ afterBodyStart: svgs,
361
+ beforeBodyEnd: scripts,
362
+ htmlAttributes: helmet.htmlAttributes.toComponent(),
363
+ bodyAttributes: helmet.bodyAttributes.toComponent()
364
+ }));
365
+ return {
366
+ error,
367
+ html: ['<!doctype html>', html].join(''),
368
+ routerContext
369
+ };
370
+ };
371
+ const getWindowProgressive = (req, res) => {
372
+ const options = req.app.options || {};
373
+ return {
374
+ buildOrigin: (0, _utils.getAssetUrl)(''),
375
+ cacheManifest: options.cacheHashManifest || {},
376
+ ssrOptions: {
377
+ // The hostname and origin under which this page is served
378
+ appHostname: options.appHostname,
379
+ appOrigin: options.appOrigin,
380
+ // The id of the bundle being served, as a string,
381
+ // defaulting to 'development' for the local dev server
382
+ bundleId: process.env.BUNDLE_ID || 'development',
383
+ // The id of the deploy as a string, defaulting to '0'
384
+ // for the local dev server
385
+ deployId: process.env.DEPLOY_ID || '0',
386
+ // On a local dev server, the DEPLOY_TARGET environment variable
387
+ // isn't defined by default. Developers may define it if it's
388
+ // used by the UPWA to modify behaviour.
389
+ deployTarget: process.env.DEPLOY_TARGET || 'local',
390
+ proxyConfigs: _ssrShared.proxyConfigs,
391
+ // The request class (undefined by default)
392
+ requestClass: res.locals.requestClass
393
+ }
394
+ };
395
+ };
396
+ const serverRenderer =
397
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
398
+ ({
399
+ clientStats,
400
+ serverStats
401
+ }) => {
402
+ return (req, res, next) => render(req, res, next);
403
+ };
404
+ var _default = serverRenderer;
405
+ exports.default = _default;