diff --git a/src/gulpfile.js b/src/gulpfile.js index c4165bed..a541157c 100644 --- a/src/gulpfile.js +++ b/src/gulpfile.js @@ -186,74 +186,65 @@ gulp.task('chat-styles', ['chat-styles-handlebars', 'chat-styles-js'], function( // Compile and concatenate handlebars files for all chat styles. gulp.task('chat-styles-handlebars', function() { - var promises = []; - fs.readdir(config.chatStylesPath, function(err, list){ - if(err) return done(err); - list.filter(function(path){ - return fs.lstatSync(config.chatStylesPath + "/" + path).isDirectory(); - }).map(function(dir){ - promises.push(new Promise(function(resolve, reject){ - var pipeline = gulp.src(config.chatStylesPath + '/' + dir + '/templates_src/client_side/**/*.handlebars') - .pipe(handlebars({ - // Use specific version of Handlebars.js - handlebars: handlebarsEngine - })) - .pipe(wrapHandlebarsTemplate()) - .pipe(concat('templates.js')) - .pipe(uglify({preserveComments: 'some'})) - .pipe(header(config.compiledTemplatesHeader)) - .pipe(gulp.dest(config.chatStylesPath + '/' + dir + '/templates_compiled/client_side')); - pipeline.on('end', resolve); - pipeline.on('error', reject); + return getChildDirs(config.chatStylesPath) + .then(function (dirs) { + return Promise.all(dirs.map(function (dir) { + return new Promise(function(resolve, reject){ + gulp.src(config.chatStylesPath + '/' + dir + '/templates_src/client_side/**/*.handlebars') + .pipe(handlebars({ + // Use specific version of Handlebars.js + handlebars: handlebarsEngine + })) + .pipe(wrapHandlebarsTemplate()) + .pipe(concat('templates.js')) + .pipe(uglify({preserveComments: 'some'})) + .pipe(header(config.compiledTemplatesHeader)) + .pipe(gulp.dest(config.chatStylesPath + '/' + dir + '/templates_compiled/client_side')) + .on('end', resolve) + .on('error', reject); + }); })); }); - }); }); // Compile and concatenate js files for all chat styles. gulp.task('chat-styles-js', function() { - var promises = []; - fs.readdir(config.chatStylesPath, function(err, list){ - if(err) return done(err); - list.filter(function(path){ - return fs.lstatSync(config.chatStylesPath + "/" + path).isDirectory(); - }).map(function(dir){ - promises.push(new Promise(function(resolve, reject){ - var pipeline = gulp.src(config.chatStylesPath + '/' + dir + '/js/source/**/*.js') - .pipe(concat('scripts.js')) - .pipe(uglify({preserveComments: 'some'})) - .pipe(gulp.dest(config.chatStylesPath + '/' + dir + '/js/compiled')); - pipeline.on('end', resolve); - pipeline.on('error', reject); + return getChildDirs(config.chatStylesPath) + .then(function (dirs) { + return Promise.all(dirs.map(function (dir) { + return new Promise(function(resolve, reject){ + gulp.src(config.chatStylesPath + '/' + dir + '/js/source/**/*.js') + .pipe(concat('scripts.js')) + .pipe(uglify({preserveComments: 'some'})) + .pipe(gulp.dest(config.chatStylesPath + '/' + dir + '/js/compiled')) + .on('end', resolve) + .on('error', reject); + }); })); }); - }); }); // Performs all job related with pages styles. gulp.task('page-styles', function() { - var promises = []; - fs.readdir(config.pageStylesPath, function(err, list){ - if(err) return done(err); - list.filter(function(path){ - return fs.lstatSync(config.pageStylesPath + "/" + path).isDirectory(); - }).map(function(dir){ - promises.push(new Promise(function(resolve, reject){ - var pipeline = gulp.src(config.pageStylesPath + '/' + dir + '/templates_src/client_side/**/*.handlebars') - .pipe(handlebars({ - // Use specific version of Handlebars.js - handlebars: handlebarsEngine - })) - .pipe(wrapHandlebarsTemplate()) - .pipe(concat('templates.js')) - .pipe(uglify({preserveComments: 'some'})) - .pipe(header(config.compiledTemplatesHeader)) - .pipe(gulp.dest(config.pageStylesPath + '/' + dir + '/templates_compiled/client_side')); - pipeline.on('end', resolve); - pipeline.on('error', reject); + return getChildDirs(config.pageStylesPath) + .then(function (dirs) { + return Promise.all(dirs.map(function (dir) { + return new Promise(function(resolve, reject){ + gulp.src(config.pageStylesPath + '/' + dir + '/templates_src/client_side/**/*.handlebars') + .pipe(handlebars({ + // Use specific version of Handlebars.js + handlebars: handlebarsEngine + })) + .pipe(wrapHandlebarsTemplate()) + .pipe(concat('templates.js')) + .pipe(uglify({preserveComments: 'some'})) + .pipe(header(config.compiledTemplatesHeader)) + .pipe(gulp.dest(config.pageStylesPath + '/' + dir + '/templates_compiled/client_side')) + .on('end', resolve) + .on('error', reject); + }); })); }); - }); }); // Watch styles @@ -509,3 +500,40 @@ var xgettextHandlebars = function() { callback(); }); } + +/** + * Retrieves list of all dirs which are placed in the specified one. + * + * @param {String} srcDir A dir where to search. + * @returns Promise A promise which will be resolved with list of child dirs or + * rejected with the occured error. + */ +var getChildDirs = function(srcDir) { + return (new Promise(function(resolve, reject) { + fs.readdir(srcDir, function (err, files) { + if (err) { + reject(err); + } else { + resolve(files); + } + }); + })).then(function (files) { + // Replace all the files that are not a directory with nulls. + return Promise.all(files.map(function (file) { + return new Promise(function (resolve, reject) { + fs.lstat(config.chatStylesPath + '/' + file, function (err, stat) { + if (err) { + reject(err); + } else { + resolve(stat.isDirectory() ? file : null); + } + }); + }); + })); + }).then(function(dirs) { + // Remove all the nulls from the array. + return dirs.filter(function (dir) { + return null !== dir; + }); + }); +}