├── .babelrc ├── .codeclimate.yml ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .npmignore ├── .nvmrc ├── .nycrc ├── .prettierignore ├── .prettierrc ├── .travis.yml ├── AUTHORS.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── docs ├── assets │ ├── css │ │ ├── main.css │ │ └── main.css.map │ ├── images │ │ ├── icons.png │ │ ├── icons@2x.png │ │ ├── widgets.png │ │ └── widgets@2x.png │ └── js │ │ ├── main.js │ │ └── search.js ├── classes │ └── uploader.html ├── globals.html └── index.html ├── package-lock.json ├── package.json ├── src ├── index.ts └── lib │ ├── Uploader.ts │ ├── batch.ts │ └── cli.ts ├── test ├── Uploader.spec.ts ├── _setup │ ├── arrow-function-coverage-fix.js │ └── setup.js ├── files │ ├── .gitkeep │ └── demo.png └── mocha.opts ├── tsconfig.build.json ├── tsconfig.json ├── tslint.json ├── wallaby.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["@babel/env", { 4 | "targets": { 5 | "node": "6" 6 | }, 7 | "loose": true, 8 | "useBuiltIns": false 9 | }], 10 | "@babel/preset-stage-3", 11 | "@babel/typescript" 12 | ], 13 | "plugins": [ 14 | ["@babel/plugin-transform-runtime", { 15 | "helpers": true, 16 | "polyfill": false, 17 | "regenerator": false, 18 | "moduleName": "@babel/runtime" 19 | }] 20 | ], 21 | "env": { 22 | "test": { 23 | "plugins": [ 24 | "./test/_setup/arrow-function-coverage-fix.js", 25 | "istanbul" 26 | ] 27 | } 28 | }, 29 | "ignore": [ 30 | "src/lib/vendor/**/*.*", 31 | "./test/_setup/arrow-function-coverage-fix.js" 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | engines: 2 | tslint: 3 | enabled: true 4 | duplication: 5 | enabled: true 6 | config: 7 | languages: 8 | - javascript 9 | fixme: 10 | enabled: true 11 | ratings: 12 | paths: 13 | - src/** 14 | exclude_paths: 15 | - doc/**/* 16 | - dist/**/* 17 | - test/**/* 18 | - vendor/**/* 19 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # see editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | 7 | # Change these settings to your own preference 8 | indent_style = space 9 | indent_size = 2 10 | 11 | # We recommend you to keep these unchanged 12 | end_of_line = lf 13 | charset = utf-8 14 | trim_trailing_whitespace = true 15 | insert_final_newline = true 16 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | lib/**/* 2 | src/lib/vendor/**/* 3 | *.ts 4 | wallaby.js 5 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // http://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module', 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | extends: ['airbnb-base', 'prettier'], 13 | plugins: ['import', 'prettier'], 14 | settings: { 15 | "import/resolver": { 16 | "node": true, 17 | "typescript": true 18 | }, 19 | }, 20 | rules: { 21 | 'import/extensions': [ 22 | 'error', 23 | 'always', 24 | // hide known extensions that are resolved by webpack 25 | { 26 | js: 'never', 27 | ts: 'never', 28 | }, 29 | ], 30 | // prettier compatibility 31 | 'max-len': 0, 32 | 'prettier/prettier': [ 33 | 'error', 34 | { singleQuote: true, trailingComma: 'all', printWidth: 100, tabWidth: 2 }, 35 | ], 36 | // only for use with getter-setters 37 | 'no-underscore-dangle': 0, 38 | // to correctly work on windows with some tools that create windows line-endings 39 | // this will be correct by git when committed 40 | 'linebreak-style': 0 41 | }, 42 | }; 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## copy to .npmignore 2 | .DS_Store 3 | .idea 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | node_modules/ 8 | .npm 9 | .eslintcache 10 | /coverage/ 11 | /.nyc_output/ 12 | /tmp/ 13 | 14 | ## only ignore in git 15 | /lib 16 | /index.js 17 | /index.d.ts 18 | test/files/* 19 | !test/files/.gitkeep 20 | !test/files/demo.png 21 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | ## copy from .gitignore 2 | .DS_Store 3 | .idea 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | node_modules/ 8 | .npm 9 | .eslintcache 10 | /coverage/ 11 | /.nyc_output/ 12 | /tmp/ 13 | 14 | # .npmignore 15 | .babelrc 16 | .editorconfig 17 | .eslintignore 18 | .eslintrc.js 19 | .gitignore 20 | .nvmrc 21 | .nycrc 22 | .prettierignore 23 | .prettierrc 24 | .travis.yml 25 | AUTHORS.md 26 | CONTRIBUTING.md 27 | tsconfig.json 28 | tslint.json 29 | /docs 30 | /example 31 | /src 32 | /test 33 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 8 2 | -------------------------------------------------------------------------------- /.nycrc: -------------------------------------------------------------------------------- 1 | { 2 | "sourceMap": false, 3 | "instrument": false, 4 | "check-coverage": true, 5 | "per-file": true, 6 | "lines": 10, 7 | "statements": 10, 8 | "functions": 10, 9 | "branches": 10, 10 | "include": [ 11 | "src/**/*.{js,ts}" 12 | ], 13 | "exclude": [ 14 | "test/**/*.spec.{js,ts}", 15 | "src/lib/vendor/**/*.*" 16 | ], 17 | "reporter": [ 18 | "lcov", 19 | "text-summary" 20 | ], 21 | "extension": [ 22 | ".js", 23 | ".ts" 24 | ], 25 | "cache": true, 26 | "all": true, 27 | "report-dir": "./coverage" 28 | } 29 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # for potential vendor files in src 2 | lib/**/* 3 | src/lib/vendor/**/* 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "tabWidth": 2, 4 | "singleQuote": true, 5 | "trailingComma": "all", 6 | "overrides": [ 7 | { 8 | "files": "*.json", 9 | "options": { 10 | "printWidth": 999999 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | cache: yarn 4 | 5 | node_js: 6 | - 'stable' 7 | - '6' 8 | - '8' 9 | 10 | sudo: false 11 | 12 | script: 13 | - yarn test 14 | 15 | deploy: 16 | - provider: npm 17 | email: 'devmonk@mediamonks.com' 18 | api_key: $NPM_TOKEN 19 | on: 20 | tags: true 21 | node: '8' 22 | skip_cleanup: true 23 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | * [Arjan van Wijk](https://github.com/thanarie) 2 | * [Mient-jan Stelling](https://github.com/mientjan) 3 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Adding docs 4 | 5 | Documentation is important, so any additions or improvements are welcomed! 6 | 7 | ## Adding features 8 | 9 | Wanting to add a feature? Awesome! 10 | 11 | If you're not sure the feature will be accepted, you can first open an issue to 12 | see what others think. 13 | 14 | Otherwise, just open a PR and describe what the feature is for; what problem it 15 | solves, why it should be added. 16 | 17 | You should also provide tests for the new feature, so we know it's working and 18 | to show of the usage. 19 | 20 | At last, please update the docs, describing how this new feature can be used. 21 | 22 | ## Fixing bugs 23 | 24 | You found a bug? How embarrassing! 25 | 26 | If you don't know how to fix it yourself, you can open an issue describing the 27 | bug; how to reproduce, desired behavior, actual behavior. 28 | 29 | Otherwise, you can open a PR. Please add a test first to show the incorrect 30 | behavior, and then add the fix so the test passes. 31 | 32 | ## Code style 33 | 34 | Please keep the code style consistent, defined by .editorconfig and the linters 35 | in place. 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 MediaMonks B.V. 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # s3-batch-upload 2 | 3 | Super fast batched S3 folder uploads from CLI or API. 4 | 5 | ## Installation 6 | 7 | ```sh 8 | yarn add s3-batch-upload 9 | ``` 10 | 11 | ```sh 12 | npm i -S s3-batch-upload 13 | ``` 14 | 15 | 16 | ## Basic Usage 17 | 18 | ### CLI 19 | 20 | ```sh 21 | # with config 22 | s3-batch-upload -c ./config/configS3.json -b bucket-name -p ./files -r remote/path/in/bucket 23 | 24 | # with env vars 25 | AWS_ACCESS_KEY_ID=AKIA...Q AWS_SECRET_ACCESS_KEY=jY...uJ s3-batch-upload -b bucket-name -p ./files -r remote/path/in/bucket -g "*.jpg -C 200 -d" 26 | ``` 27 | 28 | ``` 29 | Usage: cli.js [options] 30 | 31 | Commands: 32 | cli.js upload Upload files to s3 [default] 33 | 34 | Required: 35 | -b, --bucket The bucket to upload to. [string] [required] 36 | -p, --local-path The path to the folder to upload. [string] [required] 37 | -r, --remote-path The remote path in the bucket to upload the files to. [string] [required] 38 | 39 | Options: 40 | -d, --dry-run Do a dry run, don't do any upload. [boolean] [default: false] 41 | -C, --concurrency The amount of simultaneous uploads, increase on faster internet connection. 42 | [number] [default: 100] 43 | -g, --glob A glob on filename level to filter the files to upload [string] [default: "*.*"] 44 | --go, --glob-options Options to pass to the glob module [string] [default: "undefined] 45 | -a, --cache-control Cache control for uploaded files, can be string for single value or list of glob settings 46 | [string] [default: ""] 47 | -acl, --access-control-level Sets the access control level for uploaded files 48 | [string] [default: "undefined"] 49 | -c, --config The AWS config json path to load S3 credentials with loadFromPath. [string] 50 | -o, --overwrite Overwrite remote files with the same name, or skip them. [boolean] [default: true] 51 | -h, --help Show help [boolean] 52 | 53 | Examples: 54 | cli.js -b bucket-name -p ./files -r /data Upload files from a local folder to a s3 bucket path 55 | cli.js ... -a "max-age=300" Set cache-control for all files 56 | cli.js ... -a '{ "**/*.json": "max-age=300", "**/*.*": Upload files from a local folder to a s3 bucket path 57 | "max-age=3600" }' 58 | cli.js ... -g "*" --go.nodir true --go.dot true Upload files from a local folder (including files with or without extension and .dot files) 59 | cli.js --no-overwrite ... Skip uploading files which exist already on s3 60 | cli.js -d ... Dry run upload 61 | 62 | for more information about AWS authentication, please visit 63 | https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html 64 | 65 | ``` 66 | 67 | ### API 68 | ```js 69 | import Uploader from 's3-batch-upload'; 70 | 71 | const files = await new Uploader({ 72 | config: './config/configS3.json', // can also use environment variables 73 | config: { // or you can use a object 74 | accessKeyId: "__EMPTY__", 75 | secretAccessKey: "__EMPTY__", 76 | region: "us-east-1" 77 | }, 78 | bucket: 'bucket-name', 79 | localPath: './files', 80 | remotePath: 'remote/path/in/bucket', 81 | glob: '*.jpg', // default is '*.*' 82 | globOptions: { nodir: true, dot: true }, // optional, additional options to pass to "glob" module 83 | concurrency: '200', // default is 100 84 | dryRun: true, // default is false 85 | cacheControl: 'max-age=300', // can be a string, for all uploade resources 86 | cacheControl: { // or an object with globs as keys to match the input path 87 | '**/settings.json': 'max-age=60', // 1 mins for settings, specific matches should go first 88 | '**/*.json': 'max-age=300', // 5 mins for other jsons 89 | '**/*.*': 'max-age=3600', // 1 hour for everthing else 90 | }, 91 | overwrite: false, // overwrite remote files with the same name, default is true 92 | accessControlLevel: 'bucket-owner-full-control' // optional, not passed if undefined. - available options - "private"|"public-read"|"public-read-write"|"authenticated-read"|"aws-exec-read"|"bucket-owner-read"|"bucket-owner-full-control" 93 | }).upload(); 94 | 95 | // the files array contains a list of uploaded keys, which you can use to build up the S3 urls. 96 | // e.g. "remote/path/in/bucket/demo.jpg" 97 | ``` 98 | 99 | ### S3 Authentication 100 | 101 | As seem above, you can either use environment variables, or a config file. 102 | 103 | When using a config file, add it to the `.gitignore`, because you don't want your credentials 104 | in your repo. Use the following template for the config file as stated in the [AWS Docs](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-json-file.html): 105 | 106 | ```json 107 | { 108 | "accessKeyId": "", 109 | "secretAccessKey": "", 110 | "region": "us-east-1" 111 | } 112 | ``` 113 | 114 | When using environment variables, check the [AWS docs](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-environment.html). 115 | 116 | ## Documentation 117 | 118 | View the [generated documentation](http://mediamonks.github.io/s3-batch-upload/). 119 | 120 | 121 | ## Building 122 | 123 | In order to build s3-batch-upload, ensure that you have [Git](http://git-scm.com/downloads) 124 | and [Node.js](http://nodejs.org/) installed. 125 | 126 | Clone a copy of the repo: 127 | ```sh 128 | git clone https://github.com/mediamonks/s3-batch-upload.git 129 | ``` 130 | 131 | Change to the s3-batch-upload directory: 132 | ```sh 133 | cd s3-batch-upload 134 | ``` 135 | 136 | Install dev dependencies: 137 | ```sh 138 | yarn 139 | ``` 140 | 141 | Use one of the following main scripts: 142 | ```sh 143 | yarn build # build this project 144 | yarn dev # run compilers in watch mode, both for babel and typescript 145 | yarn test # run the unit tests incl coverage 146 | yarn test:dev # run the unit tests in watch mode 147 | yarn lint # run eslint and tslint on this project 148 | yarn doc # generate typedoc documentation 149 | ``` 150 | 151 | When installing this module, it adds a pre-commit hook, that runs lint and prettier commands 152 | before committing, so you can be sure that everything checks out. 153 | 154 | 155 | ## Contribute 156 | 157 | View [CONTRIBUTING.md](./CONTRIBUTING.md) 158 | 159 | 160 | ## Changelog 161 | 162 | View [CHANGELOG.md](./CHANGELOG.md) 163 | 164 | 165 | ## Authors 166 | 167 | View [AUTHORS.md](./AUTHORS.md) 168 | 169 | 170 | ## LICENSE 171 | 172 | [MIT](./LICENSE) © MediaMonks 173 | 174 | 175 | -------------------------------------------------------------------------------- /docs/assets/css/main.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v1.1.3 | MIT License | git.io/normalize */ 2 | /* ========================================================================== HTML5 display definitions ========================================================================== */ 3 | /** Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. */ 4 | article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } 5 | 6 | /** Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */ 7 | audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } 8 | 9 | /** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ 10 | audio:not([controls]) { display: none; height: 0; } 11 | 12 | /** Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. Known issue: no IE 6 support. */ 13 | [hidden] { display: none; } 14 | 15 | /* ========================================================================== Base ========================================================================== */ 16 | /** 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using `em` units. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ 17 | html { font-size: 100%; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ font-family: sans-serif; } 18 | 19 | /** Address `font-family` inconsistency between `textarea` and other form elements. */ 20 | button, input, select, textarea { font-family: sans-serif; } 21 | 22 | /** Address margins handled incorrectly in IE 6/7. */ 23 | body { margin: 0; } 24 | 25 | /* ========================================================================== Links ========================================================================== */ 26 | /** Address `outline` inconsistency between Chrome and other browsers. */ 27 | a:focus { outline: thin dotted; } 28 | a:active, a:hover { outline: 0; } 29 | 30 | /** Improve readability when focused and also mouse hovered in all browsers. */ 31 | /* ========================================================================== Typography ========================================================================== */ 32 | /** Address font sizes and margins set differently in IE 6/7. Address font sizes within `section` and `article` in Firefox 4+, Safari 5, and Chrome. */ 33 | h1 { font-size: 2em; margin: 0.67em 0; } 34 | 35 | h2 { font-size: 1.5em; margin: 0.83em 0; } 36 | 37 | h3 { font-size: 1.17em; margin: 1em 0; } 38 | 39 | h4, .tsd-index-panel h3 { font-size: 1em; margin: 1.33em 0; } 40 | 41 | h5 { font-size: 0.83em; margin: 1.67em 0; } 42 | 43 | h6 { font-size: 0.67em; margin: 2.33em 0; } 44 | 45 | /** Address styling not present in IE 7/8/9, Safari 5, and Chrome. */ 46 | abbr[title] { border-bottom: 1px dotted; } 47 | 48 | /** Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. */ 49 | b, strong { font-weight: bold; } 50 | 51 | blockquote { margin: 1em 40px; } 52 | 53 | /** Address styling not present in Safari 5 and Chrome. */ 54 | dfn { font-style: italic; } 55 | 56 | /** Address differences between Firefox and other browsers. Known issue: no IE 6/7 normalization. */ 57 | hr { box-sizing: content-box; height: 0; } 58 | 59 | /** Address styling not present in IE 6/7/8/9. */ 60 | mark { background: #ff0; color: #000; } 61 | 62 | /** Address margins set differently in IE 6/7. */ 63 | p, pre { margin: 1em 0; } 64 | 65 | /** Correct font family set oddly in IE 6, Safari 4/5, and Chrome. */ 66 | code, kbd, pre, samp { font-family: monospace, serif; _font-family: "courier new", monospace; font-size: 1em; } 67 | 68 | /** Improve readability of pre-formatted text in all browsers. */ 69 | pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } 70 | 71 | /** Address CSS quotes not supported in IE 6/7. */ 72 | q { quotes: none; } 73 | q:before, q:after { content: ""; content: none; } 74 | 75 | /** Address `quotes` property not supported in Safari 4. */ 76 | /** Address inconsistent and variable font size in all browsers. */ 77 | small { font-size: 80%; } 78 | 79 | /** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ 80 | sub { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } 81 | 82 | sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; top: -0.5em; } 83 | 84 | sub { bottom: -0.25em; } 85 | 86 | /* ========================================================================== Lists ========================================================================== */ 87 | /** Address margins set differently in IE 6/7. */ 88 | dl, menu, ol, ul { margin: 1em 0; } 89 | 90 | dd { margin: 0 0 0 40px; } 91 | 92 | /** Address paddings set differently in IE 6/7. */ 93 | menu, ol, ul { padding: 0 0 0 40px; } 94 | 95 | /** Correct list images handled incorrectly in IE 7. */ 96 | nav ul, nav ol { list-style: none; list-style-image: none; } 97 | 98 | /* ========================================================================== Embedded content ========================================================================== */ 99 | /** 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. 2. Improve image quality when scaled in IE 7. */ 100 | img { border: 0; /* 1 */ -ms-interpolation-mode: bicubic; } 101 | 102 | /* 2 */ 103 | /** Correct overflow displayed oddly in IE 9. */ 104 | svg:not(:root) { overflow: hidden; } 105 | 106 | /* ========================================================================== Figures ========================================================================== */ 107 | /** Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */ 108 | figure, form { margin: 0; } 109 | 110 | /* ========================================================================== Forms ========================================================================== */ 111 | /** Correct margin displayed oddly in IE 6/7. */ 112 | /** Define consistent border, margin, and padding. */ 113 | fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } 114 | 115 | /** 1. Correct color not being inherited in IE 6/7/8/9. 2. Correct text not wrapping in Firefox 3. 3. Correct alignment displayed oddly in IE 6/7. */ 116 | legend { border: 0; /* 1 */ padding: 0; white-space: normal; /* 2 */ *margin-left: -7px; } 117 | 118 | /* 3 */ 119 | /** 1. Correct font size not being inherited in all browsers. 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, and Chrome. 3. Improve appearance and consistency in all browsers. */ 120 | button, input, select, textarea { font-size: 100%; /* 1 */ margin: 0; /* 2 */ vertical-align: baseline; /* 3 */ *vertical-align: middle; } 121 | 122 | /* 3 */ 123 | /** Address Firefox 3+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ 124 | button, input { line-height: normal; } 125 | 126 | /** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. Correct `select` style inheritance in Firefox 4+ and Opera. */ 127 | button, select { text-transform: none; } 128 | 129 | /** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. 4. Remove inner spacing in IE 7 without affecting normal text inputs. Known issue: inner spacing remains in IE 6. */ 130 | button, html input[type="button"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; } 131 | 132 | /* 4 */ 133 | input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; } 134 | 135 | /* 4 */ 136 | /** Re-set default cursor for disabled elements. */ 137 | button[disabled], html input[disabled] { cursor: default; } 138 | 139 | /** 1. Address box sizing set to content-box in IE 8/9. 2. Remove excess padding in IE 8/9. 3. Remove excess padding in IE 7. Known issue: excess padding remains in IE 6. */ 140 | input { /* 3 */ } 141 | input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ *height: 13px; /* 3 */ *width: 13px; } 142 | input[type="search"] { -webkit-appearance: textfield; /* 1 */ /* 2 */ box-sizing: content-box; } 143 | input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } 144 | 145 | /** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ 146 | /** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ 147 | /** Remove inner padding and border in Firefox 3+. */ 148 | button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } 149 | 150 | /** 1. Remove default vertical scrollbar in IE 6/7/8/9. 2. Improve readability and alignment in all browsers. */ 151 | textarea { overflow: auto; /* 1 */ vertical-align: top; } 152 | 153 | /* 2 */ 154 | /* ========================================================================== Tables ========================================================================== */ 155 | /** Remove most spacing between table cells. */ 156 | table { border-collapse: collapse; border-spacing: 0; } 157 | 158 | /* Visual Studio-like style based on original C# coloring by Jason Diamond */ 159 | .hljs { display: inline-block; padding: 0.5em; background: white; color: black; } 160 | 161 | .hljs-comment, .hljs-annotation, .hljs-template_comment, .diff .hljs-header, .hljs-chunk, .apache .hljs-cbracket { color: #008000; } 162 | 163 | .hljs-keyword, .hljs-id, .hljs-built_in, .css .smalltalk .hljs-class, .hljs-winutils, .bash .hljs-variable, .tex .hljs-command, .hljs-request, .hljs-status, .nginx .hljs-title { color: #00f; } 164 | 165 | .xml .hljs-tag { color: #00f; } 166 | .xml .hljs-tag .hljs-value { color: #00f; } 167 | 168 | .hljs-string, .hljs-title, .hljs-parent, .hljs-tag .hljs-value, .hljs-rules .hljs-value { color: #a31515; } 169 | 170 | .ruby .hljs-symbol { color: #a31515; } 171 | .ruby .hljs-symbol .hljs-string { color: #a31515; } 172 | 173 | .hljs-template_tag, .django .hljs-variable, .hljs-addition, .hljs-flow, .hljs-stream, .apache .hljs-tag, .hljs-date, .tex .hljs-formula, .coffeescript .hljs-attribute { color: #a31515; } 174 | 175 | .ruby .hljs-string, .hljs-decorator, .hljs-filter .hljs-argument, .hljs-localvars, .hljs-array, .hljs-attr_selector, .hljs-pseudo, .hljs-pi, .hljs-doctype, .hljs-deletion, .hljs-envvar, .hljs-shebang, .hljs-preprocessor, .hljs-pragma, .userType, .apache .hljs-sqbracket, .nginx .hljs-built_in, .tex .hljs-special, .hljs-prompt { color: #2b91af; } 176 | 177 | .hljs-phpdoc, .hljs-javadoc, .hljs-xmlDocTag { color: #808080; } 178 | 179 | .vhdl .hljs-typename { font-weight: bold; } 180 | .vhdl .hljs-string { color: #666666; } 181 | .vhdl .hljs-literal { color: #a31515; } 182 | .vhdl .hljs-attribute { color: #00b0e8; } 183 | 184 | .xml .hljs-attribute { color: #f00; } 185 | 186 | .col > :first-child, .col-1 > :first-child, .col-2 > :first-child, .col-3 > :first-child, .col-4 > :first-child, .col-5 > :first-child, .col-6 > :first-child, .col-7 > :first-child, .col-8 > :first-child, .col-9 > :first-child, .col-10 > :first-child, .col-11 > :first-child, .tsd-panel > :first-child, ul.tsd-descriptions > li > :first-child, .col > :first-child > :first-child, .col-1 > :first-child > :first-child, .col-2 > :first-child > :first-child, .col-3 > :first-child > :first-child, .col-4 > :first-child > :first-child, .col-5 > :first-child > :first-child, .col-6 > :first-child > :first-child, .col-7 > :first-child > :first-child, .col-8 > :first-child > :first-child, .col-9 > :first-child > :first-child, .col-10 > :first-child > :first-child, .col-11 > :first-child > :first-child, .tsd-panel > :first-child > :first-child, ul.tsd-descriptions > li > :first-child > :first-child, .col > :first-child > :first-child > :first-child, .col-1 > :first-child > :first-child > :first-child, .col-2 > :first-child > :first-child > :first-child, .col-3 > :first-child > :first-child > :first-child, .col-4 > :first-child > :first-child > :first-child, .col-5 > :first-child > :first-child > :first-child, .col-6 > :first-child > :first-child > :first-child, .col-7 > :first-child > :first-child > :first-child, .col-8 > :first-child > :first-child > :first-child, .col-9 > :first-child > :first-child > :first-child, .col-10 > :first-child > :first-child > :first-child, .col-11 > :first-child > :first-child > :first-child, .tsd-panel > :first-child > :first-child > :first-child, ul.tsd-descriptions > li > :first-child > :first-child > :first-child { margin-top: 0; } 187 | .col > :last-child, .col-1 > :last-child, .col-2 > :last-child, .col-3 > :last-child, .col-4 > :last-child, .col-5 > :last-child, .col-6 > :last-child, .col-7 > :last-child, .col-8 > :last-child, .col-9 > :last-child, .col-10 > :last-child, .col-11 > :last-child, .tsd-panel > :last-child, ul.tsd-descriptions > li > :last-child, .col > :last-child > :last-child, .col-1 > :last-child > :last-child, .col-2 > :last-child > :last-child, .col-3 > :last-child > :last-child, .col-4 > :last-child > :last-child, .col-5 > :last-child > :last-child, .col-6 > :last-child > :last-child, .col-7 > :last-child > :last-child, .col-8 > :last-child > :last-child, .col-9 > :last-child > :last-child, .col-10 > :last-child > :last-child, .col-11 > :last-child > :last-child, .tsd-panel > :last-child > :last-child, ul.tsd-descriptions > li > :last-child > :last-child, .col > :last-child > :last-child > :last-child, .col-1 > :last-child > :last-child > :last-child, .col-2 > :last-child > :last-child > :last-child, .col-3 > :last-child > :last-child > :last-child, .col-4 > :last-child > :last-child > :last-child, .col-5 > :last-child > :last-child > :last-child, .col-6 > :last-child > :last-child > :last-child, .col-7 > :last-child > :last-child > :last-child, .col-8 > :last-child > :last-child > :last-child, .col-9 > :last-child > :last-child > :last-child, .col-10 > :last-child > :last-child > :last-child, .col-11 > :last-child > :last-child > :last-child, .tsd-panel > :last-child > :last-child > :last-child, ul.tsd-descriptions > li > :last-child > :last-child > :last-child { margin-bottom: 0; } 188 | 189 | .container { max-width: 1200px; margin: 0 auto; padding: 0 40px; } 190 | @media (max-width: 640px) { .container { padding: 0 20px; } } 191 | 192 | .container-main { padding-bottom: 200px; } 193 | 194 | .row { position: relative; margin: 0 -10px; } 195 | .row:after { visibility: hidden; display: block; content: ""; clear: both; height: 0; } 196 | 197 | .col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11 { box-sizing: border-box; float: left; padding: 0 10px; } 198 | 199 | .col-1 { width: 8.33333%; } 200 | 201 | .offset-1 { margin-left: 8.33333%; } 202 | 203 | .col-2 { width: 16.66667%; } 204 | 205 | .offset-2 { margin-left: 16.66667%; } 206 | 207 | .col-3 { width: 25%; } 208 | 209 | .offset-3 { margin-left: 25%; } 210 | 211 | .col-4 { width: 33.33333%; } 212 | 213 | .offset-4 { margin-left: 33.33333%; } 214 | 215 | .col-5 { width: 41.66667%; } 216 | 217 | .offset-5 { margin-left: 41.66667%; } 218 | 219 | .col-6 { width: 50%; } 220 | 221 | .offset-6 { margin-left: 50%; } 222 | 223 | .col-7 { width: 58.33333%; } 224 | 225 | .offset-7 { margin-left: 58.33333%; } 226 | 227 | .col-8 { width: 66.66667%; } 228 | 229 | .offset-8 { margin-left: 66.66667%; } 230 | 231 | .col-9 { width: 75%; } 232 | 233 | .offset-9 { margin-left: 75%; } 234 | 235 | .col-10 { width: 83.33333%; } 236 | 237 | .offset-10 { margin-left: 83.33333%; } 238 | 239 | .col-11 { width: 91.66667%; } 240 | 241 | .offset-11 { margin-left: 91.66667%; } 242 | 243 | .tsd-kind-icon { display: block; position: relative; padding-left: 20px; text-indent: -20px; } 244 | .tsd-kind-icon:before { content: ''; display: inline-block; vertical-align: middle; width: 17px; height: 17px; margin: 0 3px 2px 0; background-image: url(../images/icons.png); } 245 | @media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { .tsd-kind-icon:before { background-image: url(../images/icons@2x.png); background-size: 238px 204px; } } 246 | 247 | .tsd-signature.tsd-kind-icon:before { background-position: 0 -153px; } 248 | 249 | .tsd-kind-object-literal > .tsd-kind-icon:before { background-position: 0px -17px; } 250 | .tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -17px; } 251 | .tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -17px; } 252 | 253 | .tsd-kind-class > .tsd-kind-icon:before { background-position: 0px -34px; } 254 | .tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -34px; } 255 | .tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -34px; } 256 | 257 | .tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: 0px -51px; } 258 | .tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -51px; } 259 | .tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -51px; } 260 | 261 | .tsd-kind-interface > .tsd-kind-icon:before { background-position: 0px -68px; } 262 | .tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -68px; } 263 | .tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -68px; } 264 | 265 | .tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: 0px -85px; } 266 | .tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -85px; } 267 | .tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -85px; } 268 | 269 | .tsd-kind-module > .tsd-kind-icon:before { background-position: 0px -102px; } 270 | .tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -102px; } 271 | .tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -102px; } 272 | 273 | .tsd-kind-external-module > .tsd-kind-icon:before { background-position: 0px -102px; } 274 | .tsd-kind-external-module.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -102px; } 275 | .tsd-kind-external-module.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -102px; } 276 | 277 | .tsd-kind-enum > .tsd-kind-icon:before { background-position: 0px -119px; } 278 | .tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -119px; } 279 | .tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -119px; } 280 | 281 | .tsd-kind-enum-member > .tsd-kind-icon:before { background-position: 0px -136px; } 282 | .tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -136px; } 283 | .tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -136px; } 284 | 285 | .tsd-kind-signature > .tsd-kind-icon:before { background-position: 0px -153px; } 286 | .tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -153px; } 287 | .tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -153px; } 288 | 289 | .tsd-kind-type-alias > .tsd-kind-icon:before { background-position: 0px -170px; } 290 | .tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -170px; } 291 | .tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -170px; } 292 | 293 | .tsd-kind-variable > .tsd-kind-icon:before { background-position: -136px -0px; } 294 | .tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -0px; } 295 | .tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 296 | .tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -0px; } 297 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -0px; } 298 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -0px; } 299 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -0px; } 300 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 301 | .tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -0px; } 302 | .tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -0px; } 303 | .tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 304 | .tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -0px; } 305 | .tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -0px; } 306 | 307 | .tsd-kind-property > .tsd-kind-icon:before { background-position: -136px -0px; } 308 | .tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -0px; } 309 | .tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 310 | .tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -0px; } 311 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -0px; } 312 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -0px; } 313 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -0px; } 314 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 315 | .tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -0px; } 316 | .tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -0px; } 317 | .tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 318 | .tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -0px; } 319 | .tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -0px; } 320 | 321 | .tsd-kind-get-signature > .tsd-kind-icon:before { background-position: -136px -17px; } 322 | .tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -17px; } 323 | .tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; } 324 | .tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -17px; } 325 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -17px; } 326 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -17px; } 327 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -17px; } 328 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; } 329 | .tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -17px; } 330 | .tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -17px; } 331 | .tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; } 332 | .tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -17px; } 333 | .tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -17px; } 334 | 335 | .tsd-kind-set-signature > .tsd-kind-icon:before { background-position: -136px -34px; } 336 | .tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -34px; } 337 | .tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; } 338 | .tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -34px; } 339 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -34px; } 340 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -34px; } 341 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -34px; } 342 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; } 343 | .tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -34px; } 344 | .tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -34px; } 345 | .tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; } 346 | .tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -34px; } 347 | .tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -34px; } 348 | 349 | .tsd-kind-accessor > .tsd-kind-icon:before { background-position: -136px -51px; } 350 | .tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -51px; } 351 | .tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; } 352 | .tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -51px; } 353 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -51px; } 354 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -51px; } 355 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -51px; } 356 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; } 357 | .tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -51px; } 358 | .tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -51px; } 359 | .tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; } 360 | .tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -51px; } 361 | .tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -51px; } 362 | 363 | .tsd-kind-function > .tsd-kind-icon:before { background-position: -136px -68px; } 364 | .tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; } 365 | .tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 366 | .tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; } 367 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; } 368 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; } 369 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; } 370 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 371 | .tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; } 372 | .tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; } 373 | .tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 374 | .tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; } 375 | .tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; } 376 | 377 | .tsd-kind-method > .tsd-kind-icon:before { background-position: -136px -68px; } 378 | .tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; } 379 | .tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 380 | .tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; } 381 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; } 382 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; } 383 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; } 384 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 385 | .tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; } 386 | .tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; } 387 | .tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 388 | .tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; } 389 | .tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; } 390 | 391 | .tsd-kind-call-signature > .tsd-kind-icon:before { background-position: -136px -68px; } 392 | .tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; } 393 | .tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 394 | .tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; } 395 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; } 396 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; } 397 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; } 398 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 399 | .tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; } 400 | .tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; } 401 | .tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 402 | .tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; } 403 | .tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; } 404 | 405 | .tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: -136px -85px; } 406 | .tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -85px; } 407 | .tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 408 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -85px; } 409 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -85px; } 410 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -85px; } 411 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -85px; } 412 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 413 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -85px; } 414 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -85px; } 415 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 416 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -85px; } 417 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -85px; } 418 | 419 | .tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: -136px -85px; } 420 | .tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -85px; } 421 | .tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 422 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -85px; } 423 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -85px; } 424 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -85px; } 425 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -85px; } 426 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 427 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -85px; } 428 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -85px; } 429 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 430 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -85px; } 431 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -85px; } 432 | 433 | .tsd-kind-constructor > .tsd-kind-icon:before { background-position: -136px -102px; } 434 | .tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -102px; } 435 | .tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 436 | .tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -102px; } 437 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -102px; } 438 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -102px; } 439 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -102px; } 440 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 441 | .tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -102px; } 442 | .tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -102px; } 443 | .tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 444 | .tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -102px; } 445 | .tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -102px; } 446 | 447 | .tsd-kind-constructor-signature > .tsd-kind-icon:before { background-position: -136px -102px; } 448 | .tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -102px; } 449 | .tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 450 | .tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -102px; } 451 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -102px; } 452 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -102px; } 453 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -102px; } 454 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 455 | .tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -102px; } 456 | .tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -102px; } 457 | .tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 458 | .tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -102px; } 459 | .tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -102px; } 460 | 461 | .tsd-kind-index-signature > .tsd-kind-icon:before { background-position: -136px -119px; } 462 | .tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -119px; } 463 | .tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; } 464 | .tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -119px; } 465 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -119px; } 466 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -119px; } 467 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -119px; } 468 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; } 469 | .tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -119px; } 470 | .tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -119px; } 471 | .tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; } 472 | .tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -119px; } 473 | .tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -119px; } 474 | 475 | .tsd-kind-event > .tsd-kind-icon:before { background-position: -136px -136px; } 476 | .tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -136px; } 477 | .tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; } 478 | .tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -136px; } 479 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -136px; } 480 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -136px; } 481 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -136px; } 482 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; } 483 | .tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -136px; } 484 | .tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -136px; } 485 | .tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; } 486 | .tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -136px; } 487 | .tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -136px; } 488 | 489 | .tsd-is-static > .tsd-kind-icon:before { background-position: -136px -153px; } 490 | .tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -153px; } 491 | .tsd-is-static.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; } 492 | .tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -153px; } 493 | .tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -153px; } 494 | .tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -153px; } 495 | .tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -153px; } 496 | .tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; } 497 | .tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -153px; } 498 | .tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -153px; } 499 | .tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; } 500 | .tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -153px; } 501 | .tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -153px; } 502 | 503 | .tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { background-position: -136px -170px; } 504 | .tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; } 505 | .tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 506 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; } 507 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; } 508 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; } 509 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; } 510 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 511 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; } 512 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; } 513 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 514 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; } 515 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; } 516 | 517 | .tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { background-position: -136px -170px; } 518 | .tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; } 519 | .tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 520 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; } 521 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; } 522 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; } 523 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; } 524 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 525 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; } 526 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; } 527 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 528 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; } 529 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; } 530 | 531 | .tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { background-position: -136px -170px; } 532 | .tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; } 533 | .tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 534 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; } 535 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; } 536 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; } 537 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; } 538 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 539 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; } 540 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; } 541 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 542 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; } 543 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; } 544 | 545 | .tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { background-position: -136px -187px; } 546 | .tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -187px; } 547 | .tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; } 548 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -187px; } 549 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -187px; } 550 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -187px; } 551 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -187px; } 552 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; } 553 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -187px; } 554 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -187px; } 555 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; } 556 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -187px; } 557 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -187px; } 558 | 559 | .no-transition { transition: none !important; } 560 | 561 | @-webkit-keyframes fade-in { from { opacity: 0; } 562 | to { opacity: 1; } } 563 | 564 | @keyframes fade-in { from { opacity: 0; } 565 | to { opacity: 1; } } 566 | @-webkit-keyframes fade-out { from { opacity: 1; visibility: visible; } 567 | to { opacity: 0; } } 568 | @keyframes fade-out { from { opacity: 1; visibility: visible; } 569 | to { opacity: 0; } } 570 | @-webkit-keyframes fade-in-delayed { 0% { opacity: 0; } 571 | 33% { opacity: 0; } 572 | 100% { opacity: 1; } } 573 | @keyframes fade-in-delayed { 0% { opacity: 0; } 574 | 33% { opacity: 0; } 575 | 100% { opacity: 1; } } 576 | @-webkit-keyframes fade-out-delayed { 0% { opacity: 1; visibility: visible; } 577 | 66% { opacity: 0; } 578 | 100% { opacity: 0; } } 579 | @keyframes fade-out-delayed { 0% { opacity: 1; visibility: visible; } 580 | 66% { opacity: 0; } 581 | 100% { opacity: 0; } } 582 | @-webkit-keyframes shift-to-left { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 583 | to { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } } 584 | @keyframes shift-to-left { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 585 | to { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } } 586 | @-webkit-keyframes unshift-to-left { from { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } 587 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 588 | @keyframes unshift-to-left { from { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } 589 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 590 | @-webkit-keyframes pop-in-from-right { from { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } 591 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 592 | @keyframes pop-in-from-right { from { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } 593 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 594 | @-webkit-keyframes pop-out-to-right { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; } 595 | to { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } } 596 | @keyframes pop-out-to-right { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; } 597 | to { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } } 598 | body { background: #fdfdfd; font-family: "Segoe UI", sans-serif; font-size: 16px; color: #222; } 599 | 600 | a { color: #4da6ff; text-decoration: none; } 601 | a:hover { text-decoration: underline; } 602 | 603 | code, pre { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; padding: 0.2em; margin: 0; font-size: 14px; background-color: rgba(0, 0, 0, 0.04); } 604 | 605 | pre { padding: 10px; } 606 | pre code { padding: 0; font-size: 100%; background-color: transparent; } 607 | 608 | .tsd-typography { line-height: 1.333em; } 609 | .tsd-typography ul { list-style: square; padding: 0 0 0 20px; margin: 0; } 610 | .tsd-typography h4, .tsd-typography .tsd-index-panel h3, .tsd-index-panel .tsd-typography h3, .tsd-typography h5, .tsd-typography h6 { font-size: 1em; margin: 0; } 611 | .tsd-typography h5, .tsd-typography h6 { font-weight: normal; } 612 | .tsd-typography p, .tsd-typography ul, .tsd-typography ol { margin: 1em 0; } 613 | 614 | @media (min-width: 901px) and (max-width: 1024px) { html.default .col-content { width: 72%; } 615 | html.default .col-menu { width: 28%; } 616 | html.default .tsd-navigation { padding-left: 10px; } } 617 | @media (max-width: 900px) { html.default .col-content { float: none; width: 100%; } 618 | html.default .col-menu { position: fixed !important; overflow: auto; -webkit-overflow-scrolling: touch; overflow-scrolling: touch; z-index: 1024; top: 0 !important; bottom: 0 !important; left: auto !important; right: 0 !important; width: 100%; padding: 20px 20px 0 0; max-width: 450px; visibility: hidden; background-color: #fff; -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } 619 | html.default .col-menu > *:last-child { padding-bottom: 20px; } 620 | html.default .overlay { content: ""; display: block; position: fixed; z-index: 1023; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.75); visibility: hidden; } 621 | html.default.to-has-menu .overlay { -webkit-animation: fade-in 0.4s; animation: fade-in 0.4s; } 622 | html.default.to-has-menu header, html.default.to-has-menu footer, html.default.to-has-menu .col-content { -webkit-animation: shift-to-left 0.4s; animation: shift-to-left 0.4s; } 623 | html.default.to-has-menu .col-menu { -webkit-animation: pop-in-from-right 0.4s; animation: pop-in-from-right 0.4s; } 624 | html.default.from-has-menu .overlay { -webkit-animation: fade-out 0.4s; animation: fade-out 0.4s; } 625 | html.default.from-has-menu header, html.default.from-has-menu footer, html.default.from-has-menu .col-content { -webkit-animation: unshift-to-left 0.4s; animation: unshift-to-left 0.4s; } 626 | html.default.from-has-menu .col-menu { -webkit-animation: pop-out-to-right 0.4s; animation: pop-out-to-right 0.4s; } 627 | html.default.has-menu body { overflow: hidden; } 628 | html.default.has-menu .overlay { visibility: visible; } 629 | html.default.has-menu header, html.default.has-menu footer, html.default.has-menu .col-content { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } 630 | html.default.has-menu .col-menu { visibility: visible; -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 631 | 632 | .tsd-page-title { padding: 70px 0 20px 0; margin: 0 0 40px 0; background: #fff; box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); } 633 | .tsd-page-title h1 { margin: 0; } 634 | 635 | .tsd-breadcrumb { margin: 0; padding: 0; color: #808080; } 636 | .tsd-breadcrumb a { color: #808080; text-decoration: none; } 637 | .tsd-breadcrumb a:hover { text-decoration: underline; } 638 | .tsd-breadcrumb li { display: inline; } 639 | .tsd-breadcrumb li:after { content: " / "; } 640 | 641 | html.minimal .container { margin: 0; } 642 | html.minimal .container-main { padding-top: 50px; padding-bottom: 0; } 643 | html.minimal .content-wrap { padding-left: 300px; } 644 | html.minimal .tsd-navigation { position: fixed !important; overflow: auto; -webkit-overflow-scrolling: touch; overflow-scrolling: touch; box-sizing: border-box; z-index: 1; left: 0; top: 40px; bottom: 0; width: 300px; padding: 20px; margin: 0; } 645 | html.minimal .tsd-member .tsd-member { margin-left: 0; } 646 | html.minimal .tsd-page-toolbar { position: fixed; z-index: 2; } 647 | html.minimal #tsd-filter .tsd-filter-group { right: 0; -webkit-transform: none; transform: none; } 648 | html.minimal footer { background-color: transparent; } 649 | html.minimal footer .container { padding: 0; } 650 | html.minimal .tsd-generator { padding: 0; } 651 | @media (max-width: 900px) { html.minimal .tsd-navigation { display: none; } 652 | html.minimal .content-wrap { padding-left: 0; } } 653 | 654 | dl.tsd-comment-tags { overflow: hidden; } 655 | dl.tsd-comment-tags dt { clear: both; float: left; padding: 1px 5px; margin: 0 10px 0 0; border-radius: 4px; border: 1px solid #808080; color: #808080; font-size: 0.8em; font-weight: normal; } 656 | dl.tsd-comment-tags dd { margin: 0 0 10px 0; } 657 | dl.tsd-comment-tags p { margin: 0; } 658 | 659 | .tsd-panel.tsd-comment .lead { font-size: 1.1em; line-height: 1.333em; margin-bottom: 2em; } 660 | .tsd-panel.tsd-comment .lead:last-child { margin-bottom: 0; } 661 | 662 | .toggle-protected .tsd-is-private { display: none; } 663 | 664 | .toggle-public .tsd-is-private, .toggle-public .tsd-is-protected, .toggle-public .tsd-is-private-protected { display: none; } 665 | 666 | .toggle-inherited .tsd-is-inherited { display: none; } 667 | 668 | .toggle-only-exported .tsd-is-not-exported { display: none; } 669 | 670 | .toggle-externals .tsd-is-external { display: none; } 671 | 672 | #tsd-filter { position: relative; display: inline-block; height: 40px; vertical-align: bottom; } 673 | .no-filter #tsd-filter { display: none; } 674 | #tsd-filter .tsd-filter-group { display: inline-block; height: 40px; vertical-align: bottom; white-space: nowrap; } 675 | #tsd-filter input { display: none; } 676 | @media (max-width: 900px) { #tsd-filter .tsd-filter-group { display: block; position: absolute; top: 40px; right: 20px; height: auto; background-color: #fff; visibility: hidden; -webkit-transform: translate(50%, 0); transform: translate(50%, 0); box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); } 677 | .has-options #tsd-filter .tsd-filter-group { visibility: visible; } 678 | .to-has-options #tsd-filter .tsd-filter-group { -webkit-animation: fade-in 0.2s; animation: fade-in 0.2s; } 679 | .from-has-options #tsd-filter .tsd-filter-group { -webkit-animation: fade-out 0.2s; animation: fade-out 0.2s; } 680 | #tsd-filter label, #tsd-filter .tsd-select { display: block; padding-right: 20px; } } 681 | 682 | footer { border-top: 1px solid #eee; background-color: #fff; } 683 | footer.with-border-bottom { border-bottom: 1px solid #eee; } 684 | footer .tsd-legend-group { font-size: 0; } 685 | footer .tsd-legend { display: inline-block; width: 25%; padding: 0; font-size: 16px; list-style: none; line-height: 1.333em; vertical-align: top; } 686 | @media (max-width: 900px) { footer .tsd-legend { width: 50%; } } 687 | 688 | .tsd-hierarchy { list-style: square; padding: 0 0 0 20px; margin: 0; } 689 | .tsd-hierarchy .target { font-weight: bold; } 690 | 691 | .tsd-index-panel .tsd-index-content { margin-bottom: -30px !important; } 692 | .tsd-index-panel .tsd-index-section { margin-bottom: 30px !important; } 693 | .tsd-index-panel h3 { margin: 0 -20px 10px -20px; padding: 0 20px 10px 20px; border-bottom: 1px solid #eee; } 694 | .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 3; -moz-column-count: 3; -ms-column-count: 3; -o-column-count: 3; column-count: 3; -webkit-column-gap: 20px; -moz-column-gap: 20px; -ms-column-gap: 20px; -o-column-gap: 20px; column-gap: 20px; padding: 0; list-style: none; line-height: 1.333em; } 695 | @media (max-width: 900px) { .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 1; -moz-column-count: 1; -ms-column-count: 1; -o-column-count: 1; column-count: 1; } } 696 | @media (min-width: 901px) and (max-width: 1024px) { .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 2; -moz-column-count: 2; -ms-column-count: 2; -o-column-count: 2; column-count: 2; } } 697 | .tsd-index-panel ul.tsd-index-list li { -webkit-column-break-inside: avoid; -moz-column-break-inside: avoid; -ms-column-break-inside: avoid; -o-column-break-inside: avoid; column-break-inside: avoid; -webkit-page-break-inside: avoid; -moz-page-break-inside: avoid; -ms-page-break-inside: avoid; -o-page-break-inside: avoid; page-break-inside: avoid; } 698 | .tsd-index-panel a, .tsd-index-panel .tsd-parent-kind-module a { color: #9600ff; } 699 | .tsd-index-panel .tsd-parent-kind-interface a { color: #7da01f; } 700 | .tsd-index-panel .tsd-parent-kind-enum a { color: #cc9900; } 701 | .tsd-index-panel .tsd-parent-kind-class a { color: #4da6ff; } 702 | .tsd-index-panel .tsd-kind-module a { color: #9600ff; } 703 | .tsd-index-panel .tsd-kind-interface a { color: #7da01f; } 704 | .tsd-index-panel .tsd-kind-enum a { color: #cc9900; } 705 | .tsd-index-panel .tsd-kind-class a { color: #4da6ff; } 706 | .tsd-index-panel .tsd-is-private a { color: #808080; } 707 | 708 | .tsd-flag { display: inline-block; padding: 1px 5px; border-radius: 4px; color: #fff; background-color: #808080; text-indent: 0; font-size: 14px; font-weight: normal; } 709 | 710 | .tsd-anchor { position: absolute; top: -100px; } 711 | 712 | .tsd-member { position: relative; } 713 | .tsd-member .tsd-anchor + h3 { margin-top: 0; margin-bottom: 0; border-bottom: none; } 714 | 715 | .tsd-navigation { padding: 0 0 0 40px; } 716 | .tsd-navigation a { display: block; padding-top: 2px; padding-bottom: 2px; border-left: 2px solid transparent; color: #222; text-decoration: none; transition: border-left-color 0.1s; } 717 | .tsd-navigation a:hover { text-decoration: underline; } 718 | .tsd-navigation ul { margin: 0; padding: 0; list-style: none; } 719 | .tsd-navigation li { padding: 0; } 720 | 721 | .tsd-navigation.primary { padding-bottom: 40px; } 722 | .tsd-navigation.primary a { display: block; padding-top: 6px; padding-bottom: 6px; } 723 | .tsd-navigation.primary ul li a { padding-left: 5px; } 724 | .tsd-navigation.primary ul li li a { padding-left: 25px; } 725 | .tsd-navigation.primary ul li li li a { padding-left: 45px; } 726 | .tsd-navigation.primary ul li li li li a { padding-left: 65px; } 727 | .tsd-navigation.primary ul li li li li li a { padding-left: 85px; } 728 | .tsd-navigation.primary ul li li li li li li a { padding-left: 105px; } 729 | .tsd-navigation.primary > ul { border-bottom: 1px solid #eee; } 730 | .tsd-navigation.primary li { border-top: 1px solid #eee; } 731 | .tsd-navigation.primary li.current > a { font-weight: bold; } 732 | .tsd-navigation.primary li.label span { display: block; padding: 20px 0 6px 5px; color: #808080; } 733 | .tsd-navigation.primary li.globals + li > span, .tsd-navigation.primary li.globals + li > a { padding-top: 20px; } 734 | 735 | .tsd-navigation.secondary ul { transition: opacity 0.2s; } 736 | .tsd-navigation.secondary ul li a { padding-left: 25px; } 737 | .tsd-navigation.secondary ul li li a { padding-left: 45px; } 738 | .tsd-navigation.secondary ul li li li a { padding-left: 65px; } 739 | .tsd-navigation.secondary ul li li li li a { padding-left: 85px; } 740 | .tsd-navigation.secondary ul li li li li li a { padding-left: 105px; } 741 | .tsd-navigation.secondary ul li li li li li li a { padding-left: 125px; } 742 | .tsd-navigation.secondary ul.current a { border-left-color: #eee; } 743 | .tsd-navigation.secondary li.focus > a, .tsd-navigation.secondary ul.current li.focus > a { border-left-color: #000; } 744 | .tsd-navigation.secondary li.current { margin-top: 20px; margin-bottom: 20px; border-left-color: #eee; } 745 | .tsd-navigation.secondary li.current > a { font-weight: bold; } 746 | 747 | @media (min-width: 901px) { .menu-sticky-wrap { position: static; } 748 | .no-csspositionsticky .menu-sticky-wrap.sticky { position: fixed; } 749 | .no-csspositionsticky .menu-sticky-wrap.sticky-current { position: fixed; } 750 | .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.before-current, .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.after-current { opacity: 0; } 751 | .no-csspositionsticky .menu-sticky-wrap.sticky-bottom { position: absolute; top: auto !important; left: auto !important; bottom: 0; right: 0; } 752 | .csspositionsticky .menu-sticky-wrap.sticky { position: -webkit-sticky; position: sticky; } 753 | .csspositionsticky .menu-sticky-wrap.sticky-current { position: -webkit-sticky; position: sticky; } } 754 | 755 | .tsd-panel { margin: 20px 0; padding: 20px; background-color: #fff; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); } 756 | .tsd-panel:empty { display: none; } 757 | .tsd-panel > h1, .tsd-panel > h2, .tsd-panel > h3 { margin: 1.5em -20px 10px -20px; padding: 0 20px 10px 20px; border-bottom: 1px solid #eee; } 758 | .tsd-panel > h1.tsd-before-signature, .tsd-panel > h2.tsd-before-signature, .tsd-panel > h3.tsd-before-signature { margin-bottom: 0; border-bottom: 0; } 759 | .tsd-panel table { display: block; width: 100%; overflow: auto; margin-top: 10px; word-break: normal; word-break: keep-all; } 760 | .tsd-panel table th { font-weight: bold; } 761 | .tsd-panel table th, .tsd-panel table td { padding: 6px 13px; border: 1px solid #ddd; } 762 | .tsd-panel table tr { background-color: #fff; border-top: 1px solid #ccc; } 763 | .tsd-panel table tr:nth-child(2n) { background-color: #f8f8f8; } 764 | 765 | .tsd-panel-group { margin: 60px 0; } 766 | .tsd-panel-group > h1, .tsd-panel-group > h2, .tsd-panel-group > h3 { padding-left: 20px; padding-right: 20px; } 767 | 768 | #tsd-search { transition: background-color 0.2s; } 769 | #tsd-search .title { position: relative; z-index: 2; } 770 | #tsd-search .field { position: absolute; left: 0; top: 0; right: 40px; height: 40px; } 771 | #tsd-search .field input { box-sizing: border-box; position: relative; top: -50px; z-index: 1; width: 100%; padding: 0 10px; opacity: 0; outline: 0; border: 0; background: transparent; color: #222; } 772 | #tsd-search .field label { position: absolute; overflow: hidden; right: -40px; } 773 | #tsd-search .field input, #tsd-search .title { transition: opacity 0.2s; } 774 | #tsd-search .results { position: absolute; visibility: hidden; top: 40px; width: 100%; margin: 0; padding: 0; list-style: none; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); } 775 | #tsd-search .results li { padding: 0 10px; background-color: #fdfdfd; } 776 | #tsd-search .results li:nth-child(even) { background-color: #fff; } 777 | #tsd-search .results li.state { display: none; } 778 | #tsd-search .results li.current, #tsd-search .results li:hover { background-color: #eee; } 779 | #tsd-search .results a { display: block; } 780 | #tsd-search .results a:before { top: 10px; } 781 | #tsd-search .results span.parent { color: #808080; font-weight: normal; } 782 | #tsd-search.has-focus { background-color: #eee; } 783 | #tsd-search.has-focus .field input { top: 0; opacity: 1; } 784 | #tsd-search.has-focus .title { z-index: 0; opacity: 0; } 785 | #tsd-search.has-focus .results { visibility: visible; } 786 | #tsd-search.loading .results li.state.loading { display: block; } 787 | #tsd-search.failure .results li.state.failure { display: block; } 788 | 789 | .tsd-signature { margin: 0 0 1em 0; padding: 10px; border: 1px solid #eee; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } 790 | .tsd-signature.tsd-kind-icon { padding-left: 30px; } 791 | .tsd-signature.tsd-kind-icon:before { top: 10px; left: 10px; } 792 | .tsd-panel > .tsd-signature { margin-left: -20px; margin-right: -20px; border-width: 1px 0; } 793 | .tsd-panel > .tsd-signature.tsd-kind-icon { padding-left: 40px; } 794 | .tsd-panel > .tsd-signature.tsd-kind-icon:before { left: 20px; } 795 | 796 | .tsd-signature-symbol { color: #808080; font-weight: normal; } 797 | 798 | .tsd-signature-type { font-style: italic; font-weight: normal; } 799 | 800 | .tsd-signatures { padding: 0; margin: 0 0 1em 0; border: 1px solid #eee; } 801 | .tsd-signatures .tsd-signature { margin: 0; border-width: 1px 0 0 0; transition: background-color 0.1s; } 802 | .tsd-signatures .tsd-signature:first-child { border-top-width: 0; } 803 | .tsd-signatures .tsd-signature.current { background-color: #eee; } 804 | .tsd-signatures.active > .tsd-signature { cursor: pointer; } 805 | .tsd-panel > .tsd-signatures { margin-left: -20px; margin-right: -20px; border-width: 1px 0; } 806 | .tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { padding-left: 40px; } 807 | .tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { left: 20px; } 808 | .tsd-panel > a.anchor + .tsd-signatures { border-top-width: 0; margin-top: -20px; } 809 | 810 | ul.tsd-descriptions { position: relative; overflow: hidden; transition: height 0.3s; padding: 0; list-style: none; } 811 | ul.tsd-descriptions.active > .tsd-description { display: none; } 812 | ul.tsd-descriptions.active > .tsd-description.current { display: block; } 813 | ul.tsd-descriptions.active > .tsd-description.fade-in { -webkit-animation: fade-in-delayed 0.3s; animation: fade-in-delayed 0.3s; } 814 | ul.tsd-descriptions.active > .tsd-description.fade-out { -webkit-animation: fade-out-delayed 0.3s; animation: fade-out-delayed 0.3s; position: absolute; display: block; top: 0; left: 0; right: 0; opacity: 0; visibility: hidden; } 815 | ul.tsd-descriptions h4, ul.tsd-descriptions .tsd-index-panel h3, .tsd-index-panel ul.tsd-descriptions h3 { font-size: 16px; margin: 1em 0 0.5em 0; } 816 | 817 | ul.tsd-parameters, ul.tsd-type-parameters { list-style: square; margin: 0; padding-left: 20px; } 818 | ul.tsd-parameters > li.tsd-parameter-siganture, ul.tsd-type-parameters > li.tsd-parameter-siganture { list-style: none; margin-left: -20px; } 819 | ul.tsd-parameters h5, ul.tsd-type-parameters h5 { font-size: 16px; margin: 1em 0 0.5em 0; } 820 | ul.tsd-parameters .tsd-comment, ul.tsd-type-parameters .tsd-comment { margin-top: -0.5em; } 821 | 822 | .tsd-sources { font-size: 14px; color: #808080; margin: 0 0 1em 0; } 823 | .tsd-sources a { color: #808080; text-decoration: underline; } 824 | .tsd-sources ul, .tsd-sources p { margin: 0 !important; } 825 | .tsd-sources ul { list-style: none; padding: 0; } 826 | 827 | .tsd-page-toolbar { position: absolute; z-index: 1; top: 0; left: 0; width: 100%; height: 40px; color: #333; background: #fff; border-bottom: 1px solid #eee; } 828 | .tsd-page-toolbar a { color: #333; text-decoration: none; } 829 | .tsd-page-toolbar a.title { font-weight: bold; } 830 | .tsd-page-toolbar a.title:hover { text-decoration: underline; } 831 | .tsd-page-toolbar .table-wrap { display: table; width: 100%; height: 40px; } 832 | .tsd-page-toolbar .table-cell { display: table-cell; position: relative; white-space: nowrap; line-height: 40px; } 833 | .tsd-page-toolbar .table-cell:first-child { width: 100%; } 834 | 835 | .tsd-widget:before, .tsd-select .tsd-select-label:before, .tsd-select .tsd-select-list li:before { content: ""; display: inline-block; width: 40px; height: 40px; margin: 0 -8px 0 0; background-image: url(../images/widgets.png); background-repeat: no-repeat; text-indent: -1024px; vertical-align: bottom; } 836 | @media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { .tsd-widget:before, .tsd-select .tsd-select-label:before, .tsd-select .tsd-select-list li:before { background-image: url(../images/widgets@2x.png); background-size: 320px 40px; } } 837 | 838 | .tsd-widget { display: inline-block; overflow: hidden; opacity: 0.6; height: 40px; transition: opacity 0.1s, background-color 0.2s; vertical-align: bottom; cursor: pointer; } 839 | .tsd-widget:hover { opacity: 0.8; } 840 | .tsd-widget.active { opacity: 1; background-color: #eee; } 841 | .tsd-widget.no-caption { width: 40px; } 842 | .tsd-widget.no-caption:before { margin: 0; } 843 | .tsd-widget.search:before { background-position: 0 0; } 844 | .tsd-widget.menu:before { background-position: -40px 0; } 845 | .tsd-widget.options:before { background-position: -80px 0; } 846 | .tsd-widget.options, .tsd-widget.menu { display: none; } 847 | @media (max-width: 900px) { .tsd-widget.options, .tsd-widget.menu { display: inline-block; } } 848 | input[type=checkbox] + .tsd-widget:before { background-position: -120px 0; } 849 | input[type=checkbox]:checked + .tsd-widget:before { background-position: -160px 0; } 850 | 851 | .tsd-select { position: relative; display: inline-block; height: 40px; transition: opacity 0.1s, background-color 0.2s; vertical-align: bottom; cursor: pointer; } 852 | .tsd-select .tsd-select-label { opacity: 0.6; transition: opacity 0.2s; } 853 | .tsd-select .tsd-select-label:before { background-position: -240px 0; } 854 | .tsd-select.active .tsd-select-label { opacity: 0.8; } 855 | .tsd-select.active .tsd-select-list { visibility: visible; opacity: 1; transition-delay: 0s; } 856 | .tsd-select .tsd-select-list { position: absolute; visibility: hidden; top: 40px; left: 0; margin: 0; padding: 0; opacity: 0; list-style: none; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); transition: visibility 0s 0.2s, opacity 0.2s; } 857 | .tsd-select .tsd-select-list li { padding: 0 20px 0 0; background-color: #fdfdfd; } 858 | .tsd-select .tsd-select-list li:before { background-position: 40px 0; } 859 | .tsd-select .tsd-select-list li:nth-child(even) { background-color: #fff; } 860 | .tsd-select .tsd-select-list li:hover { background-color: #eee; } 861 | .tsd-select .tsd-select-list li.selected:before { background-position: -200px 0; } 862 | @media (max-width: 900px) { .tsd-select .tsd-select-list { top: 0; left: auto; right: 100%; margin-right: -5px; } 863 | .tsd-select .tsd-select-label:before { background-position: -280px 0; } } 864 | 865 | img { max-width: 100%; } 866 | -------------------------------------------------------------------------------- /docs/assets/css/main.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": ["../../../../src/default/assets/css/vendors/_normalize.sass","../../../../src/default/assets/css/vendors/_highlight.js.sass","../../../../src/default/assets/css/setup/_mixins.sass","../../../../src/default/assets/css/setup/_grid.sass","../../../../src/default/assets/css/setup/_icons.scss","../../../../src/default/assets/css/setup/_animations.sass","../../../../src/default/assets/css/setup/_typography.sass","../../../../src/default/assets/css/_constants.sass","../../../../src/default/assets/css/layouts/_default.sass","../../../../src/default/assets/css/layouts/_minimal.sass","../../../../src/default/assets/css/elements/_comment.sass","../../../../src/default/assets/css/elements/_filter.sass","../../../../src/default/assets/css/elements/_footer.sass","../../../../src/default/assets/css/elements/_hierarchy.sass","../../../../src/default/assets/css/elements/_index.sass","../../../../src/default/assets/css/elements/_member.sass","../../../../src/default/assets/css/elements/_navigation.sass","../../../../src/default/assets/css/elements/_panel.sass","../../../../src/default/assets/css/elements/_search.sass","../../../../src/default/assets/css/elements/_signatures.sass","../../../../src/default/assets/css/elements/_sources.sass","../../../../src/default/assets/css/elements/_toolbar.sass","../../../../src/default/assets/css/elements/_images.sass"], 5 | "names": [], 6 | "file": "main.css" 7 | } 8 | -------------------------------------------------------------------------------- /docs/assets/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mediamonks/s3-batch-upload/6c75e938e4c46cc224a7ed59182476e315a46fae/docs/assets/images/icons.png -------------------------------------------------------------------------------- /docs/assets/images/icons@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mediamonks/s3-batch-upload/6c75e938e4c46cc224a7ed59182476e315a46fae/docs/assets/images/icons@2x.png -------------------------------------------------------------------------------- /docs/assets/images/widgets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mediamonks/s3-batch-upload/6c75e938e4c46cc224a7ed59182476e315a46fae/docs/assets/images/widgets.png -------------------------------------------------------------------------------- /docs/assets/images/widgets@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mediamonks/s3-batch-upload/6c75e938e4c46cc224a7ed59182476e315a46fae/docs/assets/images/widgets@2x.png -------------------------------------------------------------------------------- /docs/assets/js/search.js: -------------------------------------------------------------------------------- 1 | var typedoc = typedoc || {}; 2 | typedoc.search = typedoc.search || {}; 3 | typedoc.search.data = {"kinds":{"32":"Variable","64":"Function","128":"Class","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","2097152":"Object literal","4194304":"Type alias"},"rows":[{"id":0,"kind":4194304,"name":"Options","url":"globals.html#options","classes":"tsd-kind-type-alias"},{"id":1,"kind":64,"name":"streamBatch","url":"globals.html#streambatch","classes":"tsd-kind-function tsd-has-type-parameter"},{"id":2,"kind":128,"name":"Uploader","url":"classes/uploader.html","classes":"tsd-kind-class"},{"id":3,"kind":1024,"name":"s3","url":"classes/uploader.html#s3","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"Uploader"},{"id":4,"kind":1024,"name":"options","url":"classes/uploader.html#options","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"Uploader"},{"id":5,"kind":1024,"name":"bar","url":"classes/uploader.html#bar","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-private","parent":"Uploader"},{"id":6,"kind":512,"name":"constructor","url":"classes/uploader.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"Uploader"},{"id":7,"kind":2048,"name":"upload","url":"classes/uploader.html#upload","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Uploader"},{"id":8,"kind":2048,"name":"run","url":"classes/uploader.html#run","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"Uploader"},{"id":9,"kind":2048,"name":"getFiles","url":"classes/uploader.html#getfiles","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-private","parent":"Uploader"},{"id":10,"kind":2048,"name":"uploadFile","url":"classes/uploader.html#uploadfile","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Uploader"},{"id":11,"kind":2048,"name":"getCacheControlValue","url":"classes/uploader.html#getcachecontrolvalue","classes":"tsd-kind-method tsd-parent-kind-class","parent":"Uploader"},{"id":12,"kind":32,"name":"glob","url":"globals.html#glob","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":13,"kind":32,"name":"minimatch","url":"globals.html#minimatch","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":14,"kind":32,"name":"path","url":"globals.html#path","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":15,"kind":32,"name":"AWS","url":"globals.html#aws","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":16,"kind":32,"name":"ProgressBar","url":"globals.html#progressbar","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":17,"kind":32,"name":"ora","url":"globals.html#ora","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":18,"kind":32,"name":"chalk","url":"globals.html#chalk","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":19,"kind":32,"name":"fs","url":"globals.html#fs","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":20,"kind":32,"name":"mime","url":"globals.html#mime","classes":"tsd-kind-variable tsd-is-not-exported"},{"id":21,"kind":65536,"name":"__type","url":"globals.html#options.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-is-not-exported","parent":"Options"},{"id":22,"kind":32,"name":"bucket","url":"globals.html#options.__type.bucket","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":23,"kind":32,"name":"localPath","url":"globals.html#options.__type.localpath","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":24,"kind":32,"name":"remotePath","url":"globals.html#options.__type.remotepath","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":25,"kind":32,"name":"config","url":"globals.html#options.__type.config","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":26,"kind":32,"name":"glob","url":"globals.html#options.__type.glob","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":27,"kind":32,"name":"concurrency","url":"globals.html#options.__type.concurrency","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":28,"kind":32,"name":"dryRun","url":"globals.html#options.__type.dryrun","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":29,"kind":32,"name":"cacheControl","url":"globals.html#options.__type.cachecontrol","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":30,"kind":32,"name":"s3Client","url":"globals.html#options.__type.s3client","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":31,"kind":32,"name":"accessControlLevel","url":"globals.html#options.__type.accesscontrollevel","classes":"tsd-kind-variable tsd-parent-kind-type-literal tsd-is-not-exported","parent":"Options.__type"},{"id":32,"kind":2097152,"name":"defaultOptions","url":"globals.html#defaultoptions","classes":"tsd-kind-object-literal tsd-is-not-exported"},{"id":33,"kind":32,"name":"dryRun","url":"globals.html#defaultoptions.dryrun","classes":"tsd-kind-variable tsd-parent-kind-object-literal tsd-is-not-exported","parent":"defaultOptions"},{"id":34,"kind":32,"name":"concurrency","url":"globals.html#defaultoptions.concurrency","classes":"tsd-kind-variable tsd-parent-kind-object-literal tsd-is-not-exported","parent":"defaultOptions"},{"id":35,"kind":32,"name":"glob","url":"globals.html#defaultoptions.glob","classes":"tsd-kind-variable tsd-parent-kind-object-literal tsd-is-not-exported","parent":"defaultOptions"},{"id":36,"kind":32,"name":"yargs","url":"globals.html#yargs","classes":"tsd-kind-variable tsd-is-not-exported"}]}; -------------------------------------------------------------------------------- /docs/classes/uploader.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Uploader | s3-batch-upload 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 | 27 |
28 |
29 | Options 30 |
31 |
32 | All 33 |
    34 |
  • Public
  • 35 |
  • Public/Protected
  • 36 |
  • All
  • 37 |
38 |
39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 |
47 | Menu 48 |
49 |
50 |
51 |
52 |
53 |
54 | 62 |

Class Uploader

63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |

Hierarchy

71 |
    72 |
  • 73 | Uploader 74 |
  • 75 |
76 |
77 |
78 |

Index

79 |
80 |
81 |
82 |

Constructors

83 | 86 |
87 |
88 |

Properties

89 | 94 |
95 |
96 |

Methods

97 | 104 |
105 |
106 |
107 |
108 |
109 |

Constructors

110 |
111 | 112 |

constructor

113 | 116 |
    117 |
  • 118 | 123 |

    Parameters

    124 |
      125 |
    • 126 |
      options: Options
      127 |
    • 128 |
    129 |

    Returns Uploader

    130 |
  • 131 |
132 |
133 |
134 |
135 |

Properties

136 |
137 | 138 |

Private bar

139 |
bar: any
140 | 145 |
146 |
147 | 148 |

Private options

149 |
options: Options
150 | 155 |
156 |
157 | 158 |

Private s3

159 |
s3: S3
160 | 165 |
166 |
167 |
168 |

Methods

169 |
170 | 171 |

getCacheControlValue

172 |
    173 |
  • getCacheControlValue(file: string): string
  • 174 |
175 |
    176 |
  • 177 | 182 |
    183 |
    184 |

    Parameters

    185 |
      186 |
    • 187 |
      file: string
      188 |
      189 |

      Path to a local file, either relative to cwd, or absolute

      190 |
      191 |
    • 192 |
    193 |

    Returns string

    194 |

    The resolved CacheControl value based on the provided settings

    195 |
  • 196 |
197 |
198 |
199 | 200 |

Private getFiles

201 |
    202 |
  • getFiles(): Promise<Array<string>>
  • 203 |
204 |
    205 |
  • 206 | 211 |
    212 |
    213 |

    Based on the local path and the provided glob pattern, this util function will find all relevant 214 | files, which will be used to upload in another step.

    215 |
    216 |
    217 |

    Returns Promise<Array<string>>

    218 |

    A list of resolved files based on the glob pattern

    219 |
  • 220 |
221 |
222 |
223 | 224 |

Private run

225 |
    226 |
  • run(): Promise<string[]>
  • 227 |
228 |
    229 |
  • 230 | 235 |

    Returns Promise<string[]>

    236 |
  • 237 |
238 |
239 |
240 | 241 |

upload

242 |
    243 |
  • upload(): Promise<string[]>
  • 244 |
245 |
    246 |
  • 247 | 252 |
    253 |
    254 |

    Executes the upload operation based on the provided options in the Uploader constructor.

    255 |
    256 |
    257 |

    Returns Promise<string[]>

    258 |

    A list of paths of the upload files relative to the bucket.

    259 |
  • 260 |
261 |
262 |
263 | 264 |

uploadFile

265 |
    266 |
  • uploadFile(localFilePath: string, remotePath: string): Promise<string>
  • 267 |
268 |
    269 |
  • 270 | 275 |
    276 |
    277 |

    Uploads a single file to S3 from the local to the remote path with the available options, 278 | and returns the uploaded location.

    279 |
    280 |
    281 |

    Parameters

    282 |
      283 |
    • 284 |
      localFilePath: string
      285 |
      286 |

      Path to the local file, either relative to cwd, or absolute

      287 |
      288 |
    • 289 |
    • 290 |
      remotePath: string
      291 |
      292 |

      The path to upload the file to in the bucket

      293 |
      294 |
    • 295 |
    296 |

    Returns Promise<string>

    297 |

    The remote path upload location relative to the bucket

    298 |
  • 299 |
300 |
301 |
302 |
303 | 391 |
392 |
393 |
394 |
395 |

Legend

396 |
397 |
    398 |
  • Module
  • 399 |
  • Object literal
  • 400 |
  • Variable
  • 401 |
  • Function
  • 402 |
  • Function with type parameter
  • 403 |
  • Index signature
  • 404 |
  • Type alias
  • 405 |
406 |
    407 |
  • Enumeration
  • 408 |
  • Enumeration member
  • 409 |
  • Property
  • 410 |
  • Method
  • 411 |
412 |
    413 |
  • Interface
  • 414 |
  • Interface with type parameter
  • 415 |
  • Constructor
  • 416 |
  • Property
  • 417 |
  • Method
  • 418 |
  • Index signature
  • 419 |
420 |
    421 |
  • Class
  • 422 |
  • Class with type parameter
  • 423 |
  • Constructor
  • 424 |
  • Property
  • 425 |
  • Method
  • 426 |
  • Accessor
  • 427 |
  • Index signature
  • 428 |
429 |
    430 |
  • Inherited constructor
  • 431 |
  • Inherited property
  • 432 |
  • Inherited method
  • 433 |
  • Inherited accessor
  • 434 |
435 |
    436 |
  • Protected property
  • 437 |
  • Protected method
  • 438 |
  • Protected accessor
  • 439 |
440 |
    441 |
  • Private property
  • 442 |
  • Private method
  • 443 |
  • Private accessor
  • 444 |
445 |
    446 |
  • Static property
  • 447 |
  • Static method
  • 448 |
449 |
450 |
451 |
452 |
453 |

Generated using TypeDoc

454 |
455 |
456 | 457 | 458 | 459 | -------------------------------------------------------------------------------- /docs/globals.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | s3-batch-upload 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 | 27 |
28 |
29 | Options 30 |
31 |
32 | All 33 |
    34 |
  • Public
  • 35 |
  • Public/Protected
  • 36 |
  • All
  • 37 |
38 |
39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 |
47 | Menu 48 |
49 |
50 |
51 |
52 |
53 |
54 | 59 |

s3-batch-upload

60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |

Index

68 |
69 |
70 |
71 |

Classes

72 | 75 |
76 |
77 |

Type aliases

78 | 81 |
82 |
83 |

Variables

84 | 96 |
97 |
98 |

Functions

99 | 102 |
103 |
104 |

Object literals

105 | 108 |
109 |
110 |
111 |
112 |
113 |

Type aliases

114 |
115 | 116 |

Options

117 |
Options: object
118 | 124 |
125 |

Type declaration

126 |
    127 |
  • 128 |
    Optional accessControlLevel?: S3.ObjectCannedACL
    129 |
  • 130 |
  • 131 |
    bucket: string
    132 |
  • 133 |
  • 134 |
    Optional cacheControl?: string | object
    135 |
  • 136 |
  • 137 |
    Optional concurrency?: number
    138 |
  • 139 |
  • 140 |
    Optional config?: string
    141 |
  • 142 |
  • 143 |
    Optional dryRun?: boolean
    144 |
  • 145 |
  • 146 |
    Optional glob?: string
    147 |
  • 148 |
  • 149 |
    localPath: string
    150 |
  • 151 |
  • 152 |
    remotePath: string
    153 |
  • 154 |
  • 155 |
    Optional s3Client?: S3
    156 |
  • 157 |
158 |
159 |
160 |
161 |
162 |

Variables

163 |
164 | 165 |

AWS

166 |
AWS: any = require('aws-sdk')
167 | 172 |
173 |
174 | 175 |

ProgressBar

176 |
ProgressBar: any = require('progress')
177 | 182 |
183 |
184 | 185 |

chalk

186 |
chalk: any = require('chalk')
187 | 192 |
193 |
194 | 195 |

fs

196 |
fs: any = require('fs')
197 | 202 |
203 |
204 | 205 |

glob

206 |
glob: any = require('glob')
207 | 212 |
213 |
214 | 215 |

mime

216 |
mime: any = require('mime')
217 | 222 |
223 |
224 | 225 |

minimatch

226 |
minimatch: any = require('minimatch')
227 | 232 |
233 |
234 | 235 |

ora

236 |
ora: any = require('ora')
237 | 242 |
243 |
244 | 245 |

path

246 |
path: any = require('path')
247 | 252 |
253 |
254 | 255 |

yargs

256 |
yargs: any = require('yargs')
257 | 262 |
263 |
264 |
265 |

Functions

266 |
267 | 268 |

streamBatch

269 |
    270 |
  • streamBatch<T>(__namedParameters: object): Promise<T[]>
  • 271 |
272 |
    273 |
  • 274 | 279 |

    Type parameters

    280 |
      281 |
    • 282 |

      T

      283 |
    • 284 |
    285 |

    Parameters

    286 |
      287 |
    • 288 |
      __namedParameters: object
      289 |
        290 |
      • 291 |
        concurrency: number
        292 |
      • 293 |
      • 294 |
        files: string[]
        295 |
      • 296 |
      • 297 |
        onProgress: function
        298 |
          299 |
        • 300 |
            301 |
          • (): void
          • 302 |
          303 |
            304 |
          • 305 |

            Returns void

            306 |
          • 307 |
          308 |
        • 309 |
        310 |
      • 311 |
      • 312 |
        processItem: function
        313 |
          314 |
        • 315 |
            316 |
          • (file: string): Promise<T>
          • 317 |
          318 |
            319 |
          • 320 |

            Parameters

            321 |
              322 |
            • 323 |
              file: string
              324 |
            • 325 |
            326 |

            Returns Promise<T>

            327 |
          • 328 |
          329 |
        • 330 |
        331 |
      • 332 |
      333 |
    • 334 |
    335 |

    Returns Promise<T[]>

    336 |
  • 337 |
338 |
339 |
340 |
341 |

Object literals

342 |
343 | 344 |

defaultOptions

345 |
defaultOptions: object
346 | 351 |
352 | 353 |

concurrency

354 |
concurrency: number = 100
355 | 360 |
361 |
362 | 363 |

dryRun

364 |
dryRun: boolean = false
365 | 370 |
371 |
372 | 373 |

glob

374 |
glob: string = "*.*"
375 | 380 |
381 |
382 |
383 |
384 | 439 |
440 |
441 |
442 |
443 |

Legend

444 |
445 |
    446 |
  • Module
  • 447 |
  • Object literal
  • 448 |
  • Variable
  • 449 |
  • Function
  • 450 |
  • Function with type parameter
  • 451 |
  • Index signature
  • 452 |
  • Type alias
  • 453 |
454 |
    455 |
  • Enumeration
  • 456 |
  • Enumeration member
  • 457 |
  • Property
  • 458 |
  • Method
  • 459 |
460 |
    461 |
  • Interface
  • 462 |
  • Interface with type parameter
  • 463 |
  • Constructor
  • 464 |
  • Property
  • 465 |
  • Method
  • 466 |
  • Index signature
  • 467 |
468 |
    469 |
  • Class
  • 470 |
  • Class with type parameter
  • 471 |
  • Constructor
  • 472 |
  • Property
  • 473 |
  • Method
  • 474 |
  • Accessor
  • 475 |
  • Index signature
  • 476 |
477 |
    478 |
  • Inherited constructor
  • 479 |
  • Inherited property
  • 480 |
  • Inherited method
  • 481 |
  • Inherited accessor
  • 482 |
483 |
    484 |
  • Protected property
  • 485 |
  • Protected method
  • 486 |
  • Protected accessor
  • 487 |
488 |
    489 |
  • Private property
  • 490 |
  • Private method
  • 491 |
  • Private accessor
  • 492 |
493 |
    494 |
  • Static property
  • 495 |
  • Static method
  • 496 |
497 |
498 |
499 |
500 |
501 |

Generated using TypeDoc

502 |
503 |
504 | 505 | 506 | 507 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | s3-batch-upload 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 | 27 |
28 |
29 | Options 30 |
31 |
32 | All 33 |
    34 |
  • Public
  • 35 |
  • Public/Protected
  • 36 |
  • All
  • 37 |
38 |
39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 |
47 | Menu 48 |
49 |
50 |
51 |
52 |
53 |
54 | 59 |

s3-batch-upload

60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |

s3-batch-upload

68 |

Super fast batched S3 folder uploads from CLI or API.

69 |

Installation

70 |
yarn add s3-batch-upload
 71 | 
72 |
npm i -S s3-batch-upload
 73 | 
74 |

Basic Usage

75 |

CLI

76 |
# with config
 77 | s3-batch-upload -c ./config/configS3.json -b bucket-name -p ./files -r remote/path/in/bucket
 78 | 
 79 | # with env vars
 80 | AWS_ACCESS_KEY_ID=AKIA...Q AWS_SECRET_ACCESS_KEY=jY...uJ s3-batch-upload -b bucket-name -p ./files -r remote/path/in/bucket -g "*.jpg -C 200 -d"
 81 | 
82 |
Usage: cli.js <command> [options]
 83 | 
 84 | Commands:
 85 |   cli.js upload  Upload files to s3                                                                            [default]
 86 | 
 87 | Required:
 88 |   -b, --bucket       The bucket to upload to.                                                        [string] [required]
 89 |   -p, --local-path   The path to the folder to upload.                                               [string] [required]
 90 |   -r, --remote-path  The remote path in the bucket to upload the files to.                           [string] [required]
 91 | 
 92 | Options:
 93 |   -d, --dry-run        Do a dry run, don't do any upload.                                     [boolean] [default: false]
 94 |   -C, --concurrency    The amount of simultaneous uploads, increase on faster internet connection.
 95 |                                                                                                  [number] [default: 100]
 96 |   -g, --glob           A glob on filename level to filter the files to upload                  [string] [default: "*.*"]
 97 |   -a, --cache-control  Cache control for uploaded files, can be string for single value or list of glob settings
 98 |                                                                                                   [string] [default: ""]
 99 |   -acl, --access-control-level  Sets the access control level for uploaded files
100 |                                                                                                   [string] [default: "undefined"]
101 |   -c, --config         The AWS config json path to load S3 credentials with loadFromPath.                       [string]
102 |   -h, --help           Show help                                                                               [boolean]
103 | 
104 | Examples:
105 |   cli.js -b bucket-name -p ./files  -r /data                    Upload files from a local folder to a s3 bucket path
106 |   cli.js ... -a "max-age=300"                                  Set cache-control for all files
107 |   cli.js ... -a '{ "**/*.json": "max-age=300", "**/*.*":       Upload files from a local folder to a s3 bucket path
108 |   "max-age=3600" }'
109 |   cli.js -d ...                                                 Dry run upload
110 | 
111 | for more information about AWS authentication, please visit
112 | https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html
113 | 

