catalyst-core 0.0.1-beta.2 → 0.0.1-beta.4

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 (101) hide show
  1. package/.eslintignore +9 -0
  2. package/.eslintrc +92 -0
  3. package/README.md +58 -43
  4. package/babel.config.json +1 -5
  5. package/bin/catalyst.js +35 -35
  6. package/changelog.md +26 -0
  7. package/config.json +1 -2
  8. package/{LICENSE → license} +2 -1
  9. package/{logger/index.js → logger.js} +13 -10
  10. package/package.json +87 -85
  11. package/router/ClientRouter.js +10 -6
  12. package/router/ServerRouter.js +2 -11
  13. package/scripts/build.js +26 -11
  14. package/scripts/checkVersion.js +5 -0
  15. package/scripts/devBuild.js +42 -0
  16. package/scripts/devServe.js +43 -0
  17. package/scripts/loadEnvironmentVariables.js +8 -21
  18. package/scripts/loadScriptsBeforeServerStarts.js +13 -21
  19. package/scripts/serve.js +27 -11
  20. package/scripts/start.js +19 -12
  21. package/scripts/validator.js +39 -11
  22. package/server/expressServer.js +50 -0
  23. package/server/renderer/document/Body.js +17 -18
  24. package/server/renderer/document/Head.js +7 -8
  25. package/server/renderer/document/index.js +2 -0
  26. package/server/renderer/extract.js +25 -24
  27. package/server/renderer/handler.js +220 -208
  28. package/server/renderer/index.js +6 -7
  29. package/server/renderer/render.js +32 -19
  30. package/server/startServer.js +66 -0
  31. package/server/utils/metaTags.js +13 -0
  32. package/server/utils/userAgentUtil.js +51 -0
  33. package/server/utils/validator.js +39 -10
  34. package/webpack/babel-plugins/remove-client.plugin.js +1 -1
  35. package/webpack/babel-plugins/remove-ssr.plugin.js +1 -1
  36. package/webpack/babel.config.client.js +3 -3
  37. package/webpack/babel.config.ssr.js +1 -1
  38. package/webpack/base.babel.js +37 -36
  39. package/webpack/development.client.babel.js +11 -8
  40. package/webpack/production.client.babel.js +1 -2
  41. package/webpack/production.ssr.babel.js +3 -3
  42. package/webpack/scssParams.js +35 -15
  43. package/.prettierignore +0 -2
  44. package/.prettierrc.json +0 -7
  45. package/checkVersion.js +0 -3
  46. package/config/config.js +0 -24
  47. package/packages/create-framework-app/node_modules/.package-lock.json +0 -249
  48. package/packages/create-framework-app/templates/redux-js/node_modules/@babel/core/lib/config/caching.js +0 -261
  49. package/packages/create-framework-app/templates/redux-js/node_modules/@remix-run/router/dist/router.js +0 -4327
  50. package/packages/create-framework-app/templates/redux-js/node_modules/catalyst/router.js +0 -15
  51. package/packages/create-framework-app/templates/redux-js/node_modules/http-proxy-middleware/dist/router.js +0 -46
  52. package/reducer/index.js +0 -88
  53. package/reducer/loadableConfigReducer.js +0 -19
  54. package/store/index.dev.js +0 -73
  55. package/store/index.js +0 -25
  56. package/store/index.prod.js +0 -66
  57. package/types/caching.d.ts +0 -1
  58. package/types/config/config.d.ts +0 -19
  59. package/types/index.d.ts +0 -1
  60. package/types/logger/index.d.ts +0 -14
  61. package/types/reducer/index.d.ts +0 -22
  62. package/types/reducer/loadableConfigReducer.d.ts +0 -9
  63. package/types/router/ClientRouter.d.ts +0 -5
  64. package/types/router/ServerRouter.d.ts +0 -7
  65. package/types/router/index.d.ts +0 -8
  66. package/types/router.d.ts +0 -1
  67. package/types/scripts/build.d.ts +0 -1
  68. package/types/scripts/loadEnvironmentVariables.d.ts +0 -5
  69. package/types/scripts/loadScriptsBeforeServerStarts.d.ts +0 -1
  70. package/types/scripts/prepare.d.ts +0 -1
  71. package/types/scripts/registerAliases.d.ts +0 -1
  72. package/types/scripts/serve.d.ts +0 -1
  73. package/types/scripts/start.d.ts +0 -1
  74. package/types/scripts/validator.d.ts +0 -9
  75. package/types/scripts/verifyConfig.d.ts +0 -1
  76. package/types/server/mainIndex.d.ts +0 -1
  77. package/types/server/mainServer.d.ts +0 -2
  78. package/types/server/renderer/document/Body.d.ts +0 -11
  79. package/types/server/renderer/document/Head.d.ts +0 -11
  80. package/types/server/renderer/document/index.d.ts +0 -2
  81. package/types/server/renderer/extract.d.ts +0 -18
  82. package/types/server/renderer/handler.d.ts +0 -6
  83. package/types/server/renderer/index.d.ts +0 -2
  84. package/types/server/renderer/render.d.ts +0 -38
  85. package/types/server/renderer/userAgentUtil.d.ts +0 -1
  86. package/types/store/index.d.ts +0 -11
  87. package/types/store/index.dev.d.ts +0 -8
  88. package/types/store/index.prod.d.ts +0 -8
  89. package/types/webpack/babel-plugins/remove-client.plugin.d.ts +0 -10
  90. package/types/webpack/babel-plugins/remove-ssr.plugin.d.ts +0 -10
  91. package/types/webpack/babel.config.client.d.ts +0 -21
  92. package/types/webpack/babel.config.d.ts +0 -16
  93. package/types/webpack/babel.config.ssr.d.ts +0 -21
  94. package/types/webpack/base.babel.d.ts +0 -184
  95. package/types/webpack/development.client.babel.d.ts +0 -1
  96. package/types/webpack/plugins/mime-types.d.ts +0 -78
  97. package/types/webpack/plugins/route-manifest-plugin.d.ts +0 -1
  98. package/types/webpack/plugins/upload-assets-plugin.d.ts +0 -1
  99. package/types/webpack/production.client.babel.d.ts +0 -174
  100. package/types/webpack/production.ssr.babel.d.ts +0 -2
  101. package/types/webpack/scssParams.d.ts +0 -2
