Created
January 31, 2016 10:51
-
-
Save alankent/3b9c69fe5e3de4f9fa9b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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