cms/build/build.js

172 lines
6.2 KiB
JavaScript

/**
* Command line helper
*
* To get the complete functional media folder please run:
* npm ci
*
* For dedicated tasks, please run:
* node build.js --build-pages will create the error pages (for incomplete repo build PHP+NPM)
* node build.js --copy-assets will clean the media/vendor folder and then will populate the folder from node_modules
* node build.js --compile-js will transpile ES6 files and also uglify the ES6,ES5 files
* node build.js --compile-css will compile all the scss defined files and also create a minified version of the css
* node build.js --compile-bs will compile all the Bootstrap javascript components
* node build.js --com-media will compile the media manager Vue application
* node build.js --watch-com-media will watch and compile the media manager Vue application
* node build.js --gzip will create gzip files for all the minified stylesheets and scripts.
* node build.js --versioning will update all the joomla.assets.json files providing accurate versions for stylesheets and scripts.
*/
const { Command } = require('commander');
const semver = require('semver');
// Joomla Build modules
const { createErrorPages } = require('./build-modules-js/error-pages.es6.js');
const { stylesheets } = require('./build-modules-js/compilecss.es6.js');
const { scripts } = require('./build-modules-js/compilejs.es6.js');
const { bootstrapJs } = require('./build-modules-js/javascript/build-bootstrap-js.es6.js');
const { localisePackages } = require('./build-modules-js/init/localise-packages.es6.js');
const { minifyVendor } = require('./build-modules-js/init/minify-vendor.es6.js');
const { patchPackages } = require('./build-modules-js/init/patches.es6.js');
const { cleanVendors } = require('./build-modules-js/init/cleanup-media.es6.js');
const { recreateMediaFolder } = require('./build-modules-js/init/recreate-media.es6');
const { watching } = require('./build-modules-js/watch.es6.js');
const { mediaManager, watchMediaManager } = require('./build-modules-js/javascript/build-com_media-js.es6');
const { compressFiles } = require('./build-modules-js/compress.es6.js');
const { versioning } = require('./build-modules-js/versioning.es6.js');
const { Timer } = require('./build-modules-js/utils/timer.es6.js');
// The settings
const options = require('../package.json');
const settings = require('./build-modules-js/settings.json');
const handleError = (err, terminateCode) => {
console.error(err); // eslint-disable-line no-console
process.exitCode = terminateCode;
};
if (semver.gte(semver.minVersion(options.engines.node), semver.clean(process.version))) {
handleError(`Node version ${semver.clean(process.version)} is not supported, please upgrade to Node version ${semver.clean(options.engines.node)}`, 1);
}
// The command line
const Program = new Command();
// Merge Joomla's specific settings to the main package.json object
if ('settings' in settings) {
options.settings = settings.settings;
}
const allowedVersion = () => {
if (!semver.satisfies(process.version.substring(1), options.engines.node)) {
handleError(`Command line tools require Node Version ${options.engines.node} but found ${process.version}`, -1);
}
};
// Initialize the CLI
Program
.allowUnknownOption()
.version(options.version)
.option('--copy-assets', 'Moving files from node_modules to media folder')
.option('--build-pages', 'Creates the error pages for unsupported PHP version & incomplete environment')
.option('--compile-js, --compile-js path', 'Handles ES6, ES5 and web component scripts')
.option('--compile-css, --compile-css path', 'Compiles all the scss files to css')
.option('--compile-bs', 'Compiles all the Bootstrap component scripts.')
.option('--watch', 'Watch file changes and re-compile (ATM only works for the js in the media_source).')
.option('--com-media', 'Compile the Media Manager client side App.')
.option('--watch-com-media', 'Watch and Compile the Media Manager client side App.')
.option('--gzip', 'Compress all the minified stylesheets and scripts.')
.option('--prepare', 'Run all the needed tasks to initialise the repo')
.option('--versioning', 'Update all the .js/.css versions on their relative joomla.assets.json')
.addHelpText('after', `
Version: ${options.version}
`);
Program.parse(process.argv);
const cliOptions = Program.opts();
// Update the vendor folder
if (cliOptions.copyAssets) {
allowedVersion();
recreateMediaFolder(options)
.then(() => cleanVendors())
.then(() => localisePackages(options))
.then(() => patchPackages(options))
.then(() => minifyVendor())
.catch((error) => handleError(error, 1));
}
// Creates the error pages for unsupported PHP version & incomplete environment
if (cliOptions.buildPages) {
createErrorPages(options)
.catch((err) => handleError(err, 1));
}
// Convert scss to css
if (cliOptions.compileCss) {
stylesheets(options, Program.args[0])
.catch((err) => handleError(err, 1));
}
// Compress/transpile the javascript files
if (cliOptions.compileJs) {
scripts(options, Program.args[0])
.catch((err) => handleError(err, 1));
}
// Compress/transpile the javascript files
if (cliOptions.watch) {
watching(Program.args[0]);
}
// Gzip js/css files
if (cliOptions.compileBs) {
bootstrapJs();
}
// Gzip js/css files
if (cliOptions.gzip) {
compressFiles();
}
// Compile the media manager
if (cliOptions.comMedia) {
// false indicates "no watch"
mediaManager(false);
}
// Watch & Compile the media manager
if (cliOptions.watchComMedia) {
watchMediaManager(true);
}
// Update the .js/.css versions
if (cliOptions.versioning) {
versioning()
.catch((err) => handleError(err, 1));
}
// Prepare the repo for dev work
if (cliOptions.prepare) {
const bench = new Timer('Build');
allowedVersion();
recreateMediaFolder(options)
.then(() => cleanVendors())
.then(() => localisePackages(options))
.then(() => patchPackages(options))
.then(() => Promise.all(
[
minifyVendor(),
createErrorPages(options),
stylesheets(options, Program.args[0]),
scripts(options, Program.args[0]),
bootstrapJs(),
mediaManager(true),
],
))
.then(() => bench.stop('Build'))
.catch((err) => handleError(err, -1));
}