commit df4f004126ea8302f206475cf09c66ab1f10c243
Author: Herre Groen <herre@yoast.com>
Date:   Thu Jun 20 13:43:30 2019 +0200

    Build all JS with WebPack

diff --git a/Gruntfile.js b/Gruntfile.js
index 870e3e1305..f2b9e420ca 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -124,17 +124,6 @@ module.exports = function(grunt) {
 			},
 			qunit: ['tests/qunit/compiled.html']
 		},
-		file_append: {
-			default_options: {
-				files: [
-					{
-						append: 'jQuery.noConflict();',
-						input: WORKING_DIR + 'wp-includes/js/jquery/jquery.js',
-						output: WORKING_DIR + 'wp-includes/js/jquery/jquery.js'
-					}
-				]
-			}
-		},
 		copy: {
 			files: {
 				files: [
@@ -162,167 +151,6 @@ module.exports = function(grunt) {
 					}
 				]
 			},
-			'npm-packages': {
-				files: [
-					{
-						[ WORKING_DIR + 'wp-includes/js/backbone.js' ]: [ './node_modules/backbone/backbone.js' ],
-						[ WORKING_DIR + 'wp-includes/js/clipboard.js' ]: [ './node_modules/clipboard/dist/clipboard.js' ],
-						[ WORKING_DIR + 'wp-includes/js/hoverIntent.js' ]: [ './node_modules/jquery-hoverintent/jquery.hoverIntent.js' ],
-						[ WORKING_DIR + 'wp-includes/js/imagesloaded.min.js' ]: [ './node_modules/imagesloaded/imagesloaded.pkgd.min.js' ],
-						[ WORKING_DIR + 'wp-includes/js/jquery/jquery-migrate.js' ]: [ './node_modules/jquery-migrate/dist/jquery-migrate.js' ],
-						[ WORKING_DIR + 'wp-includes/js/jquery/jquery-migrate.min.js' ]: [ './node_modules/jquery-migrate/dist/jquery-migrate.min.js' ],
-						[ WORKING_DIR + 'wp-includes/js/jquery/jquery.form.js' ]: [ './node_modules/jquery-form/src/jquery.form.js' ],
-						[ WORKING_DIR + 'wp-includes/js/masonry.min.js' ]: [ './node_modules/masonry-layout/dist/masonry.pkgd.min.js' ],
-						[ WORKING_DIR + 'wp-includes/js/twemoji.js' ]: [ './node_modules/twemoji/2/twemoji.js' ],
-						[ WORKING_DIR + 'wp-includes/js/underscore.js' ]: [ './node_modules/underscore/underscore.js' ],
-					},
-					{
-						expand: true,
-						cwd: './node_modules/jquery-ui/ui/',
-						src: '*.js',
-						dest: SOURCE_DIR + 'wp-includes/js/jquery/ui/'
-					}
-				]
-			},
-			'vendor-js': {
-				files: [
-					{
-						expand: true,
-						cwd: SOURCE_DIR + 'js/_enqueues/vendor/',
-						src: [
-							'**/*',
-							'!farbtastic.js',
-							'!iris.min.js',
-							'!deprecated/**',
-							'!README.md',
-							// Ignore unminified version of vendor lib we don't ship.
-							'!jquery/jquery.masonry.js',
-							'!tinymce/tinymce.js'
-						],
-						dest: WORKING_DIR + 'wp-includes/js/'
-					},
-					{
-						expand: true,
-						cwd: SOURCE_DIR + 'js/_enqueues/vendor/',
-						src: [
-							'farbtastic.js',
-							'iris.min.js'
-						],
-						dest: WORKING_DIR + 'wp-admin/js/'
-					},
-					{
-						expand: true,
-						cwd: SOURCE_DIR + 'js/_enqueues/vendor/deprecated',
-						src: [
-							'suggest*'
-						],
-						dest: WORKING_DIR + 'wp-includes/js/jquery/'
-					},
-					{
-						expand: true,
-						cwd: SOURCE_DIR + 'js/_enqueues/vendor/tinymce/',
-						src: 'tinymce.js',
-						dest: SOURCE_DIR + 'wp-includes/js/tinymce/'
-					},
-
-				]
-			},
-			'admin-js': {
-				files: {
-					[ WORKING_DIR + 'wp-admin/js/accordion.js' ]: [ './src/js/_enqueues/lib/accordion.js' ],
-					[ WORKING_DIR + 'wp-admin/js/code-editor.js' ]: [ './src/js/_enqueues/wp/code-editor.js' ],
-					[ WORKING_DIR + 'wp-admin/js/color-picker.js' ]: [ './src/js/_enqueues/lib/color-picker.js' ],
-					[ WORKING_DIR + 'wp-admin/js/comment.js' ]: [ './src/js/_enqueues/admin/comment.js' ],
-					[ WORKING_DIR + 'wp-admin/js/common.js' ]: [ './src/js/_enqueues/admin/common.js' ],
-					[ WORKING_DIR + 'wp-admin/js/custom-background.js' ]: [ './src/js/_enqueues/admin/custom-background.js' ],
-					[ WORKING_DIR + 'wp-admin/js/custom-header.js' ]: [ './src/js/_enqueues/admin/custom-header.js' ],
-					[ WORKING_DIR + 'wp-admin/js/customize-controls.js' ]: [ './src/js/_enqueues/wp/customize/controls.js' ],
-					[ WORKING_DIR + 'wp-admin/js/customize-nav-menus.js' ]: [ './src/js/_enqueues/wp/customize/nav-menus.js' ],
-					[ WORKING_DIR + 'wp-admin/js/customize-widgets.js' ]: [ './src/js/_enqueues/wp/customize/widgets.js' ],
-					[ WORKING_DIR + 'wp-admin/js/dashboard.js' ]: [ './src/js/_enqueues/wp/dashboard.js' ],
-					[ WORKING_DIR + 'wp-admin/js/edit-comments.js' ]: [ './src/js/_enqueues/admin/edit-comments.js' ],
-					[ WORKING_DIR + 'wp-admin/js/editor-expand.js' ]: [ './src/js/_enqueues/wp/editor/dfw.js' ],
-					[ WORKING_DIR + 'wp-admin/js/editor.js' ]: [ './src/js/_enqueues/wp/editor/base.js' ],
-					[ WORKING_DIR + 'wp-admin/js/gallery.js' ]: [ './src/js/_enqueues/lib/gallery.js' ],
-					[ WORKING_DIR + 'wp-admin/js/image-edit.js' ]: [ './src/js/_enqueues/lib/image-edit.js' ],
-					[ WORKING_DIR + 'wp-admin/js/inline-edit-post.js' ]: [ './src/js/_enqueues/admin/inline-edit-post.js' ],
-					[ WORKING_DIR + 'wp-admin/js/inline-edit-tax.js' ]: [ './src/js/_enqueues/admin/inline-edit-tax.js' ],
-					[ WORKING_DIR + 'wp-admin/js/language-chooser.js' ]: [ './src/js/_enqueues/lib/language-chooser.js' ],
-					[ WORKING_DIR + 'wp-admin/js/link.js' ]: [ './src/js/_enqueues/admin/link.js' ],
-					[ WORKING_DIR + 'wp-admin/js/media-gallery.js' ]: [ './src/js/_enqueues/deprecated/media-gallery.js' ],
-					[ WORKING_DIR + 'wp-admin/js/media-upload.js' ]: [ './src/js/_enqueues/admin/media-upload.js' ],
-					[ WORKING_DIR + 'wp-admin/js/media.js' ]: [ './src/js/_enqueues/admin/media.js' ],
-					[ WORKING_DIR + 'wp-admin/js/nav-menu.js' ]: [ './src/js/_enqueues/lib/nav-menu.js' ],
-					[ WORKING_DIR + 'wp-admin/js/password-strength-meter.js' ]: [ './src/js/_enqueues/wp/password-strength-meter.js' ],
-					[ WORKING_DIR + 'wp-admin/js/plugin-install.js' ]: [ './src/js/_enqueues/admin/plugin-install.js' ],
-					[ WORKING_DIR + 'wp-admin/js/post.js' ]: [ './src/js/_enqueues/admin/post.js' ],
-					[ WORKING_DIR + 'wp-admin/js/postbox.js' ]: [ './src/js/_enqueues/admin/postbox.js' ],
-					[ WORKING_DIR + 'wp-admin/js/revisions.js' ]: [ './src/js/_enqueues/wp/revisions.js' ],
-					[ WORKING_DIR + 'wp-admin/js/set-post-thumbnail.js' ]: [ './src/js/_enqueues/admin/set-post-thumbnail.js' ],
-					[ WORKING_DIR + 'wp-admin/js/svg-painter.js' ]: [ './src/js/_enqueues/wp/svg-painter.js' ],
-					[ WORKING_DIR + 'wp-admin/js/tags-box.js' ]: [ './src/js/_enqueues/admin/tags-box.js' ],
-					[ WORKING_DIR + 'wp-admin/js/tags-suggest.js' ]: [ './src/js/_enqueues/admin/tags-suggest.js' ],
-					[ WORKING_DIR + 'wp-admin/js/tags.js' ]: [ './src/js/_enqueues/admin/tags.js' ],
-					[ WORKING_DIR + 'wp-admin/js/site-health.js' ]: [ './src/js/_enqueues/admin/site-health.js' ],
-					[ WORKING_DIR + 'wp-admin/js/privacy-tools.js' ]: [ './src/js/_enqueues/admin/privacy-tools.js' ],
-					[ WORKING_DIR + 'wp-admin/js/theme-plugin-editor.js' ]: [ './src/js/_enqueues/wp/theme-plugin-editor.js' ],
-					[ WORKING_DIR + 'wp-admin/js/theme.js' ]: [ './src/js/_enqueues/wp/theme.js' ],
-					[ WORKING_DIR + 'wp-admin/js/updates.js' ]: [ './src/js/_enqueues/wp/updates.js' ],
-					[ WORKING_DIR + 'wp-admin/js/user-profile.js' ]: [ './src/js/_enqueues/admin/user-profile.js' ],
-					[ WORKING_DIR + 'wp-admin/js/user-suggest.js' ]: [ './src/js/_enqueues/lib/user-suggest.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets/custom-html-widgets.js' ]: [ './src/js/_enqueues/wp/widgets/custom-html.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets/media-audio-widget.js' ]: [ './src/js/_enqueues/wp/widgets/media-audio.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets/media-gallery-widget.js' ]: [ './src/js/_enqueues/wp/widgets/media-gallery.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets/media-image-widget.js' ]: [ './src/js/_enqueues/wp/widgets/media-image.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets/media-video-widget.js' ]: [ './src/js/_enqueues/wp/widgets/media-video.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets/media-widgets.js' ]: [ './src/js/_enqueues/wp/widgets/media.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets/text-widgets.js' ]: [ './src/js/_enqueues/wp/widgets/text.js' ],
-					[ WORKING_DIR + 'wp-admin/js/widgets.js' ]: [ './src/js/_enqueues/admin/widgets.js' ],
-					[ WORKING_DIR + 'wp-admin/js/word-count.js' ]: [ './src/js/_enqueues/wp/utils/word-count.js' ],
-					[ WORKING_DIR + 'wp-admin/js/wp-fullscreen-stub.js' ]: [ './src/js/_enqueues/deprecated/fullscreen-stub.js' ],
-					[ WORKING_DIR + 'wp-admin/js/xfn.js' ]: [ './src/js/_enqueues/admin/xfn.js' ]
-				}
-			},
-			'includes-js': {
-				files: {
-					[ WORKING_DIR + 'wp-includes/js/admin-bar.js' ]: [ './src/js/_enqueues/lib/admin-bar.js' ],
-					[ WORKING_DIR + 'wp-includes/js/api-request.js' ]: [ './src/js/_enqueues/wp/api-request.js' ],
-					[ WORKING_DIR + 'wp-includes/js/autosave.js' ]: [ './src/js/_enqueues/wp/autosave.js' ],
-					[ WORKING_DIR + 'wp-includes/js/comment-reply.js' ]: [ './src/js/_enqueues/lib/comment-reply.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-base.js' ]: [ './src/js/_enqueues/wp/customize/base.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-loader.js' ]: [ './src/js/_enqueues/wp/customize/loader.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-models.js' ]: [ './src/js/_enqueues/wp/customize/models.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-preview-nav-menus.js' ]: [ './src/js/_enqueues/wp/customize/preview-nav-menus.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-preview-widgets.js' ]: [ './src/js/_enqueues/wp/customize/preview-widgets.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-preview.js' ]: [ './src/js/_enqueues/wp/customize/preview.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-selective-refresh.js' ]: [ './src/js/_enqueues/wp/customize/selective-refresh.js' ],
-					[ WORKING_DIR + 'wp-includes/js/customize-views.js' ]: [ './src/js/_enqueues/wp/customize/views.js' ],
-					[ WORKING_DIR + 'wp-includes/js/heartbeat.js' ]: [ './src/js/_enqueues/wp/heartbeat.js' ],
-					[ WORKING_DIR + 'wp-includes/js/mce-view.js' ]: [ './src/js/_enqueues/wp/mce-view.js' ],
-					[ WORKING_DIR + 'wp-includes/js/media-editor.js' ]: [ './src/js/_enqueues/wp/media/editor.js' ],
-					[ WORKING_DIR + 'wp-includes/js/quicktags.js' ]: [ './src/js/_enqueues/lib/quicktags.js' ],
-					[ WORKING_DIR + 'wp-includes/js/shortcode.js' ]: [ './src/js/_enqueues/wp/shortcode.js' ],
-					[ WORKING_DIR + 'wp-includes/js/utils.js' ]: [ './src/js/_enqueues/lib/cookies.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-a11y.js' ]: [ './src/js/_enqueues/wp/a11y.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-ajax-response.js' ]: [ './src/js/_enqueues/lib/ajax-response.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-api.js' ]: [ './src/js/_enqueues/wp/api.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-auth-check.js' ]: [ './src/js/_enqueues/lib/auth-check.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-backbone.js' ]: [ './src/js/_enqueues/wp/backbone.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-custom-header.js' ]: [ './src/js/_enqueues/wp/custom-header.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-embed-template.js' ]: [ './src/js/_enqueues/lib/embed-template.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-embed.js' ]: [ './src/js/_enqueues/wp/embed.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-emoji-loader.js' ]: [ './src/js/_enqueues/lib/emoji-loader.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-emoji.js' ]: [ './src/js/_enqueues/wp/emoji.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-list-revisions.js' ]: [ './src/js/_enqueues/lib/list-revisions.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-lists.js' ]: [ './src/js/_enqueues/lib/lists.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-pointer.js' ]: [ './src/js/_enqueues/lib/pointer.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-sanitize.js' ]: [ './src/js/_enqueues/wp/sanitize.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wp-util.js' ]: [ './src/js/_enqueues/wp/util.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wpdialog.js' ]: [ './src/js/_enqueues/lib/dialog.js' ],
-					[ WORKING_DIR + 'wp-includes/js/wplink.js' ]: [ './src/js/_enqueues/lib/link.js' ],
-					[ WORKING_DIR + 'wp-includes/js/zxcvbn-async.js' ]: [ './src/js/_enqueues/lib/zxcvbn-async.js' ]
-				}
-			},
 			'wp-admin-css-compat-rtl': {
 				options: {
 					processContent: function( src ) {
@@ -674,107 +502,11 @@ module.exports = function(grunt) {
 				args: ['--verbose', '-c', 'phpunit.xml.dist', '--group', 'restapi-jsclient']
 			}
 		},
-		uglify: {
-			options: {
-				ASCIIOnly: true,
-				screwIE8: false
-			},
-			core: {
-				expand: true,
-				cwd: WORKING_DIR,
-				dest: WORKING_DIR,
-				ext: '.min.js',
-				src: [
-					'wp-admin/js/**/*.js',
-					'wp-includes/js/*.js',
-					'wp-includes/js/plupload/*.js',
-					'wp-includes/js/mediaelement/wp-mediaelement.js',
-					'wp-includes/js/mediaelement/wp-playlist.js',
-					'wp-includes/js/mediaelement/mediaelement-migrate.js',
-					'wp-includes/js/tinymce/plugins/wordpress/plugin.js',
-					'wp-includes/js/tinymce/plugins/wp*/plugin.js',
-
-					// Exceptions
-					'!**/*.min.js',
-					'!wp-admin/js/custom-header.js', // Why? We should minify this.
-					'!wp-admin/js/farbtastic.js',
-					'!wp-includes/js/swfobject.js',
-					'!wp-includes/js/wp-embed.js' // We have extra options for this, see uglify:embed
-				]
-			},
-			embed: {
-				options: {
-					compress: {
-						conditionals: false
-					}
-				},
-				expand: true,
-				cwd: WORKING_DIR,
-				dest: WORKING_DIR,
-				ext: '.min.js',
-				src: ['wp-includes/js/wp-embed.js']
-			},
-			jqueryui: {
-				options: {
-					// Preserve comments that start with a bang.
-					preserveComments: /^!/
-				},
-				expand: true,
-				cwd: 'node_modules/jquery-ui/ui/',
-				dest: WORKING_DIR + 'wp-includes/js/jquery/ui/',
-				ext: '.min.js',
-				src: ['*.js']
-			},
-			imgareaselect: {
-				src: WORKING_DIR + 'wp-includes/js/imgareaselect/jquery.imgareaselect.js',
-				dest: WORKING_DIR + 'wp-includes/js/imgareaselect/jquery.imgareaselect.min.js'
-			},
-			jqueryform: {
-				src: WORKING_DIR + 'wp-includes/js/jquery/jquery.form.js',
-				dest: WORKING_DIR + 'wp-includes/js/jquery/jquery.form.min.js'
-			},
-			dynamic: {
-				expand: true,
-				cwd: WORKING_DIR,
-				dest: WORKING_DIR,
-				ext: '.min.js',
-				src: []
-			}
-		},
 		webpack: {
 			prod: webpackConfig( { environment: 'production', buildTarget: WORKING_DIR } ),
 			dev: webpackConfig( { environment: 'development', buildTarget: WORKING_DIR } ),
 			watch: webpackConfig( { environment: 'development', watch: true } )
 		},
-		concat: {
-			tinymce: {
-				options: {
-					separator: '\n',
-					process: function( src, filepath ) {
-						return '// Source: ' + filepath.replace( WORKING_DIR, '' ) + '\n' + src;
-					}
-				},
-				src: [
-					WORKING_DIR + 'wp-includes/js/tinymce/tinymce.min.js',
-					WORKING_DIR + 'wp-includes/js/tinymce/themes/modern/theme.min.js',
-					WORKING_DIR + 'wp-includes/js/tinymce/plugins/*/plugin.min.js'
-				],
-				dest: WORKING_DIR + 'wp-includes/js/tinymce/wp-tinymce.js'
-			},
-			emoji: {
-				options: {
-					separator: '\n',
-					process: function( src, filepath ) {
-						return '// Source: ' + filepath.replace( WORKING_DIR, '' ) + '\n' + src;
-					}
-				},
-				src: [
-					WORKING_DIR + 'wp-includes/js/twemoji.min.js',
-					WORKING_DIR + 'wp-includes/js/wp-emoji.min.js'
-				],
-				dest: WORKING_DIR + 'wp-includes/js/wp-emoji-release.min.js'
-			}
-		},
 		patch:{
 			options: {
 				file_mappings: {
@@ -1088,7 +820,7 @@ module.exports = function(grunt) {
 			all: {
 				files: [
 					SOURCE_DIR + '**',
-					'!' + SOURCE_DIR + 'js/**/*.js',
+					'!' + SOURCE_DIR + 'js/**/*.js*',
 					// Ignore version control directories.
 					'!' + SOURCE_DIR + '**/.{svn,git}/**'
 				],
@@ -1098,26 +830,6 @@ module.exports = function(grunt) {
 					spawn: false
 				}
 			},
-			'js-enqueues': {
-				files: [SOURCE_DIR + 'js/_enqueues/**/*.js'],
-				tasks: ['clean:dynamic', 'copy:dynamic-js', 'uglify:dynamic', 'jsvalidate:dynamic'],
-				options: {
-					dot: true,
-					spawn: false
-				}
-			},
-			'js-webpack': {
-				files: [
-					SOURCE_DIR + 'js/**/*.js',
-					'!' + SOURCE_DIR + 'js/_enqueues/**/*.js',
-					'webpack-dev.config.js'
-				],
-				tasks: ['clean:dynamic', 'webpack:dev', 'uglify:dynamic', 'jsvalidate:dynamic'],
-				options: {
-					dot: true,
-					spawn: false
-				}
-			},
 			config: {
 				files: [
 					'Gruntfile.js',
@@ -1145,6 +857,14 @@ module.exports = function(grunt) {
 				],
 				tasks: ['qunit']
 			}
+		},
+		concurrent: {
+			watch: {
+				tasks: ['_watch', 'webpack:watch'],
+				options: {
+					logConcurrentOutput: true
+				}
+			}
 		}
 	});
 
@@ -1196,7 +916,14 @@ module.exports = function(grunt) {
 			};
 		}
 
-		grunt.task.run( '_' + this.nameArgs );
+		if ( this.nameArgs === 'watch' ) {
+			grunt.task.run( 'concurrent:watch' );
+		} else if ( this.nameArgs === 'watch:webpack' ) {
+			grunt.task.run( 'webpack:watch' );
+		} else {
+			grunt.task.run( '_' + this.nameArgs );
+		}
+
 	} );
 
 	grunt.registerTask( 'precommit:image', [
@@ -1206,8 +933,6 @@ module.exports = function(grunt) {
 	grunt.registerTask( 'precommit:js', [
 		'webpack:prod',
 		'jshint:corejs',
-		'uglify:imgareaselect',
-		'uglify:jqueryform',
 		'qunit:compiled'
 	] );
 
@@ -1336,30 +1061,14 @@ module.exports = function(grunt) {
 		}
 	} );
 
-	grunt.registerTask( 'copy:js', [
-		'copy:npm-packages',
-		'copy:vendor-js',
-		'copy:admin-js',
-		'copy:includes-js'
-	] );
-
 	grunt.registerTask( 'uglify:all', [
 		'uglify:core',
-		'uglify:embed',
-		'uglify:jqueryui',
-		'uglify:imgareaselect',
-		'uglify:jqueryform'
 	] );
 
 	grunt.registerTask( 'build:js', [
 		'clean:js',
 		'webpack:prod',
 		'webpack:dev',
-		'copy:js',
-		'file_append',
-		'uglify:all',
-		'concat:tinymce',
-		'concat:emoji',
 		'jsvalidate:build'
 	] );
 
@@ -1460,69 +1169,14 @@ module.exports = function(grunt) {
 		var src;
 
 		// Only configure the dynamic tasks based on known targets.
-		if ( [ 'all', 'rtl', 'webpack', 'js-enqueues', 'js-webpack' ].indexOf( target ) === -1 ) {
+		if ( [ 'all', 'rtl' ].indexOf( target ) === -1 ) {
 			return;
 		}
 
 		// Normalize filepath for Windows.
 		filepath = filepath.replace( /\\/g, '/' );
 
-		// If the target is a file in the restructured js src.
-		if ( target === 'js-enqueues' ) {
-			var files = {};
-			var configs, dest;
-
-			// If it's a vendor file which are configured with glob matchers.
-			if ( filepath.indexOf( SOURCE_DIR + 'js/_enqueues/vendor/' ) === 0 ) {
-				// Grab the glob matchers from the copy task.
-				configs = grunt.config( [ 'copy', 'vendor-js', 'files' ] );
-
-				// For each glob matcher check if it matches and if so set the variables for our dynamic tasks.
-				for ( var i = 0; i < configs.length; i++ ) {
-					var config = configs[ i ];
-					var relative = path.relative( config.cwd, filepath );
-					var minimatch = require('minimatch');
-
-					if ( minimatch.match( config.src, relative, {} ) ) {
-						dest = config.dest + relative;
-						src = [ path.relative( WORKING_DIR, dest ) ];
-						files[ dest ] = [ filepath ];
-						break;
-					}
-				}
-			// Or if it's another file which has a straight mapping.
-			} else {
-				configs = Object.assign( {},
-					grunt.config( [ 'copy', 'admin-js', 'files' ] ),
-					grunt.config( [ 'copy', 'includes-js', 'files' ] )
-				);
-
-				for ( dest in configs ) {
-					// If a file in the mapping matches then set the variables for our dynamic tasks.
-					if ( dest && configs.hasOwnProperty( dest ) && configs[ dest ][0] === './' + filepath ) {
-						files[ dest ] = configs[ dest ];
-						src = [ path.relative( WORKING_DIR, dest ) ];
-						break;
-					}
-				}
-			}
-
-			// Configure our dynamic-js copy task which uses a file mapping rather than simply copying from src to build.
-			if ( action !== 'deleted' ) {
-				grunt.config( [ 'copy', 'dynamic-js', 'files' ], files );
-			}
-		// For the webpack builds configure the jsvalidate task to only check those files build by webpack.
-		} else if ( target === 'js-webpack' ) {
-			src = [
-				'wp-includes/js/media-audiovideo.js',
-				'wp-includes/js/media-grid.js',
-				'wp-includes/js/media-models.js',
-				'wp-includes/js/media-views.js'
-			];
-		// Else simply use the path relative to the source directory.
-		} else {
-			src = [ path.relative( SOURCE_DIR, filepath ) ];
-		}
+		src = [ path.relative( SOURCE_DIR, filepath ) ];
 
 		if ( ! src ) {
 			grunt.warn( 'Failed to determine the destination file.' );
@@ -1536,15 +1190,6 @@ module.exports = function(grunt) {
 			// Otherwise copy over only the changed file.
 			grunt.config( [ 'copy', 'dynamic', 'src' ], src );
 
-			// For javascript also minify and validate the changed file.
-			if ( target === 'js-enqueues' ) {
-				grunt.config( [ 'uglify', 'dynamic', 'src' ], src );
-				grunt.config( [ 'jsvalidate', 'dynamic', 'files', 'src' ], src.map( function( dir ) { return  WORKING_DIR + dir; } ) );
-			}
-			// For webpack only validate the file, minification is handled by webpack itself.
-			if ( target === 'js-webpack' ) {
-				grunt.config( [ 'jsvalidate', 'dynamic', 'files', 'src' ], src.map( function( dir ) { return  WORKING_DIR + dir; } ) );
-			}
 			// For css run the rtl task on just the changed file.
 			if ( target === 'rtl' ) {
 				grunt.config( [ 'rtlcss', 'dynamic', 'src' ], src );
diff --git a/package-lock.json b/package-lock.json
index 10420ec231..c5d1a0bf86 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,6 +26,22 @@
 			"resolved": "https://registry.npmjs.org/@financial-times/useragent_parser/-/useragent_parser-1.0.2.tgz",
 			"integrity": "sha512-zuJMxn5Qnk7CKl+zrVXDqXs0F+p4tshO6B4s8VenJj34EEVuV4iZIbkGiEFJUbn29z9Mcn6k8yfj9qSCNDcPPQ=="
 		},
+		"@mrmlnc/readdir-enhanced": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+			"integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+			"dev": true,
+			"requires": {
+				"call-me-maybe": "^1.0.1",
+				"glob-to-regexp": "^0.3.0"
+			}
+		},
+		"@nodelib/fs.stat": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+			"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+			"dev": true
+		},
 		"@tannin/compile": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.0.3.tgz",
@@ -2768,6 +2784,12 @@
 				}
 			}
 		},
+		"call-me-maybe": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+			"integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+			"dev": true
+		},
 		"caller-callsite": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
@@ -2881,7 +2903,7 @@
 		},
 		"chalk": {
 			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+			"resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
 			"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 			"requires": {
 				"ansi-styles": "^2.2.1",
@@ -3388,7 +3410,7 @@
 		},
 		"commander": {
 			"version": "2.8.1",
-			"resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+			"resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
 			"integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
 			"dev": true,
 			"optional": true,
@@ -3454,6 +3476,100 @@
 				}
 			}
 		},
