VectorGOLEM/tests/resource-loader-bundlesize.js

67 lines
2.1 KiB
JavaScript

/**
* 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' ),
// eslint-disable-next-line es/no-object-assign
bundlesizeEnv = Object.assign( {}, process.env );
/**
* Create a ResourceLoader URL based on $MW_SERVER and $MW_SCRIPT_PATH
*
* @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.
}
} );
} );