2018-10-30 18:57:48 +00:00
|
|
|
|
/**
|
|
|
|
|
* External dependencies
|
|
|
|
|
*/
|
2018-11-06 21:53:22 +00:00
|
|
|
|
const { get } = require( 'lodash' );
|
|
|
|
|
const path = require( 'path' );
|
2018-11-15 18:16:23 +00:00
|
|
|
|
const CopyWebpackPlugin = require( 'copy-webpack-plugin' );
|
2021-08-19 14:15:59 +00:00
|
|
|
|
const CustomTemplatedPathPlugin = require( '@wordpress/custom-templated-path-webpack-plugin' );
|
2020-04-29 18:01:27 +00:00
|
|
|
|
const BundleAnalyzerPlugin = require( 'webpack-bundle-analyzer' )
|
|
|
|
|
.BundleAnalyzerPlugin;
|
|
|
|
|
const MomentTimezoneDataPlugin = require( 'moment-timezone-data-webpack-plugin' );
|
2022-04-21 05:18:24 +00:00
|
|
|
|
const ForkTsCheckerWebpackPlugin = require( 'fork-ts-checker-webpack-plugin' );
|
2018-11-06 21:53:22 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2021-08-19 14:15:59 +00:00
|
|
|
|
* Internal dependencies
|
2018-11-06 21:53:22 +00:00
|
|
|
|
*/
|
2021-08-19 14:15:59 +00:00
|
|
|
|
const AsyncChunkSrcVersionParameterPlugin = require( './chunk-src-version-param' );
|
|
|
|
|
const UnminifyWebpackPlugin = require( './unminify' );
|
|
|
|
|
const { webpackConfig: styleConfig } = require( '@woocommerce/style-build' );
|
2022-03-18 21:53:19 +00:00
|
|
|
|
const WooCommerceDependencyExtractionWebpackPlugin = require( '../../packages/js/dependency-extraction-webpack-plugin/src/index' );
|
2018-11-06 21:53:22 +00:00
|
|
|
|
|
2018-07-23 20:14:40 +00:00
|
|
|
|
const NODE_ENV = process.env.NODE_ENV || 'development';
|
2020-06-22 12:38:17 +00:00
|
|
|
|
const WC_ADMIN_PHASE = process.env.WC_ADMIN_PHASE || 'development';
|
2018-04-17 21:38:56 +00:00
|
|
|
|
|
2018-11-15 18:16:23 +00:00
|
|
|
|
const wcAdminPackages = [
|
|
|
|
|
'components',
|
|
|
|
|
'csv-export',
|
|
|
|
|
'currency',
|
2020-10-30 06:52:52 +00:00
|
|
|
|
'customer-effort-score',
|
2018-11-15 18:16:23 +00:00
|
|
|
|
'date',
|
2021-04-16 03:34:15 +00:00
|
|
|
|
'experimental',
|
|
|
|
|
'explat',
|
2018-11-15 18:16:23 +00:00
|
|
|
|
'navigation',
|
2020-11-09 07:17:08 +00:00
|
|
|
|
'notices',
|
2019-01-29 16:48:46 +00:00
|
|
|
|
'number',
|
2020-03-25 03:20:17 +00:00
|
|
|
|
'data',
|
2020-08-20 04:59:52 +00:00
|
|
|
|
'tracks',
|
2021-05-28 23:26:38 +00:00
|
|
|
|
'onboarding',
|
2018-11-15 18:16:23 +00:00
|
|
|
|
];
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// wpAdminScripts are loaded on wp-admin pages outside the context of WooCommerce Admin
|
|
|
|
|
// See ./client/wp-admin-scripts/README.md for more details
|
2019-10-21 18:13:25 +00:00
|
|
|
|
const wpAdminScripts = [
|
2020-06-16 02:30:41 +00:00
|
|
|
|
'marketing-coupons',
|
2020-12-16 14:08:14 +00:00
|
|
|
|
'navigation-opt-out',
|
2019-10-21 18:13:25 +00:00
|
|
|
|
'onboarding-homepage-notice',
|
2019-11-12 01:17:36 +00:00
|
|
|
|
'onboarding-product-notice',
|
2019-12-10 19:28:19 +00:00
|
|
|
|
'onboarding-product-import-notice',
|
2019-11-07 00:17:46 +00:00
|
|
|
|
'onboarding-tax-notice',
|
2020-03-27 20:42:58 +00:00
|
|
|
|
'print-shipping-label-banner',
|
2021-01-13 19:43:45 +00:00
|
|
|
|
'beta-features-tracking-modal',
|
2021-09-09 12:25:13 +00:00
|
|
|
|
'payment-method-promotions',
|
2022-04-29 04:06:05 +00:00
|
|
|
|
'onboarding-load-sample-products-notice',
|
2019-10-21 18:13:25 +00:00
|
|
|
|
];
|
2022-04-12 07:29:50 +00:00
|
|
|
|
const getEntryPoints = () => {
|
|
|
|
|
const entryPoints = {
|
|
|
|
|
app: './client/index.js',
|
|
|
|
|
};
|
|
|
|
|
wcAdminPackages.forEach( ( name ) => {
|
|
|
|
|
entryPoints[ name ] = `../../packages/js/${ name }`;
|
|
|
|
|
} );
|
|
|
|
|
wpAdminScripts.forEach( ( name ) => {
|
|
|
|
|
entryPoints[ name ] = `./client/wp-admin-scripts/${ name }`;
|
|
|
|
|
} );
|
|
|
|
|
return entryPoints;
|
|
|
|
|
};
|
2019-10-21 18:13:25 +00:00
|
|
|
|
|
2022-04-15 04:08:59 +00:00
|
|
|
|
// WordPress.org’s translation infrastructure ignores files named “.min.js” so we need to name our JS files without min when releasing the plugin.
|
2022-04-12 07:29:50 +00:00
|
|
|
|
const outputSuffix = WC_ADMIN_PHASE === 'core' ? '' : '.min';
|
2020-09-15 15:36:58 +00:00
|
|
|
|
|
2018-04-17 21:38:56 +00:00
|
|
|
|
const webpackConfig = {
|
|
|
|
|
mode: NODE_ENV,
|
2022-04-12 07:29:50 +00:00
|
|
|
|
entry: getEntryPoints(),
|
2018-04-17 21:38:56 +00:00
|
|
|
|
output: {
|
2019-10-21 18:13:25 +00:00
|
|
|
|
filename: ( data ) => {
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Output wpAdminScripts to wp-admin-scripts folder
|
|
|
|
|
// See https://github.com/woocommerce/woocommerce-admin/pull/3061
|
2020-02-14 02:23:21 +00:00
|
|
|
|
return wpAdminScripts.includes( data.chunk.name )
|
2022-04-12 07:29:50 +00:00
|
|
|
|
? `wp-admin-scripts/[name]${ outputSuffix }.js`
|
|
|
|
|
: `[name]/index${ outputSuffix }.js`;
|
2019-10-21 18:13:25 +00:00
|
|
|
|
},
|
2022-04-12 07:29:50 +00:00
|
|
|
|
chunkFilename: `chunks/[name]${ outputSuffix }.js`,
|
2022-03-18 21:53:19 +00:00
|
|
|
|
path: path.join( __dirname, '/../woocommerce/assets/client/admin' ),
|
2022-04-12 07:29:50 +00:00
|
|
|
|
library: {
|
|
|
|
|
// Expose the exports of entry points so we can consume the libraries in window.wc.[modulename] with WooCommerceDependencyExtractionWebpackPlugin.
|
|
|
|
|
name: [ 'wc', '[modulename]' ],
|
|
|
|
|
type: 'window',
|
|
|
|
|
},
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals.
|
2022-03-18 10:59:05 +00:00
|
|
|
|
uniqueName: '__wcAdmin_webpackJsonp',
|
2018-04-17 21:38:56 +00:00
|
|
|
|
},
|
|
|
|
|
module: {
|
|
|
|
|
rules: [
|
2018-12-06 22:08:40 +00:00
|
|
|
|
{
|
2022-04-12 07:29:50 +00:00
|
|
|
|
test: /\.(t|j)sx?$/,
|
2018-12-06 22:08:40 +00:00
|
|
|
|
parser: {
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Disable AMD to fix an issue where underscore and lodash where clashing
|
|
|
|
|
// See https://github.com/woocommerce/woocommerce-admin/pull/1004 and https://github.com/Automattic/woocommerce-services/pull/1522
|
2018-12-06 22:08:40 +00:00
|
|
|
|
amd: false,
|
|
|
|
|
},
|
2022-02-21 02:34:25 +00:00
|
|
|
|
exclude: [
|
2022-04-12 07:29:50 +00:00
|
|
|
|
// Exclude node_modules/.pnpm but not node_modules/.pnpm/debug*
|
|
|
|
|
/node_modules(\/|\\)\.pnpm(\/|\\)(?!(debug))/,
|
2022-02-21 02:34:25 +00:00
|
|
|
|
],
|
2018-12-26 02:46:32 +00:00
|
|
|
|
use: {
|
|
|
|
|
loader: 'babel-loader',
|
|
|
|
|
options: {
|
2021-02-24 01:24:22 +00:00
|
|
|
|
presets: [
|
|
|
|
|
'@wordpress/babel-preset-default',
|
|
|
|
|
[
|
|
|
|
|
'@babel/preset-env',
|
|
|
|
|
{
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Add polyfills such as Array.flat based on their usage in the code
|
|
|
|
|
// See https://github.com/woocommerce/woocommerce-admin/pull/6411/
|
2021-02-24 01:24:22 +00:00
|
|
|
|
corejs: '3',
|
|
|
|
|
useBuiltIns: 'usage',
|
|
|
|
|
},
|
|
|
|
|
],
|
2021-03-01 03:01:22 +00:00
|
|
|
|
[ '@babel/preset-typescript' ],
|
2021-02-24 01:24:22 +00:00
|
|
|
|
],
|
2018-12-26 02:46:32 +00:00
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2018-09-24 15:36:35 +00:00
|
|
|
|
{ test: /\.md$/, use: 'raw-loader' },
|
2019-05-28 14:05:55 +00:00
|
|
|
|
{
|
|
|
|
|
test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)$/,
|
|
|
|
|
loader: 'url-loader',
|
|
|
|
|
},
|
2021-08-19 14:15:59 +00:00
|
|
|
|
...styleConfig.rules,
|
2018-04-17 21:38:56 +00:00
|
|
|
|
],
|
|
|
|
|
},
|
2018-05-10 16:35:46 +00:00
|
|
|
|
resolve: {
|
2022-04-12 06:47:03 +00:00
|
|
|
|
fallback: {
|
|
|
|
|
// Reduce bundle size by omitting Node crypto library.
|
|
|
|
|
// See https://github.com/woocommerce/woocommerce-admin/pull/5768
|
|
|
|
|
crypto: 'empty',
|
2022-03-18 10:59:05 +00:00
|
|
|
|
},
|
2021-03-01 03:01:22 +00:00
|
|
|
|
extensions: [ '.json', '.js', '.jsx', '.ts', '.tsx' ],
|
2018-07-20 03:40:15 +00:00
|
|
|
|
alias: {
|
2021-03-10 15:11:37 +00:00
|
|
|
|
'~': path.resolve( __dirname + '/client' ),
|
2018-07-20 03:40:15 +00:00
|
|
|
|
},
|
2018-05-10 16:35:46 +00:00
|
|
|
|
},
|
2018-10-30 18:57:48 +00:00
|
|
|
|
plugins: [
|
2021-08-19 14:15:59 +00:00
|
|
|
|
...styleConfig.plugins,
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Runs TypeScript type checker on a separate process.
|
2022-04-27 21:54:54 +00:00
|
|
|
|
! process.env.STORYBOOK && new ForkTsCheckerWebpackPlugin(),
|
2018-11-06 21:53:22 +00:00
|
|
|
|
new CustomTemplatedPathPlugin( {
|
|
|
|
|
modulename( outputPath, data ) {
|
|
|
|
|
const entryName = get( data, [ 'chunk', 'name' ] );
|
|
|
|
|
if ( entryName ) {
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Convert the dash-case name to a camel case module name.
|
|
|
|
|
// For example, 'csv-export' -> 'csvExport'
|
2020-02-14 02:23:21 +00:00
|
|
|
|
return entryName.replace( /-([a-z])/g, ( match, letter ) =>
|
|
|
|
|
letter.toUpperCase()
|
|
|
|
|
);
|
2018-11-06 21:53:22 +00:00
|
|
|
|
}
|
|
|
|
|
return outputPath;
|
|
|
|
|
},
|
|
|
|
|
} ),
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// The package build process doesn't handle extracting CSS from JS files, so we copy them separately.
|
|
|
|
|
new CopyWebpackPlugin( {
|
2022-03-18 10:59:05 +00:00
|
|
|
|
patterns: wcAdminPackages.map( ( packageName ) => ( {
|
2022-03-18 21:53:19 +00:00
|
|
|
|
from: `../../packages/js/${ packageName }/build-style/*.css`,
|
2022-03-18 10:59:05 +00:00
|
|
|
|
to: `./${ packageName }/[name][ext]`,
|
2022-04-12 06:47:03 +00:00
|
|
|
|
noErrorOnMissing: true,
|
|
|
|
|
} ) ),
|
|
|
|
|
} ),
|
2021-06-02 03:54:00 +00:00
|
|
|
|
|
|
|
|
|
// We reuse this Webpack setup for Storybook, where we need to disable dependency extraction.
|
|
|
|
|
! process.env.STORYBOOK &&
|
2022-04-28 09:22:27 +00:00
|
|
|
|
new WooCommerceDependencyExtractionWebpackPlugin( {
|
|
|
|
|
requestToExternal( request ) {
|
|
|
|
|
if ( request === '@wordpress/components/build/ui' ) {
|
|
|
|
|
// The external wp.components does not include ui components, so we need to skip requesting to external here.
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
} ),
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Reduces data for moment-timezone.
|
2020-04-29 18:01:27 +00:00
|
|
|
|
new MomentTimezoneDataPlugin( {
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// This strips out timezone data before the year 2000 to make a smaller file.
|
|
|
|
|
startYear: 2000,
|
2020-04-29 18:01:27 +00:00
|
|
|
|
} ),
|
|
|
|
|
process.env.ANALYZE && new BundleAnalyzerPlugin(),
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Adds the script version parameter to the chunk URLs for cache busting
|
|
|
|
|
// TODO: Partially replace with __webpack_get_script_filename__ in app with Webpack 5.x.
|
2020-10-06 12:58:15 +00:00
|
|
|
|
// The CSS chunk portion will need to remain, as it originates in MiniCssExtractPlugin.
|
|
|
|
|
new AsyncChunkSrcVersionParameterPlugin(),
|
2022-04-15 04:08:59 +00:00
|
|
|
|
// We only want to generate unminified files in the development phase.
|
|
|
|
|
WC_ADMIN_PHASE === 'development' &&
|
|
|
|
|
// Generate unminified files to load the unminified version when `define( 'SCRIPT_DEBUG', true );` is set in wp-config.
|
2020-07-28 02:32:58 +00:00
|
|
|
|
new UnminifyWebpackPlugin( {
|
|
|
|
|
test: /\.js($|\?)/i,
|
|
|
|
|
mainEntry: 'app/index.min.js',
|
|
|
|
|
} ),
|
2020-04-29 18:01:27 +00:00
|
|
|
|
].filter( Boolean ),
|
|
|
|
|
optimization: {
|
|
|
|
|
minimize: NODE_ENV !== 'development',
|
2020-10-06 12:58:15 +00:00
|
|
|
|
splitChunks: {
|
2022-04-12 06:47:03 +00:00
|
|
|
|
// Not to generate chunk names because it caused a stressful workflow when deploying the plugin to WP.org
|
|
|
|
|
// See https://github.com/woocommerce/woocommerce-admin/pull/5229
|
|
|
|
|
name: false,
|
|
|
|
|
},
|
2020-12-02 01:17:02 +00:00
|
|
|
|
},
|
2018-04-17 21:38:56 +00:00
|
|
|
|
};
|
|
|
|
|
|
2022-04-15 04:08:59 +00:00
|
|
|
|
// Use the source map if we're in development mode, .
|
|
|
|
|
if (
|
|
|
|
|
webpackConfig.mode === 'development' ||
|
|
|
|
|
WC_ADMIN_PHASE === 'development'
|
|
|
|
|
) {
|
2018-04-17 23:51:48 +00:00
|
|
|
|
webpackConfig.devtool = process.env.SOURCEMAP || 'source-map';
|
|
|
|
|
}
|
|
|
|
|
|
2018-04-17 21:38:56 +00:00
|
|
|
|
module.exports = webpackConfig;
|