catalyst-core 0.0.1-beta.2

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 (106) hide show
  1. package/.prettierignore +2 -0
  2. package/.prettierrc.json +7 -0
  3. package/LICENSE +9 -0
  4. package/README.md +132 -0
  5. package/babel.config.json +24 -0
  6. package/bin/catalyst.js +41 -0
  7. package/caching.js +16 -0
  8. package/checkVersion.js +3 -0
  9. package/config/config.js +24 -0
  10. package/config.json +8 -0
  11. package/index.js +16 -0
  12. package/logger/index.js +96 -0
  13. package/package.json +87 -0
  14. package/packages/create-framework-app/node_modules/.package-lock.json +249 -0
  15. package/packages/create-framework-app/templates/redux-js/node_modules/@babel/core/lib/config/caching.js +261 -0
  16. package/packages/create-framework-app/templates/redux-js/node_modules/@remix-run/router/dist/router.js +4327 -0
  17. package/packages/create-framework-app/templates/redux-js/node_modules/catalyst/router.js +15 -0
  18. package/packages/create-framework-app/templates/redux-js/node_modules/http-proxy-middleware/dist/router.js +46 -0
  19. package/reducer/index.js +88 -0
  20. package/reducer/loadableConfigReducer.js +19 -0
  21. package/router/ClientRouter.js +15 -0
  22. package/router/ServerRouter.js +28 -0
  23. package/router/index.js +32 -0
  24. package/router.js +16 -0
  25. package/scripts/build.js +27 -0
  26. package/scripts/loadEnvironmentVariables.js +37 -0
  27. package/scripts/loadScriptsBeforeServerStarts.js +55 -0
  28. package/scripts/prepare.js +19 -0
  29. package/scripts/registerAliases.js +30 -0
  30. package/scripts/serve.js +27 -0
  31. package/scripts/start.js +28 -0
  32. package/scripts/validator.js +99 -0
  33. package/server/mainIndex.js +65 -0
  34. package/server/mainServer.js +70 -0
  35. package/server/renderer/document/Body.js +37 -0
  36. package/server/renderer/document/Head.js +44 -0
  37. package/server/renderer/document/index.js +25 -0
  38. package/server/renderer/extract.js +86 -0
  39. package/server/renderer/handler.js +228 -0
  40. package/server/renderer/index.js +13 -0
  41. package/server/renderer/render.js +71 -0
  42. package/server/renderer/userAgentUtil.js +55 -0
  43. package/server/utils/validator.js +98 -0
  44. package/store/index.dev.js +73 -0
  45. package/store/index.js +25 -0
  46. package/store/index.prod.js +66 -0
  47. package/tsconfig.json +110 -0
  48. package/types/caching.d.ts +1 -0
  49. package/types/config/config.d.ts +19 -0
  50. package/types/index.d.ts +1 -0
  51. package/types/logger/index.d.ts +14 -0
  52. package/types/reducer/index.d.ts +22 -0
  53. package/types/reducer/loadableConfigReducer.d.ts +9 -0
  54. package/types/router/ClientRouter.d.ts +5 -0
  55. package/types/router/ServerRouter.d.ts +7 -0
  56. package/types/router/index.d.ts +8 -0
  57. package/types/router.d.ts +1 -0
  58. package/types/scripts/build.d.ts +1 -0
  59. package/types/scripts/loadEnvironmentVariables.d.ts +5 -0
  60. package/types/scripts/loadScriptsBeforeServerStarts.d.ts +1 -0
  61. package/types/scripts/prepare.d.ts +1 -0
  62. package/types/scripts/registerAliases.d.ts +1 -0
  63. package/types/scripts/serve.d.ts +1 -0
  64. package/types/scripts/start.d.ts +1 -0
  65. package/types/scripts/validator.d.ts +9 -0
  66. package/types/scripts/verifyConfig.d.ts +1 -0
  67. package/types/server/mainIndex.d.ts +1 -0
  68. package/types/server/mainServer.d.ts +2 -0
  69. package/types/server/renderer/document/Body.d.ts +11 -0
  70. package/types/server/renderer/document/Head.d.ts +11 -0
  71. package/types/server/renderer/document/index.d.ts +2 -0
  72. package/types/server/renderer/extract.d.ts +18 -0
  73. package/types/server/renderer/handler.d.ts +6 -0
  74. package/types/server/renderer/index.d.ts +2 -0
  75. package/types/server/renderer/render.d.ts +38 -0
  76. package/types/server/renderer/userAgentUtil.d.ts +1 -0
  77. package/types/store/index.d.ts +11 -0
  78. package/types/store/index.dev.d.ts +8 -0
  79. package/types/store/index.prod.d.ts +8 -0
  80. package/types/webpack/babel-plugins/remove-client.plugin.d.ts +10 -0
  81. package/types/webpack/babel-plugins/remove-ssr.plugin.d.ts +10 -0
  82. package/types/webpack/babel.config.client.d.ts +21 -0
  83. package/types/webpack/babel.config.d.ts +16 -0
  84. package/types/webpack/babel.config.ssr.d.ts +21 -0
  85. package/types/webpack/base.babel.d.ts +184 -0
  86. package/types/webpack/development.client.babel.d.ts +1 -0
  87. package/types/webpack/plugins/mime-types.d.ts +78 -0
  88. package/types/webpack/plugins/route-manifest-plugin.d.ts +1 -0
  89. package/types/webpack/plugins/upload-assets-plugin.d.ts +1 -0
  90. package/types/webpack/production.client.babel.d.ts +174 -0
  91. package/types/webpack/production.ssr.babel.d.ts +2 -0
  92. package/types/webpack/scssParams.d.ts +2 -0
  93. package/webpack/babel-plugins/remove-client.plugin.js +31 -0
  94. package/webpack/babel-plugins/remove-ssr.plugin.js +21 -0
  95. package/webpack/babel.config.client.js +24 -0
  96. package/webpack/babel.config.js +20 -0
  97. package/webpack/babel.config.ssr.js +24 -0
  98. package/webpack/base.babel.js +174 -0
  99. package/webpack/development.client.babel.js +82 -0
  100. package/webpack/plugins/mime-types.js +82 -0
  101. package/webpack/plugins/route-manifest-copy.js +122 -0
  102. package/webpack/plugins/route-manifest-plugin.js +122 -0
  103. package/webpack/plugins/upload-assets-plugin.js +181 -0
  104. package/webpack/production.client.babel.js +79 -0
  105. package/webpack/production.ssr.babel.js +61 -0
  106. package/webpack/scssParams.js +31 -0
