{"_id":"@aftership/grunt-aws-s3","_rev":"3-2ae97e2d54f1ef01cdcd68be6f92d85b","name":"@aftership/grunt-aws-s3","description":"Interact with AWS S3 using the AWS SDK","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@aftership/grunt-aws-s3","description":"Interact with AWS S3 using the AWS SDK","version":"1.0.0","homepage":"https://github.com/AfterShip/grunt-aws-s3","author":{"name":"Mathieu Triay","email":"mathieu@nightzookeeper.com"},"repository":{"type":"git","url":"git://github.com/AfterShip/grunt-aws-s3.git"},"bugs":{"url":"https://github.com/AfterShip/grunt-aws-s3/issues"},"licenses":[{"type":"MIT","url":"https://github.com/AfterShip/grunt-aws-s3/blob/master/LICENSE"}],"engines":{"node":">= 0.8.0"},"scripts":{"test":"grunt"},"dependencies":{"aws-sdk":"2.0.x","mime-types":"2.0.x","lodash":"2.4.x","async":"0.9.x","progress":"1.1.x"},"devDependencies":{"grunt-contrib-jshint":"~0.2.0","grunt":"~0.4.0","chai":"~1.7.2","mocha":"~1.12.1","grunt-mocha-test":"~0.10.2","grunt-contrib-copy":"~0.4.1","grunt-contrib-clean":"~0.5.0","mock-aws-s3":"0.2.7"},"peerDependencies":{"grunt":"~0.4.0"},"keywords":["gruntplugin","aws","s3","sdk"],"gitHead":"aca3bb262a123eaff0f64aa277c96365b6e0b997","_id":"@aftership/grunt-aws-s3@1.0.0","_shasum":"7bffb616730d0392a55fc5f2406d4fd79d5db5bd","_from":".","_npmVersion":"2.14.7","_nodeVersion":"4.2.2","_npmUser":{"name":"aftership","email":"support@aftership.com"},"dist":{"shasum":"7bffb616730d0392a55fc5f2406d4fd79d5db5bd","tarball":"https://registry.npmjs.org/@aftership/grunt-aws-s3/-/grunt-aws-s3-1.0.0.tgz","integrity":"sha512-TSkr3EJ8yzHYAtQ3ntsFzhw3b+K1c2ic6IxT/C5s+xh8v3vNPgI6WyPBbF/cR24sdYZgo6yjm4D6oTToyrQdyw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmtPBcme3tRJyT8TeXQvNIIx6ot47o+Utxvtv6oQAsWAIhAKNfWOWZUEAlGlutYNXu+aSTLEbVzHnf8GWdiMOZuOH5"}]},"maintainers":[{"name":"aftership","email":"support@aftership.com"}]}},"readme":"# grunt-aws-s3\n\n> Interact with AWS S3 using AWS SDK\n\n## Warning \n\nVersions 0.4.0 to 0.5.0 have a bug where `options.params` is ignored.  \nVersion 0.8.0 doesn't actually support Node 0.8.x and 0.9.x.  \n\nIt's not recommended to use concurrencies over 100 as you may run into EMFILE/ENOTFOUND errors.\n\n## Getting Started\nThis plugin requires Grunt `~0.4.0`\n\nIf you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:\n\n```shell\n  npm install grunt-aws-s3 --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\n  grunt.loadNpmTasks('grunt-aws-s3');\n```\n\nMake sure that your AWS IAM policy allows ```s3:GetObject```, ```s3:GetObjectAcl```, ```s3:ListBucket```, ```s3:PutObject```, and ```s3:PutObjectAcl``` on everything under the buckets you plan to deploy to.  This task sets ACL properties, so you can easily find yourself in a situation where tools like s3cmd have no problem deploying files to your bucket, while this task fails with \"AccessDenied\".\n\n## The \"aws_s3\" task\n\n### Options\n\n#### options.accessKeyId (required)\nType: `String`\n\nThe AWS accessKeyId. You can load it via JSON as shown in the example or use the `AWS_ACCESS_KEY_ID` environment variable.\n\n#### options.secretAccessKey (required)\nType: `String`\n\nThe AWS secretAccessKey. You can load it via JSON as shown in the example or use the `AWS_SECRET_ACCESS_KEY` environment variable.\n\n#### options.awsProfile\nType: `String`\n\nGreat if you have [credentials profile](http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html#Creating_the_Shared_Credentials_File) stored in `~/.aws/credentials`.\n\n#### options.sessionToken\nType: `String`\n\nThe AWS sessionToken. You can load it via JSON as shown in the example or use the `AWS_SESSION_TOKEN` environment variable.\n\n#### options.bucket (required)\nType: `String`\n\nThe AWS bucket name you want to upload to.\n\n#### options.endpoint\nType: `String`\n\nThe AWS endpoint you'd like to use. Set by default by the region.\n\n#### options.region\nType: `String`  \nDefault: `US Standard`\n\nThe AWS [region](http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region).\n\nIf not specified, it uploads to the default 'US Standard'\n\n#### options.maxRetries\nType: `Integer`\n\nThe maximum amount of retries to attempt with a request.\n\n#### options.sslEnabled\nType: `Boolean`  \n\nWhether to enable SSL for requests or not.\n\n#### options.httpOptions\nType: `Object`  \n\nA set of options to pass to the low-level HTTP request. The list of options can be found in the [documentation](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor-property)\n\n#### options.signatureVersion\nType: `String`  \n\nChange the signature version to sign requests with. Possible values are: 'v2', 'v3', 'v4'.\n\n#### options.access\nType: `String`  \nDefault:`public-read`\n\nThe ACL you want to apply to ALL the files that will be uploaded. The ACL values can be found in the [documentation](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property).\n\n#### options.uploadConcurrency\nType: `Integer`  \nDefault: `1`\n\nNumber of uploads in parallel. By default, there's no concurrency. Must be > 0.\nNote: This used to be called `concurrency` but the option has been deprecated, however it is still backwards compatible until 1.0.0.\n\n#### options.downloadConcurrency\nType: `Integer`  \nDefault: `1`\n\nNumber of download in parallel. By default, there's no concurrency. Must be > 0.\n\n#### options.copyConcurrency\nType: `Integer`  \nDefault: `1`\n\nNumber of copies in parallel. By default, there's no concurrency. Must be > 0.\n\n#### options.params\nType: `Object`\n\nA hash of the params you want to apply to the files. Useful to set the `ContentEncoding` to `gzip` for instance, or set the `CacheControl` value. The list of parameters can be found in the [documentation](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property). `params` will apply to *all* the files in the target. However, the `params` option in the file list has priority over it.\n\n#### options.mime\nType: `Object`  \n\nThe MIME type of every file is determined by a MIME lookup using [node-mime](https://github.com/broofa/node-mime). If you want to override it, you can use this option object.\nThe keys are the local file paths and the values are the MIME types.\n\n```js\n  {\n    'path/to/file': 'application/json',\n    'path/to/other/file': 'application/gzip'\n  }\n```\n\nYou need to specify the full path of the file, including the `cwd` part.  \nThe `mime` hash has absolute priority over what has been set in `options.params` and the `params` option of the file list.\n\n#### options.stream\nType: `Boolean`  \nDefault: `false`\n\nAllows to use streams instead of buffers to upload and download.\nThe option can either be turned on for the whole subtask or for a specified file object like so:\n\n```js\n  {'action': 'upload', expand: true, cwd: 'dist/js', src: ['**'], stream: true}\n```\n\n#### options.debug\nType: `Boolean`  \nDefault: `false`\n\nThis will do a \"dry run\". It will not upload anything to S3 but you will get the full report just as you would in normal mode. Useful to check what will be changed on the server before actually doing it. Unless one of your actions depends on another (like download following a delete), the report should be accurate.  \n`listObjects` requests will still be made to list the content of the bucket.\n\n#### options.differential\nType: `Boolean`  \nDefault: `false`\n\n`listObjects` requests will be made to list the content of the bucket, then they will be checked against their local file equivalent (if it exists) using MD5 (and sometimes date) comparisons.\nThis means different things for different actions:\n- `upload`: will only upload the files which either don't exist on the bucket or have a different MD5 hash\n- `download`: will only download the files which either don't exist locally or have a different MD5 hash and are newer.\n- `delete`: will only delete the files which don't exist locally\n\nThe option can either be specified for the whole subtask or for a specified file object like so:\n\n```js\n  {'action': 'upload', expand: true, cwd: 'dist/js', src: ['**'], differential: true}\n```\n\nIn order to be able to compare to the local file names, it is necessary for `dest` to be a finished path (e.g `directory/` instead of just `dir`) as the comparison is done between the file names found in `cwd` and the files found on the server `dest`. If you want to compare the files in the directory `scripts/` in your bucket and the files in the corresponding local directory `dist/scripts/` you need to have something like:\n\n```js\n  {cwd: 'dist/scripts/', dest: 'scripts/', 'action': 'download', differential: true}\n```\n\n#### options.overwrite\nType: `Boolean`  \nDefault: `true`\n\nBy setting this options to `false`, you can prevent overwriting files on the server. The task will scan the whole bucket first and if it encounters a path that's about to be erased will stop.\n\n#### options.displayChangesOnly\nType: `Boolean`\nDefault: `false`\n\nIf enabled, only lists files that have changed when performing a differential upload.\n\n#### options.progress\nType: `String`\nDefault: `dots`\n\nSpecify the output format for task progress. Valid options are:\n- `dots`: will display one dot for each file, green for success, yellow for failure\n- `progressBar`: will display a progress bar with current/total count and completion eta\n- `none`: will suppress all display of progress\n\n#### options.changedFiles\nType: `String`\nDefault: `aws_s3_changed`\n\nThis tasks exports the list of uploaded files to a variable on the grunt config so it can be used by another task (`grunt-invalidate-cloudfront` for instance). By default it's accessible via `grunt.config.get('aws_s3_changed')` and this option allows you to change the variable name.\n\n\n#### options.gzipRename\nType: `String`\nDefault: ``\n\nWhen using the `gzip` abilities of the task (see below), you can use this option to change the extensions of the files uploaded to S3. Values can be:  \n- `gz`: will replace the compound extension with `.gz` (e.g. `build.css.gz` -> `build.gz`)\n- `ext`: will keep the original extension and remove `.gz` (e.g. `build.css.gz` -> `build.css`)\n- `swap`: will swap the two extensions (e.g. `build.css.gz` -> `build.gz.css`)\n\nThis only works with the `gzip` abilities of the task which is based on compound extensions like these: `.css.gz`.\n\n### gzip\n\nThis task doesn't compress anything for you. The `grunt-contrib-compress` task is here for that and is much more suitable.  \nHowever, uploading gzip files is annoying because you need to set `ContentType` and `ContentEncoding` correctly for each of the compressed files. As of version `0.12.0`, this plugin will try to guess if a file needs to have their `ContentType` and `ContentEncoding` changed relying on a convention rather than configuration (inspired by [hapi](https://github.com/hapijs/hapi/blob/master/API.md#built-in-handlers)).\n\nThe convention is that a gzipped file must have `.gz` in its extension as well as its original extension (e.g. `.css`, `.js`) like so: `build.js.gz`.  \nIn this case the plugin will apply the `ContentType` from `build.js` to `build.js.gz` and set the `ContentEncoding` to `gzip`.\n\nIf for some reason you're not following this convention (e.g. you're naming your files `build.gz`), you can force the ContentType through the `mime` option of the plugin which still has priority. Provided the extension is still `.gz`, the `ContentType` will be set for you. Alternatively, you can use the `gzipRename` option which will be able to rename the files on the fly as they're uploaded to S3.\n\n### Actions\n\nThis Grunt task supports three modes of interaction with S3, `upload`, `download` and `delete`. Every action that you specify is executed serially, one after the other. If multiple `upload` actions are one after the other, they will be grouped together.\n\nYou choose the action by specifying the key `action` in the file hash like so:\n\n```js\n  {'action': 'upload', expand: true, cwd: 'dist/js', src: ['**'], dest: 'app/js/'}\n```\n\nBy default, the action is `upload`.\n\n#### `upload`\n\nThe `upload` action uses the [newest Grunt file format](http://gruntjs.com/configuring-tasks#files), allowing to take advantage of the `expand` and `filter` options.  \nIt is the default action, so you can omit `action: 'upload'` if you want a cleaner look. Don't forget to set a `dest` (use `dest: '/'` for the root).\n\n```js\n  files: [\n    {expand: true, cwd: 'dist/staging/scripts', src: ['**'], dest: 'app/scripts/'},\n    {expand: true, cwd: 'dist/staging/styles', src: ['**'], dest: 'app/styles/', action: 'upload'}\n  ]\n```\n\nYou can also include a `params` hash which will override the options.params one. For example:\n\n```js\n  \n  params: {\n    ContentType: 'application/json'\n    CacheControl: '3000'\n  }\n\n  // ...\n\n  files: [\n    {expand: true, cwd: 'dist/staging/scripts', src: ['**'], dest: 'app/scripts/', params: {CacheControl: '2000'}},\n    {expand: true, cwd: 'dist/staging/styles', src: ['**'], dest: 'app/styles/'}\n  ]\n```\n\nThis will yield for the params which will eventually be applied:\n\n```js\n  {\n    ContentType: 'application/json',\n    CacheControl: '2000'\n  }\n\n  // AND\n\n  {\n    ContentType: 'application/json',\n    CacheControl: '3000'\n  }\n```\n\nThe `options.mime` hash, however, has priority over the ContentType. So if the hash looked like this:\n\n```js\n  {\n    'dist/staging/styles/LICENCE': 'text/plain'\n  }\n```\n\nThe `ContentType` eventually applied to `dist/staging/styles/LICENCE` would be `text/plain` even though we had a `ContentType` specified in `options.params` or in `params` of the file.\n\nWhen the `differential` option is enabled, it will only upload the files which either don't exist on the bucket or have a different MD5 hash.\n\n#### `download`\n\nThe `download` action requires a `cwd`, a `dest` and *no* `src` like so:\n\n```js\n  {cwd: 'download/', dest: 'app/', action: 'download'}\n```\n\nThe `dest` is used as the Prefix in the [listObjects command](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property) to find the files _on the server_ (which means it can be a path or a partial path). \nThe `cwd` is used as the root folder to write the downloaded files. The inner folder structure will be reproduced inside that folder.\n\nIf you specify '/' for `dest`, the whole bucket will be downloaded. It handles automatically buckets with more than a 1000 objects.  \nIf you specify 'app', all paths starting with 'app' will be targeted (e.g. 'app.js', 'app/myapp.js', 'app/index.html, 'app backup/donotdelete.js') but it will leave alone the others (e.g. 'my app/app.js', 'backup app/donotdelete.js').\n\nWhen the `differential` options is enabled, it will only download the files which either don't exist locally or have a different MD5 hash and are newer. \n\nNote: if `dest` is a file, it will be downloaded to `cwd` + `file name`. If `dest` is a directory ending with `/`, its content will be downloaded to `cwd` + `file names or directories found in dest`. If `dest` is neither a file nor a directory, the files found using it as a prefix will be downloaded to `cwd` + `paths found using dest as the prefix`.\n\nThe `download` action can also take an `exclude` option like so:\n\n```js\n  {cwd: 'download/', dest: 'app/', action: 'download', exclude \"**/.*\"}\n```\n\nThe value is a globbing pattern that can be consumed by `grunt.file.isMatch`. You can find more information on [globbing patterns on Grunt's doc](http://gruntjs.com/api/grunt.file#globbing-patterns). In this example, it will exclude all files starting with a `.` (they won't be downloaded).\nIf you want to reverse the `exclude` (that is, only what will match the pattern will be downloaded), you can use the `flipExclude` option like so:\n\n```js\n  {cwd: 'download/', dest: 'app/', action: 'download', exclude \"**/.*\", flipExclude: true}\n```\n\nIn this example, only the files starting with a `.` will be downloaded.\n\nExample:\n\n```js\n  {cwd: 'download/', dest: 'app/', action: 'download'} // app/myapp.js downloaded to download/myapp.js\n  {cwd: 'download/', dest: 'app/myapp.js', action: 'download'} // app/myapp.js downloaded to download/myapp.js\n  {cwd: 'download/', dest: 'app', action: 'download'} // app/myapp.js downloaded to download/app/myapp.js\n```\n\n#### `delete`\n\nThe `delete` action just requires a `dest`, no need for a `src` like so:\n\n```js\n  {dest: 'app/', 'action': 'delete'}\n```\n\nThe `dest` is used as the Prefix in the [listObjects command](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property) to find the files _on the server_ (which means it can be a path or a partial path). \n\nIf you specify '/', the whole bucket will be wiped. It handles automatically buckets with more than a 1000 objects.  \nIf you specify 'app', all paths starting with 'app' will be targeted (e.g. 'app.js', 'app/myapp.js', 'app/index.html, 'app backup/donotdelete.js') but it will leave alone the others (e.g. 'my app/app.js', 'backup app/donotdelete.js').\n\nWhen the `differential` options is enabled, it will only delete the files which don't exist locally. It also requires a `cwd` key with the path to the local folder to check against.\n\nPlease, be careful with the `delete` action. It doesn't forgive.\n\nThe `delete` action can also take an `exclude` option like so:\n\n```js\n  {dest: 'app/', 'action': 'delete', exclude \"**/.*\"}\n```\n\nThe value is a globbing pattern that can be consumed by `grunt.file.isMatch`. You can find more information on [globbing patterns on Grunt's doc](http://gruntjs.com/api/grunt.file#globbing-patterns). In this example, it will exclude all files starting with a `.` (they won't be deleted).\nIf you want to reverse the `exclude` (that is, only what will match the pattern will be deleted), you can use the `flipExclude` option like so:\n\n```js\n  {dest: 'app/', 'action': 'delete', exclude \"**/.*\", flipExclude: true}\n```\n\nIn this example, only the files starting with a `.` will be deleted.\n\n`dest` is the folder on the bucket that you want to target. At the moment, a globbing pattern shouldn't be in `src` (which would reference local files) but `exclude`. Exclude takes 1 globbing pattern, and can be \"flipped\" so that it becomes \"delete all that match this pattern\" rather than \"don't delete all that match this pattern\".\n\nIf you use `differential`, you need to give a `cwd`, which will indicate which folder `dest` is referencing locally. In that case, `differential` will only delete the files on AWS which don't exist locally (look at this in terms of cleaning up if you have changed some assets names or something).\n\n#### `copy`\n\nThe `copy` action just requires a `src` and a `dest` so:\n\n```js\n  {src: 'app/' dest: 'copy/', 'action': 'delete'}\n```\n\nThe `src` is used as the Prefix in the [listObjects command](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property) to find the files _on the server_ (which means it can be a path or a partial path). It will then copy objects to `dest`.\n\nThe `copy` action can also take an `exclude` option like so:\n\n```js\n  {src: 'app/' dest: 'copy/', 'action': 'delete', exclude \"**/.*\"}\n```\n\nThe value is a globbing pattern that can be consumed by `grunt.file.isMatch`. You can find more information on [globbing patterns on Grunt's doc](http://gruntjs.com/api/grunt.file#globbing-patterns). In this example, it will exclude all files starting with a `.` (they won't be copied). `flipExclude` also works.\n\n### Usage Examples\n\nThe example loads the AWS credentials from a JSON file (DO NOT forget to exclude it from your commits).\n\n```JSON\n  {\n    \"AWSAccessKeyId\": \"AKxxxxxxxxxx\",\n    \"AWSSecretKey\": \"super-secret-key\"\n  }\n```\n\n```js\naws: grunt.file.readJSON('aws-keys.json'), // Read the file\n\naws_s3: {\n  options: {\n    accessKeyId: '<%= aws.AWSAccessKeyId %>', // Use the variables\n    secretAccessKey: '<%= aws.AWSSecretKey %>', // You can also use env variables\n    region: 'eu-west-1',\n    uploadConcurrency: 5, // 5 simultaneous uploads\n    downloadConcurrency: 5 // 5 simultaneous downloads\n  },\n  staging: {\n    options: {\n      bucket: 'my-wonderful-staging-bucket',\n      differential: true, // Only uploads the files that have changed\n      gzipRename: 'ext' // when uploading a gz file, keep the original extension\n    },\n    files: [\n      {dest: 'app/', cwd: 'backup/staging/', action: 'download'},\n      {src: 'app/', cwd: 'copy/', action: 'copy'},\n      {expand: true, cwd: 'dist/staging/scripts/', src: ['**'], dest: 'app/scripts/'},\n      {expand: true, cwd: 'dist/staging/styles/', src: ['**'], dest: 'app/styles/'},\n      {dest: 'src/app', action: 'delete'},\n    ]\n  },\n  production: {\n    options: {\n      bucket: 'my-wonderful-production-bucket',\n      params: {\n        ContentEncoding: 'gzip' // applies to all the files!\n      },\n      mime: {\n        'dist/assets/production/LICENCE': 'text/plain'\n      }\n    },\n    files: [\n      {expand: true, cwd: 'dist/production/', src: ['**'], dest: 'app/'},\n      {expand: true, cwd: 'assets/prod/large', src: ['**'], dest: 'assets/large/', stream: true}, // enable stream to allow large files\n      {expand: true, cwd: 'assets/prod/', src: ['**'], dest: 'assets/', params: {CacheControl: '2000'}},\n      // CacheControl only applied to the assets folder\n      // LICENCE inside that folder will have ContentType equal to 'text/plain'\n    ]\n  },\n  clean_production: {\n    options: {\n      bucket: 'my-wonderful-production-bucket',\n      debug: true // Doesn't actually delete but shows log\n    },\n    files: [\n      {dest: 'app/', action: 'delete'},\n      {dest: 'assets/', exclude: \"**/*.tgz\", action: 'delete'}, // will not delete the tgz\n      {dest: 'assets/large/', exclude: \"**/*copy*\", flipExclude: true, action: 'delete'}, // will delete everything that has copy in the name\n    ]\n  },\n  download_production: {\n    options: {\n      bucket: 'my-wonderful-production-bucket'\n    },\n    files: [\n      {dest: 'app/', cwd: 'backup/', action: 'download'}, // Downloads the content of app/ to backup/\n      {dest: 'assets/', cwd: 'backup-assets/', exclude: \"**/*copy*\", action: 'download'}, // Downloads everything which doesn't have copy in the name\n    ]\n  },\n  secret: {\n    options: {\n      bucket: 'my-wonderful-private-bucket',\n      access: 'private'\n    },\n    files: [\n      {expand: true, cwd: 'secret_garden/', src: ['*.key'], dest: 'secret/'},\n    ]\n  }\n},\n```\n\n## Todos\n\n- Better testing (params, sync, etc.)\n\n## Release History\n* 2015-10-25   v0.14.1  Fix gzip ContentEncoding and ContentType leaking to other files\n* 2015-07-09   v0.14.0  Export uploaded files to grunt config (idea from @srlmproductions)\n* 2015-05-14   v0.13.1  Fix ACL on copy by @rayd\n* 2015-03-19   v0.13.0  New option to prevent overwriting files\n* 2015-03-19   v0.12.3  Add warning when no dest is defined\n* 2015-03-16   v0.12.2  make differential work with gzipRename by @dedsm\n* 2015-02-12   v0.12.1  gzipRename option\n* 2015-02-12   v0.12.0  Basic gzip support\n* 2015-01-22   v0.11.1  Fix url encoding for copy action by @ahageali\n* 2015-01-22   v0.11.0  Support for copy action\n* 2015-01-13   v0.10.4  Fix encoding in mime type (w/ @jeantil)\n* 2015-01-09   v0.10.3  Fix method for new mime type lib by @takeno\n* 2015-01-09   v0.10.2  Unpublished because of incomplete fix\n* 2015-01-09   v0.10.1  Create proper Content-type header with charset by @jeantil (unpublished)\n* 2014-10-03   v0.10.0  Endpoint option. Drop support for 0.8.x. Fixes.\n* 2014-10-03   v0.9.4   Add session token env variable and option\n* 2014-09-12   v0.9.3   Progress bar (by @seth-admittedly), fix #36\n* 2014-09-11   v0.9.2   Unpublished because of incomplete fix for #36\n* 2014-07-17   v0.9.1   Add signatureVersion option (by @ivanzhaowy)\n* 2014-06-21   v0.9.0   ListObjects per directory and update SDK to 2.0.0\n* 2014-05-28   v0.8.6   Don't check for credentials to allow IAM use by @joshuaspence\n* 2014-05-04   v0.8.5   New option to display changes only\n* 2014-04-26   v0.8.4   Fix bug in setImmediate support detection\n* 2014-04-26   v0.8.2-3 Unpublished because of faulty version\n* 2014-01-09   v0.8.1   Shim setImmediate to support Node 0.8.x\n* 2014-01-08   v0.8.0   Refactor to add stream option. Exclude option. Fixes.\n* 2013-11-27   v0.7.2   Follow Grunt 0.4.2 guidelines, add more options, fix download bugs\n* 2013-09-24   v0.7.1   Compensate for missing marker in listObject\n* 2013-09-09   v0.7.0   Code restructure. New differential option. Tests.\n* 2013-08-21   v0.6.0   Add 'download' option. Multiple fixes.\n* 2013-08-20   v0.5.0   Add option to override automatic MIME type detection\n* 2013-08-19   v0.4.1   Fix delete task executing separately from upload\n* 2013-08-14   v0.4.0   Add 'delete' option\n* 2013-07-30   v0.3.1   Region is now optional, defaults to US Standard\n* 2013-07-17   v0.3.0   Option for concurrency\n* 2013-07-16   v0.2.0   Can set additional params\n* 2013-07-11   v0.1.1   Fix bug when using env variable\n* 2013-07-10   v0.1.0   First release\n\nFor a proper list of changes, take a look at the [changelog](https://github.com/MathieuLoutre/grunt-aws-s3/blob/master/CHANGELOG.md)\n","maintainers":[{"name":"aftership","email":"support@aftership.com"}],"time":{"modified":"2022-06-12T14:20:44.528Z","created":"2015-11-09T09:04:19.848Z","1.0.0":"2015-11-09T09:04:19.848Z"},"homepage":"https://github.com/AfterShip/grunt-aws-s3","keywords":["gruntplugin","aws","s3","sdk"],"repository":{"type":"git","url":"git://github.com/AfterShip/grunt-aws-s3.git"},"author":{"name":"Mathieu Triay","email":"mathieu@nightzookeeper.com"},"bugs":{"url":"https://github.com/AfterShip/grunt-aws-s3/issues"},"readmeFilename":"README.md"}