-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwebpack.config.mjs
More file actions
114 lines (107 loc) · 2.59 KB
/
webpack.config.mjs
File metadata and controls
114 lines (107 loc) · 2.59 KB
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
'use strict'
import * as fs from 'fs'
import CopyPlugin from 'copy-webpack-plugin'
import TerserPlugin from 'terser-webpack-plugin'
import { CleanWebpackPlugin } from 'clean-webpack-plugin'
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import ExtensionReloader from 'webpack-ext-reloader'
import { basePath, latestGitTag } from './scripts/utils.mjs'
function aliases () {
const aliases = {}
const appDirectory = basePath('src/app')
fs.readdirSync(appDirectory).forEach((directory) => {
aliases[directory] = basePath(`src/app/${directory}`)
})
return aliases
}
export default {
mode: 'development',
devtool: 'source-map',
experiments: {
topLevelAwait: true
},
entry: {
roids: [
basePath('src/entries/app.ts'),
basePath('src/assets/styles/app.scss')
],
worker: basePath('src/entries/worker.ts'),
content: basePath('src/entries/content.ts'),
},
output: {
filename: '[name].js',
path: basePath('dist')
},
resolve: {
alias: aliases(),
extensions: ['.tsx', '.ts', '.js']
},
cache: {
type: 'filesystem'
},
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader'
},
{
loader: 'ts-loader',
options: {
transpileOnly: false,
happyPackMode: false
}
}
]
},
{
test: /\.scss$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'sass-loader',
options: {
api: 'modern-compiler'
}
}
]
}
]
},
optimization: {
minimize: true,
usedExports: true,
minimizer: [new TerserPlugin({ extractComments: false, terserOptions: { keep_classnames: true } })]
},
plugins: [
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns: [
basePath('dist/**/*'),
`!${basePath('dist/.keep')}`
]
}),
new CopyPlugin({
patterns: [{
from: '.',
to: '.',
context: 'src/assets/static',
transform: (content, absoluteFilePath) => {
if (!absoluteFilePath.endsWith('manifest.json')) return content
const manifest = JSON.parse(content.toString())
manifest.version = latestGitTag()
return JSON.stringify(manifest, null, 2)
}
}]
}),
new MiniCssExtractPlugin({
filename: '[name].css'
}),
new ExtensionReloader({
manifest: basePath('src/assets/static/manifest.json')
})
]
}