-
Notifications
You must be signed in to change notification settings - Fork 19
/
webpack.config.ts
81 lines (76 loc) · 2.07 KB
/
webpack.config.ts
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
// webpack.config.ts
import path from 'path';
import type { Configuration } from 'webpack';
import { CustomizeRule, mergeWithRules } from 'webpack-merge';
import { getPluginJson } from './.config/webpack/utils';
import grafanaConfig from './.config/webpack/webpack.config';
const config = async (env): Promise<Configuration> => {
const pluginJson = getPluginJson();
const baseConfig = await grafanaConfig(env);
const customConfig = {
module: {
rules: [
{
exclude: /(node_modules)/,
test: /\.[tj]sx?$/,
resourceQuery: { not: [/raw/] },
use: {
loader: 'swc-loader',
options: {
jsc: {
baseUrl: path.join(__dirname, './src'),
target: 'es2015',
loose: false,
parser: {
syntax: 'typescript',
tsx: true,
decorators: false,
dynamicImport: true,
},
},
},
},
},
{
resourceQuery: /raw/,
type: 'asset/source',
},
],
},
};
const res = mergeWithRules({
module: {
rules: {
test: CustomizeRule.Match,
use: {
loader: CustomizeRule.Match,
options: CustomizeRule.Replace,
},
},
},
})(customConfig, baseConfig, {
output: {
asyncChunks: true,
publicPath: `public/plugins/${pluginJson.id}/`,
chunkFilename: (pathData) => {
const { chunk } = pathData;
const { id, contentHash } = chunk;
return `${id}.${contentHash.javascript}.js`;
},
uniqueName: pluginJson.id,
},
optimization: {
chunkIds: 'named',
splitChunks: {
cacheGroups: {
// bundle vendors with lazy module when possible
// Grafana's cache busting strategy means splitting out vendor chunks does nothing
defaultVendors: false,
},
},
},
});
return res;
};
// eslint-disable-next-line no-restricted-syntax
export default config;