afront 1.0.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 (75) hide show
  1. package/.babelrc +14 -0
  2. package/.env +2 -0
  3. package/LICENSE +21 -0
  4. package/README.md +72 -0
  5. package/build-prod/favicon.ico +0 -0
  6. package/build-prod/index.html +1 -0
  7. package/build-prod/logo192.png +0 -0
  8. package/build-prod/logo512.png +0 -0
  9. package/build-prod/manifest.json +25 -0
  10. package/build-prod/robots.txt +3 -0
  11. package/build-prod/static/css/3-9b9bcf0b9b877caf80c6.css +1 -0
  12. package/build-prod/static/css/41-1bd05b5a5a70ee2fc084.css +1 -0
  13. package/build-prod/static/css/573-7b8794ea227293d474c9.css +1 -0
  14. package/build-prod/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
  15. package/build-prod/static/js/3-cde9f071488e7a433907.js +1 -0
  16. package/build-prod/static/js/41-e973a17863e1084774d7.js +1 -0
  17. package/build-prod/static/js/573-21fb9ccdf567d99f4539.js +1 -0
  18. package/build-prod/static/js/main-cc87f2505014acdf4863.js +1 -0
  19. package/build-prod/static/media/52f06bb716d4ecad087a.png +0 -0
  20. package/build-prod/static/media/adeaead125c45715106d.svg +1 -0
  21. package/build-prod/style.css +1 -0
  22. package/build-prod-ssr/3.ssr.prod.js +1 -0
  23. package/build-prod-ssr/41.ssr.prod.js +1 -0
  24. package/build-prod-ssr/573.ssr.prod.js +1 -0
  25. package/build-prod-ssr/ssr.prod.js +1 -0
  26. package/build-prod-ssr/static/css/3-9b9bcf0b9b877caf80c6.css +1 -0
  27. package/build-prod-ssr/static/css/41-1bd05b5a5a70ee2fc084.css +1 -0
  28. package/build-prod-ssr/static/css/573-7b8794ea227293d474c9.css +1 -0
  29. package/build-prod-ssr/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
  30. package/build-prod-ssr/static/media/52f06bb716d4ecad087a.png +0 -0
  31. package/build-prod-ssr/static/media/adeaead125c45715106d.svg +1 -0
  32. package/build-prod-static/favicon.ico +0 -0
  33. package/build-prod-static/index.html +1 -0
  34. package/build-prod-static/logo192.png +0 -0
  35. package/build-prod-static/logo512.png +0 -0
  36. package/build-prod-static/manifest.json +25 -0
  37. package/build-prod-static/robots.txt +3 -0
  38. package/build-prod-static/static/css/23-1bd05b5a5a70ee2fc084.css +1 -0
  39. package/build-prod-static/static/css/303-9b9bcf0b9b877caf80c6.css +1 -0
  40. package/build-prod-static/static/css/636-7b8794ea227293d474c9.css +1 -0
  41. package/build-prod-static/static/css/main-5aff2d8a2fc28d01fdad.css +1 -0
  42. package/build-prod-static/static/js/23-8e7dbd8910931f545fd9.js +1 -0
  43. package/build-prod-static/static/js/303-1db8abbd7d266bdc27c7.js +1 -0
  44. package/build-prod-static/static/js/636-8a26bc803f853c7ddf82.js +1 -0
  45. package/build-prod-static/static/js/main-709b08b8e9e528bab63c.js +1 -0
  46. package/build-prod-static/static/media/52f06bb716d4ecad087a.png +0 -0
  47. package/build-prod-static/static/media/adeaead125c45715106d.svg +1 -0
  48. package/build-prod-static/style.css +1 -0
  49. package/install.js +91 -0
  50. package/package.json +72 -0
  51. package/server.js +20 -0
  52. package/src/ARoutes/AFRoutes.js +11 -0
  53. package/src/App.js +28 -0
  54. package/src/Assets/images/afront.png +0 -0
  55. package/src/Assets/images/arrow-right.svg +1 -0
  56. package/src/Components/Background/MeshGradient.js +18 -0
  57. package/src/Components/Footer/Footer.js +108 -0
  58. package/src/Components/Header/Header.js +151 -0
  59. package/src/LoadingFallback.js +13 -0
  60. package/src/PageNotFound.js +20 -0
  61. package/src/Pages/Home.js +43 -0
  62. package/src/Pages/Support.js +68 -0
  63. package/src/Routes/ARoutes.js +25 -0
  64. package/src/Static/appStatic.js +26 -0
  65. package/src/Static/indexStatic.js +10 -0
  66. package/src/Style/App.module.css +11 -0
  67. package/src/Style/MeshGradient.module.css +130 -0
  68. package/src/Style/PageNotFound.module.css +37 -0
  69. package/src/Style/Style.module.css +685 -0
  70. package/src/Style/Support.module.css +185 -0
  71. package/src/index.js +29 -0
  72. package/webpack.build-prod.js +110 -0
  73. package/webpack.dev.js +87 -0
  74. package/webpack.prod.js +120 -0
  75. package/webpack.ssr.prod.js +86 -0
