2020-06-02 14:23:56 +00:00
|
|
|
/**
|
|
|
|
* ResourceLoader module bandwidth test
|
|
|
|
*
|
|
|
|
* Fetches a series of ResourceLoader modules from a ResourceLoader URI and
|
|
|
|
* pipes their content into a bundlesize command which validates their bytesize
|
|
|
|
* against a configuration in in ../bundlesize.config.json.
|
|
|
|
*/
|
|
|
|
|
|
|
|
const
|
|
|
|
MW_SERVER = process.env.MW_SERVER || 'http://127.0.0.1:8080',
|
|
|
|
MW_SCRIPT_PATH = process.env.MW_SCRIPT_PATH || '/w',
|
|
|
|
childProcess = require( 'child_process' ),
|
|
|
|
fetch = require( 'node-fetch' ).default,
|
|
|
|
bundles = require( '../bundlesize.config.json' ),
|
2020-06-08 22:14:37 +00:00
|
|
|
// eslint-disable-next-line es/no-object-assign
|
2020-06-02 14:23:56 +00:00
|
|
|
bundlesizeEnv = Object.assign( {}, process.env );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a ResourceLoader URL based on $MW_SERVER and $MW_SCRIPT_PATH
|
2020-06-08 22:14:37 +00:00
|
|
|
*
|
2020-06-02 14:23:56 +00:00
|
|
|
* @param {string} rlModuleName
|
|
|
|
* @return {string}
|
|
|
|
*/
|
|
|
|
function createRLUrl( rlModuleName ) {
|
|
|
|
return `${MW_SERVER}${MW_SCRIPT_PATH}/load.php?lang=en&modules=${rlModuleName}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove the "CI" environment variable so that it is not passed to
|
|
|
|
* the bundlesize command, resulting in an unnecessary "Github token not found"
|
|
|
|
* warning. Note: assigning to null or undefined doesn't work because Node casts
|
|
|
|
* environment variable values to strings.
|
|
|
|
*/
|
|
|
|
delete bundlesizeEnv.CI;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fetch each ResourceLoader module defined in the bundlesize config
|
|
|
|
* and pipe it's content into a bundlesize command.
|
|
|
|
* The bundlesize stdout and stderr are passed to the parent process,
|
|
|
|
* so any error in bundlesize will trigger a non-zero exit status for this script.
|
|
|
|
*/
|
|
|
|
bundles.forEach( async ( rlModule ) => {
|
|
|
|
const rlModuleResponse = await fetch( createRLUrl( rlModule.resourceModule ) ),
|
|
|
|
rlModuleContent = await rlModuleResponse.text();
|
|
|
|
|
|
|
|
// Execute the bundlesize command.
|
|
|
|
const cmd = childProcess.spawn(
|
|
|
|
'node_modules/.bin/bundlesize-pipe',
|
|
|
|
[ '--name', rlModule.resourceModule, '--max-size', rlModule.maxSize ],
|
|
|
|
{
|
|
|
|
// Stdin is writable stream, stdout and stderr are passed to the parent process.
|
|
|
|
stdio: [ 'pipe', 'inherit', 'inherit' ],
|
|
|
|
env: bundlesizeEnv
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
cmd.stdin.write( rlModuleContent );
|
|
|
|
cmd.stdin.end();
|
|
|
|
|
|
|
|
cmd.on( 'exit', ( code ) => {
|
|
|
|
if ( code !== 0 ) {
|
|
|
|
process.exitCode = code || 1; // prevent assigning falsy values.
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
} );
|