UNPKG

@incdevco/framework

Version:
121 lines (73 loc) 2.49 kB
var crypto = require('crypto'); var AWS = require('aws-sdk'); var es = require('event-stream'); var gulp = require('gulp'); var gutil = require('gulp-util'); var mime = require('mime-types'); var defaultContentType = 'application/octet-stream'; var pluginName = 'upload-angular-package'; module.exports = function (config) { 'use strict'; var s3 = new AWS.S3(); config = config || {}; config.acl = config.acl || 'public-read'; config.cacheControl = config.cacheControl || 'max-age=0'; return es.map(function (client, done) { var bucket = config.bucket; var name = client.path.split('/').reverse()[1]; var src = client.path.replace('/index.html', ''); if (config.buckets) { bucket = config.buckets[name] || config.bucket; } gulp.src(src + '/**/*') .pipe(es.map(function (file, done) { if (!file.contents) { return done(); } var eTag = '"' + crypto.createHash('md5').update(file.contents).digest('hex') + '"'; var key = file.path.replace(file.base, ''); s3.headObject({ Bucket: bucket, Key: key }).promise() .then(function (result) { if (eTag === result.ETag) { return false; } else { return true; } }, function (exception) { console.log(bucket, key, exception.code); if (exception.code === 'NotFound') { return true; } throw exception; }) .then(function (upload) { if (upload) { gutil.log('uploading', bucket, key); return s3.putObject({ Bucket: bucket, Key: key, ACL: config.acl, Body: file.contents, CacheControl: config.cacheControl, ContentType: mime.lookup(file.path) || defaultContentType }).promise() .then(function () { gutil.log('uploaded', bucket, key); return true; }); } return false; }) .then(function () { done(); }) .catch(done); })) .on('error', done) .on('end', done); }); };