API

114 |
import Uploader from 's3-batch-upload';
115 | 
116 | const files = await new Uploader({
117 |   config: './config/configS3.json', // can also use environment variables
118 |   bucket: 'bucket-name',
119 |   localPath: './files',
120 |   remotePath: 'remote/path/in/bucket',
121 |   glob: '*.jpg', // default is '*.*'
122 |   concurrency: '200', // default is 100
123 |   dryRun: true, // default is false
124 |   cacheControl: 'max-age=300', // can be a string, for all uploade resources
125 |   cacheControl: { // or an object with globs as keys to match the input path
126 |     '**/settings.json': 'max-age=60', // 1 mins for settings, specific matches should go first
127 |     '**/*.json': 'max-age=300', // 5 mins for other jsons
128 |     '**/*.*': 'max-age=3600', // 1 hour for everthing else
129 |   },
130 |   accessControlLevel: 'bucket-owner-full-control' // optional, not passed if undefined. - available options - "private"|"public-read"|"public-read-write"|"authenticated-read"|"aws-exec-read"|"bucket-owner-read"|"bucket-owner-full-control"
131 | }).upload();
132 | 
133 | // the files array contains a list of uploaded keys, which you can use to build up the S3 urls.
134 | // e.g. "remote/path/in/bucket/demo.jpg"
135 | 
136 |

