8640eaa96e
The following package versions were changed: @wordpress/a11y: 2.6.0 -> 2.7.0 @wordpress/annotations: 1.10.0 -> 1.11.0 @wordpress/api-fetch: 3.9.0 -> 3.10.0 @wordpress/autop: 2.5.1 -> 2.6.0 @wordpress/blob: 2.6.0 -> 2.7.0 @wordpress/block-directory: 1.3.0 -> 1.4.0 @wordpress/block-editor: 3.5.0 -> 3.6.0 @wordpress/block-library: 2.12.0 -> 2.13.0 @wordpress/block-serialization-default-parser: 3.4.1 -> 3.5.0 @wordpress/blocks: 6.10.0 -> 6.11.0 @wordpress/components: 9.0.0 -> 9.1.0 @wordpress/compose: 3.10.0 -> 3.11.0 @wordpress/core-data: 2.10.0 -> 2.11.0 @wordpress/custom-templated-path-webpack-plugin: 1.5.0 -> 1.6.0 @wordpress/data: 4.12.0 -> 4.13.0 @wordpress/data-controls: 1.6.0 -> 1.7.0 @wordpress/date: 3.7.0 -> 3.8.0 @wordpress/dependency-extraction-webpack-plugin: 2.1.0 -> 2.2.0 @wordpress/deprecated: 2.6.1 -> 2.7.0 @wordpress/dom: 2.7.0 -> 2.8.0 @wordpress/dom-ready: 2.6.0 -> 2.7.0 @wordpress/e2e-test-utils: 4.1.0 -> 4.2.0 @wordpress/edit-post: 3.11.0 -> 3.12.0 @wordpress/editor: 9.10.0 -> 9.11.0 @wordpress/element: 2.10.0 -> 2.11.0 @wordpress/escape-html: 1.6.0 -> 1.7.0 @wordpress/format-library: 1.12.0 -> 1.13.0 @wordpress/hooks: 2.6.0 -> 2.7.0 @wordpress/html-entities: 2.5.0 -> 2.6.0 @wordpress/i18n: 3.8.0 -> 3.9.0 @wordpress/is-shallow-equal: 1.7.0 -> 1.8.0 @wordpress/keyboard-shortcuts: 0.2.0 -> 1.0.0 @wordpress/keycodes: 2.8.0 -> 2.9.0 @wordpress/library-export-default-webpack-plugin: 1.5.0 -> 1.6.0 @wordpress/list-reusable-blocks: 1.11.0 -> 1.12.0 @wordpress/media-utils: 1.5.0 -> 1.6.0 @wordpress/notices: 1.11.0 -> 1.12.0 @wordpress/nux: 3.10.0 -> 3.11.0 @wordpress/plugins: 2.10.0 -> 2.11.0 @wordpress/priority-queue: 1.4.0 -> 1.5.0 @wordpress/redux-routine: 3.6.2 -> 3.7.0 @wordpress/rich-text: 3.10.0 -> 3.11.0 @wordpress/scripts: 6.2.0 -> 7.0.0 @wordpress/server-side-render: 1.6.0 -> 1.7.0 @wordpress/shortcode: 2.5.0 -> 2.6.0 @wordpress/token-list: 1.8.0 -> 1.9.0 @wordpress/url: 2.9.0 -> 2.10.0 @wordpress/viewport: 2.11.0 -> 2.12.0 @wordpress/wordcount: 2.6.2 -> 2.7.0 Added these new packages: @wordpress/warning @wordpress/primitives @wordpress/icons Re-added keyboard-shortcuts to script loader removed by mistake on revision 47198. Props gziolo, itsjonq, youknowriad, mcsf, andraganescu. Fixes #49358. git-svn-id: https://develop.svn.wordpress.org/trunk@47199 602fd350-edb4-49c9-b593-d223f7449a82
279 lines
7.9 KiB
JavaScript
279 lines
7.9 KiB
JavaScript
/**
|
|
* External dependencies
|
|
*/
|
|
const { DefinePlugin } = require( 'webpack' );
|
|
const CopyWebpackPlugin = require( 'copy-webpack-plugin' );
|
|
const LiveReloadPlugin = require( 'webpack-livereload-plugin' );
|
|
const postcss = require( 'postcss' );
|
|
const UglifyJS = require( 'uglify-js' );
|
|
|
|
const { join, basename } = require( 'path' );
|
|
const { get } = require( 'lodash' );
|
|
|
|
/**
|
|
* WordPress dependencies
|
|
*/
|
|
const CustomTemplatedPathPlugin = require( '@wordpress/custom-templated-path-webpack-plugin' );
|
|
const DependencyExtractionPlugin = require( '@wordpress/dependency-extraction-webpack-plugin' );
|
|
const LibraryExportDefaultPlugin = require( '@wordpress/library-export-default-webpack-plugin' );
|
|
|
|
/**
|
|
* Internal dependencies
|
|
*/
|
|
const { dependencies } = require( '../../package' );
|
|
|
|
const baseDir = join( __dirname, '../../' );
|
|
|
|
/**
|
|
* Given a string, returns a new string with dash separators converedd to
|
|
* camel-case equivalent. This is not as aggressive as `_.camelCase` in
|
|
* converting to uppercase, where Lodash will convert letters following
|
|
* numbers.
|
|
*
|
|
* @param {string} string Input dash-delimited string.
|
|
*
|
|
* @return {string} Camel-cased string.
|
|
*/
|
|
function camelCaseDash( string ) {
|
|
return string.replace(
|
|
/-([a-z])/g,
|
|
( match, letter ) => letter.toUpperCase()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Maps vendors to copy commands for the CopyWebpackPlugin.
|
|
*
|
|
* @param {Object} vendors Vendors to include in the vendor folder.
|
|
* @param {string} buildTarget The folder in which to build the packages.
|
|
*
|
|
* @return {Object[]} Copy object suitable for the CopyWebpackPlugin.
|
|
*/
|
|
function mapVendorCopies( vendors, buildTarget ) {
|
|
return Object.keys( vendors ).map( ( filename ) => ( {
|
|
from: join( baseDir, `node_modules/${ vendors[ filename ] }` ),
|
|
to: join( baseDir, `${ buildTarget }/js/dist/vendor/${ filename }` ),
|
|
} ) );
|
|
}
|
|
|
|
module.exports = function( env = { environment: 'production', watch: false, buildTarget: false } ) {
|
|
const mode = env.environment;
|
|
const suffix = mode === 'production' ? '.min' : '';
|
|
let buildTarget = env.buildTarget ? env.buildTarget : ( mode === 'production' ? 'build' : 'src' );
|
|
buildTarget = buildTarget + '/wp-includes';
|
|
|
|
const WORDPRESS_NAMESPACE = '@wordpress/';
|
|
const BUNDLED_PACKAGES = [ '@wordpress/icons' ];
|
|
const packages = Object.keys( dependencies )
|
|
.filter( ( packageName ) =>
|
|
! BUNDLED_PACKAGES.includes( packageName ) &&
|
|
packageName.startsWith( WORDPRESS_NAMESPACE )
|
|
)
|
|
.map( ( packageName ) => packageName.replace( WORDPRESS_NAMESPACE, '' ) );
|
|
|
|
const vendors = {
|
|
'lodash.js': 'lodash/lodash.js',
|
|
'wp-polyfill.js': '@babel/polyfill/dist/polyfill.js',
|
|
'wp-polyfill-fetch.js': 'whatwg-fetch/dist/fetch.umd.js',
|
|
'wp-polyfill-element-closest.js': 'element-closest/element-closest.js',
|
|
'wp-polyfill-node-contains.js': 'polyfill-library/polyfills/Node/prototype/contains/polyfill.js',
|
|
'wp-polyfill-formdata.js': 'formdata-polyfill/FormData.js',
|
|
'moment.js': 'moment/moment.js',
|
|
'react.js': 'react/umd/react.development.js',
|
|
'react-dom.js': 'react-dom/umd/react-dom.development.js',
|
|
};
|
|
|
|
const minifiedVendors = {
|
|
'lodash.min.js': 'lodash/lodash.min.js',
|
|
'wp-polyfill.min.js': '@babel/polyfill/dist/polyfill.min.js',
|
|
'wp-polyfill-formdata.min.js': 'formdata-polyfill/formdata.min.js',
|
|
'moment.min.js': 'moment/min/moment.min.js',
|
|
'react.min.js': 'react/umd/react.production.min.js',
|
|
'react-dom.min.js': 'react-dom/umd/react-dom.production.min.js',
|
|
};
|
|
|
|
const minifyVendors = {
|
|
'wp-polyfill-fetch.min.js': 'whatwg-fetch/dist/fetch.umd.js',
|
|
'wp-polyfill-element-closest.min.js': 'element-closest/element-closest.js',
|
|
'wp-polyfill-node-contains.min.js': 'polyfill-library/polyfills/Node/prototype/contains/polyfill.js',
|
|
};
|
|
|
|
const blockNames = [
|
|
'archives',
|
|
'block',
|
|
'calendar',
|
|
'categories',
|
|
'latest-comments',
|
|
'latest-posts',
|
|
'navigation',
|
|
'rss',
|
|
'search',
|
|
'shortcode',
|
|
'tag-cloud',
|
|
];
|
|
const phpFiles = {
|
|
'block-serialization-default-parser/parser.php': 'wp-includes/class-wp-block-parser.php',
|
|
...blockNames.reduce( ( files, blockName ) => {
|
|
files[ `block-library/src/${ blockName }/index.php` ] = `wp-includes/blocks/${ blockName }.php`;
|
|
return files;
|
|
} , {} ),
|
|
};
|
|
const blockMetadataCopies = {
|
|
from: join( baseDir, `node_modules/@wordpress/block-library/src/+(${ blockNames.join( '|' ) })/block.json` ),
|
|
test: new RegExp( `\/([^/]+)\/block\.json$` ),
|
|
to: join( baseDir, `${ buildTarget }/blocks/[1]/block.json` ),
|
|
};
|
|
|
|
const developmentCopies = mapVendorCopies( vendors, buildTarget );
|
|
const minifiedCopies = mapVendorCopies( minifiedVendors, buildTarget );
|
|
const minifyCopies = mapVendorCopies( minifyVendors, buildTarget ).map( ( copyCommand ) => {
|
|
return {
|
|
...copyCommand,
|
|
transform: ( content ) => {
|
|
return UglifyJS.minify( content.toString() ).code;
|
|
},
|
|
};
|
|
} );
|
|
|
|
let vendorCopies = mode === "development" ? developmentCopies : [ ...minifiedCopies, ...minifyCopies ];
|
|
|
|
let cssCopies = packages.map( ( packageName ) => ( {
|
|
from: join( baseDir, `node_modules/@wordpress/${ packageName }/build-style/*.css` ),
|
|
to: join( baseDir, `${ buildTarget }/css/dist/${ packageName }/` ),
|
|
flatten: true,
|
|
transform: ( content ) => {
|
|
if ( mode === 'production' ) {
|
|
return postcss( [
|
|
require( 'cssnano' )( {
|
|
preset: 'default',
|
|
} ),
|
|
] )
|
|
.process( content, { from: 'src/app.css', to: 'dest/app.css' } )
|
|
.then( ( result ) => result.css );
|
|
}
|
|
|
|
return content;
|
|
},
|
|
transformPath: ( targetPath, sourcePath ) => {
|
|
if ( mode === 'production' ) {
|
|
return targetPath.replace( /\.css$/, '.min.css' );
|
|
}
|
|
|
|
return targetPath;
|
|
}
|
|
} ) );
|
|
|
|
const phpCopies = Object.keys( phpFiles ).map( ( filename ) => ( {
|
|
from: join( baseDir, `node_modules/@wordpress/${ filename }` ),
|
|
to: join( baseDir, `src/${ phpFiles[ filename ] }` ),
|
|
} ) );
|
|
|
|
const config = {
|
|
mode,
|
|
|
|
entry: packages.reduce( ( memo, packageName ) => {
|
|
const name = camelCaseDash( packageName );
|
|
memo[ name ] = join( baseDir, `node_modules/@wordpress/${ packageName }` );
|
|
return memo;
|
|
}, {} ),
|
|
output: {
|
|
devtoolNamespace: 'wp',
|
|
filename: `[basename]${ suffix }.js`,
|
|
path: join( baseDir, `${ buildTarget }/js/dist` ),
|
|
library: {
|
|
root: [ 'wp', '[name]' ]
|
|
},
|
|
libraryTarget: 'this',
|
|
},
|
|
resolve: {
|
|
modules: [
|
|
baseDir,
|
|
'node_modules',
|
|
],
|
|
alias: {
|
|
'lodash-es': 'lodash',
|
|
},
|
|
},
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: /\.js$/,
|
|
use: [ 'source-map-loader' ],
|
|
enforce: 'pre',
|
|
},
|
|
],
|
|
},
|
|
plugins: [
|
|
new DefinePlugin( {
|
|
// Inject the `GUTENBERG_PHASE` global, used for feature flagging.
|
|
'process.env.GUTENBERG_PHASE': 1,
|
|
} ),
|
|
new LibraryExportDefaultPlugin( [
|
|
'api-fetch',
|
|
'deprecated',
|
|
'dom-ready',
|
|
'redux-routine',
|
|
'token-list',
|
|
'server-side-render',
|
|
'shortcode',
|
|
].map( camelCaseDash ) ),
|
|
new CustomTemplatedPathPlugin( {
|
|
basename( path, data ) {
|
|
let rawRequest;
|
|
|
|
const entryModule = get( data, [ 'chunk', 'entryModule' ], {} );
|
|
switch ( entryModule.type ) {
|
|
case 'javascript/auto':
|
|
rawRequest = entryModule.rawRequest;
|
|
break;
|
|
|
|
case 'javascript/esm':
|
|
rawRequest = entryModule.rootModule.rawRequest;
|
|
break;
|
|
}
|
|
|
|
if ( rawRequest ) {
|
|
return basename( rawRequest );
|
|
}
|
|
|
|
return path;
|
|
},
|
|
} ),
|
|
new DependencyExtractionPlugin( {
|
|
injectPolyfill: true,
|
|
} ),
|
|
new CopyWebpackPlugin(
|
|
[
|
|
...vendorCopies,
|
|
...cssCopies,
|
|
...phpCopies,
|
|
blockMetadataCopies,
|
|
],
|
|
),
|
|
],
|
|
stats: {
|
|
children: false,
|
|
},
|
|
|
|
watch: env.watch,
|
|
};
|
|
|
|
if ( config.mode !== 'production' ) {
|
|
config.devtool = process.env.SOURCEMAP || 'source-map';
|
|
}
|
|
|
|
if ( mode === 'development' && env.buildTarget === 'build/' ) {
|
|
delete config.devtool;
|
|
config.mode = 'production';
|
|
config.optimization = {
|
|
minimize: false
|
|
};
|
|
}
|
|
|
|
if ( config.mode === 'development' ) {
|
|
config.plugins.push( new LiveReloadPlugin( { port: process.env.WORDPRESS_LIVE_RELOAD_PORT || 35729 } ) );
|
|
}
|
|
|
|
return config;
|
|
};
|