+		"compression-webpack-plugin": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-3.0.0.tgz",
+			"integrity": "sha512-ls+oKw4eRbvaSv/hj9NmctihhBcR26j76JxV0bLRLcWhrUBdQFgd06z/Kgg7exyQvtWWP484wZxs0gIUX3NO0Q==",
+			"dev": true,
+			"requires": {
+				"cacache": "^11.2.0",
+				"find-cache-dir": "^3.0.0",
+				"neo-async": "^2.5.0",
+				"schema-utils": "^1.0.0",
+				"serialize-javascript": "^1.4.0",
+				"webpack-sources": "^1.0.1"
+			},
+			"dependencies": {
+				"find-cache-dir": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz",
+					"integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==",
+					"dev": true,
+					"requires": {
+						"commondir": "^1.0.1",
+						"make-dir": "^3.0.0",
+						"pkg-dir": "^4.1.0"
+					}
+				},
+				"find-up": {
+					"version": "4.1.0",
+					"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+					"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+					"dev": true,
+					"requires": {
+						"locate-path": "^5.0.0",
+						"path-exists": "^4.0.0"
+					}
+				},
+				"locate-path": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+					"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+					"dev": true,
+					"requires": {
+						"p-locate": "^4.1.0"
+					}
+				},
+				"make-dir": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz",
+					"integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==",
+					"dev": true,
+					"requires": {
+						"semver": "^6.0.0"
+					}
+				},
+				"p-limit": {
+					"version": "2.2.0",
+					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
+					"integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+					"dev": true,
+					"requires": {
+						"p-try": "^2.0.0"
+					}
+				},
+				"p-locate": {
+					"version": "4.1.0",
+					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+					"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+					"dev": true,
+					"requires": {
+						"p-limit": "^2.2.0"
+					}
+				},
+				"path-exists": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+					"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+					"dev": true
+				},
+				"pkg-dir": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+					"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+					"dev": true,
+					"requires": {
+						"find-up": "^4.0.0"
+					}
+				},
+				"semver": {
+					"version": "6.1.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz",
+					"integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==",
+					"dev": true
+				}
+			}
+		},
 		"computed-style": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz",
