├── .env.example ├── .gitignore ├── LICENSE ├── README.md ├── files ├── derek-thomson-443919-unsplash.jpg └── test.txt ├── lib └── aws-s3.js ├── main.js ├── package-lock.json └── package.json /.env.example: -------------------------------------------------------------------------------- 1 | AWS_S3_REGION="" 2 | AWS_S3_ACCESS_KEY_ID="" 3 | AWS_S3_SECRET_ACCESS_KEY="" 4 | AWS_S3_BUCKET_NAME="" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Maciej Lisowski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-s3-example 2 | Example implementation of NodeJS and Amazon Simple Storage Service (Amazon S3) 3 | 4 | Feel free to use it however you want to :-) 5 | 6 | This repository is part of article posted on LinkedIN: [NodeJS - Resizing Images and Uploading Files to Amazon S3](https://www.linkedin.com/pulse/nodejs-resizing-images-uploading-files-amazons3-mac-lisowski) 7 | 8 | ## Run project 9 | ``` 10 | node main.js 11 | ``` 12 | 13 | ## License 14 | 15 | This package is under MIT License (MIT). Please see LICENSE file for more details. 16 | 17 | Copyright (c) 2018 Maciej Lisowski -------------------------------------------------------------------------------- /files/derek-thomson-443919-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mac-lisowski/node-s3-example/2added1bc96a8f36d73a2fa0e456b72b1e6f771e/files/derek-thomson-443919-unsplash.jpg -------------------------------------------------------------------------------- /files/test.txt: -------------------------------------------------------------------------------- 1 | Upload to Amazon S3 -------------------------------------------------------------------------------- /lib/aws-s3.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const AWS = require("aws-sdk"); 3 | const Sharp = require("sharp"); 4 | 5 | /** 6 | * AWSS3 Example of simple class with basic functionality used to upload 7 | * files to Amaozn S3 bucket 8 | * 9 | * @author Maciej Lisowski 10 | * @since 2018-11-27 11 | */ 12 | class AWSS3 { 13 | constructor() { 14 | // Amazon SES configuration 15 | this.config = { 16 | // current version of Amazon S3 API (see: https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html) 17 | apiVersion: "2006-03-01", 18 | accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID, 19 | secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY, 20 | region: process.env.AWS_S3_REGION 21 | }; 22 | 23 | this.s3 = new AWS.S3(this.config); 24 | } 25 | 26 | /** 27 | * S3Upload method used to upload file from given location into Amazon S3 Bucket 28 | * If you are uploading an image you can sepcify param resize and create 29 | * ne thumbnail to be uploaded to S3 bucket 30 | * 31 | * @author Maciej Lisowski 32 | * @since 2018-11-27 33 | * @param {String} filepath 34 | * @param {String} name 35 | * @param {JSON} options eg. { resize: { width: 300, height: 400 } } 36 | * @return 37 | */ 38 | upload(filepath, name, options) { 39 | return new Promise((resolve, reject) => { 40 | // check if file exist 41 | if (fs.existsSync(filepath)) { 42 | let res = { 43 | filepath: filepath, 44 | data: [] 45 | }; 46 | // upload file 47 | let fileBinaryString = fs.readFileSync(filepath, null); 48 | let params = { 49 | Body: fileBinaryString, 50 | Bucket: process.env.AWS_S3_BUCKET_NAME, 51 | Key: name 52 | }; 53 | 54 | this.s3.putObject(params, (e, d) => { 55 | if (e) { 56 | reject(e); 57 | } 58 | 59 | d.name = name; 60 | res.data.push(d); 61 | 62 | // check if we should create resized copy of uploaded file 63 | if ( 64 | typeof options !== "undefined" && 65 | typeof options.resize !== "undefined" && 66 | typeof options.resize.width === "number" && 67 | typeof options.resize.height === "number" 68 | ) { 69 | let width = options.resize.width; 70 | let height = options.resize.height; 71 | 72 | // resize image and upload to S3 73 | // won't be creating any temporary files 74 | Sharp(filepath) 75 | .resize(width, height) 76 | .toBuffer() 77 | .then(buffer => { 78 | params.Body = buffer; 79 | 80 | params.Key = width + "-" + height + "-" + params.Key; 81 | 82 | this.s3.putObject(params, (e, d) => { 83 | if (e) { 84 | reject(e); 85 | } 86 | 87 | d.name = params.Key; 88 | 89 | res.data.push(d); 90 | resolve(res); 91 | }); 92 | }) 93 | .catch(e => reject(e)); 94 | } else { 95 | resolve(res); 96 | } 97 | }); 98 | } else { 99 | reject("File " + filepath + " does not exist"); 100 | } 101 | }); 102 | } 103 | } 104 | module.exports = new AWSS3(); 105 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Example implementation of Amazon Simple Storage Service (Amazon S3) 3 | * 4 | * @author Maciej Lisowski 5 | * @since 2018-11-27 6 | */ 7 | 8 | // import dotenv 9 | require("dotenv").config(); 10 | const S3 = require("./lib/aws-s3"); 11 | 12 | S3.upload("./files/test.txt", "example-text-file.txt") 13 | .then(r => { 14 | console.log(r); 15 | }) 16 | .catch(e => { 17 | console.error(e); 18 | }); 19 | 20 | var resize = true; 21 | 22 | if (!resize) { 23 | S3.upload("./files/derek-thomson-443919-unsplash.jpg", "example-image.jpg") 24 | .then(r => { 25 | console.log(r); 26 | }) 27 | .catch(e => { 28 | console.error(e); 29 | }); 30 | } else { 31 | S3.upload("./files/derek-thomson-443919-unsplash.jpg", "example-image.jpg", { 32 | resize: { width: 300, height: 400 } 33 | }) 34 | .then(r => { 35 | console.log(r); 36 | }) 37 | .catch(e => { 38 | console.error(e); 39 | }); 40 | } 41 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-s3-example", 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 | "aws-sdk": { 27 | "version": "2.363.0", 28 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.363.0.tgz", 29 | "integrity": "sha512-kQOfjzCEllH45OFN0z3fvhpSWDFWu19715A7TztHx6IEWKwwIEyd3b2XhTZtQLJrI1Giv7iGALwH46gybH9HJw==", 30 | "requires": { 31 | "buffer": "4.9.1", 32 | "events": "1.1.1", 33 | "ieee754": "1.1.8", 34 | "jmespath": "0.15.0", 35 | "querystring": "0.2.0", 36 | "sax": "1.2.1", 37 | "url": "0.10.3", 38 | "uuid": "3.1.0", 39 | "xml2js": "0.4.19" 40 | } 41 | }, 42 | "base64-js": { 43 | "version": "1.3.0", 44 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 45 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 46 | }, 47 | "bl": { 48 | "version": "1.2.2", 49 | "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 50 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 51 | "requires": { 52 | "readable-stream": "^2.3.5", 53 | "safe-buffer": "^5.1.1" 54 | } 55 | }, 56 | "buffer": { 57 | "version": "4.9.1", 58 | "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 59 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 60 | "requires": { 61 | "base64-js": "^1.0.2", 62 | "ieee754": "^1.1.4", 63 | "isarray": "^1.0.0" 64 | } 65 | }, 66 | "buffer-alloc": { 67 | "version": "1.2.0", 68 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 69 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 70 | "requires": { 71 | "buffer-alloc-unsafe": "^1.1.0", 72 | "buffer-fill": "^1.0.0" 73 | } 74 | }, 75 | "buffer-alloc-unsafe": { 76 | "version": "1.1.0", 77 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 78 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 79 | }, 80 | "buffer-fill": { 81 | "version": "1.0.0", 82 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 83 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 84 | }, 85 | "chownr": { 86 | "version": "1.1.1", 87 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", 88 | "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" 89 | }, 90 | "code-point-at": { 91 | "version": "1.1.0", 92 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 93 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 94 | }, 95 | "color": { 96 | "version": "3.1.0", 97 | "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", 98 | "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", 99 | "requires": { 100 | "color-convert": "^1.9.1", 101 | "color-string": "^1.5.2" 102 | } 103 | }, 104 | "color-convert": { 105 | "version": "1.9.3", 106 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 107 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 108 | "requires": { 109 | "color-name": "1.1.3" 110 | } 111 | }, 112 | "color-name": { 113 | "version": "1.1.3", 114 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 115 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 116 | }, 117 | "color-string": { 118 | "version": "1.5.3", 119 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", 120 | "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", 121 | "requires": { 122 | "color-name": "^1.0.0", 123 | "simple-swizzle": "^0.2.2" 124 | } 125 | }, 126 | "console-control-strings": { 127 | "version": "1.1.0", 128 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 129 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 130 | }, 131 | "core-util-is": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 134 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 135 | }, 136 | "decompress-response": { 137 | "version": "3.3.0", 138 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 139 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 140 | "requires": { 141 | "mimic-response": "^1.0.0" 142 | } 143 | }, 144 | "deep-extend": { 145 | "version": "0.6.0", 146 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 147 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 148 | }, 149 | "delegates": { 150 | "version": "1.0.0", 151 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 152 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 153 | }, 154 | "detect-libc": { 155 | "version": "1.0.3", 156 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 157 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 158 | }, 159 | "dotenv": { 160 | "version": "6.1.0", 161 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.1.0.tgz", 162 | "integrity": "sha512-/veDn2ztgRlB7gKmE3i9f6CmDIyXAy6d5nBq+whO9SLX+Zs1sXEgFLPi+aSuWqUuusMfbi84fT8j34fs1HaYUw==" 163 | }, 164 | "end-of-stream": { 165 | "version": "1.4.1", 166 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 167 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 168 | "requires": { 169 | "once": "^1.4.0" 170 | } 171 | }, 172 | "events": { 173 | "version": "1.1.1", 174 | "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", 175 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" 176 | }, 177 | "expand-template": { 178 | "version": "1.1.1", 179 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", 180 | "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" 181 | }, 182 | "fs-constants": { 183 | "version": "1.0.0", 184 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 185 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 186 | }, 187 | "fs-copy-file-sync": { 188 | "version": "1.1.1", 189 | "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", 190 | "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==" 191 | }, 192 | "fs-minipass": { 193 | "version": "1.2.5", 194 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", 195 | "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", 196 | "requires": { 197 | "minipass": "^2.2.1" 198 | } 199 | }, 200 | "gauge": { 201 | "version": "2.7.4", 202 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 203 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 204 | "requires": { 205 | "aproba": "^1.0.3", 206 | "console-control-strings": "^1.0.0", 207 | "has-unicode": "^2.0.0", 208 | "object-assign": "^4.1.0", 209 | "signal-exit": "^3.0.0", 210 | "string-width": "^1.0.1", 211 | "strip-ansi": "^3.0.1", 212 | "wide-align": "^1.1.0" 213 | } 214 | }, 215 | "github-from-package": { 216 | "version": "0.0.0", 217 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 218 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 219 | }, 220 | "has-unicode": { 221 | "version": "2.0.1", 222 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 223 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 224 | }, 225 | "ieee754": { 226 | "version": "1.1.8", 227 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", 228 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" 229 | }, 230 | "inherits": { 231 | "version": "2.0.3", 232 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 233 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 234 | }, 235 | "ini": { 236 | "version": "1.3.5", 237 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 238 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 239 | }, 240 | "is-arrayish": { 241 | "version": "0.3.2", 242 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 243 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 244 | }, 245 | "is-fullwidth-code-point": { 246 | "version": "1.0.0", 247 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 248 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 249 | "requires": { 250 | "number-is-nan": "^1.0.0" 251 | } 252 | }, 253 | "isarray": { 254 | "version": "1.0.0", 255 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 256 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 257 | }, 258 | "jmespath": { 259 | "version": "0.15.0", 260 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 261 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" 262 | }, 263 | "mimic-response": { 264 | "version": "1.0.1", 265 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 266 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 267 | }, 268 | "minimist": { 269 | "version": "1.2.0", 270 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 271 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 272 | }, 273 | "minipass": { 274 | "version": "2.3.5", 275 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", 276 | "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", 277 | "requires": { 278 | "safe-buffer": "^5.1.2", 279 | "yallist": "^3.0.0" 280 | } 281 | }, 282 | "minizlib": { 283 | "version": "1.1.1", 284 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz", 285 | "integrity": "sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==", 286 | "requires": { 287 | "minipass": "^2.2.1" 288 | } 289 | }, 290 | "mkdirp": { 291 | "version": "0.5.1", 292 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 293 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 294 | "requires": { 295 | "minimist": "0.0.8" 296 | }, 297 | "dependencies": { 298 | "minimist": { 299 | "version": "0.0.8", 300 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 301 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 302 | } 303 | } 304 | }, 305 | "nan": { 306 | "version": "2.11.1", 307 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", 308 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" 309 | }, 310 | "napi-build-utils": { 311 | "version": "1.0.1", 312 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", 313 | "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==" 314 | }, 315 | "node-abi": { 316 | "version": "2.5.0", 317 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.5.0.tgz", 318 | "integrity": "sha512-9g2twBGSP6wIR5PW7tXvAWnEWKJDH/VskdXp168xsw9VVxpEGov8K4jsP4/VeoC7b2ZAyzckvMCuQuQlw44lXg==", 319 | "requires": { 320 | "semver": "^5.4.1" 321 | } 322 | }, 323 | "noop-logger": { 324 | "version": "0.1.1", 325 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 326 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 327 | }, 328 | "npmlog": { 329 | "version": "4.1.2", 330 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 331 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 332 | "requires": { 333 | "are-we-there-yet": "~1.1.2", 334 | "console-control-strings": "~1.1.0", 335 | "gauge": "~2.7.3", 336 | "set-blocking": "~2.0.0" 337 | } 338 | }, 339 | "number-is-nan": { 340 | "version": "1.0.1", 341 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 342 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 343 | }, 344 | "object-assign": { 345 | "version": "4.1.1", 346 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 347 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 348 | }, 349 | "once": { 350 | "version": "1.4.0", 351 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 352 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 353 | "requires": { 354 | "wrappy": "1" 355 | } 356 | }, 357 | "os-homedir": { 358 | "version": "1.0.2", 359 | "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 360 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 361 | }, 362 | "prebuild-install": { 363 | "version": "5.2.1", 364 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.1.tgz", 365 | "integrity": "sha512-9DAccsInWHB48TBQi2eJkLPE049JuAI6FjIH0oIrij4bpDVEbX6JvlWRAcAAlUqBHhjgq0jNqA3m3bBXWm9v6w==", 366 | "requires": { 367 | "detect-libc": "^1.0.3", 368 | "expand-template": "^1.0.2", 369 | "github-from-package": "0.0.0", 370 | "minimist": "^1.2.0", 371 | "mkdirp": "^0.5.1", 372 | "napi-build-utils": "^1.0.1", 373 | "node-abi": "^2.2.0", 374 | "noop-logger": "^0.1.1", 375 | "npmlog": "^4.0.1", 376 | "os-homedir": "^1.0.1", 377 | "pump": "^2.0.1", 378 | "rc": "^1.2.7", 379 | "simple-get": "^2.7.0", 380 | "tar-fs": "^1.13.0", 381 | "tunnel-agent": "^0.6.0", 382 | "which-pm-runs": "^1.0.0" 383 | }, 384 | "dependencies": { 385 | "simple-get": { 386 | "version": "2.8.1", 387 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", 388 | "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", 389 | "requires": { 390 | "decompress-response": "^3.3.0", 391 | "once": "^1.3.1", 392 | "simple-concat": "^1.0.0" 393 | } 394 | } 395 | } 396 | }, 397 | "process-nextick-args": { 398 | "version": "2.0.0", 399 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 400 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 401 | }, 402 | "pump": { 403 | "version": "2.0.1", 404 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 405 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 406 | "requires": { 407 | "end-of-stream": "^1.1.0", 408 | "once": "^1.3.1" 409 | } 410 | }, 411 | "punycode": { 412 | "version": "1.3.2", 413 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 414 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 415 | }, 416 | "querystring": { 417 | "version": "0.2.0", 418 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 419 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 420 | }, 421 | "rc": { 422 | "version": "1.2.8", 423 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 424 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 425 | "requires": { 426 | "deep-extend": "^0.6.0", 427 | "ini": "~1.3.0", 428 | "minimist": "^1.2.0", 429 | "strip-json-comments": "~2.0.1" 430 | } 431 | }, 432 | "readable-stream": { 433 | "version": "2.3.6", 434 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 435 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 436 | "requires": { 437 | "core-util-is": "~1.0.0", 438 | "inherits": "~2.0.3", 439 | "isarray": "~1.0.0", 440 | "process-nextick-args": "~2.0.0", 441 | "safe-buffer": "~5.1.1", 442 | "string_decoder": "~1.1.1", 443 | "util-deprecate": "~1.0.1" 444 | } 445 | }, 446 | "safe-buffer": { 447 | "version": "5.1.2", 448 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 449 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 450 | }, 451 | "sax": { 452 | "version": "1.2.1", 453 | "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 454 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" 455 | }, 456 | "semver": { 457 | "version": "5.6.0", 458 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 459 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 460 | }, 461 | "set-blocking": { 462 | "version": "2.0.0", 463 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 464 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 465 | }, 466 | "sharp": { 467 | "version": "0.21.0", 468 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.21.0.tgz", 469 | "integrity": "sha512-qr6yMl0ju8EGMtjIj5U1Ojj8sKuZ99/DQaNKWmoFHxqg3692AFSrEiPI/yr0O05OWtGD8LuCw8WSGmnZcNrZaA==", 470 | "requires": { 471 | "color": "^3.0.0", 472 | "detect-libc": "^1.0.3", 473 | "fs-copy-file-sync": "^1.1.1", 474 | "nan": "^2.11.1", 475 | "npmlog": "^4.1.2", 476 | "prebuild-install": "^5.2.0", 477 | "semver": "^5.5.1", 478 | "simple-get": "^3.0.3", 479 | "tar": "^4.4.6", 480 | "tunnel-agent": "^0.6.0" 481 | } 482 | }, 483 | "signal-exit": { 484 | "version": "3.0.2", 485 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 486 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 487 | }, 488 | "simple-concat": { 489 | "version": "1.0.0", 490 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 491 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 492 | }, 493 | "simple-get": { 494 | "version": "3.0.3", 495 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.3.tgz", 496 | "integrity": "sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==", 497 | "requires": { 498 | "decompress-response": "^3.3.0", 499 | "once": "^1.3.1", 500 | "simple-concat": "^1.0.0" 501 | } 502 | }, 503 | "simple-swizzle": { 504 | "version": "0.2.2", 505 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 506 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 507 | "requires": { 508 | "is-arrayish": "^0.3.1" 509 | } 510 | }, 511 | "string-width": { 512 | "version": "1.0.2", 513 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 514 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 515 | "requires": { 516 | "code-point-at": "^1.0.0", 517 | "is-fullwidth-code-point": "^1.0.0", 518 | "strip-ansi": "^3.0.0" 519 | } 520 | }, 521 | "string_decoder": { 522 | "version": "1.1.1", 523 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 524 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 525 | "requires": { 526 | "safe-buffer": "~5.1.0" 527 | } 528 | }, 529 | "strip-ansi": { 530 | "version": "3.0.1", 531 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 532 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 533 | "requires": { 534 | "ansi-regex": "^2.0.0" 535 | } 536 | }, 537 | "strip-json-comments": { 538 | "version": "2.0.1", 539 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 540 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 541 | }, 542 | "tar": { 543 | "version": "4.4.8", 544 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", 545 | "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", 546 | "requires": { 547 | "chownr": "^1.1.1", 548 | "fs-minipass": "^1.2.5", 549 | "minipass": "^2.3.4", 550 | "minizlib": "^1.1.1", 551 | "mkdirp": "^0.5.0", 552 | "safe-buffer": "^5.1.2", 553 | "yallist": "^3.0.2" 554 | } 555 | }, 556 | "tar-fs": { 557 | "version": "1.16.3", 558 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", 559 | "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", 560 | "requires": { 561 | "chownr": "^1.0.1", 562 | "mkdirp": "^0.5.1", 563 | "pump": "^1.0.0", 564 | "tar-stream": "^1.1.2" 565 | }, 566 | "dependencies": { 567 | "pump": { 568 | "version": "1.0.3", 569 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 570 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 571 | "requires": { 572 | "end-of-stream": "^1.1.0", 573 | "once": "^1.3.1" 574 | } 575 | } 576 | } 577 | }, 578 | "tar-stream": { 579 | "version": "1.6.2", 580 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 581 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 582 | "requires": { 583 | "bl": "^1.0.0", 584 | "buffer-alloc": "^1.2.0", 585 | "end-of-stream": "^1.0.0", 586 | "fs-constants": "^1.0.0", 587 | "readable-stream": "^2.3.0", 588 | "to-buffer": "^1.1.1", 589 | "xtend": "^4.0.0" 590 | } 591 | }, 592 | "to-buffer": { 593 | "version": "1.1.1", 594 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 595 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 596 | }, 597 | "tunnel-agent": { 598 | "version": "0.6.0", 599 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 600 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 601 | "requires": { 602 | "safe-buffer": "^5.0.1" 603 | } 604 | }, 605 | "url": { 606 | "version": "0.10.3", 607 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 608 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 609 | "requires": { 610 | "punycode": "1.3.2", 611 | "querystring": "0.2.0" 612 | } 613 | }, 614 | "util-deprecate": { 615 | "version": "1.0.2", 616 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 617 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 618 | }, 619 | "uuid": { 620 | "version": "3.1.0", 621 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 622 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 623 | }, 624 | "which-pm-runs": { 625 | "version": "1.0.0", 626 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 627 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 628 | }, 629 | "wide-align": { 630 | "version": "1.1.3", 631 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 632 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 633 | "requires": { 634 | "string-width": "^1.0.2 || 2" 635 | } 636 | }, 637 | "wrappy": { 638 | "version": "1.0.2", 639 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 640 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 641 | }, 642 | "xml2js": { 643 | "version": "0.4.19", 644 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 645 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 646 | "requires": { 647 | "sax": ">=0.6.0", 648 | "xmlbuilder": "~9.0.1" 649 | } 650 | }, 651 | "xmlbuilder": { 652 | "version": "9.0.7", 653 | "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 654 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" 655 | }, 656 | "xtend": { 657 | "version": "4.0.1", 658 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 659 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 660 | }, 661 | "yallist": { 662 | "version": "3.0.3", 663 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 664 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" 665 | } 666 | } 667 | } 668 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-s3-example", 3 | "version": "1.0.0", 4 | "description": "Example implementation of NodeJS and Amazon Simple Storage Service (Amazon S3)", 5 | "main": "main.js", 6 | "directories": { 7 | "lib": "lib" 8 | }, 9 | "scripts": { 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/maclisowski/node-s3-example.git" 15 | }, 16 | "author": "Maciej Lisowski", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/maclisowski/node-s3-example/issues" 20 | }, 21 | "homepage": "https://github.com/maclisowski/node-s3-example#readme", 22 | "dependencies": { 23 | "aws-sdk": "^2.363.0", 24 | "dotenv": "^6.1.0", 25 | "sharp": "^0.21.0" 26 | } 27 | } 28 | --------------------------------------------------------------------------------