@eightshift/frontend-libs
Version:
A collection of useful frontend utility modules. powered by Eightshift
156 lines (138 loc) • 3.37 kB
JavaScript
/**
* Project Base overrides used in production and development build.
*
*/
import webpack from 'webpack';
import * as sass from 'sass';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import { WebpackManifestPlugin } from 'webpack-manifest-plugin';
import { convertDataToSass, readManifestJson } from './helpers.mjs';
import DependencyExtractionWebpackPlugin from '@wordpress/dependency-extraction-webpack-plugin';
export default (options) => {
// All Plugins used in production and development build.
const plugins = [];
// Provide variables to code build.
if (!options.overrides.includes('definePlugin')) {
plugins.push(
new webpack.DefinePlugin({
'process.env.VERSION': JSON.stringify(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)),
'typeof window': '"object"',
}),
);
}
// Output css from Js.
if (!options.overrides.includes('miniCssExtractPlugin')) {
plugins.push(
new MiniCssExtractPlugin({
filename: `${options.config.filesOutput}.css`,
}),
);
}
// Create manifest.json file.
if (!options.overrides.includes('webpackManifestPlugin')) {
plugins.push(new WebpackManifestPlugin());
}
// Enable export for all WordPress related packages
if (!options.overrides.includes('dependencyExtractionWebpackPlugin')) {
plugins.push(
new DependencyExtractionWebpackPlugin({
outputFormat: 'json',
}),
);
}
// All module used in production and development build.
const module = {
rules: [],
};
// Module for JS and JSX.
if (!options.overrides.includes('js')) {
module.rules.push({
test: /\.(js|jsx)$/,
exclude: /node_modules[\\/](?!@eightshift)/,
use: {
loader: 'swc-loader',
},
});
}
// Module for MJS.
if (!options.overrides.includes('mjs')) {
module.rules.push({
test: /\.m?js$/,
resolve: {
fullySpecified: false,
},
});
}
// Module for Scss and Css.
if (!options.overrides.includes('css')) {
module.rules.push({
test: /\.scss$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
},
{
loader: 'postcss-loader',
},
{
loader: 'sass-loader',
options: {
implementation: sass,
additionalData: (() => {
const manifest = readManifestJson(options.config.blocksManifestSettingsPath);
return convertDataToSass(manifest) + ' ' + convertDataToSass(manifest, 'config', 'global-config');
})(),
},
},
],
});
module.rules.push({
test: /\.css$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
},
{
loader: 'postcss-loader',
},
],
});
module.rules.push({
test: /\.css$/,
include: /node_modules/,
use: [
{
loader: 'css-loader',
},
],
});
module.rules.push({
test: /\.(woff2|ttf|otf)$/i,
type: 'asset/resource',
include: /node_modules\/@eightshift/,
});
}
// Module for Images.
if (!options.overrides.includes('images')) {
module.rules.push({
test: /\.(png|svg|jpg|jpeg|gif|ico|webp)$/i,
exclude: [/fonts/, /node_modules/],
type: 'asset/resource',
});
}
if (options.extraPlugins?.length) {
plugins.push(...options.extraPlugins);
}
const resolve = {
symlinks: false,
};
return {
plugins,
module,
resolve,
};
};