@@ -3476,6 +3592,23 @@
 				"typedarray": "^0.0.6"
 			}
 		},
+		"concat-with-sourcemaps": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+			"integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+			"dev": true,
+			"requires": {
+				"source-map": "^0.6.1"
+			},
+			"dependencies": {
+				"source-map": {
+					"version": "0.6.1",
+					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+					"dev": true
+				}
+			}
+		},
 		"connect-history-api-fallback": {
 			"version": "1.6.0",
 			"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
@@ -3883,7 +4016,7 @@
 		},
 		"create-hash": {
 			"version": "1.2.0",
-			"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+			"resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
 			"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
 			"dev": true,
 			"requires": {
@@ -3896,7 +4029,7 @@
 		},
 		"create-hmac": {
 			"version": "1.1.7",
-			"resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+			"resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
 			"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
 			"dev": true,
 			"requires": {
@@ -3956,7 +4089,7 @@
 		},
 		"css-color-names": {
 			"version": "0.0.4",
-			"resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+			"resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
 			"integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
 			"dev": true
 		},
@@ -4593,7 +4726,7 @@
 		},
 		"diffie-hellman": {
 			"version": "5.0.3",
-			"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+			"resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
 			"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
 			"dev": true,
 			"requires": {
@@ -4906,7 +5039,7 @@
 		},
 		"entities": {
 			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+			"resolved": "http://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
 			"integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
 			"dev": true
 		},
@@ -5341,50 +5474,341 @@
 					"integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
 					"dev": true,
 					"requires": {
-						"pend": "~1.2.0"
+						"pend": "~1.2.0"
+					}
+				},
+				"yauzl": {
+					"version": "2.4.1",
+					"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+					"integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+					"dev": true,
+					"requires": {
+						"fd-slicer": "~1.0.1"
+					}
+				}
+			}
+		},
+		"extsprintf": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+			"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+			"dev": true
+		},
+		"fancy-log": {
+			"version": "1.3.3",
+			"resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
+			"integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"ansi-gray": "^0.1.1",
+				"color-support": "^1.1.3",
+				"parse-node-version": "^1.0.0",
+				"time-stamp": "^1.0.0"
+			}
+		},
+		"fast-average-color": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/fast-average-color/-/fast-average-color-4.3.0.tgz",
+			"integrity": "sha512-k8FXd6+JeXoItmdNqB3hMwFgArryjdYBLuzEM8fRY/oztd/051yhSHU6GUrMOfIQU9dDHyFDcIAkGrQKlYtpDA=="
+		},
+		"fast-deep-equal": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+			"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+			"dev": true
+		},
+		"fast-glob": {
+			"version": "2.2.7",
+			"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+			"integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+			"dev": true,
+			"requires": {
+				"@mrmlnc/readdir-enhanced": "^2.2.1",
+				"@nodelib/fs.stat": "^1.1.2",
+				"glob-parent": "^3.1.0",
+				"is-glob": "^4.0.0",
+				"merge2": "^1.2.3",
+				"micromatch": "^3.1.10"
+			},
+			"dependencies": {
+				"arr-diff": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+					"integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+					"dev": true
+				},
+				"array-unique": {
+					"version": "0.3.2",
+					"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+					"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+					"dev": true
+				},
+				"braces": {
+					"version": "2.3.2",
+					"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+					"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+					"dev": true,
+					"requires": {
+						"arr-flatten": "^1.1.0",
+						"array-unique": "^0.3.2",
+						"extend-shallow": "^2.0.1",
+						"fill-range": "^4.0.0",
+						"isobject": "^3.0.1",
+						"repeat-element": "^1.1.2",
+						"snapdragon": "^0.8.1",
+						"snapdragon-node": "^2.0.1",
+						"split-string": "^3.0.2",
+						"to-regex": "^3.0.1"
+					},
+					"dependencies": {
+						"extend-shallow": {
+							"version": "2.0.1",
+							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+							"dev": true,
+							"requires": {
+								"is-extendable": "^0.1.0"
+							}
+						}
+					}
+				},
+				"expand-brackets": {
+					"version": "2.1.4",
+					"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+					"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+					"dev": true,
+					"requires": {
+						"debug": "^2.3.3",
+						"define-property": "^0.2.5",
+						"extend-shallow": "^2.0.1",
+						"posix-character-classes": "^0.1.0",
+						"regex-not": "^1.0.0",
+						"snapdragon": "^0.8.1",
+						"to-regex": "^3.0.1"
+					},
+					"dependencies": {
+						"define-property": {
+							"version": "0.2.5",
+							"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+							"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+							"dev": true,
+							"requires": {
+								"is-descriptor": "^0.1.0"
+							}
+						},
+						"extend-shallow": {
+							"version": "2.0.1",
+							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+							"dev": true,
+							"requires": {
+								"is-extendable": "^0.1.0"
+							}
+						},
+						"is-descriptor": {
+							"version": "0.1.6",
+							"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+							"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+							"dev": true,
+							"requires": {
+								"is-accessor-descriptor": "^0.1.6",
+								"is-data-descriptor": "^0.1.4",
+								"kind-of": "^5.0.0"
+							}
+						},
+						"kind-of": {
+							"version": "5.1.0",
+							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+							"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+							"dev": true
+						}
+					}
+				},
+				"extend-shallow": {
+					"version": "3.0.2",
+					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+					"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+					"dev": true,
+					"requires": {
+						"assign-symbols": "^1.0.0",
+						"is-extendable": "^1.0.1"
+					},
+					"dependencies": {
+						"is-extendable": {
+							"version": "1.0.1",
+							"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+							"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+							"dev": true,
+							"requires": {
+								"is-plain-object": "^2.0.4"
+							}
+						}
+					}
+				},
+				"extglob": {
+					"version": "2.0.4",
+					"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+					"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+					"dev": true,
+					"requires": {
+						"array-unique": "^0.3.2",
+						"define-property": "^1.0.0",
+						"expand-brackets": "^2.1.4",
+						"extend-shallow": "^2.0.1",
+						"fragment-cache": "^0.2.1",
+						"regex-not": "^1.0.0",
+						"snapdragon": "^0.8.1",
+						"to-regex": "^3.0.1"
+					},
+					"dependencies": {
+						"define-property": {
+							"version": "1.0.0",
+							"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+							"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+							"dev": true,
+							"requires": {
+								"is-descriptor": "^1.0.0"
+							}
+						},
+						"extend-shallow": {
+							"version": "2.0.1",
+							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+							"dev": true,
+							"requires": {
+								"is-extendable": "^0.1.0"
+							}
+						}
+					}
+				},
+				"fill-range": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+					"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+					"dev": true,
+					"requires": {
+						"extend-shallow": "^2.0.1",
+						"is-number": "^3.0.0",
+						"repeat-string": "^1.6.1",
+						"to-regex-range": "^2.1.0"
+					},
+					"dependencies": {
+						"extend-shallow": {
+							"version": "2.0.1",
+							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+							"dev": true,
+							"requires": {
+								"is-extendable": "^0.1.0"
+							}
+						}
+					}
+				},
+				"is-accessor-descriptor": {
+					"version": "0.1.6",
+					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+					"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+					"dev": true,
+					"requires": {
+						"kind-of": "^3.0.2"
+					},
+					"dependencies": {
+						"kind-of": {
+							"version": "3.2.2",
+							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+							"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+							"dev": true,
+							"requires": {
+								"is-buffer": "^1.1.5"
+							}
+						}
+					}
+				},
+				"is-data-descriptor": {
+					"version": "0.1.4",
+					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+					"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+					"dev": true,
+					"requires": {
+						"kind-of": "^3.0.2"
+					},
+					"dependencies": {
+						"kind-of": {
+							"version": "3.2.2",
+							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+							"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+							"dev": true,
+							"requires": {
+								"is-buffer": "^1.1.5"
+							}
+						}
+					}
+				},
+				"is-glob": {
+					"version": "4.0.1",
+					"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+					"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+					"dev": true,
+					"requires": {
+						"is-extglob": "^2.1.1"
 					}
 				},
