@incdevco/framework
Version:
node.js lambda framework
342 lines (215 loc) • 8.6 kB
JavaScript
var path = require('path');
var concat = require('gulp-concat');
var del = require('del');
var es = require('event-stream');
var gulp = require('gulp');
var gulpif = require('gulp-if');
var gutil = require('gulp-util');
var angularTemplateInjection = require('../angular-template-injection');
var order = require('gulp-order');
var Promise = require('bluebird');
var StreamPromise = require('../../stream-promise');
var uglify = require('gulp-uglify');
var Utilities = require('../../utilities');
module.exports = function (config) {
'use strict';
var promise = Promise.resolve(true);
config = config || {};
config.base = config.base || '';
config.concat = config.concat || {};
config.dest = config.dest || 'dist/clients';
config.templatesModuleName = config.templatesModuleName || 'main';
config.uglify = config.uglify || false;
config.version = config.version || '';
return es.map(function(client, done) {
var name = client.path.split('/').reverse()[1];
var src = client.path.replace('/index.html', '');
var dest = config.dest + '/' + name;
var base = config.base + '/' + name;
var replace;
var sw;
//console.log('build-angular-client-package');
if (config.replace) {
replace = Utilities.copy(config.replace);
}
if (config.packages && config.packages[name]) {
if (config.packages[name].replace) {
if (!replace) {
replace = {};
}
Object.keys(config.packages[name].replace).forEach(function(key) {
replace[key] = config.packages[name].replace[key];
});
}
if (config.packages[name].sw) {
sw = config.packages[name].sw;
}
}
promise = promise.then(function () {
return del(dest)
.then(function() {
//console.log('del');
return Promise.stream(gulp.src(src + '/modules/*')
.pipe(es.map(function (module, done) {
var name = module.path.split('/').reverse()[0];
es.merge([
gulp.src([
module.path + '/*.js',
'!' + module.path + '/*spec*.js'
]),
gulp.src(module.path + '/templates/**/*.html')
.pipe(angularTemplateInjection(name, 'templates.js', base + '/modules/'))
])
.pipe(order([
'bootstrap.js'
]))
.pipe(concat(name + '.js'))
.pipe(es.through(function (file) {
done(null, file);
}));
}))
.pipe(concat('modules.js'))
.pipe(gulp.dest(dest)));
})
.then(function () {
//console.log('modules');
return Promise.stream(gulp.src(src + '/templates/**/*.html')
.pipe(angularTemplateInjection(config.templatesModuleName, 'templates.js', base + '/'))
.pipe(gulp.dest(dest)));
})
.then(function () {
//console.log('concat');
var files = [];
files = files.concat(config.concat.before || []);
files.push(dest + '/modules.js');
files.push(src + '/*.js');
if (sw) {
files.push('!' + src + '/sw.js');
}
files.push('!' + src + '/*spec*.js');
files.push(dest + '/templates.js');
files = files.concat(config.concat.after || []);
return Promise.stream(gulp.src(files)
.pipe(es.through(function (file) {
if (replace) {
var contents = file.contents.toString('utf8');
Object.keys(replace).forEach(function (key) {
contents = contents.replace(new RegExp(key, 'g'), replace[key]);
});
var cloned = new gutil.File({
base: file.base,
contents: new Buffer(contents, 'utf8'),
path: file.path
});
this.emit('data', cloned);
} else {
this.emit('data', file);
}
}))
.pipe(concat('application.js'))
.pipe(es.through(function(file) {
var contents = file.contents.toString('utf8');
contents = '(function () {\n\n' + contents + '\n\n})();';
var cloned = new gutil.File({
base: file.base,
contents: new Buffer(contents, 'utf8'),
path: file.path
});
this.emit('data', cloned);
}))
.pipe(gulpif(config.uglify, uglify()))
.pipe(gulp.dest(dest + '/' + config.version)));
})
.then(function () {
return del([
dest + '/modules.js',
dest + '/templates.js'
]);
})
.then(function () {
return Promise.stream(gulp.src([
src + '/css/**/*'
])
.pipe(gulp.dest(dest + '/' + config.version + '/css')));
})
.then(function () {
return Promise.stream(gulp.src([
src + '/images/**/*'
])
.pipe(gulp.dest(dest + '/' + config.version + '/images')));
})
.then(function () {
//console.log('copy');
return Promise.stream(gulp.src([
src + '/**/*',
'!' + src + '/**/*.js',
'!' + src + '/modules/**/*',
'!' + src + '/css/**/*',
'!' + src + '/images/*',
'!' + src + '/templates/**/*'
])
.pipe(es.through(function(file) {
var ext = path.extname(file.path);
//console.log('ext', ext);
if (file.contents
&& ext === '.html'
&& replace) {
var contents = file.contents.toString('utf8');
Object.keys(replace).forEach(function (key) {
contents = contents.replace(new RegExp(key, 'g'), replace[key]);
});
var cloned = new gutil.File({
base: file.base,
contents: new Buffer(contents, 'utf8'),
path: file.path
});
this.emit('data', cloned);
} else {
this.emit('data', file);
}
}))
.pipe(gulp.dest(dest)));
})
.then(function () {
var promises = [];
if (config.include) {
Object.keys(config.include).forEach(function(key) {
promises.push(Promise.stream(gulp.src(key)
.pipe(gulp.dest(dest + '/' + config.version + config.include[key]))));
});
}
return Promise.all(promises);
})
.then(function () {
if (sw) {
//console.log('sw');
return Promise.stream(gulp.src(src + '/' + sw)
.pipe(es.through(function(file) {
//console.log('file.path', file.path);
if (file.contents && replace) {
var contents = file.contents.toString('utf8');
Object.keys(replace).forEach(function (key) {
//console.log('file.path', file.path, key);
contents = contents.replace(new RegExp(key, 'g'), replace[key]);
});
var cloned = new gutil.File({
base: file.base,
contents: new Buffer(contents, 'utf8'),
path: file.path
});
this.emit('data', cloned);
} else {
this.emit('data', file);
}
}))
.pipe(gulp.dest(dest)));
}
return true;
})
.then(function () {
done();
})
.catch(done);
});
});
};