@@ -0,0 +1,185 @@
1
+ /* Support.module.css */
2
+
3
+ .supportContainer {
4
+ display: flex;
5
+ flex-direction: column;
6
+ align-items: center;
7
+ justify-content: center;
8
+ padding: 5rem 2rem;
9
+ color: #333;
10
+ text-align: center;
11
+ position: relative;
12
+ overflow: hidden;
13
+ min-height: 100vh;
14
+ background: #f7f9fc;
15
+ }
16
+
17
+ .supportTitle {
18
+ font-size: 3rem;
19
+ font-weight: bold;
20
+ margin-bottom: 1rem;
21
+ color: #2c3e50;
22
+ }
23
+
24
+ .supportDescription {
25
+ font-size: 1.25rem;
26
+ margin-bottom: 2rem;
27
+ color: #34495e;
28
+ /* Slightly lighter color */
29
+ }
30
+
31
+ .supportContent {
32
+ max-width: 900px;
33
+ margin: 0 auto;
34
+ padding: 1rem;
35
+ }
36
+
37
+ .supportCard {
38
+ background: #ffffff;
39
+ /* White background for cards */
40
+ color: #2c3e50;
41
+ /* Dark text color */
42
+ border-radius: 8px;
43
+ padding: 2rem;
44
+ margin-bottom: 2rem;
45
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
46
+ position: relative;
47
+ overflow: hidden;
48
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
49
+ }
50
+
51
+ .supportCard::before {
52
+ content: "";
53
+ position: absolute;
54
+ top: 50%;
55
+ left: 50%;
56
+ width: 300%;
57
+ height: 300%;
58
+ background: linear-gradient(45deg, rgba(0, 255, 238, 0.2), rgba(0, 49, 109, 0.2));
59
+ /* Lighter gradient */
60
+ transform: translate(-50%, -50%) rotate(0deg);
61
+ opacity: 0;
62
+ transition: opacity 0.3s ease;
63
+ z-index: 0;
64
+ }
65
+
66
+ .supportCardTitle {
67
+ font-size: 1.5rem;
68
+ margin-bottom: 1rem;
69
+ position: relative;
70
+ z-index: 1;
71
+ }
72
+
73
+ .supportCardContent {
74
+ font-size: 1rem;
75
+ position: relative;
76
+ z-index: 1;
77
+ }
78
+
79
+ .supportCard:hover {
80
+ transform: translateY(-10px);
81
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
82
+ }
83
+
84
+ .supportCard:hover::before {
85
+ opacity: 1;
86
+ }
87
+
88
+ .footerLink {
89
+ display: inline-block;
90
+ margin-top: 2rem;
91
+ padding: 0.5rem 1rem;
92
+ background: #3498db;
93
+ /* Light blue color */
94
+ color: #ffffff;
95
+ border-radius: 4px;
96
+ text-decoration: none;
97
+ transition: background 0.3s, transform 0.3s;
98
+ position: relative;
99
+ overflow: hidden;
100
+ }
101
+
102
+ .footerLink::after {
103
+ content: "";
104
+ position: absolute;
105
+ top: 50%;
106
+ left: 50%;
107
+ width: 300%;
108
+ height: 300%;
109
+ background: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0) 70%);
110
+ transform: translate(-50%, -50%) scale(0);
111
+ transition: transform 0.3s;
112
+ z-index: 0;
113
+ }
114
+
115
+ .footerLink:hover {
116
+ background: #2980b9;
117
+ transform: scale(1.05);
118
+ }
119
+
120
+ .footerLink:hover::after {
121
+ transform: translate(-50%, -50%) scale(1);
122
+ }
123
+
124
+ .supportContainer::before {
125
+ content: "AFront";
126
+ position: absolute;
127
+ top: 2%;
128
+ left: 50%;
129
+ transform: translateX(-50%);
130
+ font-size: 15rem;
131
+ color: rgba(0, 0, 0, 0.1);
132
+ white-space: nowrap;
133
+ pointer-events: none;
134
+ z-index: 0;
135
+ }
136
+
137
+ /* New Styles for FAQ */
138
+ .supportFAQ {
139
+ max-width: 900px;
140
+ margin: 2rem auto;
141
+ padding: 1rem;
142
+ background: #ffffff;
143
+ border-radius: 8px;
144
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
145
+ text-align: left;
146
+ }
147
+
148
+ .faqList {
149
+ list-style-type: none;
150
+ padding: 0;
151
+ font-size: 1rem;
152
+ color: #2c3e50;
153
+ }
154
+
155
+ .faqList li {
156
+ margin-bottom: 1rem;
157
+ }
158
+
159
+ /* Responsive Design */
160
+ @media (max-width: 768px) {
161
+ .supportTitle {
162
+ font-size: 2.5rem;
163
+ }
164
+
165
+ .supportDescription {
166
+ font-size: 1rem;
167
+ }
168
+
169
+ .supportCard {
170
+ padding: 1rem;
171
+ }
172
+
173
+ .supportCardTitle {
174
+ font-size: 1.25rem;
175
+ }
176
+
177
+ .supportCardContent {
178
+ font-size: 0.875rem;
179
+ }
180
+
181
+ .supportContainer::before {
182
+ font-size: 5rem;
183
+ bottom: 5%;
184
+ }
185
+ }
package/src/index.js ADDED
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import ReactDOM, { hydrateRoot } from "react-dom/client";
3
+ import App from "./App";
4
+ import { BrowserRouter } from "react-router-dom";
5
+
6
+ const container = document.getElementById("asggen");
7
+
8
+ // Create a root for React
9
+ const root = ReactDOM.createRoot(container);
10
+
11
+ if (process.env.NODE_ENV === "production") {
12
+ // Use `hydrateRoot` for production
13
+ hydrateRoot(
14
+ container,
15
+ <React.StrictMode>
16
+ <BrowserRouter>
17
+ <App />
18
+ </BrowserRouter>
19
+ </React.StrictMode>
20
+ );
21
+ } else {
22
+ root.render(
23
+ <React.StrictMode>
24
+ <BrowserRouter>
25
+ <App />
26
+ </BrowserRouter>
27
+ </React.StrictMode>
28
+ );
29
+ }
@@ -0,0 +1,110 @@
1
+ const htmlWebpackPlugin = require("html-webpack-plugin");
2
+ const MiniCssExtractPlugin = require("mini-css-extract-plugin");
3
+ const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
4
+ const TerserWebpackPlugin = require("terser-webpack-plugin");
5
+
6
+ const CopyWebpackPlugin = require("copy-webpack-plugin");
7
+ const path = require("path");
8
+ const crypto = require("crypto");
9
+
10
+ module.exports = {
11
+ mode: "production",
12
+ entry: "./src/Static/indexStatic.js",
13
+ output: {
14
+ filename: "static/js/[name]-[contenthash].js",
15
+ path: path.resolve(__dirname, "build-prod-static"),
16
+ clean: true,
17
+ },
18
+ module: {
19
+ rules: [
20
+ {
21
+ test: /\.js$/,
22
+ exclude: /node_modules/,
23
+ use: [
24
+ {
25
+ loader: "babel-loader",
26
+ options: {
27
+ configFile: path.resolve(__dirname, "./.babelrc"),
28
+ },
29
+ },
30
+ ],
31
+ },
32
+ {
33
+ test: /\.css$/,
34
+ use: [
35
+ MiniCssExtractPlugin.loader,
36
+ {
37
+ loader: "css-loader",
38
+ options: {
39
+ modules: {
40
+ localIdentName: "[local]",
41
+ },
42
+ sourceMap: true,
43
+ },
44
+ },
45
+ ],
46
+ },
47
+ {
48
+ test: /\.(png|jpe?g|gif|svg)$/,
49
+ type: "asset/resource",
50
+ generator: {
51
+ filename: "static/media/[contenthash][ext]",
52
+ },
53
+ },
54
+ {
55
+ test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/,
56
+ type: "asset/resource",
57
+ generator: {
58
+ filename: "static/media/[name][ext]",
59
+ },
60
+ },
61
+ ],
62
+ },
63
+ optimization: {
64
+ minimizer: [
65
+ new TerserWebpackPlugin({
66
+ terserOptions: {
67
+ format: {
68
+ comments: false, // Remove all comments
69
+ },
70
+ },
71
+ extractComments: false, // Do not extract comments to a separate file
72
+ }),
73
+ new CssMinimizerPlugin(),
74
+ ],
75
+ },
76
+ plugins: [
77
+ new htmlWebpackPlugin({
78
+ title: "AFront",
79
+ template: "./dev/index.html",
80
+ buildTag: `prod-[contenthash]`,
81
+ hash: true,
82
+ templateParameters: (compilation, options) => {
83
+ const hash = crypto.createHash("sha1");
84
+ hash.update(compilation.hash);
85
+ const sha1Hash = hash.digest("hex");
86
+ return {
87
+ htmlWebpackPlugin: {
88
+ options: {
89
+ title: "AFront",
90
+ buildTag: `prod-${sha1Hash}`,
91
+ },
92
+ },
93
+ };
94
+ },
95
+ }),
96
+ new MiniCssExtractPlugin({
97
+ filename: "static/css/[name]-[contenthash].css",
98
+ }),
99
+ new CopyWebpackPlugin({
100
+ patterns: [
101
+ { from: "dev/favicon.ico", to: "favicon.ico" }, // Copy favicon
102
+ { from: "dev/logo192.png", to: "logo192.png" }, // Copy logo192
103
+ { from: "dev/logo512.png", to: "logo512.png" }, // Copy logo512
104
+ { from: "dev/manifest.json", to: "manifest.json" }, // Copy manifest
105
+ { from: "dev/style.css", to: "style.css" },
106
+ { from: "dev/robots.txt", to: "robots.txt" },
107
+ ],
108
+ }),
109
+ ],
110
+ };
package/webpack.dev.js ADDED
@@ -0,0 +1,87 @@
1
+ const htmlWebpackPlugin = require("html-webpack-plugin");
2
+ const path = require("path");
3
+ const MiniCssExtractPlugin = require("mini-css-extract-plugin");
4
+ const TerserWebpackPlugin = require("terser-webpack-plugin");
5
+ const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
6
+
7
+ module.exports = {
8
+ mode: "development",
9
+ entry: "./src/index.js",
10
+ devServer: {
11
+ static: {
12
+ directory: path.join(__dirname, "dev"),
13
+ },
14
+ port: 9999,
15
+ open: true,
16
+ historyApiFallback: true,
17
+ },
18
+ output: {
19
+ filename: "[name].bundle.js",
20
+ path: `${__dirname}/dev`,
21
+ clean: true,
22
+ },
23
+ module: {
24
+ rules: [
25
+ {
26
+ test: /\.js$/,
27
+ exclude: /node_modules/,
28
+ use: [
29
+ {
30
+ loader: "babel-loader",
31
+ options: {
32
+ configFile: path.resolve(__dirname, "./.babelrc"),
33
+ },
34
+ },
35
+ ],
36
+ },
37
+ {
38
+ test: /\.module\.css$/,
39
+ use: [
40
+ MiniCssExtractPlugin.loader,
41
+ {
42
+ loader: "css-loader",
43
+ options: {
44
+ modules: {
45
+ localIdentName: "[local]",
46
+ },
47
+ },
48
+ },
49
+ ],
50
+ },
51
+ {
52
+ test: /\.css$/,
53
+ exclude: /\.module\.css$/,
54
+ use: [MiniCssExtractPlugin.loader, "css-loader"],
55
+ },
56
+ {
57
+ test: /\.(png|jpe?g|gif|svg)$/,
58
+ type: "asset/resource",
59
+ generator: {
60
+ filename: "static/media/[name][ext]",
61
+ },
62
+ },
63
+ {
64
+ test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/,
65
+ type: "asset/resource",
66
+ generator: {
67
+ filename: "static/media/[name][ext]",
68
+ },
69
+ },
70
+ ],
71
+ },
72
+ optimization: {
73
+ minimizer: [new TerserWebpackPlugin(), new CssMinimizerPlugin()],
74
+ },
75
+ resolve: {
76
+ extensions: [".js", ".jsx", ".ts", ".tsx"],
77
+ },
78
+ plugins: [
79
+ new MiniCssExtractPlugin({
80
+ filename: "static/css/[name].bundle.css",
81
+ }),
82
+ new htmlWebpackPlugin({
83
+ title: "AFront",
84
+ template: `${__dirname}/dev/index.html`,
85
+ }),
86
+ ],
87
+ };
@@ -0,0 +1,120 @@
1
+ const MiniCssExtractPlugin = require("mini-css-extract-plugin");
2
+ const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
3
+ const TerserWebpackPlugin = require("terser-webpack-plugin");
4
+ const CopyWebpackPlugin = require("copy-webpack-plugin");
5
+ const HtmlWebpackPlugin = require("html-webpack-plugin");
6
+ const path = require("path");
7
+ const crypto = require("crypto");
8
+
9
+ module.exports = {
10
+ mode: "production",
11
+ entry: "./src/index.js",
12
+ output: {
13
+ filename: "static/js/[name]-[contenthash].js",
14
+ path: path.resolve(__dirname, "build-prod"),
15
+ clean: true,
16
+ },
17
+ module: {
18
+ rules: [
19
+ {
20
+ test: /\.js$/,
21
+ exclude: /node_modules/,
22
+ use: {
23
+ loader: "babel-loader",
24
+ options: {
25
+ configFile: path.resolve(__dirname, "./.babelrc"),
26
+ },
27
+ },
28
+ },
29
+ {
30
+ test: /\.module\.css$/,
31
+ use: [
32
+ MiniCssExtractPlugin.loader,
33
+ {
34
+ loader: "css-loader",
35
+ options: {
36
+ modules: {
37
+ localIdentName: "[local]",
38
+ },
39
+ },
40
+ },
41
+ ],
42
+ },
43
+ {
44
+ test: /\.css$/,
45
+ exclude: /\.module\.css$/,
46
+ use: [MiniCssExtractPlugin.loader, "css-loader"],
47
+ },
48
+ {
49
+ test: /\.(png|jpe?g|gif|svg)$/,
50
+ type: "asset/resource",
51
+ generator: {
52
+ filename: "static/media/[contenthash][ext]",
53
+ },
54
+ },
55
+ {
56
+ test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/,
57
+ type: "asset/resource",
58
+ generator: {
59
+ filename: "static/media/[name][ext]",
60
+ },
61
+ },
62
+ ],
63
+ },
64
+ optimization: {
65
+ minimizer: [
66
+ new TerserWebpackPlugin({
67
+ terserOptions: {
68
+ format: {
69
+ comments: false,
70
+ },
71
+ },
72
+ extractComments: false,
73
+ }),
74
+ new CssMinimizerPlugin(),
75
+ ],
76
+ },
77
+ plugins: [
78
+ new HtmlWebpackPlugin({
79
+ title: "AFront",
80
+ template: "./dev/index.html",
81
+ buildTag: `prod-[contenthash]`,
82
+ hash: true,
83
+ minify: {
84
+ removeComments: true,
85
+ collapseWhitespace: true,
86
+ },
87
+ templateParameters: (compilation) => {
88
+ const hash = crypto.createHash("sha1");
89
+ hash.update(compilation.hash);
90
+ const sha1Hash = hash.digest("hex");
91
+ return {
92
+ htmlWebpackPlugin: {
93
+ options: {
94
+ title: "AFront",
95
+ buildTag: `prod-${sha1Hash}`,
96
+ },
97
+ },
98
+ };
99
+ },
100
+ }),
101
+ new MiniCssExtractPlugin({
102
+ filename: "static/css/[name]-[contenthash].css",
103
+ }),
104
+ new CopyWebpackPlugin({
105
+ patterns: [
106
+ { from: "dev/favicon.ico", to: "favicon.ico" },
107
+ { from: "dev/logo192.png", to: "logo192.png" },
108
+ { from: "dev/logo512.png", to: "logo512.png" },
109
+ { from: "dev/manifest.json", to: "manifest.json" },
110
+ { from: "dev/style.css", to: "style.css" },
111
+ { from: "dev/robots.txt", to: "robots.txt" },
112
+ ],
113
+ }),
114
+ ],
115
+ performance: {
116
+ hints: "warning",
117
+ maxEntrypointSize: 400000,
118
+ maxAssetSize: 400000,
119
+ },
120
+ };
@@ -0,0 +1,86 @@
1
+ const path = require("path");
2
+ const nodeExternals = require("webpack-node-externals");
3
+ const MiniCssExtractPlugin = require("mini-css-extract-plugin");
4
+ const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
5
+ const TerserWebpackPlugin = require("terser-webpack-plugin");
6
+
7
+ module.exports = {
8
+ mode: "production",
9
+ entry: "./Asggen SSR/index.js",
10
+ output: {
11
+ path: path.resolve(__dirname, "build-prod-ssr"),
12
+ filename: "ssr.prod.js",
13
+ clean: true,
14
+ libraryTarget: "commonjs2",
15
+ },
16
+ target: "node",
17
+ module: {
18
+ rules: [
19
+ {
20
+ test: /\.js$/,
21
+ exclude: /node_modules/,
22
+ use: {
23
+ loader: "babel-loader",
24
+ options: {
25
+ presets: ["@babel/preset-env", "@babel/preset-react"],
26
+ },
27
+ },
28
+ },
29
+ {
30
+ test: /\.module\.css$/,
31
+ use: [
32
+ MiniCssExtractPlugin.loader,
33
+ {
34
+ loader: "css-loader",
35
+ options: {
36
+ modules: {
37
+ localIdentName: "[local]",
38
+ },
39
+ },
40
+ },
41
+ ],
42
+ },
43
+ {
44
+ test: /\.css$/,
45
+ exclude: /\.module\.css$/,
46
+ use: [MiniCssExtractPlugin.loader, "css-loader"],
47
+ },
48
+ {
49
+ test: /\.(png|jpe?g|gif|svg)$/,
50
+ type: "asset/resource",
51
+ generator: {
52
+ filename: "static/media/[contenthash][ext]",
53
+ },
54
+ },
55
+ {
56
+ test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/,
57
+ type: "asset/resource",
58
+ generator: {
59
+ filename: "static/media/[name][ext]",
60
+ },
61
+ },
62
+ ],
63
+ },
64
+ optimization: {
65
+ minimizer: [
66
+ new TerserWebpackPlugin({
67
+ terserOptions: {
68
+ format: {
69
+ comments: false,
70
+ },
71
+ },
72
+ extractComments: false,
73
+ }),
74
+ new CssMinimizerPlugin(),
75
+ ],
76
+ },
77
+ plugins: [
78
+ new MiniCssExtractPlugin({
79
+ filename: "static/css/[name]-[contenthash].css",
80
+ }),
81
+ ],
82
+ resolve: {
83
+ extensions: [".js", ".jsx", ".ts", ".tsx"],
84
+ },
85
+ externals: [nodeExternals()],
86
+ };