-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.config.js
executable file
·123 lines (119 loc) · 4.67 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
119
120
121
122
123
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const { AureliaPlugin, ModuleDependenciesPlugin } = require("aurelia-webpack-plugin");
const { optimize: { CommonsChunkPlugin }, ProvidePlugin } = require("webpack")
const { TsConfigPathsPlugin, CheckerPlugin } = require("awesome-typescript-loader");
// config helpers:
const ensureArray = (config) => config && (Array.isArray(config) ? config : [config]) || []
const when = (condition, config, negativeConfig) =>
condition ? ensureArray(config) : ensureArray(negativeConfig)
// primary config:
const title = "PriceWise";
const outDir = path.resolve(__dirname, "dist");
const srcDir = path.resolve(__dirname, "src");
const nodeModulesDir = path.resolve(__dirname, "node_modules");
const baseUrl = "/";
const cssRules = [
{ loader: "css-loader" },
{
loader: "postcss-loader",
options: { plugins: () => [require("autoprefixer")({ browsers: ["last 2 versions"] })]}
}
]
module.exports = ({production, server, extractCss, coverage} = {}) => ({
resolve: {
extensions: [".ts", ".js"],
modules: [srcDir, "node_modules"],
},
entry: {
app: ["aurelia-bootstrapper"],
vendor: ["bluebird"],
},
output: {
path: outDir,
publicPath: baseUrl,
filename: production ? "[name].[chunkhash].bundle.js" : "[name].[hash].bundle.js",
sourceMapFilename: production ? "[name].[chunkhash].bundle.map" : "[name].[hash].bundle.map",
chunkFilename: production ? "[chunkhash].chunk.js" : "[hash].chunk.js",
},
devServer: {
contentBase: baseUrl,
historyApiFallback: true,
},
module: {
rules: [
// CSS required in JS/TS files should use the style-loader that auto-injects it into the website
// only when the issuer is a .js/.ts file, so the loaders are not applied inside html templates
{
test: /\.css$/i,
issuer: [{ not: [{ test: /\.html$/i }] }],
use: extractCss ? ExtractTextPlugin.extract({
fallback: "style-loader",
use: cssRules,
}) : ["style-loader", ...cssRules],
},
{
test: /\.css$/i,
issuer: [{ test: /\.html$/i }],
// CSS required in templates cannot be extracted safely
// because Aurelia would try to require it again in runtime
use: cssRules,
},
{ test: /\.html$/i, loader: "html-loader" },
{ test: /\.ts$/i, loader: "awesome-typescript-loader", exclude: nodeModulesDir },
{ test: /\.json$/i, loader: "json-loader" },
// use Bluebird as the global Promise implementation:
{ test: /[\/\\]node_modules[\/\\]bluebird[\/\\].+\.js$/, loader: "expose-loader?Promise" },
// exposes jQuery globally as $ and as jQuery:
{ test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" },
// embed small images and fonts as Data Urls and larger ones as files:
{ test: /\.(png|gif|jpg|cur)$/i, loader: "url-loader", options: { limit: 8192 } },
{ test: /\.(png|gif|jpg|cur)$/i, loader: "file-loader", options: { name: "./images/[name].[ext]" } },
{ test: /\.woff2(\?v=[0-9]\.[0-9]\.[0-9])?$/i, loader: "url-loader", options: { limit: 10000, mimetype: "application/font-woff2" } },
{ test: /\.woff(\?v=[0-9]\.[0-9]\.[0-9])?$/i, loader: "url-loader", options: { limit: 10000, mimetype: "application/font-woff" } },
// load these fonts normally, as files:
{ test: /\.(ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/i, loader: "file-loader" }
]
},
plugins: [
new AureliaPlugin(),
new ModuleDependenciesPlugin({
"aurelia-chart": [ "./elements/chart-element", "./attributes/chart-attribute" ],
"parent-module": [ "child-module" ]
}),
new ProvidePlugin({
"Promise": "bluebird",
"$": "jquery",
"jQuery": "jquery",
"window.jQuery": "jquery",
}),
new TsConfigPathsPlugin(),
new CheckerPlugin(),
new HtmlWebpackPlugin({
template: "index.ejs",
minify: production ? {
removeComments: true,
collapseWhitespace: true
} : undefined,
metadata: {
// available in index.ejs //
title, server, baseUrl
},
}),
new CopyWebpackPlugin([
{ from: "static", to: "" },
{ from: "src/shared/assets/locales", to: "shared/assets/locales" },
{ from: "src/shared/assets/images", to: "images" },
{ from: "web.config" }
]),
...when(extractCss, new ExtractTextPlugin({
filename: production ? "[contenthash].css" : "[id].css",
allChunks: true,
})),
...when(production, new CommonsChunkPlugin({
name: ["common"]
}))
],
})