S3 Authentication

137 |

As seem above, you can either use environment variables, or a config file.

138 |

When using a config file, add it to the .gitignore, because you don't want your credentials 139 | in your repo. Use the following template for the config file as stated in the AWS Docs:

140 |
{
141 |   "accessKeyId": "<YOUR_ACCESS_KEY_ID>",
142 |   "secretAccessKey": "<YOUR_SECRET_ACCESS_KEY>",
143 |   "region": "us-east-1"
144 | }
145 | 
146 |

When using environment variables, check the AWS docs.

147 |

Documentation

148 |

View the generated documentation.

149 |

Building

150 |

In order to build s3-batch-upload, ensure that you have Git 151 | and Node.js installed.

152 |

Clone a copy of the repo:

153 |
git clone https://github.com/mediamonks/s3-batch-upload.git
154 | 
155 |

Change to the s3-batch-upload directory:

156 |
cd s3-batch-upload
157 | 
158 |

Install dev dependencies:

159 |
yarn
160 | 
161 |

Use one of the following main scripts:

162 |
yarn build            # build this project
163 | yarn dev              # run compilers in watch mode, both for babel and typescript
164 | yarn test             # run the unit tests incl coverage
165 | yarn test:dev         # run the unit tests in watch mode
166 | yarn lint             # run eslint and tslint on this project
167 | yarn doc              # generate typedoc documentation
168 | 
169 |

