Skip to content

Instantly share code, notes, and snippets.

@alankent
Created January 31, 2016 10:51
Show Gist options
  • Save alankent/3b9c69fe5e3de4f9fa9b to your computer and use it in GitHub Desktop.
Save alankent/3b9c69fe5e3de4f9fa9b to your computer and use it in GitHub Desktop.
// Usage:
// grunt deploy - invokes magento dev:source-theme:deploy for all themes.
// grunt less - runs less over all themes
// grunt watch - watches for file changes.
// *** INTENDED TO BE ADJUSTED ***
// All theme handled.
var themes = ['Magento/luma', 'Magento/blank'];
// *** INTENDED TO BE ADJUSTED ***
// All locales we want to generate for.
var locales = ['en_US'];
// Include gulp
var gulp = require('gulp');
// Include plugins
var jshint = require('gulp-jshint');
var less = require('gulp-less');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var gutil = require('gulp-util');
var livereload = require('gulp-livereload');
var sourcemaps = require('gulp-sourcemaps');
// *** INTENDED TO BE ADJUSTED ***
// The processing pipeline.
function gulpPipeline(srcFiles, destDir) {
return gulp.src(srcFiles)
.pipe(less())
.pipe(sourcemaps.write())
.pipe(livereload())
.pipe(gulp.dest(destDir));
}
// Include child process invocation support
var sys = require('sys');
var exec = require('child_process').exec;
// Helper function for reporting output of child processes.
function logger(error, stdout, stderr) {
sys.print(stdout);
sys.print(stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
}
// List all files in a directory. (This was recursive at one time, but
// now we say 'imported files should be in 'css' directory.)
function findFiles(baseDir, dir) {
if (dir.length > 0 && dir[dir.length-1] != '/') {
dir = dir + '/';
}
var fs = fs || require('fs');
var filelist = [];
fs.stat(baseDir + dir, function(err, stat) {
if (stat && stat.isDirectory()) {
var files = fs.readdirSync(baseDir + dir);
var k;
for (k = 0; k < files.length; k++) {
var file = files[k];
if (file.indexOf(".less", file.length - 5) >= 0) {
filelist.push(dir + file.substring(0, file.length - 5));
}
}
}
});
return filelist;
};
// Find all short relative paths to Less output files (assuming they
// are all in 'css'). If isCustom is false, returns the default Magento
// files (which take a bit longer to process).
function findLessFiles(theme, locale, isCustom) {
if (isCustom) {
return findFiles('pub/static/frontend/' + theme + '/' + locale + '/', 'css/');
} else {
return ['css/styles-l', 'css/styles-m', 'css/print', 'css/email'];
}
}
// Create rules per theme/locale/isCustom
// (less-<theme>-<locale>-<magento/custom>).
var i, j;
for (i = 0; i < themes.length; i++) {
for (j = 0; j < locales.length; j++) {
var func = function(theme, locale, isCustom) {
return function() {
var files = findLessFiles(theme, locale, isCustom);
var srcFiles = [];
var k;
for (k = 0; k < files.length; k++) {
fullPathFiles.push('pub/static/frontend/' + theme + '/' + locale + '/' + files[k] + '.less');
}
var destDir = 'pub/static/frontend/' + theme + '/' + locale + '/css';
return gulpPipeline(srcFiles, destDir);
};
};
gulp.task('less-' + themes[i] + '-' + locales[j] + '-magento',
func(themes[i], locales[j], false));
gulp.task('less-' + themes[i] + '-' + locales[j] + '-custom',
func(themes[i], locales[j], true));
}
}
// Make 'less' target depends on all theme/locale variations.
var lessTargets = [];
for (i = 0; i < themes.length; i++) {
for (j = 0; j < locales.length; j++) {
lessTargets.push('less-' + themes[i] + '-' + locales[j] + '-magento');
lessTargets.push('less-' + themes[i] + '-' + locales[j] + '-custom');
}
}
gulp.task('less', lessTargets);
// Watch Files For Changes
gulp.task('watch', function() {
livereload.listen();
var i, j;
for (i = 0; i < themes.length; i++) {
for (j = 0; j < locales.length; j++) {
var baseDir = 'pub/static/frontend/' + themes[i] + '/' + locales[j];
var baseTarget = 'less-' + themes[i] + '-' + locales[j];
// Watch all .less files in theme, because these change a lot.
// (Does not watch inherited theme etc.)
gulp.watch(baseDir + '/**/*.less', [baseTarget + '-custom']);
// Magento files are slower - be more conservative when to rebuild.
// - Watch _*.less assuming its loaded via //@magento_import.
// - Watch the Magento CSS files by name as well.
gulp.watch(baseDir + '/**/_*.less', [baseTarget + '-magento']);
var files = findLessFiles(themes[i], locales[j], false);
var k;
for (k = 0; k < files.length; k++) {
gulp.watch(baseDir + '/' + files[k] + '.less',
[baseTarget + '-magento']);
}
}
}
});
// Run Magento deploy command on every theme and language code.
gulp.task('deploy', function() {
var i, j;
for (i = 0; i < themes.length; i++) {
for (j = 0; j < locales.length; j++) {
var rmCmd = 'rm -rf pub/static/frontend/' + themes[i];
sys.print(rmCmd);
exec(rmCmd, logger);
var files = findLessFiles(themes[i], locales[j], false);
files.push(findLessFiles(themes[i], locales[j], true));
var deployCmd = 'magento dev:source-theme:deploy --type=less --area=frontend --theme=' + themes[i] + ' --locale=' + locales[j] + ' ' + files.join(' ');
sys.print(deployCmd);
exec(deployCmd, logger);
}
}
});
// Default Task
gulp.task('default', ['less', 'watch']);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment