File: /var/www/html/wp-content/themes/Divi/includes/builder/frontend-builder/webpack/common.js
/* eslint-disable import/no-extraneous-dependencies, global-require */
const path = require('path');
const merge = require('webpack-merge');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const DirectoryNamedWebpackPlugin = require('directory-named-webpack-plugin');
const selectorPrefixer = require('postcss-prefix-selector');
module.exports = (development, customLoader = false) => {
const paths = {
root: path.join(__dirname, '../'),
build: path.join(__dirname, '../build/'),
};
const entry = {
bundle: path.join(paths.root, 'app/app.jsx'),
gutenberg: path.join(paths.root, 'gutenberg/controller.js'),
};
const gutenberg = require('./gutenberg.js')(paths, development);
const cssLoaders = options => [
// If a custom loader is provided, use that instead of 'style-loader'
customLoader || {
loader: 'style-loader',
options: {
sourceMap: development,
},
},
{
loader: 'css-loader',
options: {
url: false,
importLoaders: 2,
sourceMap: development,
},
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
sourceMap: development,
plugins: [
require('autoprefixer'),
selectorPrefixer({
prefix: '.et-db #et-boc',
// Exclude selectors which start with "html" or "body" or already contain the prefix.
exclude: [
/^html($|\s?)/,
/^body($|\s?)/,
/\.et-db #et-boc/,
/^:export/,
/^\.gutenberg__editor($|\s?)/,
],
}),
],
},
},
{
loader: 'sass-loader',
options,
},
];
return {
entry,
output: {
path: paths.build,
filename: '[name].js',
chunkFilename: development ? 'bundle.[name].js' : 'bundle.[name].[chunkhash:8].js',
library: ['ET_BUNDLES', '[name]'],
libraryTarget: 'window',
},
externals: merge(
gutenberg.externals,
{
jquery: 'jQuery',
underscore: '_',
react: 'React',
'react-dom': 'ReactDOM',
},
),
resolve: {
extensions: ['.js', '.jsx'],
alias: merge(
gutenberg.alias,
{
lodash$: path.resolve(paths.root, 'app/lib/lodash.js'),
lodash: path.resolve(paths.root, 'node_modules/lodash'),
'prop-types': path.resolve(paths.root, 'node_modules/prop-types'),
'performance-now': path.resolve(paths.root, 'node_modules/performance-now'),
'core-ui': path.resolve(paths.root, '../../../core/ui'),
gutenberg: path.resolve(paths.root, 'gutenberg'),
},
),
modules: [path.resolve(paths.root, 'node_modules')],
plugins: [
new DirectoryNamedWebpackPlugin(true),
],
},
module: {
rules: [
{
test: /\.jsx?$/,
exclude: new RegExp(`(node_modules|bower_components)(?!(\\${path.sep}file-type))`),
use: [
{
loader: 'babel-loader',
options: {
compact: false,
presets: [
[require('babel-preset-env'), {
modules: false,
targets: { browser: ['last 2 versions', '> 5%'] },
}],
require('babel-preset-react'),
],
plugins: [
development ? require('react-hot-loader/babel') : false,
require('babel-plugin-transform-object-rest-spread'),
require('babel-plugin-transform-class-properties'),
require('babel-plugin-syntax-dynamic-import'),
].filter(plugin => plugin !== false),
cacheDirectory: false,
},
},
],
},
{
// CSS loaders for our own code
test: /\.s?css$/i,
exclude: gutenberg.path,
use: cssLoaders({
sourceMap: development,
}),
},
{
// CSS loaders for gutenberg code
test: /\.s?css$/i,
include: gutenberg.path,
use: cssLoaders(gutenberg.sassLoaderOptions),
},
],
},
optimization: {
splitChunks: {
cacheGroups: {
// Enable this so create chunks including common code shared between different entry points, eg lodash
// commons: {
// name: 'commons',
// chunks: 'initial',
// minChunks: 2,
// },
vendors: false,
},
},
},
plugins: [
new CleanWebpackPlugin([
'build',
'bundle*.js',
'bundle*.map',
'assets/css/style.css',
], {
root: paths.root,
verbose: true,
}),
],
};
};