UNPKG

4.75 kBJavaScriptView Raw
1/**
2 * Common webpack configuration
3 */
4const merge = require('webpack-merge');
5const MiniHtmlWebpackPlugin = require('mini-html-webpack-plugin');
6const WebpackBar = require('webpackbar');
7const MiniCssExtractPlugin = require('mini-css-extract-plugin');
8const webpack = require('webpack');
9const { fromCwd } = require('quickenv');
10
11const getHTMLTemplate = require('./helpers/getHTMLTemplate.js');
12const loaders = require('./helpers/loaders.js');
13const {
14 isOfModuleType,
15 transpileIgnoreBaseCondition,
16} = require('./helpers/depTranspiling.js');
17const {
18 DEBUG_LVL,
19 IS_POS,
20 IS_BROWSER,
21 IS_DEV,
22 IS_PROD,
23 NODE_ENV,
24 APP_ENV,
25 ADD_MAMBA_SIMULATOR,
26} = require('./helpers/consts.js');
27
28module.exports = {
29 mode: IS_PROD ? 'production' : 'development',
30 cache: true,
31 target: 'web',
32 node: false,
33 context: fromCwd('src'),
34 output: {
35 path: fromCwd('dist'),
36 publicPath: './',
37 filename: '[name].[hash:5].js',
38 chunkFilename: '[name].[hash:5].js',
39 },
40 resolve: {
41 /** Do not resolve symlinks */
42 symlinks: false,
43 enforceExtension: false,
44 mainFields: ['svelte', 'esnext', 'jsnext:main', 'module', 'main'],
45 extensions: ['.js', '.json', '.pcss', '.css', '.html', '.htmlx', '.svelte'],
46 },
47 module: {
48 rules: [
49 /**
50 * ! App modules
51 * */
52 {
53 test: /\.(htmlx?|svelte)$/,
54 include: [fromCwd('src')],
55 exclude: [/node_modules/],
56 use: [loaders.babelEsNext, loaders.svelte, loaders.eslint],
57 },
58 {
59 test: /\.js$/,
60 include: [fromCwd('src')],
61 exclude: [/node_modules/],
62 use: [loaders.babelEsNext, loaders.eslint],
63 },
64 /**
65 * ! Dependency modules
66 * */
67 /** On dependencies svelte files, run svelte compiler and babel */
68 {
69 test: /\.(htmlx?|svelte)$/,
70 include: [/node_modules/],
71 /** When developing, parse linked packages svelte dependencies */
72 use: [loaders.babelEsNext, loaders.svelte],
73 },
74 /** Transpile .mjs dependencies as well */
75 {
76 test: /\.mjs$/,
77 include: [/node_modules/],
78 exclude: [/core-js/],
79 use: [loaders.babelEsNext],
80 },
81 /**
82 * * Run app COMMONJS dependencies through babel with module: 'commonjs'.
83 * @babel/preset-env inserts es6 import if we don't pass "module: 'commonjs'",
84 * resulting in mixed es6 and commonjs code.
85 * */
86 {
87 test: {
88 ...transpileIgnoreBaseCondition,
89 and: [isOfModuleType('cjs')],
90 },
91 use: [loaders.babelCJS],
92 },
93 /** Run app ES6 dependencies through babel with { modules: false } */
94 {
95 test: {
96 ...transpileIgnoreBaseCondition,
97 and: [isOfModuleType('es')],
98 },
99 use: [loaders.babelEsNext],
100 },
101 /**
102 * ! Generic files
103 */
104 {
105 test: /\.(css|pcss)$/,
106 /** When importing from a style file, let's
107 * use package.json's 'style' field before
108 * the actual 'main' one
109 * */
110 resolve: { mainFields: ['style', 'main'] },
111 use: [
112 loaders.extractCss,
113 loaders.css,
114 loaders.postcss,
115 loaders.resolveUrl,
116 ],
117 },
118 ],
119 },
120 plugins: [
121 new WebpackBar(),
122 new MiniCssExtractPlugin({
123 filename: 'style.css',
124 chunkFilename: '[name].[hash:5].css',
125 }),
126 new MiniHtmlWebpackPlugin({
127 context: { title: 'Application' },
128 template: getHTMLTemplate,
129 }),
130 new webpack.DefinePlugin(
131 // eslint-disable-next-line
132 merge(require('@mamba/configs/helpers/clientEnvironment.js'), {
133 __NODE_ENV__: JSON.stringify(NODE_ENV),
134 __APP_ENV__: JSON.stringify(APP_ENV),
135 __PROD__: IS_PROD,
136 __TEST__: NODE_ENV === 'test',
137 __DEV__: IS_DEV,
138 __DEBUG_LVL__: DEBUG_LVL,
139 __POS__: IS_POS,
140 __SIMULATOR__: ADD_MAMBA_SIMULATOR,
141 __BROWSER__: IS_BROWSER,
142 }),
143 ),
144 ],
145 /** Minimal useful output log */
146 stats: {
147 modules: false,
148 chunks: false,
149 colors: true,
150 children: false,
151 env: true,
152 },
153 optimization: {
154 namedChunks: true,
155 namedModules: true,
156 /** Create a separate chunk for webpack runtime */
157 runtimeChunk: { name: 'runtime' },
158 splitChunks: {
159 chunks: 'all',
160 minSize: 0,
161 minChunks: 1,
162 automaticNameDelimiter: '_',
163 cacheGroups: {
164 vendors: false,
165 libs: {
166 test: /[\\/]node_modules[\\/]/,
167 priority: -10,
168 },
169 /** Chunk that contains used polyfills */
170 polyfills: {
171 test: /core-js/,
172 name: 'polyfills',
173 priority: 10,
174 },
175 },
176 },
177 },
178};