@berun/runner-webpack
Version:
Webpack runner for building React web applications
66 lines (61 loc) • 1.79 kB
text/typescript
import * as ModuleScopePlugin from 'react-dev-utils/ModuleScopePlugin'
import * as PnpWebpackPlugin from 'pnp-webpack-plugin'
import * as path from 'path'
import Berun from '@berun/berun'
// Hack to use a class instead of an object
// Prevents webpack-chain 'Cannot redefine property: __pluginArgs' error
// Just use this class instead of PnpWebpackPlugin
class PnpWebpackPluginClass {
apply(compiler) {
return PnpWebpackPlugin.apply(compiler)
}
}
class PnpWebpackPluginClassModuleLoader {
apply(compiler) {
return PnpWebpackPlugin.moduleLoader.apply(compiler, module)
}
}
/**
* Add resolve webpack configuration including
* module scope and pnp plugins
*/
export default (berun: Berun, _) => {
berun.webpack.resolve.modules
.add('node_modules')
.merge(process.env.NODE_PATH!.split(path.delimiter).filter(Boolean))
.end()
.extensions.merge([
'.ts',
'.tsx',
'.web.js',
'.mjs',
'.js',
'.json',
'.web.jsx',
'.jsx'
])
.end()
.alias.set(
'@babel/runtime',
path.dirname(require.resolve('@babel/runtime/package.json'))
)
.end()
.alias.set('react-native', 'react-native-web')
.end()
.plugin('ModuleScope')
.use(ModuleScopePlugin, [
berun.options.paths.appSrc,
[berun.options.paths.appPackageJson]
])
.end()
.plugin('pnp1')
// Adds support for installing with Plug'n'Play, leading to faster installs and adding
// guards against forgotten dependencies and such.
.use(PnpWebpackPluginClass)
.end()
berun.webpack.resolveLoader
.plugin('pnp-resolve')
// Also related to Plug'n'Play, but this time it tells Webpack to load its loaders
// from the current package.
.use(PnpWebpackPluginClassModuleLoader)
}