Files
2025-11-17 18:45:35 +01:00

156 lines
3.9 KiB
JavaScript

const path = require("path");
const TerserPlugin = require('terser-webpack-plugin');
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
const webpack = require("webpack");
const CopyPlugin = require("copy-webpack-plugin");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
const JSEntryWebpackPlugin = require('./plugins/JSEntryWebpackPlugin.cjs');
const { buildVars } = require("./src/dev-utils/buildVars.cjs");
const isVisualizerEnabled = !!process.env.ENABLE_VISUALIZER;
const define = {};
buildVars.forEach(({ name, defaultValue }) => {
define[name] = JSON.stringify(process.env[name] || defaultValue);
});
const apiBaseUrl = "http://localhost:8000";
module.exports = {
mode: 'production',
entry: "./index.jsx",
// externals: {
// 'react': 'React',
// 'react-dom': 'ReactDOM',
// },
module: {
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
transpileOnly: true,
},
},
],
exclude: /node_modules/,
},
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: ["babel-loader"],
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
{
test: /\.svg$/i,
issuer: /\.[jt]sx?$/,
use: [
{
loader: '@svgr/webpack',
options: {
svgoConfig: {
svgo: false,
},
},
},
'url-loader'
]
},
{
test: /\.(pdf|jpg|png|gif|ico)$/,
use: [
{
loader: "url-loader",
},
],
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
loader: "file-loader",
},
{
test: /\.md$/,
use: 'raw-loader'
}
],
},
resolve: {
extensions: [".*", ".js", ".jsx", ".ts", ".tsx"],
alias: {
"lowcoder-sdk": path.resolve(__dirname, "../lowcoder/src/index.sdk"),
"@lowcoder-ee": path.resolve(__dirname, "../lowcoder/src"),
},
plugins: [new TsconfigPathsPlugin({
configFile: "../lowcoder/tsconfig.json"
})]
},
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: "https://sdk.lowcoder.cloud/",
filename: '[name].bundle.js',
clean: true,
},
plugins: [
new webpack.DefinePlugin({
...define,
REACT_APP_API_SERVICE_URL: JSON.stringify(apiBaseUrl),
REACT_APP_BUNDLE_TYPE: JSON.stringify("sdk"),
}),
new webpack.IgnorePlugin({
resourceRegExp: /.test.(ts|tsx)$/,
}),
new JSEntryWebpackPlugin({
path: path.resolve(__dirname, 'bundle'),
filename: 'bundle.js'
}),
// new CopyPlugin({
// patterns: [
// "./index.html",
// ],
// }),
new CopyPlugin({
patterns: [
"./index.html",
{
from: 'src/custom_component/*.html', // Path to source files
to: '[name][ext]', // Pattern for the output, '[name][ext]' will keep the original file name and extension
},
{
from: 'src/custom_component/index_custom_component_files', // Path to your folder
to: 'index_custom_component_files/', // Destination path in the dist folder
},
{
from: 'netlify.toml', // Path to your netlify.toml file
to: 'netlify.toml', // Destination filename in the dist folder
},
],
}),
isVisualizerEnabled && new BundleAnalyzerPlugin()
],
optimization: {
minimize: true,
minimizer: [new TerserPlugin({
// Your customization if any
})],
sideEffects: true,
splitChunks: {
chunks: 'all',
},
runtimeChunk: 'single',
},
devServer: {
static: {
directory: path.join(__dirname, "dist"),
},
},
};