UNPKG

adgile

Version:

An easy-to-use automated front-end setup.

136 lines (122 loc) 5.18 kB
'use strict' /** * A submodule for running the `adg build` task, * responsible for assembling all JavaScript files * @module task.js */ const settings = require('../settings.default'), helpers = require('../helpers/index'), chalk = require('chalk'), gulp = require('gulp'), path = require('path'), globule = require('globule'), plugins = require('gulp-load-plugins')({ config: path.join(__dirname, '../package.json') }); /** * Process all main JS files, except for JS files starting with _ and view-specific JS files. * jQuery and / or Ender are loaded first, followed by dev and lib files respectively. * All JS files are concatenated, stripped of debug statements and uglified on production. */ function runScriptsMain() { // Only update bar if it hasn't been completed yet, to prevent logs while JS-files are being watched. if (!settings.isVerbose && !settings.bar.complete) { helpers.updateBar('Compiling scripts'); } helpers.verbose(chalk.grey('Running task "scripts"')); const files = [ settings.assetsFolder + '/js/libs/jquery*.js', settings.assetsFolder + '/js/**/*.js', '!' + settings.assetsFolder + '/js/**/view-*.js', '!' + settings.assetsFolder + '/js/**/_*.js' ]; // Create a filter for Babel to not process files in the /js/libs directory const filter = plugins.filter([ settings.assetsFolder + '/js/**/*.js', '!' + settings.assetsFolder + '/js/libs/**/*.js' ], { restore: true }); if (settings.isProduction) { var numFiles = globule.find(files).length; console.log(chalk.green('✄ Concatenated ' + numFiles + ' JS files')); } return gulp.src(files, {base: settings.assetsFolder + '/js'}) .pipe(plugins.plumber({ errorHandler: function(err) { // console.error(Object.keys(err), Object.values(err)); const plugin = err.plugin ? '\nError thrown by plugin "' + chalk.magenta(err.plugin) + '"' : ''; const msg = err.message ? chalk.hex('#ff6f60')(err.message) : ''; const fileName = err.fileName ? '\nIn ' + chalk.yellow(err.fileName) : ''; const lineNumber = err.lineNumber ? ' on ' + chalk.yellow('line ' + err.lineNumber) : ''; const columnNumber = err.column ? ', ' + chalk.yellow('column ' + err.column) : ''; console.error('\n' + chalk.bold.hex('#d32f2f')('JS error: ') + msg + fileName + lineNumber + columnNumber + plugin); this.emit('end'); } })) .pipe(plugins.deporder()) .pipe(filter) // .pipe(plugins.debug()) // Lists the paths in console of the files that are currently in the pipeline .pipe(plugins.if(config.useBabel, plugins.babel({ cwd: __dirname, presets: [['@babel/preset-env', { useBuiltIns: 'entry', corejs: 3 }]], retainLines: true }))) .pipe(filter.restore) .pipe(plugins.if(settings.isProduction, plugins.stripDebug())) .pipe(plugins.if(settings.isProduction, plugins.terser({ safari10: true }))) .pipe(plugins.if(settings.isProduction, plugins.concat('core-libs.js'))) .pipe(plugins.if(settings.isProduction, plugins.rename({extname: '.min.js'}))) .pipe(gulp.dest(config.export_assets + '/' + settings.assetsFolder + '/js')); } /** * Process all view-specific JS files. * Files are stripped of debug statements and uglified on production. */ function runScriptsView() { helpers.verbose(chalk.grey('Running task "scripts:view"')); return gulp.src(settings.assetsFolder + '/js/view-*.js') .pipe(plugins.plumber({ errorHandler: function(err) { const plugin = err.plugin ? '\nError thrown by plugin "' + chalk.magenta(err.plugin) + '"' : ''; const msg = err.message ? chalk.hex('#ff6f60')(err.message) : ''; const fileName = err.fileName ? '\nIn ' + chalk.yellow(err.fileName) : ''; const lineNumber = err.lineNumber ? ' on ' + chalk.yellow('line ' + err.lineNumber) : ''; const columnNumber = err.column ? ', ' + chalk.yellow('column ' + err.column) : ''; console.error('\n' + chalk.bold.hex('#d32f2f')('JS error: ') + msg + fileName + lineNumber + columnNumber + plugin); this.emit('end'); } })) .pipe(plugins.if(settings.useBabel, plugins.babel({ cwd: __dirname, presets: ['@babel/preset-env'], retainLines: true }))) .pipe(plugins.if(settings.isProduction, plugins.rename({suffix: '.min'}))) .pipe(plugins.if(settings.isProduction, plugins.stripDebug())) .pipe(plugins.if(settings.isProduction, plugins.terser({ safari10: true }))) .pipe(gulp.dest(config.export_assets + '/' + settings.assetsFolder + '/js')); } /** * ESLint options: https://eslint.org/docs/rules/ */ function runHints() { helpers.verbose(chalk.grey('Running task "hint:scripts"')); // Hint all non-lib js files and exclude _ prefixed files return gulp.src([ settings.assetsFolder + '/js/*.js', '!**/_*.js', '!node_modules/**' ]) .pipe(plugins.plumber({ errorHandler: function(error) { console.error(chalk.red('ESLint error: ') + chalk.white(error.message)); } })) .pipe(plugins.eslint({ useEslintrc: true })) .pipe(plugins.eslint.format('stylish')) ; } module.exports = { runScriptsView, runScriptsMain, runHints }