@incdevco/framework
Version:
node.js lambda framework
274 lines (152 loc) • 6.53 kB
JavaScript
var crypto = require('crypto');
var del = require('del');
var es = require('event-stream');
var exec = require('child_process').exec;
var fs = require('fs');
var gulp = require('gulp');
var mkdirp = require('mkdirp');
var Promise = require('bluebird');
var spawn = require('child_process').spawn;
var zip = require('gulp-vinyl-zip');
var StreamPromise = require('../../stream-promise');
// lambda/*/index.js
module.exports = function (config) {
'use strict';
var promise = Promise.resolve(true);
config = config || {};
config.dest = config.dest || 'dist/lambda';
config.packages = config.packages || {};
return es.map(function (lambda, done) {
var name = lambda.path.split('/').reverse()[1];
var dest = config.dest + '/' + name;
var src = lambda.path.replace('/index.js', '');
promise = promise.then(function () {
mkdirp.sync(dest);
return del(dest)
.then(function () {
return new Promise(function (resolve, reject) {
exec('cp -Lr ' + src + ' ' + config.dest, function(exception) {
if (exception) {
reject(exception);
} else {
resolve(true);
}
});
});
})
.then(function () {
var dependencies, promise = Promise.resolve(true);
if (fs.existsSync(src + '/deps.json')) {
dependencies = fs.readFileSync(src + '/deps.json', 'utf8');
if (dependencies) {
dependencies = JSON.parse(dependencies);
}
} else if (fs.existsSync(src + '/dependencies.json')) {
dependencies = fs.readFileSync(src + '/dependencies.json', 'utf8');
if (dependencies) {
dependencies = JSON.parse(dependencies);
}
}
if (dependencies) {
dependencies.forEach(function (dep) {
promise = promise.then(function () {
return StreamPromise(gulp.src([
'./node_modules/' + dep + '/**/*'
])
.pipe(gulp.dest(dest + '/node_modules/' + dep)));
});
});
} else {
var deps = [
'./node_modules/**/*'
];
if (fs.existsSync(src + '/ignore-dependencies.json')) {
var ignoreDeps = fs.readFileSync(src + '/ignore-dependencies.json', 'utf8');
if (ignoreDeps) {
ignoreDeps = JSON.parse(ignoreDeps);
}
}
promise = new Promise(function (resolve, reject) {
exec('cp -r ./node_modules ' + dest, function (exception, stdout, stderr) {
if (exception) {
reject(exception);
} else {
resolve(true);
}
});
})
.then(function () {
if (ignoreDeps && ignoreDeps.length) {
return new Promise(function (resolve, reject) {
var command = 'rm -rf';
ignoreDeps.forEach(function(dep) {
command += ' ' + dest + '/node_modules/' + dep;
});
//console.log('command', command);
/*
exec('pwd', function(exception, stdout, stderr) {
console.log('pwd', stdout);
resolve(true);
});
*/
exec(command, function(exception, stdout, stderr) {
if (exception) {
reject(exception);
} else {
resolve(true);
}
});
});
}
return true;
});
}
return promise;
})
.then(function () {
var includes, promise = Promise.resolve(true);
if (fs.existsSync(src + '/includes.json')) {
includes = fs.readFileSync(src + '/includes.json', 'utf8');
if (includes) {
includes = JSON.parse(includes);
}
}
if (includes) {
includes.forEach(function (inc) {
promise = promise.then(function () {
return StreamPromise(gulp.src([
inc + '/**/*'
])
.pipe(gulp.dest(dest + '/' + inc)));
});
});
}
return promise;
})
.then(function () {
return new Promise(function (resolve, reject) {
var command = 'cd ' + dest;
var options = {
maxBuffer: 1025 * 500
};
command += ' && zip -J -q -r -u ../' + name + '.zip *';
exec(command, options, function(exception, stdout, stderr) {
if (exception) {
reject(exception);
} else {
resolve(true);
}
});
});
})
.then(function () {
config.packages[name] = config.packages[name] || {};
config.packages[name].sha256 = crypto.createHash('sha256')
.update(fs.readFileSync(dest + '.zip'))
.digest('hex');
done();
})
.catch(done);
});
});
};