-				"yauzl": {
-					"version": "2.4.1",
-					"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
-					"integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+				"is-number": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+					"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
 					"dev": true,
 					"requires": {
-						"fd-slicer": "~1.0.1"
+						"kind-of": "^3.0.2"
+					},
+					"dependencies": {
+						"kind-of": {
+							"version": "3.2.2",
+							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+							"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+							"dev": true,
+							"requires": {
+								"is-buffer": "^1.1.5"
+							}
+						}
+					}
+				},
+				"isobject": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+					"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+					"dev": true
+				},
+				"kind-of": {
+					"version": "6.0.2",
+					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+					"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+					"dev": true
+				},
+				"micromatch": {
+					"version": "3.1.10",
+					"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+					"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+					"dev": true,
+					"requires": {
+						"arr-diff": "^4.0.0",
+						"array-unique": "^0.3.2",
+						"braces": "^2.3.1",
+						"define-property": "^2.0.2",
+						"extend-shallow": "^3.0.2",
+						"extglob": "^2.0.4",
+						"fragment-cache": "^0.2.1",
+						"kind-of": "^6.0.2",
+						"nanomatch": "^1.2.9",
+						"object.pick": "^1.3.0",
+						"regex-not": "^1.0.0",
+						"snapdragon": "^0.8.1",
+						"to-regex": "^3.0.2"
 					}
 				}
 			}
 		},
