UNPKG

4.03 kBJavaScriptView Raw
1var aws
2var async
3var mime
4var fileStuff
5var glob
6var path
7var fs
8
9var manifest
10
11var exports = {
12 deploy : deploy,
13 isDeployable : isDeployable,
14 getDeployableFiles : getDeployableFiles,
15 doUpload : doUpload,
16 getBucketObjects : getBucketObjects,
17 shouldBeUploaded : shouldBeUploaded
18}
19
20module.exports = function(gulpManifest, deps) {
21 if(deps) {
22 aws = deps.awssdk
23 async = deps.async
24 mime = deps.mime
25 fileStuff = deps.fileStuff
26 glob = deps.glob
27 fs = deps.fs
28 path = deps.path
29 }
30 else {
31 aws = require('aws-sdk')
32 async = require('async')
33 mime = require('mime')
34 glob = require('glob')
35 path = require('path')
36 fs = require('fs')
37 fileStuff = require(path.dirname(__filename) + '/fileStuff.js')()
38 }
39
40 manifest = gulpManifest
41 return exports
42}
43
44//------------------------------------------------------------
45
46function deploy(pkgIndex, destIndex, cb) {
47
48 try{
49
50 var dest = manifest[pkgIndex]["dest"][destIndex]
51
52 if(!exports.isDeployable(dest)) {
53 cb()
54 return
55 }
56
57 var creds = new aws.SharedIniFileCredentials({profile: dest.awsCredentialsProfile});
58 aws.config.credentials = creds
59 var s3 = new aws.S3()
60
61 exports.getBucketObjects(s3, dest.s3Bucket, function(err, data){
62
63 if(err) {
64 cb(err)
65 return
66 }
67
68 var objects = data
69
70 try{
71 var deployableFiles = exports.getDeployableFiles(dest.directory)
72 }
73 catch(err){
74 cb(err)
75 return
76 }
77
78 var prefix = (dest.s3Prefix === undefined? "" : dest.s3Prefix + "/")
79 var cacheControl = (dest.s3CacheControl === undefined? "" : dest.s3CacheControl)
80 if(prefix === "/") prefix = ""
81
82 async.each(deployableFiles, function(file, cb){
83
84 if(exports.shouldBeUploaded(objects, file, prefix)){
85 var filekey = prefix + file.key
86 exports.doUpload(dest.s3Bucket, file.path, filekey, cacheControl, s3, cb)
87 }
88 else {
89 cb()
90 }
91 },
92 function(err) {
93 if(err) cb(err)
94 else {
95 console.log("")
96 console.log("DONE DEPLOYING")
97 console.log("")
98 cb()
99 }
100 })
101 })
102 }
103 catch(err) {
104 cb(err)
105 return
106 }
107}
108
109function getBucketObjects(s3, bucketName, cb){
110 s3.listObjects({Bucket:bucketName}, function(err, data){
111
112 if(err) {
113 cb(err)
114 return
115 }
116
117 var objects = []
118
119 for(var i in data.Contents){
120 objects.push({
121 key: data.Contents[i].Key,
122 lastModified: (new Date(data.Contents[i].LastModified)).getTime()
123 })
124 }
125
126 cb(null, objects)
127 })
128}
129
130function shouldBeUploaded(objects, file, prefix) {
131
132 var fullKey = prefix + file.key
133 var lastModified
134
135 for(var i in objects){
136 if(objects[i].key === fullKey) {
137 lastModified = objects[i].lastModified
138 break
139 }
140 }
141
142 if(lastModified === undefined) {
143 return true
144 }
145 else {
146 return fileStuff.fileIsNewer(file.path, lastModified)
147 }
148}
149
150function doUpload(bucket, filePath, key, cacheControl, s3, cb) {
151 console.log("Uploading file: ", key)
152
153 var params = { Bucket: bucket,
154 Key: key,
155 ContentType: mime.lookup(filePath),
156 Body: fs.createReadStream(filePath),
157 ACL: 'public-read'
158 }
159
160 if(cacheControl !== "") {
161 params.CacheControl = cacheControl
162 }
163
164 var options = {}
165
166 s3.upload(params, options, function(err, data){
167 if(err) cb(err)
168 else {
169 console.log("Finished uploading: ", key)
170 cb()
171 }
172 })
173}
174
175
176function isDeployable(dest) {
177 if(dest.s3Bucket && dest.awsCredentialsProfile) return true
178 return false
179}
180
181
182function getDeployableFiles(directory) {
183
184 var distDirectory = path.normalize(directory)
185 if(distDirectory !== "") distDirectory += "/"
186
187
188 var allFiles = glob.sync(distDirectory + '**')
189 var result = []
190
191 for(var i in allFiles){
192 if(!fileStuff.fileIsDirectory(allFiles[i])) {
193 var key = path.relative(distDirectory, allFiles[i]).replace(/\\/g, '/')
194 result.push({"path" : allFiles[i], "key" : key})
195 }
196 }
197 return result
198}
199
200