diff --git a/packages/scripts/CHANGELOG.md b/packages/scripts/CHANGELOG.md index 3bbe09827dc74..f9daef1778454 100644 --- a/packages/scripts/CHANGELOG.md +++ b/packages/scripts/CHANGELOG.md @@ -1,7 +1,7 @@ ## Unreleased - +- Parse block.json files to look for a `files` property and generate a list of files to be copied from `src` to the output directory (`build` by default)([39653](https://github.com/WordPress/gutenberg/pull/39653) ## 22.2.0 (2022-03-11) ### Enhancement diff --git a/packages/scripts/config/webpack.config.js b/packages/scripts/config/webpack.config.js index 6661b633de56e..b531b152e2c0c 100644 --- a/packages/scripts/config/webpack.config.js +++ b/packages/scripts/config/webpack.config.js @@ -26,6 +26,7 @@ const { hasCssnanoConfig, hasPostCSSConfig, getWebpackEntryPoints, + getFilesToCopy, } = require( '../utils' ); const isProduction = process.env.NODE_ENV === 'production'; @@ -36,9 +37,7 @@ if ( ! browserslist.findConfig( '.' ) ) { } const hasReactFastRefresh = hasArgInCLI( '--hot' ) && ! isProduction; -const copyWebPackPattens = process.env.WP_COPY_PHP_FILES_TO_DIST - ? '**/{block.json,*.php}' - : '**/block.json'; +const copyWebPackPattens = getFilesToCopy(); const cssLoaders = [ { diff --git a/packages/scripts/utils/config.js b/packages/scripts/utils/config.js index b8bc4861c1f8d..2c876609dfd19 100644 --- a/packages/scripts/utils/config.js +++ b/packages/scripts/utils/config.js @@ -284,7 +284,46 @@ function getWebpackEntryPoints() { }; } +/** + * Generates a list of files to be copied from the src directory to the build directory based on a "files" + * property in block.json + * + * @return {string} The copy pattern passed to the CopyWebpackPlugin + */ +function getFilesToCopy() { + // Continue only if the `src` directory exists. + if ( ! hasProjectFile( 'src' ) ) { + return {}; + } + + // 2. Checks whether any block metadata files can be detected in the `src` directory. + // It scans all discovered files looking for JavaScript assets and converts them to entry points. + const blockMetadataFiles = glob( 'src/**/block.json', { + absolute: true, + } ); + + const filesArray = process.env.WP_COPY_PHP_FILES_TO_DIST + ? [ 'block.json', '*.php' ] + : [ 'block.json' ]; + + if ( blockMetadataFiles.length > 0 ) { + const fileList = blockMetadataFiles.reduce( + ( array, blockMetadataFile ) => { + const { files } = require( blockMetadataFile ); + return files ? [ ...array, ...files.split( ',' ) ] : array; + }, + filesArray + ); + + // Create the pattern to be used. + return `**/{${ fileList.join( ',' ) }}`; + } + // Return the default pattern + return `**/{${ filesArray.join( ',' ) }}`; +} + module.exports = { + getFilesToCopy, getJestOverrideConfigFile, getWebpackArgs, getWebpackEntryPoints, diff --git a/packages/scripts/utils/index.js b/packages/scripts/utils/index.js index 72e16527e4b19..3a524da1f6ab2 100644 --- a/packages/scripts/utils/index.js +++ b/packages/scripts/utils/index.js @@ -11,6 +11,7 @@ const { spawnScript, } = require( './cli' ); const { + getFilesToCopy, getJestOverrideConfigFile, getWebpackArgs, getWebpackEntryPoints, @@ -29,6 +30,7 @@ module.exports = { getArgFromCLI, getArgsFromCLI, getFileArgsFromCLI, + getFilesToCopy, getJestOverrideConfigFile, getNodeArgsFromCLI, getPackageProp,