-		"extsprintf": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-			"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-			"dev": true
-		},
-		"fancy-log": {
-			"version": "1.3.3",
-			"resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
-			"integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
-			"dev": true,
-			"optional": true,
-			"requires": {
-				"ansi-gray": "^0.1.1",
-				"color-support": "^1.1.3",
-				"parse-node-version": "^1.0.0",
-				"time-stamp": "^1.0.0"
-			}
-		},
-		"fast-average-color": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/fast-average-color/-/fast-average-color-4.3.0.tgz",
-			"integrity": "sha512-k8FXd6+JeXoItmdNqB3hMwFgArryjdYBLuzEM8fRY/oztd/051yhSHU6GUrMOfIQU9dDHyFDcIAkGrQKlYtpDA=="
-		},
-		"fast-deep-equal": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-			"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-			"dev": true
-		},
 		"fast-json-stable-stringify": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
@@ -5416,7 +5840,7 @@
 			"dependencies": {
 				"core-js": {
 					"version": "1.2.7",
-					"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+					"resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
 					"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
 				}
 			}
@@ -5501,7 +5925,7 @@
 		},
 		"finalhandler": {
 			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+			"resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
 			"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
 			"dev": true,
 			"requires": {
@@ -6525,6 +6949,12 @@
 				}
 			}
 		},
+		"glob-to-regexp": {
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+			"integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+			"dev": true
+		},
 		"global-cache": {
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/global-cache/-/global-cache-1.2.1.tgz",
@@ -6765,6 +7195,18 @@
 				"chalk": "^1.1.0"
 			}
 		},
+		"grunt-concurrent": {
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-2.3.1.tgz",
+			"integrity": "sha1-Hj2zjM71o9oRleYdYx/n4yE0TSM=",
+			"dev": true,
+			"requires": {
+				"arrify": "^1.0.1",
+				"async": "^1.2.1",
+				"indent-string": "^2.0.0",
+				"pad-stream": "^1.0.0"
+			}
+		},
 		"grunt-contrib-clean": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz",
