const closureCompiler = require('google-closure-compiler').gulp(), concat = require('gulp-concat'), gulp = require('gulp'), path = require('path'), workers = []; class JSWorker { constructor(config, helper) { this.config = config; this.helper = helper.clone(); if (!this.config.name) { throw Error("Found Empty name for JS Job..."); } this.validateConfig(); this.input = this.helper.replaceVariables(this.config.input); this.helper.addConfigItem("$name", this.config.name); this.helper.addConfigItem("$", this.input); this.getCompilerConfig(); this.out = this.helper.replaceVariables(this.config.output); this.watch = this.helper.replaceVariables(this.config.watch || '$/**/*.js'); this.prepareFiles(this.config.files) this.path = path.parse(this.out); this.path = this.path.dir + "/" + this.path.base + "/"; gulp.task(this.taskName, this.work.bind(this)); } validateConfig() { let config = this.config; config.onlyMinify = config.onlyMinify || false; config.minify = config.minify || false; if (!this.config.input || !this.config.output || !this.config.files) { throw Error("Invalid Config for: " + this.config.name + ")"); } } getCompilerConfig() { this.compiler = { compilation_level: 'SIMPLE', warning_level: 'VERBOSE', language_in: 'ECMASCRIPT6_STRICT', language_out: 'ECMASCRIPT6_STRICT', js_output_file: this.config.name + ".min.js" } if (this.config.compiler) { this.compiler = Object.assign(this.compiler, this.config.compiler); } this.compiler.js_output_file = this.helper.replaceVariables(this.compiler.js_output_file); } startWatch() { gulp.watch([this.watch, ...this.files], gulp.parallel([this.taskName])); } get taskName() { return `js-${this.config.name}`; } prepareFiles(files) { this.files = []; for (const file of files) { this.files.push(this.input + "/" + this.helper.replaceVariables(file)); } } work() { let d = gulp.src(this.files).pipe(concat(this.config.name + '.js')) if (!this.config.onlyMinify) { d.pipe(gulp.dest(this.path.dir)); } if (this.config.minify) { d.pipe(closureCompiler(this.compiler)).pipe(gulp.dest(this.path.dir)); } return d; } } module.exports = { build: function () { let array = []; for (let worker of workers) { array.push(worker.taskName); } return array; }, prepare: function (config) { // we load the json and parse it here const js = config.js || []; for (let jsConfig of js) { const worker = new JSWorker(jsConfig, config.helper); workers.push(worker); } }, startWatch: function () { for (let worker of workers) { worker.startWatch(); } } }