├── .gitignore ├── optimize.js ├── package-lock.json ├── package.json └── serverless.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /optimize.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const AWS = require("aws-sdk"); 4 | const sharp = require("sharp"); 5 | const { basename, extname } = require("path"); 6 | 7 | const S3 = new AWS.S3(); 8 | 9 | module.exports.handle = async ({ Records: records }, context) => { 10 | try { 11 | await Promise.all( 12 | records.map(async record => { 13 | const { key } = record.s3.object; 14 | 15 | const image = await S3.getObject({ 16 | Bucket: process.env.bucket, 17 | Key: key 18 | }).promise(); 19 | 20 | const optimized = await sharp(image.Body) 21 | .resize(1280, 720, { fit: "inside", withoutEnlargement: true }) 22 | .toFormat("jpeg", { progressive: true, quality: 50 }) 23 | .toBuffer(); 24 | 25 | await S3.putObject({ 26 | Body: optimized, 27 | Bucket: process.env.bucket, 28 | ContentType: "image/jpeg", 29 | Key: `compressed/${basename(key, extname(key))}.jpg` 30 | }).promise(); 31 | }) 32 | ); 33 | 34 | return { 35 | statusCode: 301, 36 | body: { ok: true } 37 | }; 38 | } catch (err) { 39 | return err; 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodeless", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-regex": { 8 | "version": "2.1.1", 9 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 10 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 11 | }, 12 | "aproba": { 13 | "version": "1.2.0", 14 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 15 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 16 | }, 17 | "are-we-there-yet": { 18 | "version": "1.1.5", 19 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 20 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 21 | "requires": { 22 | "delegates": "^1.0.0", 23 | "readable-stream": "^2.0.6" 24 | } 25 | }, 26 | "bindings": { 27 | "version": "1.4.0", 28 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.4.0.tgz", 29 | "integrity": "sha512-7znEVX22Djn+nYjxCWKDne0RRloa9XfYa84yk3s+HkE3LpDYZmhArYr9O9huBoHY3/oXispx5LorIX7Sl2CgSQ==", 30 | "requires": { 31 | "file-uri-to-path": "1.0.0" 32 | } 33 | }, 34 | "bl": { 35 | "version": "1.2.2", 36 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 37 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 38 | "requires": { 39 | "readable-stream": "^2.3.5", 40 | "safe-buffer": "^5.1.1" 41 | } 42 | }, 43 | "buffer-alloc": { 44 | "version": "1.2.0", 45 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 46 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 47 | "requires": { 48 | "buffer-alloc-unsafe": "^1.1.0", 49 | "buffer-fill": "^1.0.0" 50 | } 51 | }, 52 | "buffer-alloc-unsafe": { 53 | "version": "1.1.0", 54 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 55 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 56 | }, 57 | "buffer-fill": { 58 | "version": "1.0.0", 59 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 60 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 61 | }, 62 | "chownr": { 63 | "version": "1.1.1", 64 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", 65 | "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" 66 | }, 67 | "code-point-at": { 68 | "version": "1.1.0", 69 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 70 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 71 | }, 72 | "color": { 73 | "version": "3.1.0", 74 | "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", 75 | "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", 76 | "requires": { 77 | "color-convert": "^1.9.1", 78 | "color-string": "^1.5.2" 79 | } 80 | }, 81 | "color-convert": { 82 | "version": "1.9.3", 83 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 84 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 85 | "requires": { 86 | "color-name": "1.1.3" 87 | } 88 | }, 89 | "color-name": { 90 | "version": "1.1.3", 91 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 92 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 93 | }, 94 | "color-string": { 95 | "version": "1.5.3", 96 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", 97 | "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", 98 | "requires": { 99 | "color-name": "^1.0.0", 100 | "simple-swizzle": "^0.2.2" 101 | } 102 | }, 103 | "console-control-strings": { 104 | "version": "1.1.0", 105 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 106 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 107 | }, 108 | "core-util-is": { 109 | "version": "1.0.2", 110 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 111 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 112 | }, 113 | "decompress-response": { 114 | "version": "3.3.0", 115 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 116 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 117 | "requires": { 118 | "mimic-response": "^1.0.0" 119 | } 120 | }, 121 | "deep-extend": { 122 | "version": "0.6.0", 123 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 124 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 125 | }, 126 | "delegates": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 129 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 130 | }, 131 | "detect-libc": { 132 | "version": "1.0.3", 133 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 134 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 135 | }, 136 | "end-of-stream": { 137 | "version": "1.4.1", 138 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 139 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 140 | "requires": { 141 | "once": "^1.4.0" 142 | } 143 | }, 144 | "expand-template": { 145 | "version": "2.0.3", 146 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 147 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 148 | }, 149 | "file-uri-to-path": { 150 | "version": "1.0.0", 151 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 152 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 153 | }, 154 | "fs-constants": { 155 | "version": "1.0.0", 156 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 157 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 158 | }, 159 | "fs-copy-file-sync": { 160 | "version": "1.1.1", 161 | "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", 162 | "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==" 163 | }, 164 | "fs-minipass": { 165 | "version": "1.2.5", 166 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", 167 | "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", 168 | "requires": { 169 | "minipass": "^2.2.1" 170 | } 171 | }, 172 | "gauge": { 173 | "version": "2.7.4", 174 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 175 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 176 | "requires": { 177 | "aproba": "^1.0.3", 178 | "console-control-strings": "^1.0.0", 179 | "has-unicode": "^2.0.0", 180 | "object-assign": "^4.1.0", 181 | "signal-exit": "^3.0.0", 182 | "string-width": "^1.0.1", 183 | "strip-ansi": "^3.0.1", 184 | "wide-align": "^1.1.0" 185 | } 186 | }, 187 | "github-from-package": { 188 | "version": "0.0.0", 189 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 190 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 191 | }, 192 | "has-unicode": { 193 | "version": "2.0.1", 194 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 195 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 196 | }, 197 | "inherits": { 198 | "version": "2.0.3", 199 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 200 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 201 | }, 202 | "ini": { 203 | "version": "1.3.5", 204 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 205 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 206 | }, 207 | "is-arrayish": { 208 | "version": "0.3.2", 209 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 210 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 211 | }, 212 | "is-fullwidth-code-point": { 213 | "version": "1.0.0", 214 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 215 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 216 | "requires": { 217 | "number-is-nan": "^1.0.0" 218 | } 219 | }, 220 | "isarray": { 221 | "version": "1.0.0", 222 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 223 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 224 | }, 225 | "mimic-response": { 226 | "version": "1.0.1", 227 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 228 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 229 | }, 230 | "minimist": { 231 | "version": "1.2.0", 232 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 233 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 234 | }, 235 | "minipass": { 236 | "version": "2.3.5", 237 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", 238 | "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", 239 | "requires": { 240 | "safe-buffer": "^5.1.2", 241 | "yallist": "^3.0.0" 242 | } 243 | }, 244 | "minizlib": { 245 | "version": "1.2.1", 246 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", 247 | "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", 248 | "requires": { 249 | "minipass": "^2.2.1" 250 | } 251 | }, 252 | "mkdirp": { 253 | "version": "0.5.1", 254 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 255 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 256 | "requires": { 257 | "minimist": "0.0.8" 258 | }, 259 | "dependencies": { 260 | "minimist": { 261 | "version": "0.0.8", 262 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 263 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 264 | } 265 | } 266 | }, 267 | "nan": { 268 | "version": "2.12.1", 269 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", 270 | "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" 271 | }, 272 | "napi-build-utils": { 273 | "version": "1.0.1", 274 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", 275 | "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==" 276 | }, 277 | "node-abi": { 278 | "version": "2.7.1", 279 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", 280 | "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", 281 | "requires": { 282 | "semver": "^5.4.1" 283 | } 284 | }, 285 | "noop-logger": { 286 | "version": "0.1.1", 287 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 288 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 289 | }, 290 | "npmlog": { 291 | "version": "4.1.2", 292 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 293 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 294 | "requires": { 295 | "are-we-there-yet": "~1.1.2", 296 | "console-control-strings": "~1.1.0", 297 | "gauge": "~2.7.3", 298 | "set-blocking": "~2.0.0" 299 | } 300 | }, 301 | "number-is-nan": { 302 | "version": "1.0.1", 303 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 304 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 305 | }, 306 | "object-assign": { 307 | "version": "4.1.1", 308 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 309 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 310 | }, 311 | "once": { 312 | "version": "1.4.0", 313 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 314 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 315 | "requires": { 316 | "wrappy": "1" 317 | } 318 | }, 319 | "os-homedir": { 320 | "version": "1.0.2", 321 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 322 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 323 | }, 324 | "prebuild-install": { 325 | "version": "5.2.4", 326 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.4.tgz", 327 | "integrity": "sha512-CG3JnpTZXdmr92GW4zbcba4jkDha6uHraJ7hW4Fn8j0mExxwOKK20hqho8ZuBDCKYCHYIkFM1P2jhtG+KpP4fg==", 328 | "requires": { 329 | "detect-libc": "^1.0.3", 330 | "expand-template": "^2.0.3", 331 | "github-from-package": "0.0.0", 332 | "minimist": "^1.2.0", 333 | "mkdirp": "^0.5.1", 334 | "napi-build-utils": "^1.0.1", 335 | "node-abi": "^2.7.0", 336 | "noop-logger": "^0.1.1", 337 | "npmlog": "^4.0.1", 338 | "os-homedir": "^1.0.1", 339 | "pump": "^2.0.1", 340 | "rc": "^1.2.7", 341 | "simple-get": "^2.7.0", 342 | "tar-fs": "^1.13.0", 343 | "tunnel-agent": "^0.6.0", 344 | "which-pm-runs": "^1.0.0" 345 | }, 346 | "dependencies": { 347 | "simple-get": { 348 | "version": "2.8.1", 349 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", 350 | "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", 351 | "requires": { 352 | "decompress-response": "^3.3.0", 353 | "once": "^1.3.1", 354 | "simple-concat": "^1.0.0" 355 | } 356 | } 357 | } 358 | }, 359 | "process-nextick-args": { 360 | "version": "2.0.0", 361 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 362 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 363 | }, 364 | "pump": { 365 | "version": "2.0.1", 366 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 367 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 368 | "requires": { 369 | "end-of-stream": "^1.1.0", 370 | "once": "^1.3.1" 371 | } 372 | }, 373 | "rc": { 374 | "version": "1.2.8", 375 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 376 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 377 | "requires": { 378 | "deep-extend": "^0.6.0", 379 | "ini": "~1.3.0", 380 | "minimist": "^1.2.0", 381 | "strip-json-comments": "~2.0.1" 382 | } 383 | }, 384 | "readable-stream": { 385 | "version": "2.3.6", 386 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 387 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 388 | "requires": { 389 | "core-util-is": "~1.0.0", 390 | "inherits": "~2.0.3", 391 | "isarray": "~1.0.0", 392 | "process-nextick-args": "~2.0.0", 393 | "safe-buffer": "~5.1.1", 394 | "string_decoder": "~1.1.1", 395 | "util-deprecate": "~1.0.1" 396 | } 397 | }, 398 | "safe-buffer": { 399 | "version": "5.1.2", 400 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 401 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 402 | }, 403 | "semver": { 404 | "version": "5.6.0", 405 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 406 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 407 | }, 408 | "set-blocking": { 409 | "version": "2.0.0", 410 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 411 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 412 | }, 413 | "sharp": { 414 | "version": "0.21.3", 415 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.21.3.tgz", 416 | "integrity": "sha512-5qZk8r+YgfyztLEKkNez20Wynq/Uh1oNyP5T/3gTYwt2lBYGs9iDs5m0yVsZEPm8eVBbAJhS08J1wp/g+Ai1Qw==", 417 | "requires": { 418 | "bindings": "^1.3.1", 419 | "color": "^3.1.0", 420 | "detect-libc": "^1.0.3", 421 | "fs-copy-file-sync": "^1.1.1", 422 | "nan": "^2.12.1", 423 | "npmlog": "^4.1.2", 424 | "prebuild-install": "^5.2.2", 425 | "semver": "^5.6.0", 426 | "simple-get": "^3.0.3", 427 | "tar": "^4.4.8", 428 | "tunnel-agent": "^0.6.0" 429 | } 430 | }, 431 | "signal-exit": { 432 | "version": "3.0.2", 433 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 434 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 435 | }, 436 | "simple-concat": { 437 | "version": "1.0.0", 438 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 439 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 440 | }, 441 | "simple-get": { 442 | "version": "3.0.3", 443 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.3.tgz", 444 | "integrity": "sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==", 445 | "requires": { 446 | "decompress-response": "^3.3.0", 447 | "once": "^1.3.1", 448 | "simple-concat": "^1.0.0" 449 | } 450 | }, 451 | "simple-swizzle": { 452 | "version": "0.2.2", 453 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 454 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 455 | "requires": { 456 | "is-arrayish": "^0.3.1" 457 | } 458 | }, 459 | "string-width": { 460 | "version": "1.0.2", 461 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 462 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 463 | "requires": { 464 | "code-point-at": "^1.0.0", 465 | "is-fullwidth-code-point": "^1.0.0", 466 | "strip-ansi": "^3.0.0" 467 | } 468 | }, 469 | "string_decoder": { 470 | "version": "1.1.1", 471 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 472 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 473 | "requires": { 474 | "safe-buffer": "~5.1.0" 475 | } 476 | }, 477 | "strip-ansi": { 478 | "version": "3.0.1", 479 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 480 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 481 | "requires": { 482 | "ansi-regex": "^2.0.0" 483 | } 484 | }, 485 | "strip-json-comments": { 486 | "version": "2.0.1", 487 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 488 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 489 | }, 490 | "tar": { 491 | "version": "4.4.8", 492 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", 493 | "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", 494 | "requires": { 495 | "chownr": "^1.1.1", 496 | "fs-minipass": "^1.2.5", 497 | "minipass": "^2.3.4", 498 | "minizlib": "^1.1.1", 499 | "mkdirp": "^0.5.0", 500 | "safe-buffer": "^5.1.2", 501 | "yallist": "^3.0.2" 502 | } 503 | }, 504 | "tar-fs": { 505 | "version": "1.16.3", 506 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", 507 | "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", 508 | "requires": { 509 | "chownr": "^1.0.1", 510 | "mkdirp": "^0.5.1", 511 | "pump": "^1.0.0", 512 | "tar-stream": "^1.1.2" 513 | }, 514 | "dependencies": { 515 | "pump": { 516 | "version": "1.0.3", 517 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 518 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 519 | "requires": { 520 | "end-of-stream": "^1.1.0", 521 | "once": "^1.3.1" 522 | } 523 | } 524 | } 525 | }, 526 | "tar-stream": { 527 | "version": "1.6.2", 528 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 529 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 530 | "requires": { 531 | "bl": "^1.0.0", 532 | "buffer-alloc": "^1.2.0", 533 | "end-of-stream": "^1.0.0", 534 | "fs-constants": "^1.0.0", 535 | "readable-stream": "^2.3.0", 536 | "to-buffer": "^1.1.1", 537 | "xtend": "^4.0.0" 538 | } 539 | }, 540 | "to-buffer": { 541 | "version": "1.1.1", 542 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 543 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 544 | }, 545 | "tunnel-agent": { 546 | "version": "0.6.0", 547 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 548 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 549 | "requires": { 550 | "safe-buffer": "^5.0.1" 551 | } 552 | }, 553 | "util-deprecate": { 554 | "version": "1.0.2", 555 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 556 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 557 | }, 558 | "which-pm-runs": { 559 | "version": "1.0.0", 560 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 561 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 562 | }, 563 | "wide-align": { 564 | "version": "1.1.3", 565 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 566 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 567 | "requires": { 568 | "string-width": "^1.0.2 || 2" 569 | } 570 | }, 571 | "wrappy": { 572 | "version": "1.0.2", 573 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 574 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 575 | }, 576 | "xtend": { 577 | "version": "4.0.1", 578 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 579 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 580 | }, 581 | "yallist": { 582 | "version": "3.0.3", 583 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 584 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" 585 | } 586 | } 587 | } 588 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodeless", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "optimize.js", 6 | "dependencies": { 7 | "sharp": "^0.21.3" 8 | }, 9 | "devDependencies": {}, 10 | "scripts": { 11 | "predeploy": "rm -rf node_modules/sharp && npm install --platform=linux --arch=x64 --target=8.10.0 sharp", 12 | "deploy": "serverless deploy -v", 13 | "postdeploy": "rm -rf node_modules/sharp && npm install sharp" 14 | }, 15 | "keywords": [], 16 | "author": "", 17 | "license": "ISC" 18 | } 19 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | service: nodeless # NOTE: update this with your service name 2 | 3 | provider: 4 | name: aws 5 | runtime: nodejs8.10 6 | region: sa-east-1 7 | memorySize: 256 8 | iamRoleStatements: 9 | - Effect: Allow 10 | Action: 11 | - s3:GetObject 12 | - s3:PutObject 13 | Resource: 14 | - "arn:aws:s3:::*" 15 | 16 | functions: 17 | optimize: 18 | handler: optimize.handle 19 | environment: 20 | bucket: rocketnodeserverless 21 | events: 22 | - s3: 23 | bucket: rocketnodeserverless 24 | event: s3:ObjectCreated:* 25 | rules: 26 | - prefix: uploads/ 27 | - suffix: .jpg 28 | - s3: 29 | bucket: rocketnodeserverless 30 | event: s3:ObjectCreated:* 31 | rules: 32 | - prefix: uploads/ 33 | - suffix: .png 34 | --------------------------------------------------------------------------------