When installing this module, it adds a pre-commit hook, that runs lint and prettier commands 170 | before committing, so you can be sure that everything checks out.

171 |

Contribute

172 |

View CONTRIBUTING.md

173 |

Changelog

174 |

View CHANGELOG.md

175 |

Authors

176 |

View AUTHORS.md

177 |

LICENSE

178 |

MIT © MediaMonks

179 |
180 |
181 | 236 |
237 |
238 |
239 |
240 |

Legend

241 |
242 |
    243 |
  • Module
  • 244 |
  • Object literal
  • 245 |
  • Variable
  • 246 |
  • Function
  • 247 |
  • Function with type parameter
  • 248 |
  • Index signature
  • 249 |
  • Type alias
  • 250 |
251 |
    252 |
  • Enumeration
  • 253 |
  • Enumeration member
  • 254 |
  • Property
  • 255 |
  • Method
  • 256 |
257 |
    258 |
  • Interface
  • 259 |
  • Interface with type parameter
  • 260 |
  • Constructor
  • 261 |
  • Property
  • 262 |
  • Method
  • 263 |
  • Index signature
  • 264 |
265 |
    266 |
  • Class
  • 267 |
  • Class with type parameter
  • 268 |
  • Constructor
  • 269 |
  • Property
  • 270 |
  • Method
  • 271 |
  • Accessor
  • 272 |
  • Index signature
  • 273 |
