-
Notifications
You must be signed in to change notification settings - Fork 2
/
webpack.config.js
118 lines (115 loc) · 3.8 KB
/
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
/**
* Webpack@5 build configuration
* @author codejedi365
*/
// IMPORTS
const { resolve, dirname, basename } = require("path");
const { Z_DEFAULT_COMPRESSION, Z_BEST_SPEED } = require("constants");
const nodeExternals = require("webpack-node-externals");
const FileManagerPlugin = require("filemanager-webpack-plugin");
const thisModule = require("./package.json");
// CONSTANTS
const isProduction = process.env.NODE_ENV === "production";
const pkgDir = __dirname;
const entrypoint = resolve(pkgDir, "lib", "index.ts");
const outDir = (() => {
const dir = resolve(
__dirname,
/^\.{1,2}|\/$/.test(dirname(thisModule.main))
? "dist"
: dirname(thisModule.main)
);
if (dir.search(pkgDir)) {
// Prevent malicious cleaning of directories outside of project
throw new Error("WARNING: outDir points outside of project directory");
}
return dir;
})();
/**
* Dynamic configuration function
* @param env webpack environment object
* @returns Webpack configuration object
*/
function buildConfig() {
return {
entry: entrypoint,
output: {
clean: true,
path: outDir,
filename: basename(thisModule.main),
library: {
type: "commonjs"
}
},
plugins: [
new FileManagerPlugin({
runOnceInWatchMode: true,
events: {
onEnd: {
archive: [
{
// Bundle all Docs into a compressed tarball to be included in dist/
source: resolve(pkgDir, "docs"),
destination: resolve(outDir, "docs.tar.gz"),
format: "tar",
options: {
gzip: true,
gzipOptions: {
level: isProduction
? Z_DEFAULT_COMPRESSION
: Z_BEST_SPEED
}
}
}
],
copy: [
{
source: resolve(pkgDir, "lib", "globals.d.ts"),
destination: resolve(
outDir,
basename(thisModule.types)
)
}
]
}
}
})
],
module: {
rules: [
{
test: /(?<!\.test)\.(ts)$/i,
loader: "ts-loader",
options: {
onlyCompileBundledFiles: true
},
exclude: ["/node_modules/"]
}
]
},
optimization: {
// minimize & mangle the output files (TerserPlugin w/ webpack@v5)
minimize: isProduction,
// determine which exports are used by modules and removed unused ones
usedExports: true
},
resolve: {
extensions: [".ts", ".js", ".json"]
},
// ignore all modules in node_modules folder (ie. do not bundle runtime dependencies)
externals: [nodeExternals()],
externalsPresets: {
// ignore node built-in modules like path, fs, etc.
node: true
}
};
}
module.exports = (env) => {
const config = buildConfig(env);
if (isProduction) {
config.mode = "production";
} else {
config.mode = "development";
}
return config;
};