166 lines
5.4 KiB
JavaScript
166 lines
5.4 KiB
JavaScript
/*******************************
|
|
Build Task
|
|
*******************************/
|
|
|
|
const
|
|
gulp = require('gulp'),
|
|
|
|
// node dependencies
|
|
console = require('better-console'),
|
|
|
|
// gulp dependencies
|
|
chmod = require('gulp-chmod'),
|
|
concat = require('gulp-concat'),
|
|
dedupe = require('gulp-dedupe'),
|
|
flatten = require('gulp-flatten'),
|
|
gulpif = require('gulp-if'),
|
|
header = require('gulp-header'),
|
|
normalize = require('normalize-path'),
|
|
plumber = require('gulp-plumber'),
|
|
print = require('gulp-print').default,
|
|
rename = require('gulp-rename'),
|
|
replace = require('gulp-replace'),
|
|
uglify = require('gulp-uglify'),
|
|
|
|
// config
|
|
config = require('../config/user'),
|
|
docsConfig = require('../config/docs'),
|
|
tasks = require('../config/tasks'),
|
|
install = require('../config/project/install'),
|
|
|
|
// shorthand
|
|
globs = config.globs,
|
|
assets = config.paths.assets,
|
|
|
|
banner = tasks.banner,
|
|
filenames = tasks.filenames,
|
|
comments = tasks.regExp.comments,
|
|
log = tasks.log,
|
|
settings = tasks.settings
|
|
;
|
|
|
|
/**
|
|
* Concat and uglify the Javascript files
|
|
* @param {string|array} src - source files
|
|
* @param type
|
|
* @param config
|
|
* @return {*}
|
|
*/
|
|
function build(src, type, config) {
|
|
return gulp.src(src)
|
|
.pipe(plumber())
|
|
.pipe(flatten())
|
|
.pipe(replace(comments.license.in, comments.license.out))
|
|
.pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
|
|
.pipe(gulp.dest(config.paths.output.uncompressed))
|
|
.pipe(print(log.created))
|
|
.pipe(uglify(settings.uglify))
|
|
.pipe(rename(settings.rename.minJS))
|
|
.pipe(header(banner, settings.header))
|
|
.pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
|
|
.pipe(gulp.dest(config.paths.output.compressed))
|
|
.pipe(print(log.created))
|
|
;
|
|
}
|
|
|
|
/**
|
|
* Packages the Javascript files in dist
|
|
* @param {string} type - type of the js processing (none, rtl, docs)
|
|
* @param {boolean} compress - should the output be compressed
|
|
*/
|
|
function pack(type, compress) {
|
|
const output = type === 'docs' ? docsConfig.paths.output : config.paths.output;
|
|
const concatenatedJS = compress ? filenames.concatenatedMinifiedJS : filenames.concatenatedJS;
|
|
|
|
return gulp.src(output.uncompressed + '/**/' + globs.components + globs.ignored + '.js')
|
|
.pipe(plumber())
|
|
.pipe(dedupe())
|
|
.pipe(replace(assets.uncompressed, assets.packaged))
|
|
.pipe(concat(concatenatedJS))
|
|
.pipe(gulpif(config.stripHeaders, replace(comments.header.in, comments.header.out)))
|
|
.pipe(gulpif(compress, uglify(settings.concatUglify)))
|
|
.pipe(header(banner, settings.header))
|
|
.pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
|
|
.pipe(gulp.dest(output.packaged))
|
|
.pipe(print(log.created))
|
|
;
|
|
}
|
|
|
|
function buildJS(src, type, config, callback) {
|
|
if (!install.isSetup()) {
|
|
console.error('Cannot build Javascript. Run "gulp install" to set-up Fomantic');
|
|
callback();
|
|
|
|
return;
|
|
}
|
|
|
|
if (callback === undefined) {
|
|
callback = config;
|
|
config = type;
|
|
type = src;
|
|
src = config.paths.source.definitions + '/**/' + config.globs.components + (config.globs.ignored || '') + '.js';
|
|
}
|
|
|
|
if (globs.individuals !== undefined && typeof src === 'string') {
|
|
const components = config.globs.components.replace(/[{}]/g, '') + ',' + config.globs.individuals.replace(/[{}]/g, '');
|
|
|
|
src = config.paths.source.definitions + '/**/{' + components + '}' + (config.globs.ignored || '') + '.js';
|
|
}
|
|
|
|
// copy source javascript
|
|
const js = () => build(src, type, config);
|
|
js.displayName = 'Building un/compressed Javascript';
|
|
|
|
const packUncompressed = () => pack(type, false);
|
|
packUncompressed.displayName = 'Packing uncompressed Javascript';
|
|
|
|
const packCompressed = () => pack(type, true);
|
|
packCompressed.displayName = 'Packing compressed Javascript';
|
|
|
|
gulp.series(js, gulp.parallel(packUncompressed, packCompressed))(callback);
|
|
}
|
|
|
|
module.exports = function (callback) {
|
|
buildJS(false, config, callback);
|
|
};
|
|
|
|
// We keep the changed files in an array to call build with all of them at the same time
|
|
let
|
|
timeout,
|
|
files = []
|
|
;
|
|
|
|
module.exports.watch = function (type, config) {
|
|
gulp
|
|
.watch([normalize(config.paths.source.definitions + '/**/*.js')])
|
|
.on('all', function (event, path) {
|
|
// We don't handle deleted files yet
|
|
if (event === 'unlink' || event === 'unlinkDir') {
|
|
return;
|
|
}
|
|
|
|
// Clear timeout
|
|
if (timeout) {
|
|
clearTimeout(timeout);
|
|
}
|
|
|
|
// Add file to internal changed files array
|
|
if (!files.includes(path)) {
|
|
files.push(path);
|
|
}
|
|
|
|
// Update timeout
|
|
timeout = setTimeout(() => {
|
|
console.log('Change in javascript detected');
|
|
// Copy files to build in another array
|
|
const buildFiles = [...files];
|
|
// Call method
|
|
gulp.series((callback) => buildJS(buildFiles, type, config, callback))();
|
|
// Reset internal changed files array
|
|
files = [];
|
|
}, 1000);
|
|
})
|
|
;
|
|
};
|
|
|
|
module.exports.buildJS = buildJS;
|