274 |
    275 |
  • Inherited constructor
  • 276 |
  • Inherited property
  • 277 |
  • Inherited method
  • 278 |
  • Inherited accessor
  • 279 |
280 |
    281 |
  • Protected property
  • 282 |
  • Protected method
  • 283 |
  • Protected accessor
  • 284 |
285 |
    286 |
  • Private property
  • 287 |
  • Private method
  • 288 |
  • Private accessor
  • 289 |
290 |
    291 |
  • Static property
  • 292 |
  • Static method
  • 293 |
294 |
295 |
296 |
297 |
298 |

Generated using TypeDoc

299 |
300 |
301 | 302 | 303 | 304 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "s3-batch-upload", 3 | "version": "1.5.2", 4 | "description": "Super fast batched S3 folder uploads from CLI or API.", 5 | "main": "./index.js", 6 | "types": "./index.d.ts", 7 | "bin": "lib/cli.js", 8 | "scripts": { 9 | "prepublishOnly": "npm-run-all -s validate build", 10 | "validate": "npm-run-all -p lint test", 11 | "dev": "npm-run-all -p dev:*", 12 | "dev:babel": "babel ./src -x \".ts\" --out-dir ./ --watch", 13 | "dev:ts": "tsc --noEmit --allowJs --watch", 14 | "build": "npm-run-all -s clean build:*", 15 | "build:babel": "babel ./src -x \".ts\" -x \".js\" --out-dir ./", 16 | "build:ts": "tsc -p ./tsconfig.build.json", 17 | "test": "cross-env NODE_ENV=test nyc --all mocha \"./test/**/*.spec.{ts,js}\"", 18 | "test:dev": "mocha -w --watch-extensions ts,js \"./test/**/*.spec.{ts,js}\"", 19 | "clean": "npm-run-all clean:*", 20 | "clean:test": "shx rm -rf coverage .nyc_output", 21 | "clean:npm": "shx rm -rf lib tmp index.js", 22 | "doc": "npm-run-all -p doc:*", 23 | "doc:typedoc": "typedoc --out docs/ src/ --mode file", 24 | "lint": "npm-run-all lint:*", 25 | "lint:js": "eslint src --ext .js --cache", 26 | "lint:ts": "tslint src/**/*.ts -c tslint.json -p tsconfig.json -t verbose", 27 | "prettify": "prettier --write \"src/**/*.{js,ts,json}\"", 28 | "precommit": "lint-staged" 29 | }, 30 | "lint-staged": { 31 | "linters": { 32 | "src/**/*.{js,ts,json}": [ 33 | "prettier --write", 34 | "git add" 35 | ], 36 | "src/**/*.js": [ 37 | "npm run lint:js" 38 | ], 39 | "src/**/*.ts": [ 40 | "npm run lint:ts" 41 | ] 42 | } 43 | }, 44 | "pre-push": [ 45 | "validate" 46 | ], 47 | "author": "Arjan van Wijk (thanarie)", 48 | "contributors": [ 49 | "Mient-jan Stelling (https://github.com/mientjan)" 50 | ], 51 | "homepage": "https://www.mediamonks.com/", 52 | "license": "MIT", 53 | "keywords": [ 54 | "seng", 55 | "mediamonks", 56 | "s3", 57 | "batch", 58 | " upload" 59 | ], 60 | "bugs": { 61 | "url": "https://github.com/mediamonks/s3-batch-upload/issues" 62 | }, 63 | "repository": { 64 | "type": "git", 65 | "url": "https://github.com/mediamonks/s3-batch-upload.git" 66 | }, 67 | "devDependencies": { 68 | "@babel/cli": "^7.0.0-beta.35", 69 | "@babel/core": "^7.0.0-beta.35", 70 | "@babel/plugin-transform-runtime": "^7.0.0-beta.35", 71 | "@babel/preset-env": "^7.0.0-beta.35", 72 | "@babel/preset-stage-3": "^7.0.0-beta.35", 73 | "@babel/preset-typescript": "^7.0.0-beta.35", 74 | "@babel/register": "^7.0.0-beta.35", 75 | "@types/chai": "^4.0.10", 76 | "@types/mocha": "^2.2.44", 77 | "@types/sinon": "^4.1.2", 78 | "@types/sinon-chai": "^2.7.29", 79 | "babel-eslint": "^8.0.3", 80 | "babel-plugin-istanbul": "^4.1.5", 81 | "chai": "^4.1.2", 82 | "chai-stream": "^0.0.0", 83 | "coveralls": "^2.11.6", 84 | "cross-env": "^5.1.1", 85 | "eslint": "^4.13.1", 86 | "eslint-config-airbnb-base": "^12.1.0", 87 | "eslint-config-prettier": "^2.9.0", 88 | "eslint-friendly-formatter": "^3.0.0", 89 | "eslint-import-resolver-typescript": "^1.0.2", 90 | "eslint-plugin-import": "^2.8.0", 91 | "eslint-plugin-prettier": "^2.4.0", 92 | "husky": "^0.14.3", 93 | "jsdom": "^11.5.1", 94 | "jsdom-global": "^3.0.2", 95 | "lint-staged": "^6.0.0", 96 | "minimatch": "^3.0.4", 97 | "mocha": "^4.0.1", 98 | "npm-run-all": "^4.1.2", 99 | "nyc": "^11.3.0", 100 | "prettier": "^1.9.2", 101 | "shx": "^0.2.2", 102 | "sinon": "^4.1.3", 103 | "sinon-chai": "^2.14.0", 104 | "tslint": "^5.8.0", 105 | "tslint-config-airbnb": "^5.4.2", 106 | "tslint-config-prettier": "^1.6.0", 107 | "typedoc": "^0.9.0", 108 | "typescript": "^2.6.2" 109 | }, 110 | "dependencies": { 111 | "@babel/runtime": "^7.0.0-beta.35", 112 | "aws-sdk": "^2.361.0", 113 | "chalk": "^2.4.1", 114 | "glob": "^7.1.3", 115 | "mime": "^2.3.1", 116 | "ora": "^3.0.0", 117 | "progress": "^2.0.1", 118 | "recursive-readdir": "^2.2.2", 119 | "yargs": "^12.0.5" 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { default as _export } from './lib/Uploader'; 2 | 3 | export default _export; 4 | -------------------------------------------------------------------------------- /src/lib/Uploader.ts: -------------------------------------------------------------------------------- 1 | import streamBatch from './batch'; 2 | import S3 from 'aws-sdk/clients/s3'; 3 | import { ConfigurationOptions } from 'aws-sdk/lib/config'; 4 | 5 | const glob = require('glob'); 6 | const minimatch = require('minimatch'); 7 | const path = require('path'); 8 | const AWS = require('aws-sdk'); 9 | const ProgressBar = require('progress'); 10 | const ora = require('ora'); 11 | const chalk = require('chalk'); 12 | const fs = require('fs'); 13 | const mime = require('mime'); 14 | 15 | export type Options = { 16 | bucket: string; 17 | localPath: string; 18 | remotePath: string; 19 | config?: string | ConfigurationOptions; 20 | glob?: string; 21 | globOptions?: object; 22 | concurrency?: number; 23 | dryRun?: boolean; 24 | cacheControl?: string | { [key: string]: string }; 25 | s3Client?: S3; 26 | accessControlLevel?: S3.ObjectCannedACL; 27 | overwrite?: boolean; 28 | }; 29 | 30 | const defaultOptions = { 31 | dryRun: false, 32 | concurrency: 100, 33 | glob: '*.*', 34 | globOptions: {}, 35 | overwrite: true, 36 | }; 37 | 38 | export default class Uploader { 39 | private s3: S3; 40 | private options: Options; 41 | private bar: any; 42 | 43 | constructor(options: Options) { 44 | this.options = { 45 | ...defaultOptions, 46 | ...options, 47 | }; 48 | 49 | if (this.options.config) { 50 | if (typeof this.options.config === 'string') { 51 | AWS.config.loadFromPath(this.options.config); 52 | } else if (typeof this.options.config === 'object') { 53 | AWS.config.constructor(this.options.config); 54 | } else { 55 | throw new Error('unsupported config is passed as a argument.'); 56 | } 57 | } 58 | 59 | // TODO: more checks on other options? 60 | if (!this.options.bucket) { 61 | throw new Error('No bucket defined!'); 62 | } 63 | 64 | this.s3 = this.options.s3Client || new AWS.S3(); 65 | } 66 | 67 | /** 68 | * Executes the upload operation based on the provided options in the Uploader constructor. 69 | * @returns A list of paths of the upload files relative to the bucket. 70 | */ 71 | public upload(): Promise { 72 | return this.run(); 73 | } 74 | 75 | private async run(): Promise { 76 | const files = await this.getFiles(); 77 | const { concurrency, localPath, remotePath } = this.options; 78 | 79 | // a nice progress bar to show during upload 80 | this.bar = new ProgressBar('[:bar] :percent | :etas | :current / :total | :rate/fps ', { 81 | total: files.length, 82 | complete: '=', 83 | incomplete: ' ', 84 | width: 20, 85 | }); 86 | 87 | // do the work! 88 | const results = await streamBatch({ 89 | files, 90 | concurrency, 91 | processItem: (file: string): Promise => { 92 | const key = path.join(remotePath, file); 93 | return this.uploadFile(path.resolve(localPath, file), key); 94 | }, 95 | onProgress: () => this.bar.tick(), 96 | }); 97 | 98 | // tslint:disable-next-line no-console 99 | console.log('Upload complete!'); 100 | 101 | return results; 102 | } 103 | 104 | /** 105 | * Based on the local path and the provided glob pattern, this util function will find all relevant 106 | * files, which will be used to upload in another step. 107 | * @returns A list of resolved files based on the glob pattern 108 | */ 109 | private getFiles(): Promise> { 110 | const { localPath, glob: globPath, globOptions } = this.options; 111 | const gatheringSpinner = ora(`Gathering files from ${chalk.blue(localPath)} (please wait) ...`); 112 | 113 | gatheringSpinner.start(); 114 | 115 | return new Promise((resolve, reject) => { 116 | glob(`**/${globPath}`, { ...globOptions, cwd: path.resolve(localPath) }, (err, files) => { 117 | if (err) { 118 | gatheringSpinner.fail(err); 119 | reject(err); 120 | } 121 | 122 | gatheringSpinner.succeed( 123 | `Found ${chalk.green(files.length)} files at ${chalk.blue(localPath)}, starting upload:`, 124 | ); 125 | 126 | resolve(files); 127 | }); 128 | }); 129 | } 130 | 131 | /** 132 | * Uploads a single file to S3 from the local to the remote path with the available options, 133 | * and returns the uploaded location. 134 | * 135 | * @param localFilePath Path to the local file, either relative to cwd, or absolute 136 | * @param remotePath The path to upload the file to in the bucket 137 | * @returns The remote path upload location relative to the bucket 138 | */ 139 | public async uploadFile(localFilePath: string, remotePath: string): Promise { 140 | const { dryRun, bucket: Bucket, accessControlLevel: ACL } = this.options; 141 | const baseParams = { 142 | Bucket, 143 | Key: remotePath.replace(/\\/g, '/'), 144 | }; 145 | if (!this.options.overwrite) { 146 | try { 147 | await this.s3.headObject(baseParams).promise(); 148 | // tslint:disable-next-line no-console 149 | console.log('File exists, skipping: ', baseParams.Key); 150 | return baseParams.Key; 151 | } catch (err) { 152 | if (err.code !== 'NotFound') { 153 | // tslint:disable-next-line no-console 154 | console.error('err:', err); 155 | throw err; 156 | } 157 | } 158 | } 159 | const body = fs.createReadStream(localFilePath); 160 | const params: S3.PutObjectRequest = { 161 | ...baseParams, 162 | Body: body, 163 | ContentType: mime.getType(localFilePath), 164 | CacheControl: this.getCacheControlValue(localFilePath), 165 | }; 166 | if (ACL) { 167 | params.ACL = ACL; 168 | } 169 | 170 | if (!dryRun) { 171 | try { 172 | await this.s3.upload(params).promise(); 173 | } catch (err) { 174 | // tslint:disable-next-line no-console 175 | console.error('err:', err); 176 | throw err; 177 | } 178 | } 179 | return params.Key; 180 | } 181 | 182 | /** 183 | * 184 | * @param file Path to a local file, either relative to cwd, or absolute 185 | * @return The resolved CacheControl value based on the provided settings 186 | */ 187 | public getCacheControlValue(file: string): string { 188 | const { cacheControl } = this.options; 189 | if (cacheControl) { 190 | // return single option for all files 191 | if (typeof cacheControl === 'string') { 192 | return cacheControl; 193 | } 194 | 195 | // find match in glob patterns 196 | const match = Object.keys(cacheControl).find(key => minimatch(file, key)); 197 | return (match && cacheControl[match]) || ''; 198 | } 199 | 200 | // return default value 201 | return ''; 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /src/lib/batch.ts: -------------------------------------------------------------------------------- 1 | export type Options = { 2 | concurrency: number; 3 | files: Array; 4 | processItem: (file: string) => Promise; 5 | onProgress: () => void; 6 | }; 7 | 8 | export default function streamBatch({ 9 | concurrency, 10 | files, 11 | processItem, 12 | onProgress, 13 | }: Options): Promise { 14 | return new Promise(resolve => { 15 | let count = 0; 16 | const total = files.length; 17 | const results: T[] = []; 18 | 19 | // when upload for one item is done, complete or process the next 20 | const onItemDone = (result: T) => { 21 | results.push(result); 22 | count += 1; 23 | 24 | // if completed 25 | if (!files.length && count === total) { 26 | // temp fix for https://github.com/visionmedia/node-progress/pull/183 27 | setTimeout(() => { 28 | onProgress(); 29 | resolve(results); 30 | }, 50); 31 | } else { 32 | onProgress(); 33 | 34 | if (files.length) { 35 | processItem(files.shift()).then(onItemDone); 36 | } 37 | } 38 | }; 39 | // start 'threads' 40 | for (let i = 0; i < Math.min(concurrency, files.length); i += 1) { 41 | processItem(files.shift()).then(onItemDone); 42 | } 43 | }); 44 | } 45 | -------------------------------------------------------------------------------- /src/lib/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const yargs = require('yargs'); 4 | import Uploader from './Uploader'; 5 | 6 | yargs 7 | .usage('Usage: $0 [options]') 8 | .command( 9 | ['$0', 'upload'], 10 | 'Upload files to s3', 11 | () => {}, 12 | argv => { 13 | new Uploader(argv).upload(); 14 | }, 15 | ) 16 | .example( 17 | '$0 -b bucket-name -p ./files -r /data', 18 | 'Upload files from a local folder to a s3 bucket path', 19 | ) 20 | .example('$0 ... -a "max-age=300"', 'Set cache-control for all files') 21 | .example( 22 | '$0 ... -a \'{ "**/*.json": "max-age=300", "**/*.*": "max-age=3600" }\'', 23 | 'Upload files from a local folder to a s3 bucket path', 24 | ) 25 | .example('$0 --no-overwrite ...', 'Skip uploading files which exist already on s3') 26 | .example('$0 -d ...', 'Dry run upload') 27 | .option('d', { 28 | alias: 'dry-run', 29 | default: false, 30 | describe: "Do a dry run, don't do any upload.", 31 | type: 'boolean', 32 | }) 33 | .option('b', { 34 | alias: 'bucket', 35 | default: undefined, 36 | describe: 'The bucket to upload to.', 37 | type: 'string', 38 | nargs: 1, 39 | }) 40 | .option('p', { 41 | alias: 'local-path', 42 | default: undefined, 43 | describe: 'The path to the folder to upload.', 44 | type: 'string', 45 | nargs: 1, 46 | }) 47 | .option('r', { 48 | alias: 'remote-path', 49 | default: undefined, 50 | describe: 'The remote path in the bucket to upload the files to.', 51 | type: 'string', 52 | nargs: 1, 53 | }) 54 | .option('C', { 55 | alias: 'concurrency', 56 | default: 100, 57 | describe: 'The amount of simultaneous uploads, increase on faster internet connection.', 58 | type: 'number', 59 | nargs: 1, 60 | }) 61 | .option('g', { 62 | alias: 'glob', 63 | default: '*.*', 64 | describe: 'A glob on filename level to filter the files to upload', 65 | type: 'string', 66 | nargs: 1, 67 | }) 68 | .option('go', { 69 | alias: 'glob-options', 70 | default: undefined, 71 | describe: 'An option to pass to glob module', 72 | type: 'string', 73 | }) 74 | .option('acl', { 75 | alias: 'access-control-level', 76 | default: undefined, 77 | describe: 'Sets the bucket access control level for uploaded files', 78 | type: 'string', 79 | nargs: 1, 80 | }) 81 | .option('a', { 82 | alias: 'cache-control', 83 | default: '', 84 | describe: 85 | 'Cache control for uploaded files, can be string for single value or list of glob settings', 86 | type: 'string', 87 | nargs: 1, 88 | coerce: value => { 89 | try { 90 | // try to see if it's an object 91 | const cc = JSON.parse(value); 92 | if (typeof cc === 'object') { 93 | return cc; 94 | } 95 | } catch (e) {} 96 | return value; 97 | }, 98 | }) 99 | // NOTE: For more info, see https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-json-file.html 100 | .option('c', { 101 | alias: 'config', 102 | default: undefined, 103 | describe: 'The AWS config json path to load S3 credentials with loadFromPath.', 104 | type: 'string', 105 | nargs: 1, 106 | }) 107 | .option('o', { 108 | alias: 'overwrite', 109 | default: true, 110 | describe: 111 | 'Overwrite remote files with the same name (default behavior), or skip them with --no-overwrite.', 112 | type: 'boolean', 113 | }) 114 | .demandOption( 115 | ['bucket', 'local-path', 'remote-path'], 116 | 'Please provide at least the required arguments to upload.', 117 | ) 118 | .group(['bucket', 'local-path', 'remote-path'], 'Required:') 119 | .help('h') 120 | .alias('h', 'help') 121 | .epilogue( 122 | 'for more information about AWS authentication, please visit https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html', 123 | ) 124 | .version(false) 125 | .wrap(Math.min(120, yargs.terminalWidth())).argv; 126 | -------------------------------------------------------------------------------- /test/Uploader.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, use } from 'chai'; 2 | import { spy } from 'sinon'; 3 | import sinonChai from 'sinon-chai'; 4 | import chaiStream from 'chai-stream'; 5 | 6 | import Uploader from '../src/lib/Uploader'; 7 | use(sinonChai); 8 | use(chaiStream); 9 | 10 | let uploader:Uploader; 11 | 12 | describe('Uploader', () => { 13 | describe('uploadFile', () => { 14 | it('should upload', async function() { 15 | this.timeout(10000); 16 | 17 | const s3 = { 18 | upload() { 19 | return { 20 | async promise() { 21 | return null; 22 | } 23 | } 24 | } 25 | }; 26 | spy(s3, "upload"); 27 | 28 | uploader = new Uploader({ 29 | localPath: 'test/files', 30 | remotePath: 'fake', 31 | bucket: 'fake', 32 | glob: '**/demo.png', 33 | s3Client: s3, 34 | }); 35 | 36 | await uploader.upload(); 37 | 38 | const { Body, ...args} = (s3.upload).lastCall.args[0]; 39 | 40 | 41 | expect(args).to.deep.equal({ 42 | Bucket: 'fake', 43 | Key: 'fake/demo.png', 44 | ContentType: 'image/png', 45 | CacheControl: '', 46 | }); 47 | 48 | (expect(Body).to.be.a).ReadableStream; 49 | 50 | (s3.upload).restore(); 51 | }); 52 | 53 | it('should upload with access control level options', async function() { 54 | this.timeout(10000); 55 | 56 | const s3 = { 57 | upload() { 58 | return { 59 | async promise() { 60 | return null; 61 | } 62 | } 63 | } 64 | }; 65 | spy(s3, "upload"); 66 | 67 | uploader = new Uploader({ 68 | localPath: 'test/files', 69 | remotePath: 'fake', 70 | bucket: 'fake', 71 | glob: '**/demo.png', 72 | s3Client: s3, 73 | accessControlLevel: 'bucket-owner-full-control' 74 | }); 75 | 76 | await uploader.upload(); 77 | 78 | const { Body, ...args} = (s3.upload).lastCall.args[0]; 79 | 80 | 81 | expect(args).to.deep.equal({ 82 | ACL: 'bucket-owner-full-control', 83 | Bucket: 'fake', 84 | Key: 'fake/demo.png', 85 | ContentType: 'image/png', 86 | CacheControl: '', 87 | }); 88 | 89 | (expect(Body).to.be.a).ReadableStream; 90 | 91 | (s3.upload).restore(); 92 | }); 93 | 94 | it('should fix windows paths', async function() { 95 | this.timeout(5000); 96 | 97 | const s3 = { 98 | upload() { 99 | return { 100 | async promise() { 101 | return null; 102 | } 103 | } 104 | } 105 | }; 106 | spy(s3, "upload"); 107 | 108 | uploader = new Uploader({ 109 | localPath: 'test/files', 110 | remotePath: 'fake', 111 | bucket: 'fake', 112 | glob: '**/demo.png', 113 | s3Client: s3, 114 | }); 115 | 116 | await uploader.uploadFile('files/demo.png', 'foo\\bar.png'); 117 | 118 | const { Body, ...args} = (s3.upload).lastCall.args[0]; 119 | 120 | 121 | expect(args).to.deep.equal({ 122 | Bucket: 'fake', 123 | Key: 'foo/bar.png', 124 | ContentType: 'image/png', 125 | CacheControl: '', 126 | }); 127 | 128 | (expect(Body).to.be.a).ReadableStream; 129 | 130 | (s3.upload).restore(); 131 | }); 132 | 133 | describe('with option overwrite: false', () => { 134 | it('should not overwrite existing file', async function() { 135 | this.timeout(10000); 136 | 137 | const s3 = { 138 | upload() { 139 | return { 140 | async promise() { 141 | return null; 142 | } 143 | } 144 | }, 145 | headObject() { 146 | return { 147 | async promise() { 148 | return null; 149 | } 150 | } 151 | } 152 | }; 153 | const uploadSpy = spy(s3, 'upload'); 154 | spy(s3, 'headObject'); 155 | 156 | uploader = new Uploader({ 157 | localPath: 'test/files', 158 | remotePath: 'fake', 159 | bucket: 'fake', 160 | glob: '**/demo.png', 161 | s3Client: s3, 162 | overwrite: false, 163 | }); 164 | 165 | await uploader.upload(); 166 | 167 | const args = (s3.headObject).lastCall.args[0] 168 | expect(args).to.deep.equal({ 169 | Bucket: 'fake', 170 | Key: 'fake/demo.png', 171 | }); 172 | expect(uploadSpy).to.have.callCount(0); 173 | (s3.upload).restore(); 174 | }); 175 | 176 | it('should upload existing file', async function() { 177 | this.timeout(10000); 178 | 179 | const s3 = { 180 | upload() { 181 | return { 182 | async promise() { 183 | return null; 184 | } 185 | } 186 | }, 187 | headObject(_) { 188 | return { 189 | async promise() { 190 | const err: any = new Error() 191 | err.code = 'NotFound' 192 | throw err; 193 | } 194 | } 195 | } 196 | }; 197 | const uploadSpy = spy(s3, 'upload'); 198 | spy(s3, 'headObject'); 199 | 200 | uploader = new Uploader({ 201 | localPath: 'test/files', 202 | remotePath: 'fake', 203 | bucket: 'fake', 204 | glob: '**/demo.png', 205 | s3Client: s3, 206 | overwrite: false, 207 | }); 208 | 209 | await uploader.upload(); 210 | 211 | const args = (s3.headObject).lastCall.args[0] 212 | expect(args).to.deep.equal({ 213 | Bucket: 'fake', 214 | Key: 'fake/demo.png', 215 | }); 216 | expect(uploadSpy).to.have.callCount(1); 217 | (s3.upload).restore(); 218 | }); 219 | }) 220 | }); 221 | 222 | describe('getCacheControlValue', () => { 223 | describe('with no config value', () => { 224 | it('should return default value', () => { 225 | uploader = new Uploader({ 226 | localPath: '', 227 | remotePath: '', 228 | bucket: 'a', 229 | }); 230 | 231 | expect(uploader.getCacheControlValue('foo.bar')).to.equal(''); 232 | }); 233 | }); 234 | 235 | describe('with static config value', () => { 236 | it('should return config value', () => { 237 | uploader = new Uploader({ 238 | localPath: '', 239 | remotePath: '', 240 | bucket: 'a', 241 | cacheControl: '1' 242 | }); 243 | 244 | expect(uploader.getCacheControlValue('foo.bar')).to.equal('1'); 245 | }); 246 | }); 247 | 248 | describe('with glob config value', () => { 249 | it('should return config value', () => { 250 | uploader = new Uploader({ 251 | localPath: '', 252 | remotePath: '', 253 | bucket: 'a', 254 | cacheControl: { 255 | '**/*.json': '10', 256 | '**/*.*': '100', 257 | } 258 | }); 259 | 260 | expect(uploader.getCacheControlValue('files/foo.json')).to.equal('10'); 261 | expect(uploader.getCacheControlValue('files/foo.jpg')).to.equal('100'); 262 | expect(uploader.getCacheControlValue('foo.jpg')).to.equal('100'); 263 | }); 264 | }); 265 | 266 | describe('with uploadFile', () => { 267 | it('should return the uploaded path', async function() { 268 | this.timeout(5000); 269 | 270 | const s3 = { 271 | upload() { 272 | return { 273 | async promise() { 274 | return null; 275 | } 276 | } 277 | } 278 | }; 279 | spy(s3, "upload"); 280 | 281 | uploader = new Uploader({ 282 | localPath: 'test/files', 283 | remotePath: 'fake', 284 | bucket: 'fake', 285 | glob: '**/demo.png', 286 | s3Client: s3, 287 | }); 288 | 289 | const result = await uploader.uploadFile('files/demo.png', 'foo\\bar.png'); 290 | 291 | expect(result).to.equal('foo/bar.png'); 292 | 293 | (s3.upload).restore(); 294 | }); 295 | }); 296 | 297 | describe('with uploadFile', () => { 298 | it('should return the uploaded paths', async function() { 299 | this.timeout(10000); 300 | 301 | const s3 = { 302 | upload() { 303 | return { 304 | async promise() { 305 | return null; 306 | } 307 | } 308 | } 309 | }; 310 | spy(s3, "upload"); 311 | 312 | uploader = new Uploader({ 313 | localPath: 'test/files', 314 | remotePath: 'fake', 315 | bucket: 'fake', 316 | glob: '**/demo.png', 317 | s3Client: s3, 318 | accessControlLevel: 'bucket-owner-full-control' 319 | }); 320 | 321 | const results = await uploader.upload(); 322 | 323 | expect(results).to.deep.equal([ 324 | 'fake/demo.png' 325 | ]); 326 | 327 | (s3.upload).restore(); 328 | }); 329 | }); 330 | 331 | }); 332 | }); 333 | -------------------------------------------------------------------------------- /test/_setup/arrow-function-coverage-fix.js: -------------------------------------------------------------------------------- 1 | // Restore old babylon behavior for istanbul. 2 | // https://github.com/babel/babel/pull/6836 3 | // https://github.com/istanbuljs/istanbuljs/issues/119 4 | module.exports = function hacks() { 5 | return { 6 | visitor: { 7 | Program(programPath) { 8 | programPath.traverse({ 9 | ArrowFunctionExpression(path) { 10 | const node = path.node; 11 | node.expression = node.body.type !== 'BlockStatement'; 12 | }, 13 | }); 14 | }, 15 | }, 16 | }; 17 | }; 18 | -------------------------------------------------------------------------------- /test/_setup/setup.js: -------------------------------------------------------------------------------- 1 | require("@babel/register")({ 2 | // Setting this will remove the currently hooked extensions of .es6, `.es`, `.jsx` 3 | // and .js so you'll have to add them back if you want them to be used again. 4 | extensions: [".es6", ".es", ".jsx", ".js", ".ts"], 5 | }); 6 | -------------------------------------------------------------------------------- /test/files/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mediamonks/s3-batch-upload/6c75e938e4c46cc224a7ed59182476e315a46fae/test/files/.gitkeep -------------------------------------------------------------------------------- /test/files/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mediamonks/s3-batch-upload/6c75e938e4c46cc224a7ed59182476e315a46fae/test/files/demo.png -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --require ./test/_setup/setup.js 2 | --require jsdom-global/register 3 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": false, 5 | "outDir": "tmp", 6 | "declaration": true, 7 | "declarationDir": "./" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": false, 4 | "allowSyntheticDefaultImports": true, 5 | "baseUrl": "./src/", 6 | "rootDir": "./src/", 7 | "forceConsistentCasingInFileNames": true, 8 | "module": "es2015", 9 | "moduleResolution": "node", 10 | "noEmit": false, 11 | "noImplicitAny": false, 12 | "noImplicitReturns": true, 13 | "noImplicitThis": true, 14 | "noUnusedLocals": true, 15 | "noUnusedParameters": true, 16 | "pretty": true, 17 | "skipLibCheck": true, 18 | "strictNullChecks": false, 19 | "sourceMap": true, 20 | "lib": [ 21 | "DOM", 22 | "DOM.Iterable", 23 | "ES2017" 24 | ] 25 | }, 26 | "include": [ 27 | "./src/**/*", 28 | "./types/**/*.d.ts" 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint-config-airbnb", 4 | "tslint-config-prettier" 5 | ], 6 | "defaultSeverity": "error", 7 | "rules": { 8 | "no-debugger": 2, 9 | "no-console": 1, 10 | "prefer-array-literal": [true, { "allow-type-parameters": true }], 11 | "variable-name": [ 12 | true, 13 | "ban-keywords", 14 | "check-format", 15 | "allow-pascal-case", 16 | "allow-leading-underscore" 17 | ], 18 | "max-line-length": false, 19 | "no-increment-decrement": false, 20 | "strict-boolean-expressions": false, 21 | "import-name": [false, {}], 22 | "no-parameter-properties": true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /wallaby.js: -------------------------------------------------------------------------------- 1 | module.exports = function(wallaby) { 2 | 3 | return { 4 | files: [ 5 | 'tsconfig.json', 6 | 'src/**/*.*', 7 | 'test/**/*.*', 8 | '!test/**/*.spec.ts', 9 | ], 10 | 11 | tests: ['test/**/*.spec.ts'], 12 | 13 | env: { 14 | type: 'node', 15 | runner: 'node', 16 | }, 17 | 18 | compilers: { 19 | '**/*.ts': wallaby.compilers.babel() 20 | }, 21 | 22 | testFramework: 'mocha', 23 | }; 24 | }; 25 | --------------------------------------------------------------------------------