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.
- package/.eslintignore +9 -0
- package/.eslintrc +92 -0
- package/README.md +58 -43
- package/babel.config.json +1 -5
- package/bin/catalyst.js +35 -35
- package/changelog.md +26 -0
- package/config.json +1 -2
- package/{LICENSE → license} +2 -1
- package/{logger/index.js → logger.js} +13 -10
- package/package.json +87 -85
- package/router/ClientRouter.js +10 -6
- package/router/ServerRouter.js +2 -11
- package/scripts/build.js +26 -11
- package/scripts/checkVersion.js +5 -0
- package/scripts/devBuild.js +42 -0
- package/scripts/devServe.js +43 -0
- package/scripts/loadEnvironmentVariables.js +8 -21
- package/scripts/loadScriptsBeforeServerStarts.js +13 -21
- package/scripts/serve.js +27 -11
- package/scripts/start.js +19 -12
- package/scripts/validator.js +39 -11
- package/server/expressServer.js +50 -0
- package/server/renderer/document/Body.js +17 -18
- package/server/renderer/document/Head.js +7 -8
- package/server/renderer/document/index.js +2 -0
- package/server/renderer/extract.js +25 -24
- package/server/renderer/handler.js +220 -208
- package/server/renderer/index.js +6 -7
- package/server/renderer/render.js +32 -19
- package/server/startServer.js +66 -0
- package/server/utils/metaTags.js +13 -0
- package/server/utils/userAgentUtil.js +51 -0
- package/server/utils/validator.js +39 -10
- package/webpack/babel-plugins/remove-client.plugin.js +1 -1
- package/webpack/babel-plugins/remove-ssr.plugin.js +1 -1
- package/webpack/babel.config.client.js +3 -3
- package/webpack/babel.config.ssr.js +1 -1
- package/webpack/base.babel.js +37 -36
- package/webpack/development.client.babel.js +11 -8
- package/webpack/production.client.babel.js +1 -2
- package/webpack/production.ssr.babel.js +3 -3
- package/webpack/scssParams.js +35 -15
- package/.prettierignore +0 -2
- package/.prettierrc.json +0 -7
- package/checkVersion.js +0 -3
- package/config/config.js +0 -24
- package/packages/create-framework-app/node_modules/.package-lock.json +0 -249
- package/packages/create-framework-app/templates/redux-js/node_modules/@babel/core/lib/config/caching.js +0 -261
- package/packages/create-framework-app/templates/redux-js/node_modules/@remix-run/router/dist/router.js +0 -4327
- package/packages/create-framework-app/templates/redux-js/node_modules/catalyst/router.js +0 -15
- package/packages/create-framework-app/templates/redux-js/node_modules/http-proxy-middleware/dist/router.js +0 -46
- package/reducer/index.js +0 -88
- package/reducer/loadableConfigReducer.js +0 -19
- package/store/index.dev.js +0 -73
- package/store/index.js +0 -25
- package/store/index.prod.js +0 -66
- package/types/caching.d.ts +0 -1
- package/types/config/config.d.ts +0 -19
- package/types/index.d.ts +0 -1
- package/types/logger/index.d.ts +0 -14
- package/types/reducer/index.d.ts +0 -22
- package/types/reducer/loadableConfigReducer.d.ts +0 -9
- package/types/router/ClientRouter.d.ts +0 -5
- package/types/router/ServerRouter.d.ts +0 -7
- package/types/router/index.d.ts +0 -8
- package/types/router.d.ts +0 -1
- package/types/scripts/build.d.ts +0 -1
- package/types/scripts/loadEnvironmentVariables.d.ts +0 -5
- package/types/scripts/loadScriptsBeforeServerStarts.d.ts +0 -1
- package/types/scripts/prepare.d.ts +0 -1
- package/types/scripts/registerAliases.d.ts +0 -1
- package/types/scripts/serve.d.ts +0 -1
- package/types/scripts/start.d.ts +0 -1
- package/types/scripts/validator.d.ts +0 -9
- package/types/scripts/verifyConfig.d.ts +0 -1
- package/types/server/mainIndex.d.ts +0 -1
- package/types/server/mainServer.d.ts +0 -2
- package/types/server/renderer/document/Body.d.ts +0 -11
- package/types/server/renderer/document/Head.d.ts +0 -11
- package/types/server/renderer/document/index.d.ts +0 -2
- package/types/server/renderer/extract.d.ts +0 -18
- package/types/server/renderer/handler.d.ts +0 -6
- package/types/server/renderer/index.d.ts +0 -2
- package/types/server/renderer/render.d.ts +0 -38
- package/types/server/renderer/userAgentUtil.d.ts +0 -1
- package/types/store/index.d.ts +0 -11
- package/types/store/index.dev.d.ts +0 -8
- package/types/store/index.prod.d.ts +0 -8
- package/types/webpack/babel-plugins/remove-client.plugin.d.ts +0 -10
- package/types/webpack/babel-plugins/remove-ssr.plugin.d.ts +0 -10
- package/types/webpack/babel.config.client.d.ts +0 -21
- package/types/webpack/babel.config.d.ts +0 -16
- package/types/webpack/babel.config.ssr.d.ts +0 -21
- package/types/webpack/base.babel.d.ts +0 -184
- package/types/webpack/development.client.babel.d.ts +0 -1
- package/types/webpack/plugins/mime-types.d.ts +0 -78
- package/types/webpack/plugins/route-manifest-plugin.d.ts +0 -1
- package/types/webpack/plugins/upload-assets-plugin.d.ts +0 -1
- package/types/webpack/production.client.babel.d.ts +0 -174
- package/types/webpack/production.ssr.babel.d.ts +0 -2
- 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 =
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
|
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 -
|
|
227
|
-
* @param {object} res -
|
|
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
|
+
}
|
package/server/renderer/index.js
CHANGED
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
var
|
|
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 =
|
|
12
|
-
router.use(
|
|
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
|
|
9
|
-
* @param {string} pageCss -
|
|
10
|
-
* @param {string} pageJS -
|
|
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,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
-
|
|
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
|