@@ -7140,7 +7582,7 @@
 			"dependencies": {
 				"colors": {
 					"version": "1.1.2",
-					"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+					"resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
 					"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
 					"dev": true
 				}
@@ -7841,7 +8283,7 @@
 		},
 		"http-errors": {
 			"version": "1.6.3",
-			"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+			"resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
 			"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
 			"dev": true,
 			"requires": {
@@ -7870,7 +8312,7 @@
 		},
 		"http-proxy-middleware": {
 			"version": "0.18.0",
-			"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
+			"resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
 			"integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
 			"dev": true,
 			"requires": {
@@ -10235,7 +10677,7 @@
 				},
 				"readable-stream": {
 					"version": "2.3.6",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+					"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
 					"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
 					"dev": true,
 					"requires": {
@@ -10250,7 +10692,7 @@
 				},
 				"string_decoder": {
 					"version": "1.1.1",
-					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+					"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
 					"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
 					"dev": true,
 					"requires": {
@@ -10429,6 +10871,12 @@
 			"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
 			"dev": true
 		},
+		"n-readlines": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.0.tgz",
+			"integrity": "sha512-ISDqGcspVu6U3VKqtJZG1uR55SmNNF9uK0EMq1IvNVVZOui6MW6VR0+pIZhqz85ORAGp+4zW+5fJ/SE7bwEibA==",
+			"dev": true
+		},
 		"nan": {
 			"version": "2.12.1",
 			"resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
@@ -11004,7 +11452,7 @@
 		},
 		"os-locale": {
 			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+			"resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
 			"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
 			"dev": true,
 			"requires": {
@@ -11099,6 +11547,55 @@
 			"integrity": "sha1-0lofmeJQbcsn1nBLg9yooxLk7cw=",
 			"dev": true
 		},
+		"pad-stream": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/pad-stream/-/pad-stream-1.2.0.tgz",
+			"integrity": "sha1-Yx3Mn3mBC3BZZeid7eps/w/B38k=",
+			"dev": true,
+			"requires": {
+				"meow": "^3.0.0",
+				"pumpify": "^1.3.3",
+				"repeating": "^2.0.0",
+				"split2": "^1.0.0",
+				"through2": "^2.0.0"
+			},
+			"dependencies": {
+				"readable-stream": {
+					"version": "2.3.6",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+					"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+					"dev": true,
+					"requires": {
+						"core-util-is": "~1.0.0",
+						"inherits": "~2.0.3",
+						"isarray": "~1.0.0",
+						"process-nextick-args": "~2.0.0",
+						"safe-buffer": "~5.1.1",
+						"string_decoder": "~1.1.1",
+						"util-deprecate": "~1.0.1"
+					}
+				},
+				"string_decoder": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+					"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+					"dev": true,
+					"requires": {
+						"safe-buffer": "~5.1.0"
+					}
+				},
+				"through2": {
+					"version": "2.0.5",
+					"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+					"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+					"dev": true,
+					"requires": {
+						"readable-stream": "~2.3.6",
+						"xtend": "~4.0.1"
+					}
+				}
+			}
+		},
 		"pako": {
 			"version": "1.0.8",
 			"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
@@ -11932,7 +12429,7 @@
 				},
 				"colors": {
 					"version": "1.1.2",
-					"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+					"resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
 					"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
 					"dev": true
 				},
@@ -12330,7 +12827,7 @@
 		},
 		"react-autosize-textarea": {
 			"version": "3.0.3",
-			"resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-3.0.3.tgz",
+			"resolved": "http://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-3.0.3.tgz",
 			"integrity": "sha512-iOSZK7RUuJ+iEwkJ9rqYciqtjQgrG1CCRFL6h8Bk61kODnRyEq4tS74IgXpI1t4S6jBBZVm+6ugaU+tWTlVxXg==",
 			"requires": {
 				"autosize": "^4.0.0",
@@ -13692,7 +14189,7 @@
 		},
 		"sha.js": {
 			"version": "2.4.11",
-			"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+			"resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
 			"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
 			"dev": true,
 			"requires": {
@@ -14281,6 +14778,51 @@
 				}
 			}
 		},
+		"split2": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/split2/-/split2-1.1.1.tgz",
+			"integrity": "sha1-Fi2bGIZfAqsvKtlYVSLbm1TEgfk=",
+			"dev": true,
+			"requires": {
+				"through2": "~2.0.0"
+			},
+			"dependencies": {
+				"readable-stream": {
+					"version": "2.3.6",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+					"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+					"dev": true,
+					"requires": {
+						"core-util-is": "~1.0.0",
+						"inherits": "~2.0.3",
+						"isarray": "~1.0.0",
+						"process-nextick-args": "~2.0.0",
+						"safe-buffer": "~5.1.1",
+						"string_decoder": "~1.1.1",
+						"util-deprecate": "~1.0.1"
+					}
+				},
+				"string_decoder": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+					"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+					"dev": true,
+					"requires": {
+						"safe-buffer": "~5.1.0"
+					}
+				},
+				"through2": {
+					"version": "2.0.5",
+					"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+					"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+					"dev": true,
+					"requires": {
+						"readable-stream": "~2.3.6",
+						"xtend": "~4.0.1"
+					}
+				}
+			}
+		},
 		"sprintf-js": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -14498,7 +15040,7 @@
 			"dependencies": {
 				"readable-stream": {
 					"version": "2.3.6",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+					"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
 					"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
 					"dev": true,
 					"requires": {
@@ -14513,7 +15055,7 @@
 				},
 				"string_decoder": {
 					"version": "1.1.1",
-					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+					"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
 					"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
 					"dev": true,
 					"requires": {
@@ -14694,7 +15236,7 @@
 			"dependencies": {
 				"colors": {
 					"version": "1.1.2",
-					"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+					"resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
 					"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
 					"dev": true,
 					"optional": true
@@ -14862,7 +15404,7 @@
 		},
 		"through2": {
 			"version": "0.6.5",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+			"resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
 			"integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
 			"dev": true,
 			"optional": true,
@@ -14880,7 +15422,7 @@
 				},
 				"readable-stream": {
 					"version": "1.0.34",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+					"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
 					"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
 					"dev": true,
 					"optional": true,
@@ -14893,7 +15435,7 @@
 				},
 				"string_decoder": {
 					"version": "0.10.31",
-					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+					"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
 					"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
 					"dev": true,
 					"optional": true
@@ -16195,6 +16737,88 @@
 				}
 			}
 		},
+		"webpack-concat-plugin": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/webpack-concat-plugin/-/webpack-concat-plugin-3.0.0.tgz",
+			"integrity": "sha512-DLdDbZXyrFR99wyAVC9P06HLjr2XujBmQdSbnQMK2o01H9U2NHsN5W76jeTVeXDq5OLvZf8r/se65ftRo3Prow==",
+			"dev": true,
+			"requires": {
+				"concat-with-sourcemaps": "^1.0.5",
+				"globby": "^8.0.1",
+				"schema-utils": "^0.4.5",
+				"uglify-es": "^3.3.9",
+				"upath": "^1.1.0"
+			},
+			"dependencies": {
+				"commander": {
+					"version": "2.13.0",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+					"integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
+					"dev": true
+				},
+				"glob": {
+					"version": "7.1.4",
+					"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+					"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+					"dev": true,
+					"requires": {
+						"fs.realpath": "^1.0.0",
+						"inflight": "^1.0.4",
+						"inherits": "2",
+						"minimatch": "^3.0.4",
+						"once": "^1.3.0",
+						"path-is-absolute": "^1.0.0"
+					}
+				},
+				"globby": {
+					"version": "8.0.2",
+					"resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
+					"integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
+					"dev": true,
+					"requires": {
+						"array-union": "^1.0.1",
+						"dir-glob": "2.0.0",
+						"fast-glob": "^2.0.2",
+						"glob": "^7.1.2",
+						"ignore": "^3.3.5",
+						"pify": "^3.0.0",
+						"slash": "^1.0.0"
+					}
+				},
+				"pify": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+					"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+					"dev": true
+				},
+				"schema-utils": {
+					"version": "0.4.7",
+					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+					"integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+					"dev": true,
+					"requires": {
+						"ajv": "^6.1.0",
+						"ajv-keywords": "^3.1.0"
+					}
+				},
+				"source-map": {
+					"version": "0.6.1",
+					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+					"dev": true
+				},
+				"uglify-es": {
+					"version": "3.3.9",
+					"resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+					"integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+					"dev": true,
+					"requires": {
+						"commander": "~2.13.0",
+						"source-map": "~0.6.1"
+					}
+				}
+			}
+		},
 		"webpack-dev-middleware": {
 			"version": "3.4.0",
 			"resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz",
diff --git a/package.json b/package.json
index f1a7f6f7aa..4559b6ae37 100644
--- a/package.json
+++ b/package.json
@@ -17,10 +17,12 @@
 		"@wordpress/library-export-default-webpack-plugin": "1.1.0",
 		"autoprefixer": "9.4.7",
 		"check-node-version": "3.2.0",
+		"compression-webpack-plugin": "3.0.0",
 		"copy-webpack-plugin": "^4.6.0",
 		"cssnano": "4.1.8",
 		"grunt": "~1.0.3",
 		"grunt-banner": "^0.6.0",
+		"grunt-concurrent": "2.3.1",
 		"grunt-contrib-clean": "~2.0.0",
 		"grunt-contrib-concat": "~1.0.0",
 		"grunt-contrib-copy": "~1.0.0",
@@ -44,11 +46,13 @@
 		"ink-docstrap": "^1.3.0",
 		"jquery-migrate": "1.4.1",
 		"matchdep": "~2.0.0",
+		"n-readlines": "1.0.0",
 		"node-sass": "~4.12.0",
 		"source-map-loader": "^0.2.4",
 		"uglify-js": "^3.4.9",
 		"uglifyjs-webpack-plugin": "2.1.1",
 		"webpack": "4.29.2",
+		"webpack-concat-plugin": "3.0.0",
 		"webpack-dev-server": "3.1.14",
 		"webpack-livereload-plugin": "2.2.0"
 	},
diff --git a/src/js/_enqueues/wp/dashboard.js b/src/js/_enqueues/wp/dashboard.js
index aa9f9218fb..48a7c479d5 100644
--- a/src/js/_enqueues/wp/dashboard.js
+++ b/src/js/_enqueues/wp/dashboard.js
@@ -104,21 +104,21 @@ jQuery(document).ready( function($) {
 		if ( el ) {
 			el = el.toString();
 			// If the element is available as AJAX widget, show it.
-			if ( $.inArray(el, ajaxWidgets) !== -1 ) {
+			if ( $.inArray(el, window.ajaxWidgets) !== -1 ) {
 				// Show element without any delay.
 				show(0, el);
 			}
 		} else {
 			// Walk through all ajaxWidgets, loading them after each other.
-			$.each( ajaxWidgets, show );
+			$.each( window.ajaxWidgets, show );
 		}
 	};
 
 	// Initially populate ajax widgets.
-	ajaxPopulateWidgets();
+	window.ajaxPopulateWidgets();
 
 	// Register ajax widgets as postbox toggles.
-	postboxes.add_postbox_toggles(pagenow, { pbshow: ajaxPopulateWidgets } );
+	postboxes.add_postbox_toggles(pagenow, { pbshow: window.ajaxPopulateWidgets } );
 
 	/**
 	 * Control the Quick Press (Quick Draft) widget.
@@ -149,7 +149,7 @@ jQuery(document).ready( function($) {
 				// Replace the form, and prepend the published post.
 				$('#dashboard_quick_press .inside').html( data );
 				$('#quick-press').removeClass('initial-form');
-				quickPressLoad();
+				window.quickPressLoad();
 				highlightLatestPost();
 
 				// Focus the title to allow for quickly drafting another post.
diff --git a/src/js/_enqueues/wp/embed.js b/src/js/_enqueues/wp/embed.js
index 887c7483fb..689a638793 100644
--- a/src/js/_enqueues/wp/embed.js
+++ b/src/js/_enqueues/wp/embed.js
@@ -2,11 +2,14 @@
  * WordPress inline HTML embed
  *
  * @since 4.4.0
- * @output wp-includes/js/wp-embed.js
  *
  * This file cannot have ampersands in it. This is to ensure
  * it can be embedded in older versions of WordPress.
  * See https://core.trac.wordpress.org/changeset/35708.
+ *
+ * For this reason this file also can not be build by
+ * WebPack and has a custom CopyPlugin configuration to build it.
+ * This means that this file can not be watched for changes.
  */
 (function ( window, document ) {
 	'use strict';
diff --git a/tools/webpack/core.js b/tools/webpack/core.js
new file mode 100644
index 0000000000..1d27dae47e
--- /dev/null
+++ b/tools/webpack/core.js
@@ -0,0 +1,63 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const webpack = require( 'webpack' );
+const { join } = require( 'path' );
+const UglifyJsPlugin = require( 'uglifyjs-webpack-plugin' );
+
+const generateEntries = require( './helpers/generate-entries' );
+const copyEmbedPlugin = require( './plugins/copy-embed-plugin' );
+const copyNodeModulesPlugin = require( './plugins/copy-node-modules-plugin' );
+const copyVendorPlugin = require( './plugins/copy-vendor-plugin' );
+const concatTinymcePlugin = require( './plugins/concat-tinymce-plugin' );
+const concatEmojiPlugin = require( './plugins/concat-emoji-plugin' );
+const compressTinymcePlugin = require( './plugins/compress-tinymce-plugin' );
+
+
+module.exports = function( env = { environment: 'production', watch: false, buildTarget: false } ) {
+	const config = {
+		mode: env.environment,
+		cache: true,
+		watch: env.watch,
+		entry: generateEntries( {
+			pattern: './src/js/_enqueues/**/*.js',
+			globOptions: { ignore: './src/js/_enqueues/vendor/**/*.js' },
+			prefix: './' + env.buildTarget,
+			minify: true
+		} ),
+		output: {
+			filename: '[name]',
+			path: join( __dirname, '../../' ),
+		},
+		plugins: [
+			new webpack.optimize.ModuleConcatenationPlugin(),
+		]
+	};
+
+	if ( ! env.watch ) {
+		// Most WebPack plugins seem to break WebPack's ability to figure out which input files
+		// relate to which output files. This causes WebPack to rebuild everything on every
+		// change causing extraordinarily long watch times. So we simply don't enable any of these.
+		// This means .min.js files will contain unminified JS and files from the vendor and
+		// node_modules directories aren't ever rebuild while watching.
+		config.optimization = {
+			minimize: true,
+			minimizer: [
+				new UglifyJsPlugin( {
+					include: /\.min\.js$/,
+				} )
+			]
+		};
+
+		config.plugins.push(
+			copyNodeModulesPlugin,
+			copyVendorPlugin,
+			copyEmbedPlugin,
+			concatTinymcePlugin,
+			concatEmojiPlugin,
+			compressTinymcePlugin
+		);
+	}
+
+	return config;
+};
diff --git a/tools/webpack/helpers/generate-entries.js b/tools/webpack/helpers/generate-entries.js
new file mode 100644
index 0000000000..4179361e01
--- /dev/null
+++ b/tools/webpack/helpers/generate-entries.js
@@ -0,0 +1,78 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const LineReader  = require( 'n-readlines' );
+const glob        = require( 'glob' );
+const outputRegex = /@output ([^\s]+)/;
+
+function getFileOutput( file ) {
+	let line, inComment;
+	const lineReader = new LineReader( file );
+
+	while ( line = lineReader.next() ) {
+		line = line.toString().trim();
+
+		// Empty line or opening/closing of comment block.
+		if ( line === '/*' || line === '/**' ) {
+			inComment = true;
+			continue;
+		}
+		if ( line === '*/' ) {
+			inComment = false;
+			continue;
+		}
+		if ( line.length === 0 ) {
+			continue;
+		}
+
+		// Single-line comment or line in comment block.
+		if ( line.startsWith( '/*' ) || ( inComment && line.startsWith( '*' ) ) ) {
+			let output = outputRegex.exec( line );
+
+			if ( output ) {
+				lineReader.close();
+				return output[ 1 ];
+			}
+
+			continue;
+		}
+
+		lineReader.close();
+		return false;
+	}
+
+	lineReader.close();
+	return false;
+}
+
+module.exports =  function( options ) {
+	const entries = {};
+	const files   = glob.sync( options.pattern, options.globOptions );
+
+	for ( let i = 0; i < files.length; i++ ) {
+		let output, minifiedOutput, file = files[ i ];
+
+		output = getFileOutput( file );
+
+		if ( output ) {
+			output = options.prefix + output;
+			if ( ! entries[ output ] ) {
+				entries[output] = [];
+			}
+			entries[ output ].push( file );
+
+			if ( options.minify ) {
+				minifiedOutput = output.replace( '.js', '.min.js' );
+
+				if ( ! entries[ minifiedOutput ] ) {
+					entries[minifiedOutput] = [];
+				}
+				entries[ minifiedOutput ].push( file );
+			}
+		} else {
+			console.warn( `File ${ file } does not contain an @output tag and was ignored.` );
+		}
+	}
+
+	return entries;
+};
diff --git a/tools/webpack/helpers/minifier.js b/tools/webpack/helpers/minifier.js
new file mode 100644
index 0000000000..3925b22574
--- /dev/null
+++ b/tools/webpack/helpers/minifier.js
@@ -0,0 +1,22 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const UglifyJS = require( 'uglify-js' );
+
+module.exports = function ( options ) {
+	options = options || {};
+	options.output = Object.assign( {}, options.output, {
+		ascii_only: true,
+		ie8: true
+	} );
+
+	return function ( contents ) {
+		const minified = UglifyJS.minify( contents.toString(), options );
+
+		if ( minified.error ) {
+			console.error( minified.error );
+		}
+
+		return minified.code.toString();
+	};
+};
diff --git a/tools/webpack/media.js b/tools/webpack/media.js
deleted file mode 100644
index 8f55c32249..0000000000
--- a/tools/webpack/media.js
+++ /dev/null
@@ -1,40 +0,0 @@
-const UglifyJsPlugin = require( 'uglifyjs-webpack-plugin' );
-
-var path            = require( 'path' ),
-	admin_files     = {};
-
-const baseDir = path.join( __dirname, '../../' );
-
-module.exports = function( env = { environment: 'production', watch: false, buildTarget: false } ) {
-	const include_files = {
-		[ env.buildTarget + 'wp-includes/js/media-audiovideo.js' ]: ['./src/js/_enqueues/wp/media/audiovideo.js'],
-		[ env.buildTarget + 'wp-includes/js/media-audiovideo.min.js' ]: ['./src/js/_enqueues/wp/media/audiovideo.js'],
-		[ env.buildTarget + 'wp-includes/js/media-grid.js' ]: ['./src/js/_enqueues/wp/media/grid.js'],
-		[ env.buildTarget + 'wp-includes/js/media-grid.min.js' ]: ['./src/js/_enqueues/wp/media/grid.js'],
-		[ env.buildTarget + 'wp-includes/js/media-models.js' ]: ['./src/js/_enqueues/wp/media/models.js'],
-		[ env.buildTarget + 'wp-includes/js/media-models.min.js' ]: ['./src/js/_enqueues/wp/media/models.js'],
-		[ env.buildTarget + 'wp-includes/js/media-views.js' ]: ['./src/js/_enqueues/wp/media/views.js'],
-		[ env.buildTarget + 'wp-includes/js/media-views.min.js' ]: ['./src/js/_enqueues/wp/media/views.js'],
-	};
-
-	const mediaConfig = {
-		mode: "production",
-		cache: true,
-		entry: Object.assign( admin_files, include_files ),
-		output: {
-			path: baseDir,
-			filename: '[name]',
-		},
-		optimization: {
-			minimize: true,
-			minimizer: [
-				new UglifyJsPlugin( {
-					include: /\.min\.js$/,
-				} )
-			]
-		},
-		watch: env.watch,
-	};
-
-	return mediaConfig;
-};
diff --git a/tools/webpack/plugins/compress-tinymce-plugin.js b/tools/webpack/plugins/compress-tinymce-plugin.js
new file mode 100644
index 0000000000..25f6e667a0
--- /dev/null
+++ b/tools/webpack/plugins/compress-tinymce-plugin.js
@@ -0,0 +1,8 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const CompressionPlugin = require("compression-webpack-plugin");
+
+module.exports = new CompressionPlugin({
+	include: './build/wp-includes/js/tinymce/wp-tinymce.js'
+});
diff --git a/tools/webpack/plugins/concat-emoji-plugin.js b/tools/webpack/plugins/concat-emoji-plugin.js
new file mode 100644
index 0000000000..fd44a9266b
--- /dev/null
+++ b/tools/webpack/plugins/concat-emoji-plugin.js
@@ -0,0 +1,13 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const ConcatPlugin = require('webpack-concat-plugin');
+
+module.exports = new ConcatPlugin( {
+	filesToConcat: [
+		'./node_modules/twemoji/2/twemoji.js',
+		'./src/js/_enqueues/wp/emoji.js'
+	],
+	outputPath: './build/wp-includes/js/',
+	fileName: 'wp-emoji-release.min.js'
+}  );
diff --git a/tools/webpack/plugins/concat-tinymce-plugin.js b/tools/webpack/plugins/concat-tinymce-plugin.js
new file mode 100644
index 0000000000..481b1f9470
--- /dev/null
+++ b/tools/webpack/plugins/concat-tinymce-plugin.js
@@ -0,0 +1,14 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const ConcatPlugin = require('webpack-concat-plugin');
+
+module.exports = new ConcatPlugin({
+	filesToConcat: [
+		'./src/js/_enqueues/vendor/tinymce/tinymce.min.js',
+		'./src/js/_enqueues/vendor/tinymce/themes/modern/theme.min.js',
+		'./src/js/_enqueues/vendor/tinymce/plugins/**/plugin.min.js'
+	],
+	outputPath: './build/wp-includes/js/tinymce/',
+	fileName: 'wp-tinymce.js'
+});
diff --git a/tools/webpack/plugins/copy-embed-plugin.js b/tools/webpack/plugins/copy-embed-plugin.js
new file mode 100644
index 0000000000..b979d40d70
--- /dev/null
+++ b/tools/webpack/plugins/copy-embed-plugin.js
@@ -0,0 +1,17 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const CopyPlugin = require( 'copy-webpack-plugin' );
+const minifier   = require( '../helpers/minifier' );
+
+module.exports = new CopyPlugin([
+	{
+		from: './src/js/_enqueues/wp/embed.js',
+		to: './build/wp-includes/js/wp-embed.js'
+	},
+	{
+		from: './src/js/_enqueues/wp/embed.js',
+		to: './build/wp-includes/js/wp-embed.min.js',
+		transform: minifier( { compress: { conditionals: false } } )
+	}
+]);
diff --git a/tools/webpack/plugins/copy-node-modules-plugin.js b/tools/webpack/plugins/copy-node-modules-plugin.js
new file mode 100644
index 0000000000..3f547d70fd
--- /dev/null
+++ b/tools/webpack/plugins/copy-node-modules-plugin.js
@@ -0,0 +1,39 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const CopyPlugin = require('copy-webpack-plugin');
+const minifier   = require( '../helpers/minifier' );
+
+module.exports = new CopyPlugin([
+	{ to: './build/wp-includes/js/backbone.js',                  from: './node_modules/backbone/backbone.js' },
+	{ to: './build/wp-includes/js/backbone.min.js',              from: './node_modules/backbone/backbone-min.js' },
+	{ to: './build/wp-includes/js/hoverIntent.js',               from: './node_modules/jquery-hoverintent/jquery.hoverIntent.js' },
+	{
+		to: './build/wp-includes/js/hoverIntent.min.js',
+		from: './node_modules/jquery-hoverintent/jquery.hoverIntent.js',
+		transform: minifier()
+	},
+	{ to: './build/wp-includes/js/imagesloaded.min.js',          from: './node_modules/imagesloaded/imagesloaded.pkgd.min.js' },
+	{ to: './build/wp-includes/js/jquery/jquery-migrate.js',     from: './node_modules/jquery-migrate/dist/jquery-migrate.js' },
+	{ to: './build/wp-includes/js/jquery/jquery-migrate.min.js', from: './node_modules/jquery-migrate/dist/jquery-migrate.min.js' },
+	{ to: './build/wp-includes/js/jquery/jquery.form.js',        from: './node_modules/jquery-form/src/jquery.form.js' },
+	{ to: './build/wp-includes/js/jquery/jquery.form.min.js',    from: './node_modules/jquery-form/dist/jquery.form.min.js' },
+	{ to: './build/wp-includes/js/masonry.min.js',               from: './node_modules/masonry-layout/dist/masonry.pkgd.min.js' },
+	{ to: './build/wp-includes/js/underscore.min.js',            from: './node_modules/underscore/underscore-min.js' },
+	{ to: './build/wp-includes/js/twemoji.js',                   from: './node_modules/twemoji/2/twemoji.js' },
+	{ to: './build/wp-includes/js/twemoji.min.js',               from: './node_modules/twemoji/2/twemoji.min.js' },
+	{
+		to: './build/wp-includes/js/jquery/jquery.js',
+		from: './node_modules/jquery/dist/jquery.min.js',
+		transform: function ( contents ) {
+			return contents.toString() + '\njQuery.noConflict();';
+		}
+	},
+	{
+		from: '*.js',
+		context: './node_modules/jquery-ui/ui/',
+		to: './build/wp-includes/js/jquery/ui/[name].min.js',
+		toType: 'template',
+		transform: minifier( { output: { comments: /^!/ } } )
+	}
+]);
diff --git a/tools/webpack/plugins/copy-vendor-plugin.js b/tools/webpack/plugins/copy-vendor-plugin.js
new file mode 100644
index 0000000000..d5fc6c6bc0
--- /dev/null
+++ b/tools/webpack/plugins/copy-vendor-plugin.js
@@ -0,0 +1,82 @@
+/* jshint node:true */
+/* jshint esversion:6 */
+
+const CopyPlugin = require('copy-webpack-plugin');
+
+const minifier = require( '../helpers/minifier' );
+
+module.exports = new CopyPlugin([
+	{
+		from: '**/*',
+		context: './src/js/_enqueues/vendor/',
+		ignore: [
+			'farbtastic.js',
+			'iris.min.js',
+			'deprecated/**',
+			'README.md',
+			// Ignore unminified version of vendor lib we don't ship.
+			'jquery/jquery.masonry.js',
+			'tinymce/tinymce.js'
+		],
+		to: './build/wp-includes/js/'
+	},
+	{
+		from: '{farbtastic,iris.min}.js',
+		context: './src/js/_enqueues/vendor/',
+		to: './build/wp-admin/js/'
+	},
+	{
+		from: 'suggest*',
+		context: './src/js/_enqueues/vendor/deprecated',
+		to: 'build/wp-includes/js/jquery/'
+	},
+	{
+		from: './src/js/_enqueues/vendor/imgareaselect/jquery.imgareaselect.js',
+		to: './build/wp-includes/js/imgareaselect/jquery.imgareaselect.min.js',
+		transform: minifier()
+	},
+	{
+		from: './src/js/_enqueues/vendor/colorpicker.js',
+		to: './build/wp-includes/js/colorpicker.min.js',
+		transform: minifier()
+	},
+	{
+		from: './src/js/_enqueues/vendor/json2.js',
+		to: './build/wp-includes/js/json2.min.js',
+		transform: minifier()
+	},
+	{
+		from: './src/js/_enqueues/vendor/mediaelement/mediaelement-migrate.js',
+		to: './build/wp-includes/js/mediaelement/mediaelement-migrate.min.js',
+		transform: minifier()
+	},
+	{
+		from: './src/js/_enqueues/vendor/mediaelement/wp-mediaelement.js',
+		to: './build/wp-includes/js/mediaelement/wp-mediaelement.min.js',
+		transform: minifier()
+	},
+	{
+		from: './src/js/_enqueues/vendor/mediaelement/wp-playlist.js',
+		to: './build/wp-includes/js/mediaelement/wp-playlist.min.js',
+		transform: minifier()
+	},
+	{
+		from: '*.js',
+		context: './src/js/_enqueues/vendor/plupload/',
+		to: './build/wp-includes/js/plupload/[name].min.js',
+		toType: 'template',
+		transform: minifier()
+	},
+	{
+		from: '{wordpress,wp*}/plugin.js',
+		context: './src/js/_enqueues/vendor/tinymce/plugins/',
+		to: './build/wp-includes/js/tinymce/plugins/[path]plugin.min.js',
+		toType: 'template',
+		transform: minifier()
+	},
+	{
+		from: './src/js/_enqueues/vendor/tw-sack.js',
+		to: './build/wp-includes/js/tw-sack.min.js',
+		transform: minifier()
+	}
+]);
diff --git a/webpack.config.js b/webpack.config.js
index bc6ab59bee..7ed04a38f0 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,4 +1,4 @@
-const mediaConfig = require( './tools/webpack/media' );
+const coreConfig = require( './tools/webpack/core' );
 const packagesConfig = require( './tools/webpack/packages' );
 
 module.exports = function( env = { environment: "production", watch: false, buildTarget: false } ) {
@@ -11,7 +11,7 @@ module.exports = function( env = { environment: "production", watch: false, buil
 	}
 
 	const config = [
-		mediaConfig( env ),
+		coreConfig( env ),
 		packagesConfig( env ),
 	];
 
