UNPKG

3.58 kBPlain TextView Raw
1import Berun from '@berun/berun'
2
3// FIX-DEPENDENCIES
4require.resolve('babel-loader')
5require.resolve('@svgr/webpack')
6require.resolve('url-loader')
7require.resolve('file-loader')
8
9/**
10 * Disable require.ensure as it's not a standard language feature.
11 */
12export const ruleParser = (berun: Berun, _) => {
13 berun.webpack.module
14 .rule('parser')
15 .parser({ requireEnsure: false })
16 .end()
17}
18
19/**
20 * `mjs` support is still in its infancy in the ecosystem, so we don't
21 * support it.
22 * Modules who define their `browser` or `module` key as `mjs` force
23 * the use of this extension, so we need to tell webpack to fall back
24 * to auto mode (ES Module interop, allows ESM to import CommonJS).
25 */
26export const ruleMjs = (berun: Berun, _) => {
27 berun.webpack.module
28 .rule('mjs')
29 .test([/\.mjs$/])
30 .include.add(/node_modules/)
31 .end()
32 .type('javascript/auto')
33 .use('babel')
34 .loader(require.resolve('babel-loader'))
35 .options({
36 babelrc: false,
37 configFile: false,
38 compact: false,
39 presets: [
40 require.resolve('@berun/babel-preset-react-app/dist/dependencies')
41 ],
42 cacheDirectory: true,
43 cacheCompression: process.env.NODE_ENV === 'production',
44 highlightCode: true,
45 sourceMaps: false
46 })
47}
48
49/**
50 * "url" loader works like "file" loader except that it embeds assets
51 * smaller than specified limit in bytes as data URLs to avoid requests.
52 * A missing `test` is equivalent to a match.
53 */
54export const ruleMainImage = (berun: Berun, _) => {
55 berun.webpack.module
56 .rule('main')
57 .oneOf('image')
58 .test([/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/])
59 .exclude.add(/node_modules/)
60 .end()
61 .use('url-loader')
62 .loader(require.resolve('url-loader'))
63 .options({ limit: 10000, name: 'static/media/[name].[hash:8].[ext]' })
64}
65
66/**
67 * Process application JS with Babel.
68 * The preset includes JSX, Flow, and some ESnext features.
69 */
70export const ruleMainCompile = (berun: Berun, _) => {
71 berun.webpack.module
72 .rule('main')
73 .oneOf('compile')
74 .test(/\.(js|jsx|ts|tsx)$/)
75 .include.merge([berun.options.paths.workspace])
76 .end()
77 .exclude.add(/node_modules/)
78 .end()
79 .use('babel')
80 .loader(require.resolve('babel-loader'))
81 .options({
82 /* placeholder */
83 })
84}
85
86/**
87 * "file" loader makes sure those assets get served by WebpackDevServer.
88 * When you `import` an asset, you get its (virtual) filename.
89 * In production, they would get copied to the `build` folder.
90 * This loader doesn't use a "test" so it will catch all modules
91 * that fall through the other loaders.
92 */
93export const ruleMainStatic = (berun: Berun, _) => {
94 berun.webpack.module
95 .rule('main')
96 .oneOf('static')
97 // Exclude `js` files to keep "css" loader working as it injects
98 // its runtime that would otherwise be processed through "file" loader.
99 // Also exclude `html` and `json` extensions so they get processed
100 // by webpacks internal loaders.
101 .exclude.add(/\.(css|scss|sass|js|jsx|mjs|ts|tsx)$/)
102 .add(/\.ejs$/)
103 .add(/\.html$/)
104 .add(/\.json$/)
105 .add(/node_modules/)
106 .end()
107 .use('file')
108 .loader(require.resolve('file-loader'))
109 .options({
110 name: 'static/media/[name].[hash:8].[ext]'
111 })
112}
113
114export const ruleMainSvg = (berun: Berun, _) => {
115 berun.webpack.module
116 .rule('main')
117 .oneOf('svg')
118 .test(/\.svg$/)
119 .exclude.add(/node_modules/)
120 .end()
121 .use('svgr')
122 .loader(require.resolve('@svgr/webpack'))
123 .end()
124 .use('svgr')
125 .loader(require.resolve('url-loader'))
126}