UNPKG

@incdevco/framework

Version:
416 lines (308 loc) 8.33 kB
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 })); });