diff --git a/Gruntfile.js b/Gruntfile.js index f72c93856e6b2..9c9e3e53db41a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -571,6 +571,7 @@ module.exports = function(grunt) { 'wp-admin/css/*.css', '!wp-admin/css/wp-admin*.css', 'wp-includes/css/*.css', + 'wp-includes/css/**/*.css', 'wp-includes/js/mediaelement/wp-mediaelement.css' ] }, @@ -1788,6 +1789,8 @@ module.exports = function(grunt) { grunt.registerTask( 'verify:build', [ 'verify:old-files', 'verify:source-maps', + 'verify:compressed-css', + 'verify:compressed-js', ] ); /** @@ -1845,6 +1848,106 @@ module.exports = function(grunt) { }); } ); + grunt.registerTask( 'verify:compressed-css', function() { + // Get all CSS files that do not end in *.min.css. + const files = glob.sync( `${ BUILD_DIR }/wp-*/css/**/*.css`, { + ignore: [ '**/*.min.css' ], + } ); + + var errorLog = ''; + + // For each of the files, verify that a minified version also exists. + files.forEach( function( file ) { + const minifiedFile = file.replace( /\.css$/, '.min.css' ); + + if ( ! fs.existsSync( minifiedFile ) ) { + errorLog += `The minified CSS file ${ minifiedFile } does not exist.\n`; + } + } ); + + // Now get all the css files ending in *.min.css + const minifiedFiles = glob.sync( `${ BUILD_DIR }/wp-*/css/**/*.min.css` ); + + // For each of the minified files, verify that an unminified version also exists. + minifiedFiles.forEach( function( file ) { + const unminifiedFile = file.replace( /\.min\.css$/, '.css' ); + + if ( ! fs.existsSync( unminifiedFile ) ) { + errorLog += `The unminified CSS file ${ unminifiedFile } does not exist.\n`; + } + } ); + + assert( + errorLog.length === 0, + errorLog + ); + } ); + + grunt.registerTask( 'verify:compressed-js', function() { + // Get all JavaScript files that do not end in *.min.js. + const files = glob.sync( `${ BUILD_DIR }/wp-*/js/**/*.js`, { + ignore: [ + '**/*.min.js', + '**/wp-admin/js/custom-header.js', + '**/wp-admin/js/farbtastic.js', + '**/wp-includes/js/codemirror/*.js', + '**/wp-includes/js/crop/**', + '**/wp-includes/js/jquery/jquery.query.js', + '**/wp-includes/js/jquery/jquery.schedule.js', + '**/wp-includes/js/jquery/jquery.serialize-object.js', + '**/wp-includes/js/jquery/jquery.ui.touch-punch.js', + '**/wp-includes/js/swfupload/swfupload.js', + '**/wp-includes/js/thickbox/thickbox.js', + '**/wp-includes/js/tinymce/*.js', + '**/wp-includes/js/tinymce/langs/**', + '**/wp-includes/js/tinymce/utils/**', + ], + } ); + + var errorLog = ''; + + // For each of the files, verify that a minified version also exists. + files.forEach( function( file ) { + const minifiedFile = file.replace( /\.js$/, '.min.js' ); + + if ( ! fs.existsSync( minifiedFile ) ) { + errorLog += `The minified JS file ${ minifiedFile } does not exist.\n`; + } + } ); + + // Now get all the js files ending in *.min.js + const minifiedFiles = glob.sync( `${ BUILD_DIR }/wp-*/js/**/*.min.js`, { + ignore: [ + '**/wp-admin/js/iris.min.js', + '**/wp-includes/js/codemirror/codemirror.min.js', + '**/wp-includes/js/dist/react-refresh-entry.min.js', + '**/wp-includes/js/dist/react-refresh-runtime.min.js', + '**/wp-includes/js/hoverintent-js.min.js', + '**/wp-includes/js/imagesloaded.min.js', + '**/wp-includes/js/jcrop/jquery.Jcrop.min.js', + '**/wp-includes/js/jquery/jquery.color.min.js', + '**/wp-includes/js/jquery/jquery.masonry.min.js', + '**/wp-includes/js/masonry.min.js', + '**/wp-includes/js/tinymce/tinymce.min.js', + '**/wp-includes/js/wp-emoji-release.min.js', + '**/wp-includes/js/zxcvbn.min.js', + ], + } ); + + // For each of the minified files, verify that an unminified version also exists. + minifiedFiles.forEach( function( file ) { + const unminifiedFile = file.replace( /\.min\.js$/, '.js' ); + if ( ! fs.existsSync( unminifiedFile ) ) { + errorLog += `The unminified JS file ${ unminifiedFile } does not exist.\n`; + } + } ); + + assert( + errorLog.length === 0, + errorLog + ); + } ); + /** * Compiled JavaScript files may link to sourcemaps. In some cases, * the source map may not be available, which can cause 404 errors when @@ -1894,9 +1997,9 @@ module.exports = function(grunt) { if ( grunt.option( 'dev' ) ) { grunt.task.run( [ 'build:js', - 'build:css', 'gutenberg-integrate', 'copy-vendor-scripts', + 'build:css', 'build:certificates' ] ); } else { @@ -1904,9 +2007,9 @@ module.exports = function(grunt) { 'build:certificates', 'build:files', 'build:js', - 'build:css', 'gutenberg-integrate', 'copy-vendor-scripts', + 'build:css', 'replace:source-maps', 'verify:build' ] );