@@ -3,226 +3,238 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = async function (req, res) {
6
+ exports.default = _default;
7
+ var _fs = _interopRequireDefault(require("fs"));
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _render = _interopRequireDefault(require("./render"));
11
+ var _App = _interopRequireDefault(require("@containers/App"));
12
+ var _extract = _interopRequireDefault(require("./extract"));
13
+ var _reactRedux = require("react-redux");
14
+ var _document = require("./document");
15
+ var _server = require("react-router-dom/server");
16
+ var _ServerRouter = _interopRequireDefault(require("../../router/ServerRouter.js"));
17
+ var _userAgentUtil = require("../utils/userAgentUtil");
18
+ var _router = require("@tata1mg/router");
19
+ var _server2 = require("@loadable/server");
20
+ var _server3 = require("react-dom/server");
21
+ var _validator = require("../utils/validator");
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+ const {
24
+ getRoutes
25
+ } = require(`${process.env.src_path}/src/js/routes/utils.js`);
26
+ const {
27
+ default: CustomDocument
28
+ } = require(`${process.env.src_path}/server/document.js`);
29
+ const storePath = _path.default.resolve(`${process.env.src_path}/src/js/store/index.js`);
30
+ let createStore;
31
+ if (_fs.default.existsSync(storePath)) {
7
32
  try {
8
- let context = {};
9
- let fetcherData = {};
10
- const webExtractor = new _server3.ChunkExtractor({
11
- statsFile: webStats,
12
- entrypoints: ["app"]
13
- });
14
- const deviceDetails = (0, _userAgentUtil.getUserAgentDetails)(req.headers["user-agent"] || "");
15
- const isBot = deviceDetails.googleBot || req.get("user-agent") === STATUS_CAKE_USER_AGENT_MOBILE ? true : false;
16
-
17
- // FRAMEWORK COMMENT GENERALISE THIS
18
- const store = (0, _validator.validateConfigureStore)(configureStore) ? configureStore({}, {}, req) : null;
19
-
20
- //TODO: Currently passing 4th arguement as whole request to bypass x-authorization to BE
21
- // Need to store the auth_token and user information locally too
22
- // Create a new Redux store instance
23
- // const store = configureStore({}, requestCookies, req, customHeaders)
24
-
25
- //get csrf token from client request
26
- // const csrf = typeof req.csrfToken === "function" && req.csrfToken()
27
- // See react-router's Server Rendering section:
28
- // https://reacttraining.com/react-router/web/guides/server-rendering
29
- const matchRoutes = routes => {
30
- return routes.reduce((matches, route) => {
31
- const {
32
- path
33
- } = route;
34
- const match = (0, _router.matchPath)({
35
- path,
36
- caseSensitive: false,
37
- end: true
38
- }, req.baseUrl || "/");
39
- if (match) {
40
- if (isProduction && !res.locals.pageCss && !res.locals.pageJS && !res.locals.routePath) {
41
- (0, _extract2.default)(res, route);
42
- }
43
- if (!res.locals.pageCss && !res.locals.pageJS && !res.locals.routePath) {
44
- res.locals.routePath = path;
45
- //moving routing logic outside of the App and using ServerRoutes for creating routes on server instead
46
- (0, _server2.renderToString)( /*#__PURE__*/_react2.default.createElement(_server3.ChunkExtractorManager, {
47
- extractor: webExtractor
48
- }, /*#__PURE__*/_react2.default.createElement(_reactRedux.Provider, {
49
- store: store
50
- }, /*#__PURE__*/_react2.default.createElement(_server.StaticRouter, {
51
- context: context,
52
- location: req.originalUrl
53
- }, /*#__PURE__*/_react2.default.createElement(_ServerRouter2.default, {
54
- store: store,
55
- intialData: fetcherData
56
- })))));
57
- }
58
- const wc = route.component;
59
- matches.push({
60
- route,
61
- match,
62
- serverSideFunction: wc && wc.serverSideFunction || (() => Promise.resolve()),
63
- metaTagFunction: wc && wc.metaTagFunction || null,
64
- serverFetcher: wc && wc.serverFetcher || (() => Promise.resolve()),
65
- callServerFetcher: wc && wc.serverFetcher ? true : false
66
- });
67
- }
68
- if (!match && route.routes) {
69
- // recursively try to match nested routes
70
- const nested = matchRoutes(route.routes);
71
- if (nested.length) {
72
- matches = matches.concat(nested);
73
- }
74
- }
75
- return matches;
76
- }, []);
33
+ const {
34
+ default: configureStore
35
+ } = require(`${process.env.src_path}/src/js/store/index.js`);
36
+ createStore = configureStore;
37
+ } catch (error) {
38
+ createStore = () => {
39
+ return {
40
+ getState: () => {}
41
+ };
77
42
  };
78
- const routes = (0, _validator.validateGetRoutes)(getRoutes) ? getRoutes() : [];
79
- const matches = matchRoutes(routes);
80
- // No matched route, send an error.
81
- // if (!matches.length) {
82
- // // res.status(404)
83
- // return res.redirect(301, process.env.EXTERNAL_BASE_URL + "/404")
84
- // }
85
-
86
- const getComponent = () => {
87
- //moving routing logic outside of the App and using ServerRouter for creating routes on server instead
88
- return /*#__PURE__*/_react2.default.createElement("div", {
89
- id: "app"
90
- }, /*#__PURE__*/_react2.default.createElement(_reactRedux.Provider, {
91
- store: store
92
- }, /*#__PURE__*/_react2.default.createElement(_server.StaticRouter, {
93
- context: context,
94
- location: req.originalUrl
95
- }, /*#__PURE__*/_react2.default.createElement(_ServerRouter2.default, {
96
- store: store,
97
- intialData: fetcherData
98
- }))));
43
+ }
44
+ } else {
45
+ createStore = () => {
46
+ return {
47
+ getState: () => {}
99
48
  };
100
- let metaTagFunction = null;
101
- const renderMarkUp = async errorCode => {
102
- const shellStart = await _render2.default.renderStart(res.locals.pageCss, res.locals.pageJS, metaTagFunction, isBot, fetcherData);
103
- const jsx = webExtractor.collectChunks(getComponent());
104
- let state = store.getState();
105
- const shellEnd = _render2.default.renderEnd(webExtractor, state, res, jsx, errorCode, fetcherData);
106
- const finalProps = _objectSpread(_objectSpread(_objectSpread({}, shellStart), shellEnd), {}, {
107
- jsx: jsx,
108
- req,
109
- res
49
+ };
50
+ }
51
+ const isProduction = process.env.NODE_ENV === "production";
52
+ let webStats = _path.default.join(__dirname, "../..", `loadable-stats.json`);
53
+ if (isProduction) {
54
+ webStats = _path.default.join(process.env.src_path, `${process.env.BUILD_OUTPUT_PATH}/public/loadable-stats.json`);
55
+ }
56
+ const webExtractor = new _server2.ChunkExtractor({
57
+ statsFile: webStats,
58
+ entrypoints: ["app"]
59
+ });
60
+
61
+ // matches request route with routes defined in the application.
62
+ const getMatchRoutes = (routes, req, res, store, context, fetcherData, basePath = "") => {
63
+ return routes.reduce((matches, route) => {
64
+ const {
65
+ path
66
+ } = route;
67
+ const match = (0, _router.matchPath)({
68
+ path: `${basePath}/${path}`,
69
+ caseSensitive: false,
70
+ end: true
71
+ }, req.baseUrl || "/");
72
+ if (match) {
73
+ if (isProduction && !res.locals.pageCss && !res.locals.pageJS && !res.locals.routePath) {
74
+ (0, _extract.default)(res, route);
75
+ }
76
+ if (!res.locals.pageCss && !res.locals.pageJS && !res.locals.routePath) {
77
+ res.locals.routePath = path;
78
+ //moving routing logic outside of the App and using ServerRoutes for creating routes on server instead
79
+ (0, _server3.renderToString)( /*#__PURE__*/_react.default.createElement(_server2.ChunkExtractorManager, {
80
+ extractor: webExtractor
81
+ }, /*#__PURE__*/_react.default.createElement(_reactRedux.Provider, {
82
+ store: store
83
+ }, /*#__PURE__*/_react.default.createElement(_server.StaticRouter, {
84
+ context: context,
85
+ location: req.originalUrl
86
+ }, /*#__PURE__*/_react.default.createElement(_ServerRouter.default, {
87
+ store: store,
88
+ intialData: fetcherData
89
+ })))));
90
+ }
91
+ const wc = route.component;
92
+ matches.push({
93
+ route,
94
+ match,
95
+ serverSideFunction: wc && wc.serverSideFunction || (() => Promise.resolve())
110
96
  });
111
- let CompleteDocument = () => {
112
- if ((0, _validator.validateCustomDocument)(CustomDocument)) {
113
- return CustomDocument(finalProps);
114
- } else {
115
- return /*#__PURE__*/_react2.default.createElement("html", {
116
- lang: finalProps.lang
117
- }, /*#__PURE__*/_react2.default.createElement(_document.Head, finalProps), /*#__PURE__*/_react2.default.createElement(_document.Body, finalProps));
118
- }
119
- };
120
- try {
121
- let status = matches.length && matches[0].match.path === "*" ? 404 : 200;
122
- res.set({
123
- "content-type": "text/html; charset=utf-8"
124
- });
125
- res.status(status);
126
- const {
127
- pipe
128
- } = (0, _server2.renderToPipeableStream)( /*#__PURE__*/_react2.default.createElement(CompleteDocument, null), {
129
- onShellReady() {
130
- res.setHeader("content-type", "text/html");
131
- pipe(res);
132
- res.end();
133
- },
134
- onError(error) {
135
- //transformed to new log format
136
- logger.error({
137
- message: `\n====> Error while renderToPipeableStream : ${error.toString()}`
138
- });
139
- }
140
- });
141
- } catch (error) {
142
- logger.error("Error while rendering markup:" + error);
97
+ }
98
+ if (!match && route.children) {
99
+ // recursively try to match nested routes
100
+ const nested = getMatchRoutes(route.children, req, res, store, context, fetcherData, `${basePath}/${path}`);
101
+ if (nested.length) {
102
+ matches = matches.concat(nested);
143
103
  }
144
- };
104
+ }
105
+ return matches;
106
+ }, []);
107
+ };
145
108
 
146
- // Server side function calling
147
- _App2.default.serverSideFunction({
148
- store,
149
- req
150
- }).then(() => {
151
- const serverSideFunction = matches.map(match => {
152
- if (match?.metaTagFunction) {
153
- metaTagFunction = match.metaTagFunction;
154
- }
155
- return match.serverSideFunction({
156
- store
157
- });
158
- });
109
+ // Preloads chunks required for rendering document
110
+ const getComponent = (store, context, req, fetcherData) => {
111
+ return /*#__PURE__*/_react.default.createElement("div", {
112
+ id: "app"
113
+ }, /*#__PURE__*/_react.default.createElement(_reactRedux.Provider, {
114
+ store: store
115
+ }, /*#__PURE__*/_react.default.createElement(_server.StaticRouter, {
116
+ context: context,
117
+ location: req.originalUrl
118
+ }, /*#__PURE__*/_react.default.createElement(_ServerRouter.default, {
119
+ store: store,
120
+ intialData: fetcherData
121
+ }))));
122
+ };
123
+ // sends document after rendering
124
+ const renderMarkUp = async (errorCode, req, res, metaTags, fetcherData, store, matches, context) => {
125
+ const deviceDetails = (0, _userAgentUtil.getUserAgentDetails)(req.headers["user-agent"] || "");
126
+ const isBot = deviceDetails.googleBot ? true : false;
127
+
128
+ // Transforms Head Props
129
+ const shellStart = await _render.default.renderStart(res.locals.pageCss, res.locals.pageJS, metaTags, isBot, fetcherData);
130
+ let state = store.getState();
131
+ const jsx = webExtractor.collectChunks(getComponent(store, context, req, fetcherData));
159
132
 
160
- // Api calling to fetch data
161
- Promise.all(serverSideFunction).then(() => {
162
- (0, _router.serverDataFetcher)({
163
- routes: routes,
164
- req,
165
- url: req.originalUrl
166
- }, {
167
- store
168
- }).then(res => {
169
- fetcherData = res;
170
- }).then(async () => await renderMarkUp(null)).catch(async error => {
171
- logger.error("error in calling server fetcher is ====>" + error);
172
- await renderMarkUp(404);
133
+ // Transforms Body Props
134
+ const shellEnd = _render.default.renderEnd(webExtractor, state, res, jsx, errorCode, fetcherData);
135
+ const finalProps = {
136
+ ...shellStart,
137
+ ...shellEnd,
138
+ jsx: jsx,
139
+ req,
140
+ res
141
+ };
142
+ let CompleteDocument = () => {
143
+ if ((0, _validator.validateCustomDocument)(CustomDocument)) {
144
+ return CustomDocument(finalProps);
145
+ } else {
146
+ return /*#__PURE__*/_react.default.createElement("html", {
147
+ lang: finalProps.lang
148
+ }, /*#__PURE__*/_react.default.createElement(_document.Head, {
149
+ isBot: finalProps.isBot,
150
+ pageJS: finalProps.pageJS,
151
+ pageCss: finalProps.pageCss,
152
+ fetcherData: finalProps.fetcherData,
153
+ metaTags: finalProps.metaTags,
154
+ publicAssetPath: finalProps.publicAssetPath
155
+ }), /*#__PURE__*/_react.default.createElement(_document.Body, {
156
+ initialState: finalProps.initialState,
157
+ firstFoldCss: finalProps.firstFoldCss,
158
+ firstFoldJS: finalProps.firstFoldJS,
159
+ jsx: finalProps.jsx,
160
+ statusCode: finalProps.statusCode,
161
+ fetcherData: finalProps.fetcherData
162
+ }));
163
+ }
164
+ };
165
+ try {
166
+ let status = matches.length && matches[0].match.path === "*" ? 404 : 200;
167
+ res.set({
168
+ "content-type": "text/html; charset=utf-8"
169
+ });
170
+ res.status(status);
171
+ const {
172
+ pipe
173
+ } = (0, _server3.renderToPipeableStream)( /*#__PURE__*/_react.default.createElement(CompleteDocument, null), {
174
+ onShellReady() {
175
+ res.setHeader("content-type", "text/html");
176
+ pipe(res);
177
+ res.end();
178
+ },
179
+ onError(error) {
180
+ logger.error({
181
+ message: `\n Error while renderToPipeableStream : ${error.toString()}`
173
182
  });
174
- });
175
- }).catch(error => {
176
- logger.error("error in server side function is ====>" + error);
177
- renderMarkUp(error.status_code);
183
+ }
178
184
  });
179
185
  } catch (error) {
180
- logger.error("Error on server outer" + error.toString());
186
+ logger.error("Error in rendering document on server:" + error);
181
187
  }
182
188
  };
183
- var _react = require("react");
184
- var _react2 = _interopRequireDefault(_react);
185
- var _path = require("path");
186
- var _path2 = _interopRequireDefault(_path);
187
- var _reactRedux = require("react-redux");
188
- var _router = require("@tata1mg/router");
189
- var _server = require("react-router-dom/server");
190
- var _server2 = require("react-dom/server");
191
- var _server3 = require("@loadable/server");
192
- var _App = require("@containers/App");
193
- var _App2 = _interopRequireDefault(_App);
194
- var _render = require("./render");
195
- var _render2 = _interopRequireDefault(_render);
196
- var _extract = require("./extract");
197
- var _extract2 = _interopRequireDefault(_extract);
198
- var _userAgentUtil = require("./userAgentUtil.js");
199
- var _document = require("./document");
200
- var _validator = require("../utils/validator");
201
- var _ServerRouter = require("../../router/ServerRouter.js");
202
- var _ServerRouter2 = _interopRequireDefault(_ServerRouter);
203
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
204
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
205
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
206
- 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; }
207
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
208
- 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); }
209
- const {
210
- default: configureStore
211
- } = require(`${process.env.src_path}/src/js/store/index.js`);
212
- const {
213
- default: getRoutes
214
- } = require(`${process.env.src_path}/src/js/routes/index.js`);
215
- const {
216
- default: CustomDocument
217
- } = require(`${process.env.src_path}/server/document.js`);
218
- const STATUS_CAKE_USER_AGENT_MOBILE = "StatusCake/Pretest (statuscake.com)";
219
- const isProduction = process.env.NODE_ENV === "production";
220
- let webStats = null;
221
- webStats = _path2.default.join(__dirname, "../..", `loadable-stats.json`);
222
- if (isProduction) webStats = _path2.default.join(__dirname, "../..", process.env.PUBLIC_OUTPUT_PATH, `loadable-stats.json`);
223
189
 
224
190
  /**
225
191
  * middleware for document handling
226
- * @param {object} req - router path
227
- * @param {object} res - css elements array extracted through loadable chunk extracter
228
- */
192
+ * @param {object} req - request object
193
+ * @param {object} res - response object
194
+ */
195
+ async function _default(req, res) {
196
+ try {
197
+ let context = {};
198
+ let fetcherData = {};
199
+
200
+ // creates store
201
+ const store = (0, _validator.validateConfigureStore)(createStore) ? createStore({}, req) : null;
202
+
203
+ // user defined routes
204
+ const routes = (0, _validator.validateGetRoutes)(getRoutes) ? getRoutes() : [];
205
+
206
+ // Matches req url with routes
207
+ const matches = getMatchRoutes(routes, req, res, store, context, fetcherData);
208
+ const allMatches = (0, _router.matchRoutes)(getRoutes(), req.baseUrl);
209
+ let allTags = [];
210
+
211
+ // Executing app server side function
212
+ _App.default.serverSideFunction({
213
+ store,
214
+ req,
215
+ res
216
+ })
217
+ // Executing serverFetcher functions with serverDataFetcher provided by router and returning document
218
+ .then(() => {
219
+ (0, _router.serverDataFetcher)({
220
+ routes: routes,
221
+ req,
222
+ res,
223
+ url: req.originalUrl
224
+ }, {
225
+ store
226
+ }).then(res => {
227
+ fetcherData = res;
228
+ allTags = (0, _router.getMetaData)(allMatches, fetcherData);
229
+ }).then(async () => await renderMarkUp(null, req, res, allTags, fetcherData, store, matches, context)).catch(async error => {
230
+ logger.error("Error in executing serverFetcher functions: " + error);
231
+ await renderMarkUp(404, req, res, allTags, fetcherData, store, matches, context);
232
+ });
233
+ }).catch(error => {
234
+ logger.error("Error in executing serverSideFunction inside App: " + error);
235
+ renderMarkUp(error.status_code, req, res, allTags, fetcherData, store, matches, context);
236
+ });
237
+ } catch (error) {
238
+ logger.error("Error in handling document request: " + error.toString());
239
+ }
240
+ }
@@ -3,11 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var _express = require("express");
7
- var _express2 = _interopRequireDefault(_express);
8
- var _handler = require("./handler");
9
- var _handler2 = _interopRequireDefault(_handler);
6
+ exports.default = void 0;
7
+ var _express = _interopRequireDefault(require("express"));
8
+ var _handler = _interopRequireDefault(require("./handler"));
10
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
- const router = _express2.default.Router();
12
- router.use(_handler2.default);
13
- exports.default = router;
10
+ const router = _express.default.Router();
11
+ router.use(_handler.default);
12
+ var _default = exports.default = router;
@@ -3,25 +3,32 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.default = void 0;
6
7
  var _extract = require("./extract");
7
8
  /**
8
- * returns data which will be used in head component for page rendering
9
- * @param {string} pageCss - includes all styles for page css
10
- * @param {string} pageJS - async scripts for loading chunks
9
+ * returns data which will be used in Head component for page rendering
10
+ * @param {string} pageCss - cached styles for page
11
+ * @param {string} pageJS - cached javscript elements for page
11
12
  * @param {function} metaTagFunction - user defined function which returns meta tags in array
12
13
  * @param {boolean} isBot - checks if request is made by bot
13
14
  * @param {object} fetcherData - router fetched data
14
15
  */
15
- const renderStart = (pageCss, pageJS, metaTagFunction, isBot, fetcherData) => {
16
- let publicAssetPath = "/assets";
17
- const isProd = process.env.NODE_ENV === "production";
18
- if (isProd) {
19
- publicAssetPath = `${process.env.CDN_ASSET_PATH}/${process.env.S3_FOLDER}/${process.env.BUILD_ENV}/${process.env.BUILD_NUMBER}/static/images`;
16
+ const renderStart = (pageCss, pageJS, metaTags, isBot, fetcherData) => {
17
+ const {
18
+ IS_DEV_COMMAND,
19
+ WEBPACK_DEV_SERVER_HOSTNAME,
20
+ WEBPACK_DEV_SERVER_PORT
21
+ } = process.env;
22
+ let publicAssetPath = `${process.env.PUBLIC_STATIC_ASSET_URL}${process.env.PUBLIC_STATIC_ASSET_PATH}`;
23
+
24
+ // serves assets from localhost on running devBuild and devServe command
25
+ if (JSON.parse(IS_DEV_COMMAND)) {
26
+ publicAssetPath = `http://${WEBPACK_DEV_SERVER_HOSTNAME}:${WEBPACK_DEV_SERVER_PORT}/assets/`;
20
27
  }
21
28
  return {
22
29
  pageCss,
23
30
  pageJS,
24
- metaTagFunction,
31
+ metaTags,
25
32
  isBot,
26
33
  publicAssetPath,
27
34
  fetcherData
@@ -34,27 +41,33 @@ const renderStart = (pageCss, pageJS, metaTagFunction, isBot, fetcherData) => {
34
41
  * @param {string} initialState - reducer initial state
35
42
  * @param {function} res - response object
36
43
  * @param {boolean} jsx - jsx which needs to be render on server side
37
- * @param {string|number|null} errorCode - error code
44
+ * @param {string|number|null} errorCode - error code
38
45
  * @param {object} fetcherData - router fetched data
39
46
  */
40
47
  const renderEnd = (webExtractor, initialState = {}, res, jsx, errorCode, fetcherData) => {
41
48
  // For bot first fold css and js would become complete page css and js
42
- let firstFoldCss = "",
43
- firstFoldJS = "",
44
- publicSWPath = "/assets";
49
+ let firstFoldCss = "";
50
+ let firstFoldJS = "";
45
51
  const isProd = process.env.NODE_ENV === "production";
46
52
  const {
47
53
  routePath,
48
54
  pageCss,
49
55
  pageJS
50
56
  } = res.locals;
51
- if (!isProd || routePath && (!pageCss || !pageJS)) {
57
+
58
+ // Development: Extracts styles and javascript elements for injecting in Body Component.
59
+ // NOTE: Caching of styles and javascript is not enabled in development.
60
+ if (!isProd) {
61
+ firstFoldCss = webExtractor.getStyleElements();
62
+ firstFoldJS = webExtractor.getScriptElements();
63
+ }
64
+
65
+ // Production: Extract styles and javscript elements if they are not found in cache and stores them in cache.
66
+ if (isProd && routePath && (!pageCss || !pageJS)) {
52
67
  firstFoldCss = webExtractor.getStyleElements();
53
68
  firstFoldJS = webExtractor.getScriptElements();
54
- if (isProd) {
55
- (0, _extract.cacheCSS)(routePath, webExtractor.getLinkElements());
56
- (0, _extract.cacheJS)(routePath, firstFoldJS);
57
- }
69
+ (0, _extract.cacheCSS)(routePath, webExtractor.getLinkElements());
70
+ (0, _extract.cacheJS)(routePath, webExtractor.getScriptElements());
58
71
  }
59
72
  return {
60
73
  initialState,
@@ -65,7 +78,7 @@ const renderEnd = (webExtractor, initialState = {}, res, jsx, errorCode, fetcher
65
78
  fetcherData
66
79
  };
67
80
  };
68
- exports.default = {
81
+ var _default = exports.default = {
69
82
  renderStart,
70
83
  renderEnd
71
84
  };
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ var _expressServer = _interopRequireDefault(require("./expressServer.js"));
4
+ var _chokidar = _interopRequireDefault(require("chokidar"));
5
+ var _path = _interopRequireDefault(require("path"));
6
+ var _index = require("@server/index.js");
7
+ var _validator = require("./utils/validator.js");
8
+ var _picocolors = _interopRequireDefault(require("picocolors"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ const env = process.env.NODE_ENV || "development";
11
+
12
+ // function defined by user which needs to run before server starts
13
+ if ((0, _validator.validatePreInitServer)(_index.preServerInit)) (0, _index.preServerInit)();
14
+ process.on("uncaughtException", (err, origin) => {
15
+ console.log(process.stderr.fd);
16
+ console.log(`Caught exception: ${err}\n` + `Exception origin: ${origin}`);
17
+ });
18
+ process.on("SIGINT", function (data) {
19
+ console.log("SIGINT");
20
+ console.log(data);
21
+ process.exit(0);
22
+ });
23
+ process.on("uncaughtExceptionMonitor", (err, origin) => {
24
+ console.log(err, origin);
25
+ });
26
+ process.on("message", function (msg) {
27
+ if (msg == "shutdown") {
28
+ console.log("Closing all connections...");
29
+ setTimeout(function () {
30
+ console.log("Finished closing connections");
31
+ process.exit(0);
32
+ }, 1500);
33
+ }
34
+ });
35
+ if (env === "development") {
36
+ // Add better stack tracing for promises in dev mode
37
+ process.on("unhandledRejection", r => console.debug(r));
38
+ }
39
+ const port = process.env.NODE_SERVER_PORT ?? 3005;
40
+ const host = process.env.NODE_SERVER_HOSTNAME ?? "localhost";
41
+ let statsPath = _path.default.join(__dirname, `../`, "loadable-stats.json");
42
+ if (env === "production") {
43
+ statsPath = _path.default.join(process.env.src_path, `${process.env.BUILD_OUTPUT_PATH}/public/loadable-stats.json`);
44
+ }
45
+ const watcher = _chokidar.default.watch(statsPath, {
46
+ persistent: true
47
+ });
48
+ console.log(`Waiting for chunks. Application server will be mounted when your assets are compiled.`);
49
+ watcher.on("all", (event, path) => {
50
+ if (event === "add") {
51
+ if (env == "production") {
52
+ watcher.close();
53
+ }
54
+ console.log("Starting Application Server...");
55
+ _expressServer.default.listen({
56
+ port,
57
+ host
58
+ }, error => {
59
+ if (error) {
60
+ console.log("An error occured while starting the Application server : ", error);
61
+ } else {
62
+ console.log(_picocolors.default.cyan(_picocolors.default.bold(`Application server is mounted on ${_picocolors.default.yellow(`http://${host}:${port}`)}.`)));
63
+ }
64
+ });
65
+ }
66
+ });
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.mergeMetaTags = void 0;
7
+ const mergeMetaTags = (parentTags, childTags) => {};
8
+ exports.mergeMetaTags = mergeMetaTags;
9
+ const typesOfMeta = {};
10
+
11
+ // type
12
+ // props
13
+ // children