forked from openmrs/openmrs-esm-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdefault-webpack-config.js
123 lines (115 loc) · 3.25 KB
/
default-webpack-config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
const SystemJSPublicPathWebpackPlugin = require("systemjs-webpack-interop/SystemJSPublicPathWebpackPlugin");
const { resolve, dirname, basename } = require("path");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const { DefinePlugin } = require("webpack");
const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");
const { StatsWriterPlugin } = require("webpack-stats-plugin");
const production = "production";
function getFrameworkVersion() {
try {
const { version } = require("@openmrs/esm-framework/package.json");
return `^${version}`;
} catch {
return "3.x";
}
}
function makeIdent(name) {
if (name.indexOf("/") !== -1) {
name = name.substr(name.indexOf("/"));
}
if (name.endsWith("-app")) {
name = name.substr(0, name.length - 4);
}
return name;
}
module.exports = (env, argv = {}) => {
const root = process.cwd();
const { name, peerDependencies, browser, main, types } = require(resolve(
root,
"package.json"
));
const mode = argv.mode || process.env.NODE_ENV || "development";
const filename = basename(browser || main);
const outDir = dirname(browser || main);
const srcFile = resolve(root, browser ? main : types);
const ident = makeIdent(name);
const frameworkVersion = getFrameworkVersion();
const cssLoader = {
loader: "css-loader",
options: {
modules: {
localIdentName: `${ident}__[name]__[local]___[hash:base64:5]`,
},
},
};
return {
entry: [srcFile],
output: {
filename,
libraryTarget: "system",
publicPath: "",
path: resolve(root, outDir),
},
target: "web",
module: {
rules: [
{
test: /\.m?(js|ts|tsx)$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: require.resolve("babel-loader"),
},
},
{
test: /\.css$/,
use: [require.resolve("style-loader"), cssLoader],
},
{
test: /\.s[ac]ss$/i,
use: [require.resolve("style-loader"), cssLoader, { loader: require.resolve("sass-loader") }],
},
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: require.resolve("file-loader"),
},
],
},
],
},
mode,
devtool: mode === production ? "source-map" : "inline-source-map",
devServer: {
headers: {
"Access-Control-Allow-Origin": "*",
},
},
performance: {
hints: mode === production && "warning",
},
externals: Object.keys(peerDependencies || {}),
plugins: [
new SystemJSPublicPathWebpackPlugin(),
new ForkTsCheckerWebpackPlugin(),
new CleanWebpackPlugin(),
new BundleAnalyzerPlugin({
analyzerMode: env && env.analyze ? "server" : "disabled",
}),
new DefinePlugin({
"process.env.FRAMEWORK_VERSION": JSON.stringify(frameworkVersion),
}),
new StatsWriterPlugin({
filename: `${filename}.buildmanifest.json`,
stats: {
all: false,
chunks: true,
},
}),
],
resolve: {
extensions: [".tsx", ".ts", ".jsx", ".js", ".scss"],
},
};
};