@@ -0,0 +1,2 @@
1
+ **/*.html
2
+
@@ -0,0 +1,7 @@
1
+ {
2
+ "trailingComma": "es5",
3
+ "tabWidth": 4,
4
+ "semi": false,
5
+ "arrowParens": "always",
6
+ "printWidth": 110
7
+ }
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 1mg Healthcare Solutions Private Limited.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,132 @@
1
+ # Catalyst
2
+
3
+ Frontend framework with server rendering support for web applications.
4
+
5
+ ## Table of Contents
6
+
7
+ - Overview
8
+ - Initial setup
9
+ - Data Fetching with Catalyst
10
+ - serverFetcher
11
+ - clientFetcher
12
+ - refetch (for data revalidation)
13
+ - State Management
14
+
15
+ ## Overview
16
+
17
+ This package provides a way to proxy your request through your server. It allows you to cache your incoming request to improve your server response time.
18
+
19
+
20
+ ## Initial Setup
21
+ Run the following commands in the directory where you want to scaffold catalyst app.
22
+
23
+ ```js
24
+ npx create-catalyst-app
25
+ ```
26
+
27
+ if this steps fails, make sure .npmrc file exists and token used is a valid one.
28
+
29
+ If successful, cli for setup will appear.
30
+
31
+ Select js for the language and Redux for state management option. (we’ll be adding ts support soon)
32
+
33
+ After selecting options
34
+ ```js
35
+ cd my-app && npm i
36
+ ```
37
+ For starting the project
38
+ ```js
39
+ npm run start
40
+ ```
41
+
42
+ ## Data Fetching with Catalyst
43
+
44
+ we have serverFetcher function for fetching with SSR and clientFetcher function for fetching during client side rendering and navigations.
45
+
46
+ **serverFetcher**
47
+
48
+ server fetcher will get request, request params, search params and store (if project is setup with redux or rtk) as arguments. We can declare it as an async function and use await for fetching or use then chaining for data fetching.
49
+
50
+ if server fetcher is called for a route then client fetcher will not be called for that route, unless called with refetch.
51
+ ```js
52
+ Home.serverFetcher = async ({ req,params,searchParams }, { store }) => {
53
+ store.dispatch(someAction())
54
+ const res = await fetch("some_url");
55
+ const json = await res.json();
56
+ return json;
57
+ };
58
+ ```
59
+ data returned from fetcher function will be accessible through useCurrentRouteData() hook provided by router.
60
+ ```js
61
+ const [data,error,isFetched] = useCurrentRouteData()
62
+ ```
63
+ error and loading state would be handled by router.
64
+
65
+ **clientFetcher**
66
+
67
+ client fetcher would be called on client side rendering and client side navigations. `store` would be available as a param in client side for dispatching redux/rtk actions.
68
+
69
+ ```js
70
+ Home.clientFetcher = async ({route,location,params,searchParams,navigate},{store}) => {
71
+ store.dispatch(someAction())
72
+ const res = await fetch("some_url");
73
+ const json = await res.json();
74
+ return json;
75
+ };
76
+ ```
77
+ data returned from client fetcher function will be accessible through useCurrentRouteData() hook provided by router (hook for data access through client is same).
78
+ ```js
79
+ const [data,error,isFetched] = useCurrentRouteData()
80
+ ```
81
+
82
+
83
+ **refetch (for data revalidation)**
84
+
85
+ refetch function can be used were we need to execute clientFetcher based on some condition(such as for infinite scroll or some state change inside container or onClick.)
86
+
87
+ We can pass arguments in refetch function which would
88
+
89
+ ```js
90
+ const [data,error,isFetched,refetch] = useCurrentRouteData()
91
+
92
+ useEffect(()=>{
93
+ refetch({refetchArgument:some_value})
94
+ },[arg])
95
+
96
+ clientFetcher = ({},{refetchArgument}) => {
97
+
98
+ const res = await api_call // refetchArg can be used as a param in api call
99
+ return res
100
+ }
101
+
102
+ ```
103
+
104
+
105
+ ## State Management
106
+ state management wrappers are defined in stateProvider.js file
107
+
108
+ store can be configured by manipulating store/index.js as per user requirements (custom middlewares etc can be added in this way.
109
+
110
+ initial state and request object would be provided in createStore function which will be called on server and client, we use the params to add additional arguments and middlewares in redux store.
111
+
112
+ ```js
113
+ const configureStore = (initialState, cookies, requestObj, customHeaders) => {
114
+ const api = fetchInstance
115
+ const store = createStore({
116
+ reducer: rootReducer,
117
+ middleware: (getDefaultMiddleware) =>
118
+ getDefaultMiddleware({
119
+ thunk: {
120
+ extraArgument: { api },
121
+ },
122
+ }),
123
+ preloadedState: initialState,
124
+ })
125
+ return store
126
+ }
127
+
128
+ export default configureStore
129
+ ```
130
+
131
+ ## Documentation
132
+ Visit https://catalyst.1mg.com to view the full documentation.
@@ -0,0 +1,24 @@
1
+ {
2
+ "presets": [
3
+ [
4
+ "@babel/preset-env",
5
+ {
6
+ "targets": {
7
+ "node": "current"
8
+ }
9
+ }
10
+ ],
11
+ "@babel/preset-react"
12
+ ],
13
+ "plugins": [
14
+ "@babel/plugin-proposal-object-rest-spread",
15
+ "transform-class-properties",
16
+ "@loadable/babel-plugin"
17
+ ],
18
+ "env": {
19
+ "test": {
20
+ "presets": ["@babel/preset-react"]
21
+ }
22
+ },
23
+ "ignore": ["__TEST__"]
24
+ }
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ process.on('unhandledRejection', err => {
4
+ throw err;
5
+ });
6
+ const { spawnSync } = require('node:child_process');
7
+ const args = process.argv.slice(2);
8
+ const scriptIndex = args.findIndex(
9
+ x => x === 'build' || x === 'start' || x=== 'prepare' || x=== 'serve'
10
+ );
11
+ const script = scriptIndex === -1 ? args[0] : args[scriptIndex];
12
+ const nodeArgs = scriptIndex > 0 ? args.slice(0, scriptIndex) : [];
13
+ if (['build', 'start', 'prepare', 'serve'].includes(script)) {
14
+ const result = spawnSync(
15
+ process.execPath,
16
+ nodeArgs
17
+ .concat(require.resolve('../scripts/' + script))
18
+ .concat(args.slice(scriptIndex + 1)),
19
+ { stdio: 'inherit' }
20
+ );
21
+ if (result.signal) {
22
+ if (result.signal === 'SIGKILL') {
23
+ console.log(
24
+ 'The build failed because the process exited too early. ' +
25
+ 'This probably means the system ran out of memory or someone called ' +
26
+ '`kill -9` on the process.'
27
+ );
28
+ } else if (result.signal === 'SIGTERM') {
29
+ console.log(
30
+ 'The build failed because the process exited too early. ' +
31
+ 'Someone might have called `kill` or `killall`, or the system could ' +
32
+ 'be shutting down.'
33
+ );
34
+ }
35
+ process.exit(1);
36
+ }
37
+ process.exit(result.status);
38
+ } else {
39
+ console.log('Unknown script "' + script + '".');
40
+ console.log('Perhaps you need to update framework?');
41
+ }
package/caching.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _apiCaching = require("@tata1mg/api-caching");
7
+ Object.keys(_apiCaching).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _apiCaching[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _apiCaching[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1,3 @@
1
+ if(process.versions.node.split(".")[0]<20){
2
+ console.error('\x1b[31m%s\x1b[0m', 'use node version >=20');
3
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = exports.default = {
8
+ "S3_BUCKET": "stagassets.1mg.com",
9
+ "S3_FOLDER": "pwa-app",
10
+ "CDN_ASSET_PATH": "https://stagstatic.1mg.com",
11
+ "APPLICATION_PORT": "3005",
12
+ "APPLICATION_BASE_URL": "http://localhost:3005",
13
+ "SERVER_PATH": "http://localhost:3005",
14
+ "OUTPUT_PATH": "build",
15
+ "PUBLIC_OUTPUT_PATH": "build/public",
16
+ "PUBLIC_ASSET_PATH": "http://localhost:3006/assets/",
17
+ "LOCAL_ASSET_PATH": "/assets/",
18
+ "EXTERNAL_BASE_URL": "http://localhost:3005",
19
+ "DEV_SERVER_PORT": 3006,
20
+ "DEV_SERVER_HOSTNAME": "localhost",
21
+ "DEV_SERVER_HOST_URL": "http://localhost:3006",
22
+ "ENV_NAME": "local",
23
+ "BUILD_ENV": ""
24
+ };
package/config.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "cssModulesIdentifierDev": "[name]__[local]",
3
+ "cssModulesIdentifierProd": "[name]__[local]__[hash:base64:5]",
4
+ "analyzeBundle": false,
5
+ "chunkFileNameDev": "[name].bundle.js",
6
+ "chunkFileNameProd": "[name].[contenthash].js",
7
+ "cssChunkFileName": "[name].[contenthash].css"
8
+ }
package/index.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _index = require("./server/renderer/document/index");
7
+ Object.keys(_index).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _index[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _index[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ const winston = require("winston");
4
+ const DailyRotateFile = require("winston-daily-rotate-file");
5
+ const pc = require("picocolors");
6
+ const {
7
+ createLogger,
8
+ format,
9
+ transports
10
+ } = winston;
11
+
12
+ /**
13
+ * @description Logger library with rotational strategy. Creates a logs folder in root.
14
+ * With debug, error and info log directories with their respective log files.
15
+ *
16
+ * @format Logstash with timestamp
17
+ * @param config { @enableDebugLogs: Bool // default: true }
18
+ * @returns loggerInstance
19
+ *
20
+ */
21
+ const configureLogger = (config = {}) => {
22
+ const {
23
+ enableDebugLogs = true,
24
+ enableFileLogging = true,
25
+ enableConsoleLogging = true
26
+ } = config;
27
+ const consoleTransport = new transports.Console({
28
+ level: 'debug'
29
+ });
30
+ const fileTransport = (type = "info") => {
31
+ return new DailyRotateFile({
32
+ filename: `./logs/${type}/%DATE%.${type}.log`,
33
+ datePattern: "YYYY-MM-DD",
34
+ maxFiles: "3d",
35
+ // Logs will be removed after 2days,
36
+ loglevel: type,
37
+ level: type
38
+ });
39
+ };
40
+ const infoLogger = createLogger({
41
+ format: format.combine(format.timestamp({
42
+ format: 'YYYY-MM-DD HH:mm:ss'
43
+ }), format.json()),
44
+ defaultMeta: {
45
+ loglevel: "info"
46
+ }
47
+ });
48
+ const debugLogger = createLogger({
49
+ format: format.combine(format.timestamp({
50
+ format: 'YYYY-MM-DD HH:mm:ss'
51
+ }), format.json()),
52
+ defaultMeta: {
53
+ loglevel: "debug"
54
+ }
55
+ });
56
+ const errorLogger = createLogger({
57
+ format: format.combine(format.timestamp({
58
+ format: 'YYYY-MM-DD HH:mm:ss'
59
+ }), format.json()),
60
+ defaultMeta: {
61
+ loglevel: "error"
62
+ }
63
+ });
64
+ if (enableConsoleLogging && JSON.parse(enableConsoleLogging)) {
65
+ infoLogger.add(consoleTransport);
66
+ debugLogger.add(consoleTransport);
67
+ errorLogger.add(consoleTransport);
68
+ }
69
+ if (enableFileLogging && JSON.parse(enableFileLogging)) {
70
+ infoLogger.add(fileTransport('info'));
71
+ debugLogger.add(fileTransport('debug'));
72
+ errorLogger.add(fileTransport('error'));
73
+ }
74
+ const Logger = {
75
+ debug: () => {},
76
+ error: msg => {
77
+ console.log(pc.red(pc.bold("ERROR: " + JSON.stringify(msg))));
78
+ errorLogger.error(msg);
79
+ },
80
+ info: msg => {
81
+ console.log(pc.green(pc.bold("INFO: " + JSON.stringify(msg))));
82
+ infoLogger.info(msg);
83
+ }
84
+ };
85
+ if (enableDebugLogs && JSON.parse(enableDebugLogs)) {
86
+ Logger.debug = msg => {
87
+ console.log(pc.yellow(pc.bold("DEBUG: " + JSON.stringify(msg))));
88
+ debugLogger.debug(msg);
89
+ };
90
+ }
91
+ if (global) global.logger = Logger;
92
+ return Logger;
93
+ };
94
+ module.exports = {
95
+ configureLogger
96
+ };
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "catalyst-core",
3
+ "version": "0.0.1-beta.2",
4
+ "main": "index.js",
5
+ "description": "1mg framework around react",
6
+ "bin": {
7
+ "catalyst": "./bin/catalyst.js"
8
+ },
9
+ "scripts": {
10
+ "prepare": "babel src --out-dir . ",
11
+ "start": "npx babel-node -r ./scripts/loadScriptsBeforeServerStarts.js ./webpack/development.client.babel & npx babel-node -r ./scripts/loadScriptsBeforeServerStarts.js ./server/mainIndex.js --watch-path=${npm_config_src_path}/server --watch-path=${npm_config_src_path}/src --ignore=' '",
12
+ "build": "rm -rf ${npm_config_src_path}/build & node ./scripts/loadScriptsBeforeServerStarts.js & APPLICATION=${npm_config_app_name} NODE_ENV=production webpack --config ./webpack/production.client.babel.js --progress && APPLICATION=${npm_config_app_name} NODE_ENV=production SSR=true webpack --config ./webpack/production.ssr.babel.js --progress && APPLICATION=${npm_config_app_name} NODE_ENV=production npx babel ./server --out-dir ${npm_config_src_path}/build --ignore '**/*.test.js,./server/renderer/handler.js' && APPLICATION=${npm_config_app_name} npx babel ${npm_config_src_path}/server --out-dir ${npm_config_src_path}/build ",
13
+ "serve": "APPLICATION=${npm_config_app_name} NODE_ENV=production node -r ./scripts/loadScriptsBeforeServerStarts.js ${npm_config_src_path}/build/mainIndex.js"
14
+ },
15
+ "author": "",
16
+ "license": "MIT",
17
+ "dependencies": {
18
+ "@babel/cli": "^7.23.0",
19
+ "@babel/core": "^7.23.2",
20
+ "@babel/node": "^7.22.19",
21
+ "@babel/plugin-proposal-object-rest-spread": "^7.20.7",
22
+ "@babel/plugin-transform-react-jsx": "^7.22.15",
23
+ "@babel/preset-env": "^7.23.2",
24
+ "@babel/preset-react": "^7.22.15",
25
+ "@babel/register": "^7.22.15",
26
+ "@loadable/babel-plugin": "^5.16.1",
27
+ "@loadable/component": "^5.15.3",
28
+ "@loadable/server": "^5.16.1",
29
+ "@loadable/webpack-plugin": "^5.15.2",
30
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
31
+ "@svgr/webpack": "^8.1.0",
32
+ "@tata1mg/router": "^0.0.1-alpha.13",
33
+ "acorn-loose": "^8.4.0",
34
+ "app-root-path": "^3.1.0",
35
+ "aws-sdk": "^2.1490.0",
36
+ "axios": "^0.19.2",
37
+ "babel-loader": "^9.1.3",
38
+ "babel-plugin-dynamic-import-node": "^2.3.3",
39
+ "babel-plugin-syntax-dynamic-import": "^6.18.0",
40
+ "babel-plugin-transform-class-properties": "^6.24.1",
41
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
42
+ "babel-plugin-transform-export-extensions": "^6.22.0",
43
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
44
+ "body-parser": "^1.20.2",
45
+ "compression": "^1.7.4",
46
+ "cookie-parser": "^1.4.6",
47
+ "css-hot-loader": "^1.4.4",
48
+ "css-loader": "^6.8.1",
49
+ "css-modules-require-hook": "^4.2.3",
50
+ "dotenv-webpack": "^8.0.1",
51
+ "esm-module-alias": "^2.0.3",
52
+ "express": "^4.18.2",
53
+ "express-static-gzip": "^2.1.7",
54
+ "file-loader": "^6.2.0",
55
+ "helmet": "^7.0.0",
56
+ "html-loader": "^4.2.0",
57
+ "img-loader": "^4.0.0",
58
+ "isomorphic-dompurify": "^1.13.0",
59
+ "lodash.template": "^4.5.0",
60
+ "mini-css-extract-plugin": "^2.7.6",
61
+ "module-alias": "^2.2.3",
62
+ "node-dev": "^7.4.3",
63
+ "picocolors": "^1.0.0",
64
+ "postcss-loader": "^7.3.3",
65
+ "react": "^18.2.0",
66
+ "react-dom": "^18.2.0",
67
+ "react-redux": "^8.1.3",
68
+ "react-refresh": "^0.14.0",
69
+ "react-router-dom": "^6.16.0",
70
+ "redux": "^4.2.1",
71
+ "redux-logger": "^3.0.6",
72
+ "redux-thunk": "^2.4.2",
73
+ "sass": "^1.69.5",
74
+ "sass-loader": "^13.3.2",
75
+ "sass-resources-loader": "^2.2.5",
76
+ "ua-parser-js": "^1.0.37",
77
+ "url-loader": "^4.1.1",
78
+ "webpack": "^5.88.2",
79
+ "webpack-bundle-analyzer": "^4.9.1",
80
+ "webpack-cli": "^5.1.4",
81
+ "webpack-dev-server": "^4.15.1",
82
+ "webpack-merge": "^5.9.0",
83
+ "webpack-node-externals": "^3.0.0",
84
+ "winston": "^3.11.0",
85
+ "winston-daily-rotate-file": "^5.0.0"
86
+ }
87
+ }