veezard
Version:
TECHB fork from veeva. Veeva CLM Generator & Workflow for building iRep Presentations.
345 lines (263 loc) • 11.5 kB
JavaScript
;
var ___ = require('lodash'),
assemble = require('assemble'),
browserSync = require('browser-sync'),
extname = require('gulp-extname'),
fs = require('fs'),
path = require('path'),
plumber = require('gulp-plumber'),
Q = require('q'),
utils = require('../lib/utils');
module.exports = function(gulp, options) {
function assembleSingleTemplate(keyMessage) {
var deferred = Q.defer(),
app = assemble();
app.data(options.module.workflow.assemble.data);
app.partials(path.join(options.paths.src, 'templates', 'includes', '*.hbs'));
app.layouts(path.join(options.paths.src, options.paths.layouts, '*.hbs'));
app.pages(path.join(options.paths.src, options.paths.pages, keyMessage.key_message, '*.hbs'));
app.preLayout(/\.hbs$/, function(view, next) {
// only set the layout if it's not already defined
if (view.data.layout === undefined) {
view.data.layout = options.module.workflow.assemble.defaultLayout;
}
next();
});
// register helpers
app.helpers('is', require('./helpers/is.js'));
app.helpers('isnt', require('./helpers/isnt.js'));
app.helpers('handlebars-helpers', require('handlebars-helpers')());
app.toStream('pages')
.pipe(app.renderFile('hbs'))
.once('error', function(err) {
utils.log.error(err);
deferred.reject(err);
})
.pipe(extname())
.pipe(app.dest(path.join(options.paths.dist, keyMessage.key_message)))
.once('end', function() {
deferred.resolve();
});
return deferred.promise;
}
function assembleTemplates() {
var deferred = Q.defer(),
app = assemble();
app.data(options.module.workflow.assemble.data);
app.partials(path.join(options.paths.src, 'templates', 'includes', '*.hbs'));
app.layouts(path.join(options.paths.src, options.paths.layouts, '*.hbs'));
app.pages(path.join(options.paths.src, options.paths.pages, '**', '*.hbs'));
app.preLayout(/\.hbs$/, function(view, next) {
// only set the layout if it's not already defined
if (view.data.layout === undefined) {
view.data.layout = options.module.workflow.assemble.defaultLayout;
}
next();
});
// register helpers
app.helpers('is', require('./helpers/is.js'));
app.helpers('isnt', require('./helpers/isnt.js'));
app.helpers('handlebars-helpers', require('handlebars-helpers')());
app.toStream('pages')
.pipe(app.renderFile('hbs'))
.on('error', function(err) {
utils.log.error(err);
deferred.reject(err);
})
.pipe(extname())
.pipe(app.dest(path.join(options.paths.dist)))
.on('end', function() {
deferred.resolve();
});
return deferred.promise;
}
function copyTemplateAssets(keyMessage) {
var deferred = Q.defer(),
template = keyMessage ? keyMessage.key_message : '';
gulp.src(['**/*', '!**/*.hbs'], {
cwd: path.join(process.cwd(), options.paths.src, 'templates', 'pages', template)
})
.pipe(plumber())
.pipe(gulp.dest(path.join(options.paths.dist, template)))
.once('error', function(err) {
utils.log.error(err);
deferred.reject(err);
})
.once('end', function() {
deferred.resolve();
});
return deferred.promise;
}
function handleGlobalAssets() {
var d = Q.defer(),
basePath = path.join(process.cwd(), options.paths.dist),
dirs = utils.getDirectories(basePath);
function copyGlobals(directory) {
var deferred = Q.defer();
// dont' copy global into global
if (directory === 'global') {
deferred.resolve();
} else {
gulp.src('**/*', {
cwd: path.join(process.cwd(), options.paths.dist, 'global'),
base: options.paths.dist
})
.pipe(plumber())
.pipe(gulp.dest(path.join(options.paths.dist, directory)))
.on('end', function() {
deferred.resolve();
});
}
return deferred.promise;
}
// create an array of promise-returning functions
var copyGlobalAssets = ___(dirs).map(function(directory) {
var files = utils.getFiles(path.join(basePath, directory));
return ___(files).filter(function(file) {
var regex = new RegExp(directory + '.html', 'g');
return file.match(regex);
})
.map(function() {
return copyGlobals(directory);
})
.value();
})
.flattenDeep()
.value();
Q.all(copyGlobalAssets).done(function() {
d.resolve();
}, function(err) {
utils.log.error(err);
d.reject();
});
return d.promise;
}
function generateGlobalAppConfig() {
var deferred = Q.defer(),
filerKeyMessages;
// Filter array for:
// 'global' key Message
// All Key Messages stored in hiddenKeyMessages presentation
filerKeyMessages = options.keyMessages.filter(function(item) {
return (item.key_message !== 'global' && options.hiddenKeyMessages.indexOf(item) === -1);
});
fs.writeFile(options.paths.dist + '/global/app.json', JSON.stringify(filerKeyMessages), function(err, data) {
if (err) {
utils.log.error(err);
deferred.reject(err);
}
deferred.resolve();
});
return deferred.promise;
}
function generateSitemapFile() {
var deferred = Q.defer(),
filerKeyMessages = [],
sitemapKeyMessages = [];
if (!options.sitemap) {
utils.log.warn('⤷ Skipping generateSitemapFile: Key Message Sitemap does not exist');
deferred.resolve();
return deferred.promise;
}
// Filter array for:
// 'global' key Message
// 'sitemap'
// All Key Messages stored in hiddenKeyMessages presentation
filerKeyMessages = options.keyMessages.filter(function(item) {
return (item.key_message !== 'global' && item.key_message !== options.clm.product.name + options.clm.product.suffix + 'sitemap' && options.hiddenKeyMessages.indexOf(item) === -1);
});
filerKeyMessages.map(function(item) {
sitemapKeyMessages.push({
'section': item.key_message,
'source': item.key_message + '.html',
'title': item.description,
'slide': 1
});
});
fs.writeFile(options.paths.dist + '/' + options.clm.product.name + options.clm.product.suffix + 'sitemap/sitemap.json', JSON.stringify(sitemapKeyMessages), function(err, data) {
if (err) {
utils.log.error(err);
deferred.reject(err);
}
deferred.resolve();
});
return deferred.promise;
}
gulp.task('assemble', function() {
var deferred = Q.defer(),
arrKeyMessages = options.keyMessages;
// Remove the 'global' key Message from array
arrKeyMessages = arrKeyMessages.filter(function(item) {
return (item.key_message !== 'global');
});
// Single Key Message Mode?
if (options.deploy.keyMessage) {
arrKeyMessages.splice(0, arrKeyMessages.length);
arrKeyMessages.push(options.deploy.keyMessage);
}
utils.executeWhen(!options.modeSingleKeyMessage, assembleTemplates, '⤷ Assembling Key Messages')
// single Key Message Mode
.then(function() {
return utils.executeWhen(options.modeSingleKeyMessage, function() {
return assembleSingleTemplate(options.deploy.keyMessage);
}, '⤷ Assembling Single Key Message: ' + options.deploy.keyMessage.key_message);
})
.then(function() {
return utils.executeWhen(options.modeSingleKeyMessage, function() {
return assembleSingleTemplate({ 'key_message': 'global' });
}, '⤷ Assembling Global Key Message');
})
.then(function() {
return utils.executeWhen(options.modeSingleKeyMessage, function() {
return copyTemplateAssets({ 'key_message': 'global' });
}, '⤷ Copying Global Key Message Assets');
})
.then(function() {
return utils.executeWhen(options.modeSingleKeyMessage, function() {
return copyTemplateAssets(options.deploy.keyMessage);
}, '⤷ Copying Single Key Message Assets');
})
.then(function() {
return utils.executeWhen(!options.modeSingleKeyMessage, copyTemplateAssets, '⤷ Copying Key Message Assets');
})
.then(function() {
return utils.executeWhen(true, generateGlobalAppConfig, '⤷ Generating Global app.json file');
})
.then(function() {
return utils.executeWhen(!options.modeSingleKeyMessage, generateSitemapFile, '⤷ Generating sitemap.json file');
})
.then(function() {
utils.log.note('⤷ Copying Global Assets to Key Messages');
return handleGlobalAssets(arrKeyMessages);
})
.done(function() {
utils.log.success('Done Assembling Key Messages');
browserSync.reload();
deferred.resolve();
},
function(err) {
utils.log.error(err);
deferred.reject(err);
});
return deferred.promise;
});
gulp.task('assemble:test', function() {
var deferred = Q.defer();
options.modeSingleKeyMessage = true;
utils.executeWhen(!options.modeSingleKeyMessage, assembleTemplates, '⤷ Assembling Key Messages')
// single Key Message Mode
.then(function() {
return utils.executeWhen(options.modeSingleKeyMessage, function() {
return assembleSingleTemplate(options.deploy.keyMessage);
}, '⤷ Assembling Single Key Message: ' + options.deploy.keyMessage.key_message);
}).done(function() {
utils.log.success('Done Assembling Key Messages');
deferred.resolve();
},
function(err) {
utils.log.error(err);
deferred.reject(err);
});
return deferred.promise;
});
};