@incdevco/framework
Version:
node.js lambda framework
416 lines (308 loc) • 8.33 kB
JavaScript
var fs = require('fs');
var AWS = require('aws-sdk');
var eslint = require('gulp-eslint');
var gulp = require('gulp');
var gutil = require('gulp-util');
var karma = require('karma');
var mocha = require('gulp-mocha');
var Promise = require('bluebird');
require('@incdevco/framework/stream-promise');
var AssetsBucket;
var CertificateArn = 'REPLACE_WITH_ARN';
var DomainName = 'REPLACE_WITH_DOMAIN_NAME';
var EmailAddress = 'REPLACE_WITH_EMAIL_ADDRESS';
var GoogleClientId = 'REPLACE_WITH_GOOGLE_CLIENT_ID';
var LambdaPackages = {};
var MainStack;
var pkg = require('./package.json');
var plugins = require('@incdevco/framework/gulp');
var Stage = 'development';
if (gutil.env.stage) {
Stage = gutil.env.stage;
}
AWS.config.update({
region: 'us-west-2'
});
function getBuildFrontendPackagesConfig() {
return {
base: '/clients',
concat: {
before: [
'node_modules/crypto-js/crypto-js.js',
'node_modules/amazon-cognito-js/dist/amazon-cognito.min.js',
'node_modules/@incdevco/framework/dist/angular/modules/auth.js',
'node_modules/@incdevco/framework/dist/angular/modules/aws.js',
'node_modules/@incdevco/framework/dist/angular/modules/user.js',
'dist/clients/modules/*.js'
]
},
packages: {
www: {
replace: {
'CLIENT_BASE_URL_REPLACE': MainStack.Output.WwwClientUrl
}
}
},
replace: {
'COGNITO_IDENTITY_POOL_ID_REPLACE': MainStack.Output.CognitoIdentityPoolId,
'COGNITO_IDENTITY_POOL_REGION_REPLACE': MainStack.Output.Region,
'GOOGLE_SIGNIN_CLIENT_ID_REPLACE': GoogleClientId,
'VERSION_REPLACE': pkg.version
},
version: pkg.version
};
}
function getUploadAngularClientsConfig() {
return {
buckets: {
www: MainStack.Output.WwwClientBucket
}
};
}
function outputsArrayToObject(stack) {
stack.Output = {};
stack.Outputs.forEach(function (output) {
stack.Output[output.OutputKey] = output.OutputValue;
});
}
gulp.task('build-frontend-modules', [], function() {
return gulp.src('clients/modules/*/bootstrap.js')
.pipe(plugins.BuildAngularModules({
base: '/clients'
}))
.pipe(gulp.dest('dist/clients/modules'));
});
gulp.task('build-frontend-packages', [
'unit-test-frontend',
'build-frontend-modules',
'create-update-main-stack'
], function () {
var config = getBuildFrontendPackagesConfig();
return gulp.src([
'clients/*/index.html'
])
.pipe(plugins.BuildAngularClientPackages(config));
});
gulp.task('build-lambda-packages', [
'unit-test-backend'
], function () {
if (gutil.env['skip-build-lambda-packages']) {
return Promise.resolve(true);
}
return gulp.src([
'./lambda/*/index.js'
])
.pipe(plugins.BuildLambdaPackages({
packages: LambdaPackages
}));
});
gulp.task('create-update-assets-stack', [], function () {
return plugins.CreateUpdateCloudFormationStack('assets', {
Capabilities: [
'CAPABILITY_NAMED_IAM'
],
Parameters: [
{
ParameterKey: 'EmailAddress',
ParameterValue: EmailAddress
}
],
TemplateBody: fs.readFileSync('./node_modules/@incdevco/framework/aws/cloud-formation/templates/assets/stack.json', 'utf8')
})
.then(function (result) {
result.Outputs.forEach(function (output) {
if (output.OutputKey === 'AssetsBucket') {
AssetsBucket = output.OutputValue;
}
});
return result;
});
});
gulp.task('create-update-custom-cf-resource-stack', [
'upload-lambda-packages'
], function () {
return plugins.CreateUpdateCloudFormationStack('custom-cf-resource', {
Capabilities: [
'CAPABILITY_NAMED_IAM'
],
Parameters: [
{
ParameterKey: 'LambdaPackageS3ObjectVersion',
ParameterValue: LambdaPackages['custom-cf-resource'].S3ObjectVersion
}
],
TemplateBody: fs.readFileSync('./node_modules/@incdevco/framework/aws/cloud-formation/templates/custom-cf-resource/stack.json', 'utf8')
});
});
gulp.task('create-update-main-stack', [
'create-update-custom-cf-resource-stack',
'upload-cf-templates',
'upload-lambda-packages'
], function () {
var parameters = [
{
ParameterKey: 'CertificateArn',
ParameterValue: CertificateArn
},
{
ParameterKey: 'DomainName',
ParameterValue: DomainName
},
{
ParameterKey: 'GoogleClientId',
ParameterValue: GoogleClientId
},
{
ParameterKey: 'Stage',
ParameterValue: Stage
}
];
return plugins.CreateUpdateCloudFormationStack('main', {
Capabilities: [
'CAPABILITY_NAMED_IAM'
],
Parameters: parameters,
TemplateBody: fs.readFileSync('./stacks/main/stack.json', 'utf8')
})
.then(function (result) {
MainStack = result;
return result;
});
});
gulp.task('deploy', ['upload-frontend-packages']);
gulp.task('deploy-frontend', [
'unit-test-frontend',
'build-frontend-modules'
], function () {
var cf = new AWS.CloudFormation();
return cf.describeStacks({
StackName: 'main'
}).promise()
.then(function (result) {
result.Stacks.forEach(function (possible) {
if (possible.StackName === 'main') {
MainStack = possible;
outputsArrayToObject(MainStack);
}
});
if (!MainStack) {
throw new Error('Stack Does Not Exist');
}
var config = getBuildFrontendPackagesConfig();
return Promise.stream(gulp.src([
'clients/*/index.html'
])
.pipe(plugins.BuildAngularClientPackages(config)));
})
.then(function () {
var config = getUploadAngularClientsConfig();
//console.log(JSON.stringify(config, null, 2));
return Promise.stream(gulp.src([
'dist/clients/*/index.html'
])
.pipe(plugins.UploadAngularClientPackages(config)));
});
});
gulp.task('lint-backend', [], function () {
return gulp.src([
'./lambda/**/*.js'
])
.pipe(eslint({
envs: [
"mocha",
"node"
],
rules: {
},
useEslintrc: false
}))
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
gulp.task('lint-frontend', [], function () {
return gulp.src([
'./clients/**/*.js'
])
.pipe(eslint({
envs: [
"browser",
"jasmine"
],
rules: {
},
useEslintrc: false
}))
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
gulp.task('unit-test-backend', [
'lint-backend'
], function () {
return gulp.src([
'./lambda/**/*spec.js'
], {
read: false
})
.pipe(mocha({
reporter: 'spec'
}));
});
gulp.task('unit-test-frontend', [
'lint-frontend'
], function (done) {
new karma.Server({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function (error) {
console.log('error', error);
if (error) {
return done(new Error('Test(s) Failed'));
} else {
return done();
}
})
.start();
});
gulp.task('upload-cf-templates', [
'create-update-assets-stack',
'upload-incdevco-cf-templates'
], function() {
return gulp.src([
'./stacks/**/*.json'
])
.pipe(plugins.UploadCloudFormationTemplates({
bucket: AssetsBucket
}));
});
gulp.task('upload-incdevco-cf-templates', [
'create-update-assets-stack'
], function() {
return gulp.src([
'./node_modules/@incdevco/framework/aws/cloud-formation/templates/**/*.json'
])
.pipe(plugins.UploadCloudFormationTemplates({
bucket: AssetsBucket,
prefix: 'incdevco-cf-templates/'
}));
});
gulp.task('upload-frontend-packages', [
'build-frontend-packages'
], function () {
var config = getUploadAngularClientsConfig();
return gulp.src([
'dist/clients/*/index.html'
])
.pipe(plugins.UploadAngularClientPackages(config));
});
gulp.task('upload-lambda-packages', [
'build-lambda-packages',
'create-update-assets-stack'
], function () {
return gulp.src([
'./dist/lambda/*.zip'
])
.pipe(plugins.UploadLambdaPackages({
bucket: AssetsBucket,
packages: LambdaPackages
}));
});