Browse Source

Merge branch 'master' into instagram-graph

Renée Kooi 5 years ago
parent
commit
2b7df61111
97 changed files with 1314 additions and 700 deletions
  1. 1 0
      .travis.yml
  2. 55 1
      CHANGELOG.md
  3. 50 46
      README.md
  4. 1 3
      bin/endtoend-build-ci
  5. 2 2
      examples/cdn-example/index.html
  6. 56 11
      examples/dev/Dashboard.js
  7. 1 1
      examples/transloadit-textarea/index.html
  8. 2 2
      examples/uppy-with-companion/client/index.html
  9. 2 2
      netlify.toml
  10. 344 324
      package-lock.json
  11. 30 30
      package.json
  12. 2 1
      packages/@uppy/aws-s3-multipart/package-lock.json
  13. 1 1
      packages/@uppy/aws-s3-multipart/package.json
  14. 8 3
      packages/@uppy/aws-s3-multipart/src/MultipartUploader.js
  15. 1 1
      packages/@uppy/aws-s3-multipart/types/index.d.ts
  16. 2 1
      packages/@uppy/aws-s3/package.json
  17. 33 6
      packages/@uppy/aws-s3/src/index.js
  18. 19 19
      packages/@uppy/companion/package.json
  19. 4 1
      packages/@uppy/companion/src/server/Uploader.js
  20. 1 1
      packages/@uppy/companion/src/server/controllers/get.js
  21. 11 2
      packages/@uppy/companion/src/server/controllers/s3.js
  22. 13 2
      packages/@uppy/companion/src/server/provider/onedrive/adapter.js
  23. 8 5
      packages/@uppy/companion/src/server/provider/onedrive/index.js
  24. 51 13
      packages/@uppy/companion/src/standalone/index.js
  25. 2 1
      packages/@uppy/core/package-lock.json
  26. 1 1
      packages/@uppy/core/package.json
  27. 1 1
      packages/@uppy/dashboard/package.json
  28. 4 2
      packages/@uppy/dashboard/src/index.js
  29. 1 1
      packages/@uppy/drag-drop/package.json
  30. 4 2
      packages/@uppy/drag-drop/src/index.js
  31. 1 1
      packages/@uppy/dropbox/package.json
  32. 1 1
      packages/@uppy/facebook/package.json
  33. 1 1
      packages/@uppy/file-input/package.json
  34. 1 1
      packages/@uppy/form/package.json
  35. 1 1
      packages/@uppy/golden-retriever/package.json
  36. 1 1
      packages/@uppy/google-drive/package.json
  37. 1 1
      packages/@uppy/informer/package.json
  38. 1 1
      packages/@uppy/instagram/package.json
  39. 1 1
      packages/@uppy/locales/package.json
  40. 154 0
      packages/@uppy/locales/src/ko_KR.js
  41. 155 0
      packages/@uppy/locales/src/vi_VN.js
  42. 1 1
      packages/@uppy/onedrive/package.json
  43. 1 1
      packages/@uppy/progress-bar/package.json
  44. 1 1
      packages/@uppy/provider-views/package.json
  45. 3 3
      packages/@uppy/provider-views/src/style/uppy-ProviderBrowser-viewType--grid.scss
  46. 1 1
      packages/@uppy/react/package.json
  47. 5 8
      packages/@uppy/react/src/DashboardModal.js
  48. 2 2
      packages/@uppy/robodog/README.md
  49. 1 1
      packages/@uppy/robodog/package.json
  50. 1 1
      packages/@uppy/status-bar/package.json
  51. 2 1
      packages/@uppy/thumbnail-generator/package-lock.json
  52. 1 1
      packages/@uppy/thumbnail-generator/package.json
  53. 0 4
      packages/@uppy/thumbnail-generator/src/exif.js
  54. 2 1
      packages/@uppy/transloadit/package-lock.json
  55. 1 1
      packages/@uppy/transloadit/package.json
  56. 2 2
      packages/@uppy/tus/package.json
  57. 9 4
      packages/@uppy/tus/types/index.d.ts
  58. 1 1
      packages/@uppy/url/package.json
  59. 1 1
      packages/@uppy/utils/package.json
  60. 1 1
      packages/@uppy/utils/src/isPreviewSupported.js
  61. 1 1
      packages/@uppy/utils/src/isPreviewSupported.test.js
  62. 1 1
      packages/@uppy/webcam/package.json
  63. 1 1
      packages/@uppy/xhr-upload/package.json
  64. 2 1
      packages/@uppy/xhr-upload/src/index.js
  65. 1 1
      packages/uppy/package.json
  66. 6 1
      website/inject.js
  67. 16 16
      website/package.json
  68. 63 0
      website/src/_posts/2019-12-1.7.md
  69. 10 1
      website/src/docs/aws-s3-multipart.md
  70. 7 0
      website/src/docs/aws-s3.md
  71. 15 5
      website/src/docs/companion.md
  72. 0 6
      website/src/docs/facebook.md
  73. 5 5
      website/src/docs/index.md
  74. 2 2
      website/src/docs/locales.md
  75. 0 6
      website/src/docs/onedrive.md
  76. 2 0
      website/src/docs/plugins.md
  77. 4 4
      website/src/docs/robodog-form.md
  78. 2 2
      website/src/docs/robodog.md
  79. 10 1
      website/src/examples/dashboard/app.es6
  80. 3 0
      website/src/examples/dashboard/app.html
  81. 2 0
      website/src/examples/dashboard/index.ejs
  82. 3 3
      website/src/examples/i18n/app.html
  83. 1 1
      website/src/examples/markdown-snippets/app.es6
  84. 1 1
      website/src/examples/markdown-snippets/app.html
  85. 1 0
      website/src/frontpage-code-sample.ejs
  86. 4 4
      website/src/privacy.md
  87. 0 11
      website/src/stats.ejs
  88. 1 1
      website/themes/uppy/layout/example.ejs
  89. 2 2
      website/themes/uppy/layout/index.ejs
  90. 3 2
      website/themes/uppy/layout/layout.ejs
  91. 2 1
      website/themes/uppy/layout/page.ejs
  92. 5 2
      website/themes/uppy/layout/partials/frontpage-code-sample.html
  93. 48 0
      website/themes/uppy/layout/partials/plugin_list.ejs
  94. 0 65
      website/themes/uppy/layout/stats.ejs
  95. 23 21
      website/themes/uppy/source/css/_common.scss
  96. 1 1
      website/themes/uppy/source/css/_page.scss
  97. 1 0
      website/themes/uppy/source/css/_stats.scss

+ 1 - 0
.travis.yml

@@ -58,6 +58,7 @@ matrix:
       if: branch = master AND type = push
       addons:
         apt: *APT
+
 before_install:
 - nvm install-latest-npm
 install:

+ 55 - 1
CHANGELOG.md

@@ -103,7 +103,7 @@ PRs are welcome! Please do open an issue to discuss first if it's a big feature,
 
 # next
 
-## 1.7
+## 1.8
 
 - [ ] companion: restore deferredLength — parallel upload/download, 423 and 500 issues (@ife)
 - [ ] companion: reports an error at first sign in. we did a hotfix in https://github.com/transloadit/uppy/pull/1478#issuecomment-485937942 but need a proper fix for that (@ife). Also: what about changing the location of that tooltip? So legit errors also don't block buttons?
@@ -124,6 +124,60 @@ PRs are welcome! Please do open an issue to discuss first if it's a big feature,
 - [ ] QA: add one integration test (or add to existing test) that uses more exotic (tus) options such as `useFastRemoteRetry` or `removeFingerprintOnSuccess` https://github.com/transloadit/uppy/issues/1327 (@arturi, @ifedapoolarewaju)
 - [ ] website: Adopt bcp-47 to handle and parse locales (@kvz, https://github.com/meikidd/iso-639-1/issues/19, https://tools.ietf.org/html/bcp47, https://github.com/wooorm/bcp-47)
 
+## 1.7.0
+
+Released: 2019-12-16
+
+This release adds Hebrew translations and smoothes out some rough edges in Companion. The Webcam plugin now supports showing the duration of recordings while in progress.
+
+| Package | Version | Package | Version |
+|-|-|-|-|
+| @uppy/aws-s3-multipart | 1.3.5 | @uppy/onedrive | 0.1.3 |
+| @uppy/aws-s3 | 1.4.0 | @uppy/progress-bar | 1.3.3 |
+| @uppy/companion | 1.7.0 | @uppy/provider-views | 1.5.1 |
+| @uppy/core | 1.7.0 | @uppy/react | 1.4.1 |
+| @uppy/dashboard | 1.5.1 | @uppy/robodog | 1.4.1 |
+| @uppy/drag-drop | 1.4.1 | @uppy/status-bar | 1.4.1 |
+| @uppy/dropbox | 1.3.4 | @uppy/thumbnail-generator | 1.5.1 |
+| @uppy/facebook | 0.2.1 | @uppy/transloadit | 1.4.1 |
+| @uppy/file-input | 1.4.1 | @uppy/tus | 1.5.1 |
+| @uppy/form | 1.3.4 | @uppy/url | 1.4.1 |
+| @uppy/golden-retriever | 1.3.3 | @uppy/utils | 2.1.1 |
+| @uppy/google-drive | 1.3.4 | @uppy/webcam | 1.5.0 |
+| @uppy/informer | 1.3.3 | @uppy/xhr-upload | 1.4.1 |
+| @uppy/instagram | 1.3.4 | uppy | 1.7.0 |
+| @uppy/locales | 1.10.0 | - | - |
+
+- @uppy/aws-s3: add some tests (@bambii7, #1934)
+- @uppy/companion: add onedrive domain validation for the demo deployment (@ifedapoolarewaju, #1959)
+- @uppy/companion: change demo deployment type to stable API (@kiloreux, #1938)
+- @uppy/companion: log error if exists during token verification (@ifedapoolarewaju, #1937)
+- @uppy/companion: mask auth tokens from logged referrer URLs (@ifedapoolarewaju, #1951)
+- @uppy/companion: only generate `uppyToken` if `access_token` was received from provider (@ifedapoolarewaju, #1946)
+- @uppy/companion: pass metadata to Companion `getKey()` option for S3 uploads (@goto-bus-stop, #1866)
+- @uppy/companion: rename uppy occurrences to companion (@ifedapoolarewaju, #1926)
+- @uppy/companion: run CI tests on Node 6 to ensure compatibility (@ifedapoolarewaju, #1953)
+- @uppy/companion: upgrade `helmet` (@goto-bus-stop, [6b006ac](https://github.com/transloadit/uppy/commit/6b006ac42c20062c37bdcaf6a77e07b304da7957))
+- @uppy/companion: use original file name in S3 Multipart uploads (@goto-bus-stop, #1965)
+- @uppy/core: make `uppy.on()` work better with IntelliSense (@bambii7, #1923)
+- @uppy/dashboard: hide top bar cancel button when `hideCancelButton: true` (@goto-bus-stop, #1955)
+- @uppy/dashboard: move dropEffect assignment to dragover (@goto-bus-stop, #1982)
+- @uppy/drag-drop: move dropEffect assignment to dragover (@goto-bus-stop, #1982)
+- @uppy/locales: add Hebrew (@YehudaKremer, #1932)
+- @uppy/locales: rename `es_GL` → `gl_ES` (@goto-bus-stop, #1929)
+- @uppy/thumbnail-generator: add webp to the list of supported types (@arturi, #1961)
+- @uppy/thumbnail-generator: vendor exif-js source in Uppy (@mskelton, #1940)
+- @uppy/webcam: add `showRecordingLength: true` option (@dominiceden, #1947)
+- docs: FB and OneDrive are not yet in the CDN bundle (@goto-bus-stop, [61b54b9](https://github.com/transloadit/uppy/commit/61b54b914dd437d2e60362c4ece1429943b32555))
+- docs: add `companionHeaders` to s3-multipart docs (@goto-bus-stop, [a6e44a9](https://github.com/transloadit/uppy/commit/a6e44a953114e385466dcce884d37e433f030549))
+- docs: add reset-progress event to docs (@bambii7, #1922)
+- docs: make Robodog naming more consistent (@goto-bus-stop, #1935)
+- docs: make react sample code more standalone (@uxitten, #1864)
+- examples: remove `UPPYSERVER_` references (@goto-bus-stop, [e74690e](https://github.com/transloadit/uppy/commit/e74690e20cc0a1afd9156ce03b1ca6a5358cc7d9))
+- website: add facebook to dashboard example (@ifedapoolarewaju, #1930)
+- website: add plugin versions (@arturi, #1952)
+- website: enable onedrive on the website example (@ifedapoolarewaju, #1975)
+
 ## 1.6.0
 
 Released: 2019-11-04

+ 50 - 46
README.md

@@ -65,7 +65,7 @@ $ npm install @uppy/core @uppy/dashboard @uppy/tus
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.org/).
 
-Add CSS [uppy.min.css](https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css), either to your HTML page's `<head>` or include in JS, if your bundler of choice supports it — transforms and plugins are available for Browserify and Webpack.
+Add CSS [uppy.min.css](https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css), either to your HTML page's `<head>` or include in JS, if your bundler of choice supports it — transforms and plugins are available for Browserify and Webpack.
 
 Alternatively, you can also use a pre-built bundle from Transloadit's CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object.
 
@@ -73,10 +73,10 @@ Alternatively, you can also use a pre-built bundle from Transloadit's CDN: Edgly
 
 ```html
 <!-- 1. Add CSS to `<head>` -->
-<link href="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css" rel="stylesheet">
+<link href="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css" rel="stylesheet">
 
 <!-- 2. Add JS before the closing `</body>` -->
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
 
 <!-- 3. Initialize -->
 <div class="UppyDragDrop"></div>
@@ -174,7 +174,7 @@ const Uppy = require('@uppy/core')
 If you're using Uppy from CDN, `es6-promise` and `whatwg-fetch` are already included in the bundle, so no need to include anything additionally:
 
 ```html
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
 ```
 
 ## FAQ
@@ -247,93 +247,97 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu
 :---: |:---: |:---: |:---: |:---: |:---: |
 [mcallistertyler95](https://github.com/mcallistertyler95) |[DJWassink](https://github.com/DJWassink) |[taoqf](https://github.com/taoqf) |[gavboulton](https://github.com/gavboulton) |[bertho-zero](https://github.com/bertho-zero) |[tranvansang](https://github.com/tranvansang) |
 
-[<img alt="ap--" src="https://avatars1.githubusercontent.com/u/1463443?v=4&s=117" width="117">](https://github.com/ap--) |[<img alt="mrbatista" src="https://avatars0.githubusercontent.com/u/6544817?v=4&s=117" width="117">](https://github.com/mrbatista) |[<img alt="pauln" src="https://avatars3.githubusercontent.com/u/574359?v=4&s=117" width="117">](https://github.com/pauln) |[<img alt="toadkicker" src="https://avatars1.githubusercontent.com/u/523330?v=4&s=117" width="117">](https://github.com/toadkicker) |[<img alt="dargmuesli" src="https://avatars2.githubusercontent.com/u/4778485?v=4&s=117" width="117">](https://github.com/dargmuesli) |[<img alt="manuelkiessling" src="https://avatars2.githubusercontent.com/u/206592?v=4&s=117" width="117">](https://github.com/manuelkiessling) |
+[<img alt="ap--" src="https://avatars1.githubusercontent.com/u/1463443?v=4&s=117" width="117">](https://github.com/ap--) |[<img alt="bambii7" src="https://avatars3.githubusercontent.com/u/1826459?v=4&s=117" width="117">](https://github.com/bambii7) |[<img alt="mrbatista" src="https://avatars0.githubusercontent.com/u/6544817?v=4&s=117" width="117">](https://github.com/mrbatista) |[<img alt="pauln" src="https://avatars3.githubusercontent.com/u/574359?v=4&s=117" width="117">](https://github.com/pauln) |[<img alt="toadkicker" src="https://avatars1.githubusercontent.com/u/523330?v=4&s=117" width="117">](https://github.com/toadkicker) |[<img alt="dargmuesli" src="https://avatars2.githubusercontent.com/u/4778485?v=4&s=117" width="117">](https://github.com/dargmuesli) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[ap--](https://github.com/ap--) |[mrbatista](https://github.com/mrbatista) |[pauln](https://github.com/pauln) |[toadkicker](https://github.com/toadkicker) |[dargmuesli](https://github.com/dargmuesli) |[manuelkiessling](https://github.com/manuelkiessling) |
+[ap--](https://github.com/ap--) |[bambii7](https://github.com/bambii7) |[mrbatista](https://github.com/mrbatista) |[pauln](https://github.com/pauln) |[toadkicker](https://github.com/toadkicker) |[dargmuesli](https://github.com/dargmuesli) |
 
-[<img alt="nndevstudio" src="https://avatars2.githubusercontent.com/u/22050968?v=4&s=117" width="117">](https://github.com/nndevstudio) |[<img alt="ogtfaber" src="https://avatars2.githubusercontent.com/u/320955?v=4&s=117" width="117">](https://github.com/ogtfaber) |[<img alt="sksavant" src="https://avatars1.githubusercontent.com/u/1040701?v=4&s=117" width="117">](https://github.com/sksavant) |[<img alt="sunil-shrestha" src="https://avatars3.githubusercontent.com/u/2129058?v=4&s=117" width="117">](https://github.com/sunil-shrestha) |[<img alt="yonahforst" src="https://avatars3.githubusercontent.com/u/1440796?v=4&s=117" width="117">](https://github.com/yonahforst) |[<img alt="dependabot[bot]" src="https://avatars0.githubusercontent.com/in/29110?v=4&s=117" width="117">](https://github.com/apps/dependabot) |
+[<img alt="manuelkiessling" src="https://avatars2.githubusercontent.com/u/206592?v=4&s=117" width="117">](https://github.com/manuelkiessling) |[<img alt="nndevstudio" src="https://avatars2.githubusercontent.com/u/22050968?v=4&s=117" width="117">](https://github.com/nndevstudio) |[<img alt="ogtfaber" src="https://avatars2.githubusercontent.com/u/320955?v=4&s=117" width="117">](https://github.com/ogtfaber) |[<img alt="sksavant" src="https://avatars1.githubusercontent.com/u/1040701?v=4&s=117" width="117">](https://github.com/sksavant) |[<img alt="sunil-shrestha" src="https://avatars3.githubusercontent.com/u/2129058?v=4&s=117" width="117">](https://github.com/sunil-shrestha) |[<img alt="yonahforst" src="https://avatars3.githubusercontent.com/u/1440796?v=4&s=117" width="117">](https://github.com/yonahforst) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[nndevstudio](https://github.com/nndevstudio) |[ogtfaber](https://github.com/ogtfaber) |[sksavant](https://github.com/sksavant) |[sunil-shrestha](https://github.com/sunil-shrestha) |[yonahforst](https://github.com/yonahforst) |[dependabot[bot]](https://github.com/apps/dependabot) |
+[manuelkiessling](https://github.com/manuelkiessling) |[nndevstudio](https://github.com/nndevstudio) |[ogtfaber](https://github.com/ogtfaber) |[sksavant](https://github.com/sksavant) |[sunil-shrestha](https://github.com/sunil-shrestha) |[yonahforst](https://github.com/yonahforst) |
 
-[<img alt="stephentuso" src="https://avatars2.githubusercontent.com/u/11889560?v=4&s=117" width="117">](https://github.com/stephentuso) |[<img alt="btrice" src="https://avatars2.githubusercontent.com/u/4358225?v=4&s=117" width="117">](https://github.com/btrice) |[<img alt="Burkes" src="https://avatars2.githubusercontent.com/u/9220052?v=4&s=117" width="117">](https://github.com/Burkes) |[<img alt="craigjennings11" src="https://avatars2.githubusercontent.com/u/1683368?v=4&s=117" width="117">](https://github.com/craigjennings11) |[<img alt="davekiss" src="https://avatars2.githubusercontent.com/u/1256071?v=4&s=117" width="117">](https://github.com/davekiss) |[<img alt="frobinsonj" src="https://avatars3.githubusercontent.com/u/16726902?v=4&s=117" width="117">](https://github.com/frobinsonj) |
+[<img alt="dependabot[bot]" src="https://avatars0.githubusercontent.com/in/29110?v=4&s=117" width="117">](https://github.com/apps/dependabot) |[<img alt="stephentuso" src="https://avatars2.githubusercontent.com/u/11889560?v=4&s=117" width="117">](https://github.com/stephentuso) |[<img alt="mskelton" src="https://avatars3.githubusercontent.com/u/25914066?v=4&s=117" width="117">](https://github.com/mskelton) |[<img alt="btrice" src="https://avatars2.githubusercontent.com/u/4358225?v=4&s=117" width="117">](https://github.com/btrice) |[<img alt="uxitten" src="https://avatars0.githubusercontent.com/u/1549069?v=4&s=117" width="117">](https://github.com/uxitten) |[<img alt="Burkes" src="https://avatars2.githubusercontent.com/u/9220052?v=4&s=117" width="117">](https://github.com/Burkes) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[stephentuso](https://github.com/stephentuso) |[btrice](https://github.com/btrice) |[Burkes](https://github.com/Burkes) |[craigjennings11](https://github.com/craigjennings11) |[davekiss](https://github.com/davekiss) |[frobinsonj](https://github.com/frobinsonj) |
+[dependabot[bot]](https://github.com/apps/dependabot) |[stephentuso](https://github.com/stephentuso) |[mskelton](https://github.com/mskelton) |[btrice](https://github.com/btrice) |[uxitten](https://github.com/uxitten) |[Burkes](https://github.com/Burkes) |
 
-[<img alt="geertclerx" src="https://avatars0.githubusercontent.com/u/1381327?v=4&s=117" width="117">](https://github.com/geertclerx) |[<img alt="jedwood" src="https://avatars0.githubusercontent.com/u/369060?v=4&s=117" width="117">](https://github.com/jedwood) |[<img alt="Mactaivsh" src="https://avatars0.githubusercontent.com/u/12948083?v=4&s=117" width="117">](https://github.com/Mactaivsh) |[<img alt="mskelton" src="https://avatars3.githubusercontent.com/u/25914066?v=4&s=117" width="117">](https://github.com/mskelton) |[<img alt="Martin005" src="https://avatars0.githubusercontent.com/u/10096404?v=4&s=117" width="117">](https://github.com/Martin005) |[<img alt="martiuslim" src="https://avatars2.githubusercontent.com/u/17944339?v=4&s=117" width="117">](https://github.com/martiuslim) |
+[<img alt="craigjennings11" src="https://avatars2.githubusercontent.com/u/1683368?v=4&s=117" width="117">](https://github.com/craigjennings11) |[<img alt="davekiss" src="https://avatars2.githubusercontent.com/u/1256071?v=4&s=117" width="117">](https://github.com/davekiss) |[<img alt="frobinsonj" src="https://avatars3.githubusercontent.com/u/16726902?v=4&s=117" width="117">](https://github.com/frobinsonj) |[<img alt="geertclerx" src="https://avatars0.githubusercontent.com/u/1381327?v=4&s=117" width="117">](https://github.com/geertclerx) |[<img alt="jedwood" src="https://avatars0.githubusercontent.com/u/369060?v=4&s=117" width="117">](https://github.com/jedwood) |[<img alt="Mactaivsh" src="https://avatars0.githubusercontent.com/u/12948083?v=4&s=117" width="117">](https://github.com/Mactaivsh) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[geertclerx](https://github.com/geertclerx) |[jedwood](https://github.com/jedwood) |[Mactaivsh](https://github.com/Mactaivsh) |[mskelton](https://github.com/mskelton) |[Martin005](https://github.com/Martin005) |[martiuslim](https://github.com/martiuslim) |
+[craigjennings11](https://github.com/craigjennings11) |[davekiss](https://github.com/davekiss) |[frobinsonj](https://github.com/frobinsonj) |[geertclerx](https://github.com/geertclerx) |[jedwood](https://github.com/jedwood) |[Mactaivsh](https://github.com/Mactaivsh) |
 
-[<img alt="MatthiasKunnen" src="https://avatars3.githubusercontent.com/u/16807587?v=4&s=117" width="117">](https://github.com/MatthiasKunnen) |[<img alt="msand" src="https://avatars2.githubusercontent.com/u/1131362?v=4&s=117" width="117">](https://github.com/msand) |[<img alt="richartkeil" src="https://avatars0.githubusercontent.com/u/8680858?v=4&s=117" width="117">](https://github.com/richartkeil) |[<img alt="richmeij" src="https://avatars0.githubusercontent.com/u/9741858?v=4&s=117" width="117">](https://github.com/richmeij) |[<img alt="rosenfeld" src="https://avatars1.githubusercontent.com/u/32246?v=4&s=117" width="117">](https://github.com/rosenfeld) |[<img alt="ThomasG77" src="https://avatars2.githubusercontent.com/u/642120?v=4&s=117" width="117">](https://github.com/ThomasG77) |
+[<img alt="Martin005" src="https://avatars0.githubusercontent.com/u/10096404?v=4&s=117" width="117">](https://github.com/Martin005) |[<img alt="martiuslim" src="https://avatars2.githubusercontent.com/u/17944339?v=4&s=117" width="117">](https://github.com/martiuslim) |[<img alt="MatthiasKunnen" src="https://avatars3.githubusercontent.com/u/16807587?v=4&s=117" width="117">](https://github.com/MatthiasKunnen) |[<img alt="msand" src="https://avatars2.githubusercontent.com/u/1131362?v=4&s=117" width="117">](https://github.com/msand) |[<img alt="richartkeil" src="https://avatars0.githubusercontent.com/u/8680858?v=4&s=117" width="117">](https://github.com/richartkeil) |[<img alt="richmeij" src="https://avatars0.githubusercontent.com/u/9741858?v=4&s=117" width="117">](https://github.com/richmeij) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[MatthiasKunnen](https://github.com/MatthiasKunnen) |[msand](https://github.com/msand) |[richartkeil](https://github.com/richartkeil) |[richmeij](https://github.com/richmeij) |[rosenfeld](https://github.com/rosenfeld) |[ThomasG77](https://github.com/ThomasG77) |
+[Martin005](https://github.com/Martin005) |[martiuslim](https://github.com/martiuslim) |[MatthiasKunnen](https://github.com/MatthiasKunnen) |[msand](https://github.com/msand) |[richartkeil](https://github.com/richartkeil) |[richmeij](https://github.com/richmeij) |
 
-[<img alt="zhuangya" src="https://avatars2.githubusercontent.com/u/499038?v=4&s=117" width="117">](https://github.com/zhuangya) |[<img alt="allenfantasy" src="https://avatars1.githubusercontent.com/u/1009294?v=4&s=117" width="117">](https://github.com/allenfantasy) |[<img alt="Zyclotrop-j" src="https://avatars0.githubusercontent.com/u/4939546?v=4&s=117" width="117">](https://github.com/Zyclotrop-j) |[<img alt="fortrieb" src="https://avatars0.githubusercontent.com/u/4126707?v=4&s=117" width="117">](https://github.com/fortrieb) |[<img alt="muhammadInam" src="https://avatars1.githubusercontent.com/u/7801708?v=4&s=117" width="117">](https://github.com/muhammadInam) |[<img alt="rettgerst" src="https://avatars2.githubusercontent.com/u/11684948?v=4&s=117" width="117">](https://github.com/rettgerst) |
+[<img alt="rosenfeld" src="https://avatars1.githubusercontent.com/u/32246?v=4&s=117" width="117">](https://github.com/rosenfeld) |[<img alt="ThomasG77" src="https://avatars2.githubusercontent.com/u/642120?v=4&s=117" width="117">](https://github.com/ThomasG77) |[<img alt="zhuangya" src="https://avatars2.githubusercontent.com/u/499038?v=4&s=117" width="117">](https://github.com/zhuangya) |[<img alt="allenfantasy" src="https://avatars1.githubusercontent.com/u/1009294?v=4&s=117" width="117">](https://github.com/allenfantasy) |[<img alt="Zyclotrop-j" src="https://avatars0.githubusercontent.com/u/4939546?v=4&s=117" width="117">](https://github.com/Zyclotrop-j) |[<img alt="fortrieb" src="https://avatars0.githubusercontent.com/u/4126707?v=4&s=117" width="117">](https://github.com/fortrieb) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[zhuangya](https://github.com/zhuangya) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[fortrieb](https://github.com/fortrieb) |[muhammadInam](https://github.com/muhammadInam) |[rettgerst](https://github.com/rettgerst) |
+[rosenfeld](https://github.com/rosenfeld) |[ThomasG77](https://github.com/ThomasG77) |[zhuangya](https://github.com/zhuangya) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[fortrieb](https://github.com/fortrieb) |
 
-[<img alt="jukakoski" src="https://avatars0.githubusercontent.com/u/52720967?v=4&s=117" width="117">](https://github.com/jukakoski) |[<img alt="ajschmidt8" src="https://avatars0.githubusercontent.com/u/7400326?v=4&s=117" width="117">](https://github.com/ajschmidt8) |[<img alt="superhawk610" src="https://avatars1.githubusercontent.com/u/18172185?v=4&s=117" width="117">](https://github.com/superhawk610) |[<img alt="adamvigneault" src="https://avatars2.githubusercontent.com/u/18236120?v=4&s=117" width="117">](https://github.com/adamvigneault) |[<img alt="asmt3" src="https://avatars1.githubusercontent.com/u/1777709?v=4&s=117" width="117">](https://github.com/asmt3) |[<img alt="alexnj" src="https://avatars0.githubusercontent.com/u/683500?v=4&s=117" width="117">](https://github.com/alexnj) |
+[<img alt="muhammadInam" src="https://avatars1.githubusercontent.com/u/7801708?v=4&s=117" width="117">](https://github.com/muhammadInam) |[<img alt="rettgerst" src="https://avatars2.githubusercontent.com/u/11684948?v=4&s=117" width="117">](https://github.com/rettgerst) |[<img alt="jukakoski" src="https://avatars0.githubusercontent.com/u/52720967?v=4&s=117" width="117">](https://github.com/jukakoski) |[<img alt="ajschmidt8" src="https://avatars0.githubusercontent.com/u/7400326?v=4&s=117" width="117">](https://github.com/ajschmidt8) |[<img alt="superhawk610" src="https://avatars1.githubusercontent.com/u/18172185?v=4&s=117" width="117">](https://github.com/superhawk610) |[<img alt="adamvigneault" src="https://avatars2.githubusercontent.com/u/18236120?v=4&s=117" width="117">](https://github.com/adamvigneault) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[jukakoski](https://github.com/jukakoski) |[ajschmidt8](https://github.com/ajschmidt8) |[superhawk610](https://github.com/superhawk610) |[adamvigneault](https://github.com/adamvigneault) |[asmt3](https://github.com/asmt3) |[alexnj](https://github.com/alexnj) |
+[muhammadInam](https://github.com/muhammadInam) |[rettgerst](https://github.com/rettgerst) |[jukakoski](https://github.com/jukakoski) |[ajschmidt8](https://github.com/ajschmidt8) |[superhawk610](https://github.com/superhawk610) |[adamvigneault](https://github.com/adamvigneault) |
 
-[<img alt="bambii7" src="https://avatars3.githubusercontent.com/u/1826459?v=4&s=117" width="117">](https://github.com/bambii7) |[<img alt="amitport" src="https://avatars1.githubusercontent.com/u/1131991?v=4&s=117" width="117">](https://github.com/amitport) |[<img alt="functino" src="https://avatars0.githubusercontent.com/u/415498?v=4&s=117" width="117">](https://github.com/functino) |[<img alt="Botz" src="https://avatars3.githubusercontent.com/u/2706678?v=4&s=117" width="117">](https://github.com/Botz) |[<img alt="radarhere" src="https://avatars2.githubusercontent.com/u/3112309?v=4&s=117" width="117">](https://github.com/radarhere) |[<img alt="superandrew213" src="https://avatars3.githubusercontent.com/u/13059204?v=4&s=117" width="117">](https://github.com/superandrew213) |
+[<img alt="asmt3" src="https://avatars1.githubusercontent.com/u/1777709?v=4&s=117" width="117">](https://github.com/asmt3) |[<img alt="alexnj" src="https://avatars0.githubusercontent.com/u/683500?v=4&s=117" width="117">](https://github.com/alexnj) |[<img alt="amitport" src="https://avatars1.githubusercontent.com/u/1131991?v=4&s=117" width="117">](https://github.com/amitport) |[<img alt="functino" src="https://avatars0.githubusercontent.com/u/415498?v=4&s=117" width="117">](https://github.com/functino) |[<img alt="Botz" src="https://avatars3.githubusercontent.com/u/2706678?v=4&s=117" width="117">](https://github.com/Botz) |[<img alt="radarhere" src="https://avatars2.githubusercontent.com/u/3112309?v=4&s=117" width="117">](https://github.com/radarhere) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[bambii7](https://github.com/bambii7) |[amitport](https://github.com/amitport) |[functino](https://github.com/functino) |[Botz](https://github.com/Botz) |[radarhere](https://github.com/radarhere) |[superandrew213](https://github.com/superandrew213) |
+[asmt3](https://github.com/asmt3) |[alexnj](https://github.com/alexnj) |[amitport](https://github.com/amitport) |[functino](https://github.com/functino) |[Botz](https://github.com/Botz) |[radarhere](https://github.com/radarhere) |
 
-[<img alt="arthurdenner" src="https://avatars0.githubusercontent.com/u/13774309?v=4&s=117" width="117">](https://github.com/arthurdenner) |[<img alt="bochkarev-artem" src="https://avatars2.githubusercontent.com/u/11025874?v=4&s=117" width="117">](https://github.com/bochkarev-artem) |[<img alt="ayhankesicioglu" src="https://avatars2.githubusercontent.com/u/36304312?v=4&s=117" width="117">](https://github.com/ayhankesicioglu) |[<img alt="azeemba" src="https://avatars0.githubusercontent.com/u/2160795?v=4&s=117" width="117">](https://github.com/azeemba) |[<img alt="uxitten" src="https://avatars0.githubusercontent.com/u/1549069?v=4&s=117" width="117">](https://github.com/uxitten) |[<img alt="bducharme" src="https://avatars2.githubusercontent.com/u/4173569?v=4&s=117" width="117">](https://github.com/bducharme) |
+[<img alt="superandrew213" src="https://avatars3.githubusercontent.com/u/13059204?v=4&s=117" width="117">](https://github.com/superandrew213) |[<img alt="arthurdenner" src="https://avatars0.githubusercontent.com/u/13774309?v=4&s=117" width="117">](https://github.com/arthurdenner) |[<img alt="bochkarev-artem" src="https://avatars2.githubusercontent.com/u/11025874?v=4&s=117" width="117">](https://github.com/bochkarev-artem) |[<img alt="ayhankesicioglu" src="https://avatars2.githubusercontent.com/u/36304312?v=4&s=117" width="117">](https://github.com/ayhankesicioglu) |[<img alt="azeemba" src="https://avatars0.githubusercontent.com/u/2160795?v=4&s=117" width="117">](https://github.com/azeemba) |[<img alt="bducharme" src="https://avatars2.githubusercontent.com/u/4173569?v=4&s=117" width="117">](https://github.com/bducharme) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[arthurdenner](https://github.com/arthurdenner) |[bochkarev-artem](https://github.com/bochkarev-artem) |[ayhankesicioglu](https://github.com/ayhankesicioglu) |[azeemba](https://github.com/azeemba) |[uxitten](https://github.com/uxitten) |[bducharme](https://github.com/bducharme) |
+[superandrew213](https://github.com/superandrew213) |[arthurdenner](https://github.com/arthurdenner) |[bochkarev-artem](https://github.com/bochkarev-artem) |[ayhankesicioglu](https://github.com/ayhankesicioglu) |[azeemba](https://github.com/azeemba) |[bducharme](https://github.com/bducharme) |
 
 [<img alt="Quorafind" src="https://avatars1.githubusercontent.com/u/13215013?v=4&s=117" width="117">](https://github.com/Quorafind) |[<img alt="chao" src="https://avatars2.githubusercontent.com/u/55872?v=4&s=117" width="117">](https://github.com/chao) |[<img alt="csprance" src="https://avatars0.githubusercontent.com/u/7902617?v=4&s=117" width="117">](https://github.com/csprance) |[<img alt="cbush06" src="https://avatars0.githubusercontent.com/u/15720146?v=4&s=117" width="117">](https://github.com/cbush06) |[<img alt="czj" src="https://avatars2.githubusercontent.com/u/14306?v=4&s=117" width="117">](https://github.com/czj) |[<img alt="sercraig" src="https://avatars3.githubusercontent.com/u/24261518?v=4&s=117" width="117">](https://github.com/sercraig) |
 :---: |:---: |:---: |:---: |:---: |:---: |
 [Quorafind](https://github.com/Quorafind) |[chao](https://github.com/chao) |[csprance](https://github.com/csprance) |[cbush06](https://github.com/cbush06) |[czj](https://github.com/czj) |[sercraig](https://github.com/sercraig) |
 
-[<img alt="danmichaelo" src="https://avatars1.githubusercontent.com/u/434495?v=4&s=117" width="117">](https://github.com/danmichaelo) |[<img alt="mrboomer" src="https://avatars0.githubusercontent.com/u/5942912?v=4&s=117" width="117">](https://github.com/mrboomer) |[<img alt="davilima6" src="https://avatars0.githubusercontent.com/u/422130?v=4&s=117" width="117">](https://github.com/davilima6) |[<img alt="DennisKofflard" src="https://avatars2.githubusercontent.com/u/8669129?v=4&s=117" width="117">](https://github.com/DennisKofflard) |[<img alt="yoldar" src="https://avatars3.githubusercontent.com/u/1597578?v=4&s=117" width="117">](https://github.com/yoldar) |[<img alt="eliOcs" src="https://avatars1.githubusercontent.com/u/1283954?v=4&s=117" width="117">](https://github.com/eliOcs) |
+[<img alt="danmichaelo" src="https://avatars1.githubusercontent.com/u/434495?v=4&s=117" width="117">](https://github.com/danmichaelo) |[<img alt="mrboomer" src="https://avatars0.githubusercontent.com/u/5942912?v=4&s=117" width="117">](https://github.com/mrboomer) |[<img alt="davilima6" src="https://avatars0.githubusercontent.com/u/422130?v=4&s=117" width="117">](https://github.com/davilima6) |[<img alt="DennisKofflard" src="https://avatars2.githubusercontent.com/u/8669129?v=4&s=117" width="117">](https://github.com/DennisKofflard) |[<img alt="dominiceden" src="https://avatars2.githubusercontent.com/u/6367692?v=4&s=117" width="117">](https://github.com/dominiceden) |[<img alt="yoldar" src="https://avatars3.githubusercontent.com/u/1597578?v=4&s=117" width="117">](https://github.com/yoldar) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[danmichaelo](https://github.com/danmichaelo) |[mrboomer](https://github.com/mrboomer) |[davilima6](https://github.com/davilima6) |[DennisKofflard](https://github.com/DennisKofflard) |[yoldar](https://github.com/yoldar) |[eliOcs](https://github.com/eliOcs) |
+[danmichaelo](https://github.com/danmichaelo) |[mrboomer](https://github.com/mrboomer) |[davilima6](https://github.com/davilima6) |[DennisKofflard](https://github.com/DennisKofflard) |[dominiceden](https://github.com/dominiceden) |[yoldar](https://github.com/yoldar) |
 
-[<img alt="lowsprofile" src="https://avatars1.githubusercontent.com/u/11029687?v=4&s=117" width="117">](https://github.com/lowsprofile) |[<img alt="FWirtz" src="https://avatars1.githubusercontent.com/u/6052785?v=4&s=117" width="117">](https://github.com/FWirtz) |[<img alt="geoffappleford" src="https://avatars2.githubusercontent.com/u/731678?v=4&s=117" width="117">](https://github.com/geoffappleford) |[<img alt="gjungb" src="https://avatars0.githubusercontent.com/u/3391068?v=4&s=117" width="117">](https://github.com/gjungb) |[<img alt="HughbertD" src="https://avatars0.githubusercontent.com/u/1580021?v=4&s=117" width="117">](https://github.com/HughbertD) |[<img alt="HussainAlkhalifah" src="https://avatars1.githubusercontent.com/u/43642162?v=4&s=117" width="117">](https://github.com/HussainAlkhalifah) |
+[<img alt="eliOcs" src="https://avatars1.githubusercontent.com/u/1283954?v=4&s=117" width="117">](https://github.com/eliOcs) |[<img alt="lowsprofile" src="https://avatars1.githubusercontent.com/u/11029687?v=4&s=117" width="117">](https://github.com/lowsprofile) |[<img alt="FWirtz" src="https://avatars1.githubusercontent.com/u/6052785?v=4&s=117" width="117">](https://github.com/FWirtz) |[<img alt="geoffappleford" src="https://avatars2.githubusercontent.com/u/731678?v=4&s=117" width="117">](https://github.com/geoffappleford) |[<img alt="gjungb" src="https://avatars0.githubusercontent.com/u/3391068?v=4&s=117" width="117">](https://github.com/gjungb) |[<img alt="HughbertD" src="https://avatars0.githubusercontent.com/u/1580021?v=4&s=117" width="117">](https://github.com/HughbertD) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[lowsprofile](https://github.com/lowsprofile) |[FWirtz](https://github.com/FWirtz) |[geoffappleford](https://github.com/geoffappleford) |[gjungb](https://github.com/gjungb) |[HughbertD](https://github.com/HughbertD) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) |
+[eliOcs](https://github.com/eliOcs) |[lowsprofile](https://github.com/lowsprofile) |[FWirtz](https://github.com/FWirtz) |[geoffappleford](https://github.com/geoffappleford) |[gjungb](https://github.com/gjungb) |[HughbertD](https://github.com/HughbertD) |
 
-[<img alt="huydod" src="https://avatars2.githubusercontent.com/u/37580530?v=4&s=117" width="117">](https://github.com/huydod) |[<img alt="JacobMGEvans" src="https://avatars1.githubusercontent.com/u/27247160?v=4&s=117" width="117">](https://github.com/JacobMGEvans) |[<img alt="jcjmcclean" src="https://avatars3.githubusercontent.com/u/1822574?v=4&s=117" width="117">](https://github.com/jcjmcclean) |[<img alt="janklimo" src="https://avatars1.githubusercontent.com/u/7811733?v=4&s=117" width="117">](https://github.com/janklimo) |[<img alt="vith" src="https://avatars1.githubusercontent.com/u/3265539?v=4&s=117" width="117">](https://github.com/vith) |[<img alt="jessica-coursera" src="https://avatars1.githubusercontent.com/u/35155465?v=4&s=117" width="117">](https://github.com/jessica-coursera) |
+[<img alt="HussainAlkhalifah" src="https://avatars1.githubusercontent.com/u/43642162?v=4&s=117" width="117">](https://github.com/HussainAlkhalifah) |[<img alt="huydod" src="https://avatars2.githubusercontent.com/u/37580530?v=4&s=117" width="117">](https://github.com/huydod) |[<img alt="JacobMGEvans" src="https://avatars1.githubusercontent.com/u/27247160?v=4&s=117" width="117">](https://github.com/JacobMGEvans) |[<img alt="jcjmcclean" src="https://avatars3.githubusercontent.com/u/1822574?v=4&s=117" width="117">](https://github.com/jcjmcclean) |[<img alt="janklimo" src="https://avatars1.githubusercontent.com/u/7811733?v=4&s=117" width="117">](https://github.com/janklimo) |[<img alt="vith" src="https://avatars1.githubusercontent.com/u/3265539?v=4&s=117" width="117">](https://github.com/vith) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[huydod](https://github.com/huydod) |[JacobMGEvans](https://github.com/JacobMGEvans) |[jcjmcclean](https://github.com/jcjmcclean) |[janklimo](https://github.com/janklimo) |[vith](https://github.com/vith) |[jessica-coursera](https://github.com/jessica-coursera) |
+[HussainAlkhalifah](https://github.com/HussainAlkhalifah) |[huydod](https://github.com/huydod) |[JacobMGEvans](https://github.com/JacobMGEvans) |[jcjmcclean](https://github.com/jcjmcclean) |[janklimo](https://github.com/janklimo) |[vith](https://github.com/vith) |
 
-[<img alt="theJoeBiz" src="https://avatars1.githubusercontent.com/u/189589?v=4&s=117" width="117">](https://github.com/theJoeBiz) |[<img alt="jderrough" src="https://avatars3.githubusercontent.com/u/1108358?v=4&s=117" width="117">](https://github.com/jderrough) |[<img alt="jonathanly" src="https://avatars3.githubusercontent.com/u/13286473?v=4&s=117" width="117">](https://github.com/jonathanly) |[<img alt="jorgeepc" src="https://avatars3.githubusercontent.com/u/3879892?v=4&s=117" width="117">](https://github.com/jorgeepc) |[<img alt="julianocomg" src="https://avatars1.githubusercontent.com/u/7483557?v=4&s=117" width="117">](https://github.com/julianocomg) |[<img alt="dogrocker" src="https://avatars0.githubusercontent.com/u/8379027?v=4&s=117" width="117">](https://github.com/dogrocker) |
+[<img alt="jessica-coursera" src="https://avatars1.githubusercontent.com/u/35155465?v=4&s=117" width="117">](https://github.com/jessica-coursera) |[<img alt="theJoeBiz" src="https://avatars1.githubusercontent.com/u/189589?v=4&s=117" width="117">](https://github.com/theJoeBiz) |[<img alt="jderrough" src="https://avatars3.githubusercontent.com/u/1108358?v=4&s=117" width="117">](https://github.com/jderrough) |[<img alt="jonathanly" src="https://avatars3.githubusercontent.com/u/13286473?v=4&s=117" width="117">](https://github.com/jonathanly) |[<img alt="jorgeepc" src="https://avatars3.githubusercontent.com/u/3879892?v=4&s=117" width="117">](https://github.com/jorgeepc) |[<img alt="julianocomg" src="https://avatars1.githubusercontent.com/u/7483557?v=4&s=117" width="117">](https://github.com/julianocomg) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[theJoeBiz](https://github.com/theJoeBiz) |[jderrough](https://github.com/jderrough) |[jonathanly](https://github.com/jonathanly) |[jorgeepc](https://github.com/jorgeepc) |[julianocomg](https://github.com/julianocomg) |[dogrocker](https://github.com/dogrocker) |
+[jessica-coursera](https://github.com/jessica-coursera) |[theJoeBiz](https://github.com/theJoeBiz) |[jderrough](https://github.com/jderrough) |[jonathanly](https://github.com/jonathanly) |[jorgeepc](https://github.com/jorgeepc) |[julianocomg](https://github.com/julianocomg) |
 
-[<img alt="firesharkstudios" src="https://avatars1.githubusercontent.com/u/17069637?v=4&s=117" width="117">](https://github.com/firesharkstudios) |[<img alt="kyleparisi" src="https://avatars0.githubusercontent.com/u/1286753?v=4&s=117" width="117">](https://github.com/kyleparisi) |[<img alt="larowlan" src="https://avatars2.githubusercontent.com/u/555254?v=4&s=117" width="117">](https://github.com/larowlan) |[<img alt="dviry" src="https://avatars3.githubusercontent.com/u/1230260?v=4&s=117" width="117">](https://github.com/dviry) |[<img alt="leods92" src="https://avatars0.githubusercontent.com/u/879395?v=4&s=117" width="117">](https://github.com/leods92) |[<img alt="lucaperret" src="https://avatars1.githubusercontent.com/u/1887122?v=4&s=117" width="117">](https://github.com/lucaperret) |
+[<img alt="dogrocker" src="https://avatars0.githubusercontent.com/u/8379027?v=4&s=117" width="117">](https://github.com/dogrocker) |[<img alt="firesharkstudios" src="https://avatars1.githubusercontent.com/u/17069637?v=4&s=117" width="117">](https://github.com/firesharkstudios) |[<img alt="kyleparisi" src="https://avatars0.githubusercontent.com/u/1286753?v=4&s=117" width="117">](https://github.com/kyleparisi) |[<img alt="larowlan" src="https://avatars2.githubusercontent.com/u/555254?v=4&s=117" width="117">](https://github.com/larowlan) |[<img alt="dviry" src="https://avatars3.githubusercontent.com/u/1230260?v=4&s=117" width="117">](https://github.com/dviry) |[<img alt="leods92" src="https://avatars0.githubusercontent.com/u/879395?v=4&s=117" width="117">](https://github.com/leods92) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[firesharkstudios](https://github.com/firesharkstudios) |[kyleparisi](https://github.com/kyleparisi) |[larowlan](https://github.com/larowlan) |[dviry](https://github.com/dviry) |[leods92](https://github.com/leods92) |[lucaperret](https://github.com/lucaperret) |
+[dogrocker](https://github.com/dogrocker) |[firesharkstudios](https://github.com/firesharkstudios) |[kyleparisi](https://github.com/kyleparisi) |[larowlan](https://github.com/larowlan) |[dviry](https://github.com/dviry) |[leods92](https://github.com/leods92) |
 
-[<img alt="mperrando" src="https://avatars2.githubusercontent.com/u/525572?v=4&s=117" width="117">](https://github.com/mperrando) |[<img alt="marcusforsberg" src="https://avatars0.githubusercontent.com/u/1009069?v=4&s=117" width="117">](https://github.com/marcusforsberg) |[<img alt="mattfik" src="https://avatars2.githubusercontent.com/u/1638028?v=4&s=117" width="117">](https://github.com/mattfik) |[<img alt="hrsh" src="https://avatars3.githubusercontent.com/u/1929359?v=4&s=117" width="117">](https://github.com/hrsh) |[<img alt="achmiral" src="https://avatars0.githubusercontent.com/u/10906059?v=4&s=117" width="117">](https://github.com/achmiral) |[<img alt="mnafees" src="https://avatars1.githubusercontent.com/u/1763885?v=4&s=117" width="117">](https://github.com/mnafees) |
+[<img alt="lucaperret" src="https://avatars1.githubusercontent.com/u/1887122?v=4&s=117" width="117">](https://github.com/lucaperret) |[<img alt="mperrando" src="https://avatars2.githubusercontent.com/u/525572?v=4&s=117" width="117">](https://github.com/mperrando) |[<img alt="marcusforsberg" src="https://avatars0.githubusercontent.com/u/1009069?v=4&s=117" width="117">](https://github.com/marcusforsberg) |[<img alt="mattfik" src="https://avatars2.githubusercontent.com/u/1638028?v=4&s=117" width="117">](https://github.com/mattfik) |[<img alt="hrsh" src="https://avatars3.githubusercontent.com/u/1929359?v=4&s=117" width="117">](https://github.com/hrsh) |[<img alt="achmiral" src="https://avatars0.githubusercontent.com/u/10906059?v=4&s=117" width="117">](https://github.com/achmiral) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[mperrando](https://github.com/mperrando) |[marcusforsberg](https://github.com/marcusforsberg) |[mattfik](https://github.com/mattfik) |[hrsh](https://github.com/hrsh) |[achmiral](https://github.com/achmiral) |[mnafees](https://github.com/mnafees) |
+[lucaperret](https://github.com/lucaperret) |[mperrando](https://github.com/mperrando) |[marcusforsberg](https://github.com/marcusforsberg) |[mattfik](https://github.com/mattfik) |[hrsh](https://github.com/hrsh) |[achmiral](https://github.com/achmiral) |
 
-[<img alt="leftdevel" src="https://avatars3.githubusercontent.com/u/843337?v=4&s=117" width="117">](https://github.com/leftdevel) |[<img alt="phillipalexander" src="https://avatars0.githubusercontent.com/u/1577682?v=4&s=117" width="117">](https://github.com/phillipalexander) |[<img alt="Pzoco" src="https://avatars0.githubusercontent.com/u/3101348?v=4&s=117" width="117">](https://github.com/Pzoco) |[<img alt="eman8519" src="https://avatars2.githubusercontent.com/u/2380804?v=4&s=117" width="117">](https://github.com/eman8519) |[<img alt="luarmr" src="https://avatars3.githubusercontent.com/u/817416?v=4&s=117" width="117">](https://github.com/luarmr) |[<img alt="phobos101" src="https://avatars2.githubusercontent.com/u/7114944?v=4&s=117" width="117">](https://github.com/phobos101) |
+[<img alt="mnafees" src="https://avatars1.githubusercontent.com/u/1763885?v=4&s=117" width="117">](https://github.com/mnafees) |[<img alt="leftdevel" src="https://avatars3.githubusercontent.com/u/843337?v=4&s=117" width="117">](https://github.com/leftdevel) |[<img alt="phillipalexander" src="https://avatars0.githubusercontent.com/u/1577682?v=4&s=117" width="117">](https://github.com/phillipalexander) |[<img alt="Pzoco" src="https://avatars0.githubusercontent.com/u/3101348?v=4&s=117" width="117">](https://github.com/Pzoco) |[<img alt="eman8519" src="https://avatars2.githubusercontent.com/u/2380804?v=4&s=117" width="117">](https://github.com/eman8519) |[<img alt="luarmr" src="https://avatars3.githubusercontent.com/u/817416?v=4&s=117" width="117">](https://github.com/luarmr) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[leftdevel](https://github.com/leftdevel) |[phillipalexander](https://github.com/phillipalexander) |[Pzoco](https://github.com/Pzoco) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[phobos101](https://github.com/phobos101) |
+[mnafees](https://github.com/mnafees) |[leftdevel](https://github.com/leftdevel) |[phillipalexander](https://github.com/phillipalexander) |[Pzoco](https://github.com/Pzoco) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |
 
-[<img alt="fortunto2" src="https://avatars1.githubusercontent.com/u/1236751?v=4&s=117" width="117">](https://github.com/fortunto2) |[<img alt="samuelcolburn" src="https://avatars2.githubusercontent.com/u/9741902?v=4&s=117" width="117">](https://github.com/samuelcolburn) |[<img alt="sergei-zelinsky" src="https://avatars2.githubusercontent.com/u/19428086?v=4&s=117" width="117">](https://github.com/sergei-zelinsky) |[<img alt="steverob" src="https://avatars2.githubusercontent.com/u/1220480?v=4&s=117" width="117">](https://github.com/steverob) |[<img alt="tajchumber" src="https://avatars3.githubusercontent.com/u/16062635?v=4&s=117" width="117">](https://github.com/tajchumber) |[<img alt="Tashows" src="https://avatars2.githubusercontent.com/u/16656928?v=4&s=117" width="117">](https://github.com/Tashows) |
+[<img alt="phobos101" src="https://avatars2.githubusercontent.com/u/7114944?v=4&s=117" width="117">](https://github.com/phobos101) |[<img alt="fortunto2" src="https://avatars1.githubusercontent.com/u/1236751?v=4&s=117" width="117">](https://github.com/fortunto2) |[<img alt="samuelcolburn" src="https://avatars2.githubusercontent.com/u/9741902?v=4&s=117" width="117">](https://github.com/samuelcolburn) |[<img alt="sergei-zelinsky" src="https://avatars2.githubusercontent.com/u/19428086?v=4&s=117" width="117">](https://github.com/sergei-zelinsky) |[<img alt="steverob" src="https://avatars2.githubusercontent.com/u/1220480?v=4&s=117" width="117">](https://github.com/steverob) |[<img alt="tajchumber" src="https://avatars3.githubusercontent.com/u/16062635?v=4&s=117" width="117">](https://github.com/tajchumber) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[fortunto2](https://github.com/fortunto2) |[samuelcolburn](https://github.com/samuelcolburn) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[steverob](https://github.com/steverob) |[tajchumber](https://github.com/tajchumber) |[Tashows](https://github.com/Tashows) |
+[phobos101](https://github.com/phobos101) |[fortunto2](https://github.com/fortunto2) |[samuelcolburn](https://github.com/samuelcolburn) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[steverob](https://github.com/steverob) |[tajchumber](https://github.com/tajchumber) |
 
-[<img alt="twarlop" src="https://avatars3.githubusercontent.com/u/2856082?v=4&s=117" width="117">](https://github.com/twarlop) |[<img alt="tomsaleeba" src="https://avatars0.githubusercontent.com/u/1773838?v=4&s=117" width="117">](https://github.com/tomsaleeba) |[<img alt="tvaliasek" src="https://avatars2.githubusercontent.com/u/8644946?v=4&s=117" width="117">](https://github.com/tvaliasek) |[<img alt="vially" src="https://avatars1.githubusercontent.com/u/433598?v=4&s=117" width="117">](https://github.com/vially) |[<img alt="nagyv" src="https://avatars2.githubusercontent.com/u/126671?v=4&s=117" width="117">](https://github.com/nagyv) |[<img alt="eltercero" src="https://avatars0.githubusercontent.com/u/545235?v=4&s=117" width="117">](https://github.com/eltercero) |
+[<img alt="Tashows" src="https://avatars2.githubusercontent.com/u/16656928?v=4&s=117" width="117">](https://github.com/Tashows) |[<img alt="twarlop" src="https://avatars3.githubusercontent.com/u/2856082?v=4&s=117" width="117">](https://github.com/twarlop) |[<img alt="tomsaleeba" src="https://avatars0.githubusercontent.com/u/1773838?v=4&s=117" width="117">](https://github.com/tomsaleeba) |[<img alt="tvaliasek" src="https://avatars2.githubusercontent.com/u/8644946?v=4&s=117" width="117">](https://github.com/tvaliasek) |[<img alt="vially" src="https://avatars1.githubusercontent.com/u/433598?v=4&s=117" width="117">](https://github.com/vially) |[<img alt="nagyv" src="https://avatars2.githubusercontent.com/u/126671?v=4&s=117" width="117">](https://github.com/nagyv) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[twarlop](https://github.com/twarlop) |[tomsaleeba](https://github.com/tomsaleeba) |[tvaliasek](https://github.com/tvaliasek) |[vially](https://github.com/vially) |[nagyv](https://github.com/nagyv) |[eltercero](https://github.com/eltercero) |
+[Tashows](https://github.com/Tashows) |[twarlop](https://github.com/twarlop) |[tomsaleeba](https://github.com/tomsaleeba) |[tvaliasek](https://github.com/tvaliasek) |[vially](https://github.com/vially) |[nagyv](https://github.com/nagyv) |
 
-[<img alt="willycamargo" src="https://avatars1.githubusercontent.com/u/5041887?v=4&s=117" width="117">](https://github.com/willycamargo) |[<img alt="xhocquet" src="https://avatars2.githubusercontent.com/u/8116516?v=4&s=117" width="117">](https://github.com/xhocquet) |[<img alt="arggh" src="https://avatars3.githubusercontent.com/u/17210302?v=4&s=117" width="117">](https://github.com/arggh) |[<img alt="avalla" src="https://avatars1.githubusercontent.com/u/986614?v=4&s=117" width="117">](https://github.com/avalla) |[<img alt="c0b41" src="https://avatars1.githubusercontent.com/u/2834954?v=4&s=117" width="117">](https://github.com/c0b41) |[<img alt="canvasbh" src="https://avatars3.githubusercontent.com/u/44477734?v=4&s=117" width="117">](https://github.com/canvasbh) |
+[<img alt="eltercero" src="https://avatars0.githubusercontent.com/u/545235?v=4&s=117" width="117">](https://github.com/eltercero) |[<img alt="willycamargo" src="https://avatars1.githubusercontent.com/u/5041887?v=4&s=117" width="117">](https://github.com/willycamargo) |[<img alt="xhocquet" src="https://avatars2.githubusercontent.com/u/8116516?v=4&s=117" width="117">](https://github.com/xhocquet) |[<img alt="YehudaKremer" src="https://avatars3.githubusercontent.com/u/946652?v=4&s=117" width="117">](https://github.com/YehudaKremer) |[<img alt="arggh" src="https://avatars3.githubusercontent.com/u/17210302?v=4&s=117" width="117">](https://github.com/arggh) |[<img alt="avalla" src="https://avatars1.githubusercontent.com/u/986614?v=4&s=117" width="117">](https://github.com/avalla) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[willycamargo](https://github.com/willycamargo) |[xhocquet](https://github.com/xhocquet) |[arggh](https://github.com/arggh) |[avalla](https://github.com/avalla) |[c0b41](https://github.com/c0b41) |[canvasbh](https://github.com/canvasbh) |
+[eltercero](https://github.com/eltercero) |[willycamargo](https://github.com/willycamargo) |[xhocquet](https://github.com/xhocquet) |[YehudaKremer](https://github.com/YehudaKremer) |[arggh](https://github.com/arggh) |[avalla](https://github.com/avalla) |
 
-[<img alt="craigcbrunner" src="https://avatars3.githubusercontent.com/u/2780521?v=4&s=117" width="117">](https://github.com/craigcbrunner) |[<img alt="franckl" src="https://avatars0.githubusercontent.com/u/3875803?v=4&s=117" width="117">](https://github.com/franckl) |[<img alt="green-mike" src="https://avatars1.githubusercontent.com/u/5584225?v=4&s=117" width="117">](https://github.com/green-mike) |[<img alt="jarey" src="https://avatars1.githubusercontent.com/u/5025224?v=4&s=117" width="117">](https://github.com/jarey) |[<img alt="johnmanjiro13" src="https://avatars1.githubusercontent.com/u/28798279?v=4&s=117" width="117">](https://github.com/johnmanjiro13) |[<img alt="magumbo" src="https://avatars3.githubusercontent.com/u/6683765?v=4&s=117" width="117">](https://github.com/magumbo) |
+[<img alt="c0b41" src="https://avatars1.githubusercontent.com/u/2834954?v=4&s=117" width="117">](https://github.com/c0b41) |[<img alt="canvasbh" src="https://avatars3.githubusercontent.com/u/44477734?v=4&s=117" width="117">](https://github.com/canvasbh) |[<img alt="craigcbrunner" src="https://avatars3.githubusercontent.com/u/2780521?v=4&s=117" width="117">](https://github.com/craigcbrunner) |[<img alt="franckl" src="https://avatars0.githubusercontent.com/u/3875803?v=4&s=117" width="117">](https://github.com/franckl) |[<img alt="green-mike" src="https://avatars1.githubusercontent.com/u/5584225?v=4&s=117" width="117">](https://github.com/green-mike) |[<img alt="jarey" src="https://avatars1.githubusercontent.com/u/5025224?v=4&s=117" width="117">](https://github.com/jarey) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[craigcbrunner](https://github.com/craigcbrunner) |[franckl](https://github.com/franckl) |[green-mike](https://github.com/green-mike) |[jarey](https://github.com/jarey) |[johnmanjiro13](https://github.com/johnmanjiro13) |[magumbo](https://github.com/magumbo) |
+[c0b41](https://github.com/c0b41) |[canvasbh](https://github.com/canvasbh) |[craigcbrunner](https://github.com/craigcbrunner) |[franckl](https://github.com/franckl) |[green-mike](https://github.com/green-mike) |[jarey](https://github.com/jarey) |
 
-[<img alt="ninesalt" src="https://avatars2.githubusercontent.com/u/7952255?v=4&s=117" width="117">](https://github.com/ninesalt) |[<img alt="luntta" src="https://avatars0.githubusercontent.com/u/14221637?v=4&s=117" width="117">](https://github.com/luntta) |[<img alt="rhymes" src="https://avatars3.githubusercontent.com/u/146201?v=4&s=117" width="117">](https://github.com/rhymes) |[<img alt="tinny77" src="https://avatars2.githubusercontent.com/u/1872936?v=4&s=117" width="117">](https://github.com/tinny77) |[<img alt="olitomas" src="https://avatars0.githubusercontent.com/u/6918659?v=4&s=117" width="117">](https://github.com/olitomas) |[<img alt="tuoxiansp" src="https://avatars1.githubusercontent.com/u/3960056?v=4&s=117" width="117">](https://github.com/tuoxiansp) |
+[<img alt="johnmanjiro13" src="https://avatars1.githubusercontent.com/u/28798279?v=4&s=117" width="117">](https://github.com/johnmanjiro13) |[<img alt="magumbo" src="https://avatars3.githubusercontent.com/u/6683765?v=4&s=117" width="117">](https://github.com/magumbo) |[<img alt="ninesalt" src="https://avatars2.githubusercontent.com/u/7952255?v=4&s=117" width="117">](https://github.com/ninesalt) |[<img alt="luntta" src="https://avatars0.githubusercontent.com/u/14221637?v=4&s=117" width="117">](https://github.com/luntta) |[<img alt="rhymes" src="https://avatars3.githubusercontent.com/u/146201?v=4&s=117" width="117">](https://github.com/rhymes) |[<img alt="tinny77" src="https://avatars2.githubusercontent.com/u/1872936?v=4&s=117" width="117">](https://github.com/tinny77) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[ninesalt](https://github.com/ninesalt) |[luntta](https://github.com/luntta) |[rhymes](https://github.com/rhymes) |[tinny77](https://github.com/tinny77) |[olitomas](https://github.com/olitomas) |[tuoxiansp](https://github.com/tuoxiansp) |
+[johnmanjiro13](https://github.com/johnmanjiro13) |[magumbo](https://github.com/magumbo) |[ninesalt](https://github.com/ninesalt) |[luntta](https://github.com/luntta) |[rhymes](https://github.com/rhymes) |[tinny77](https://github.com/tinny77) |
+
+[<img alt="olitomas" src="https://avatars0.githubusercontent.com/u/6918659?v=4&s=117" width="117">](https://github.com/olitomas) |[<img alt="tuoxiansp" src="https://avatars1.githubusercontent.com/u/3960056?v=4&s=117" width="117">](https://github.com/tuoxiansp) |
+:---: |:---: |
+[olitomas](https://github.com/olitomas) |[tuoxiansp](https://github.com/tuoxiansp) |
 <!--/contributors-->
 
 ## Software

+ 1 - 3
bin/endtoend-build-ci

@@ -69,12 +69,10 @@ git checkout -- package-lock.json
 ENDTOEND=1 lerna version prerelease --yes \
   --exact \
   --force-publish \
-  --npm-client=npm \
   --no-push
 ENDTOEND=1 lerna publish from-git --yes \
   --registry="$VERDACCIO_REGISTRY" \
-  --no-verify-access \
-  --npm-client=npm
+  --no-verify-access
 
 # install all packages to the endtoend folder
 # (Don't use the npm cache, don't generate a package-lock, don't save dependencies to any package.json)

+ 2 - 2
examples/cdn-example/index.html

@@ -4,11 +4,11 @@
     <title></title>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
-    <link href="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css" rel="stylesheet">
+    <link href="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css" rel="stylesheet">
   </head>
   <body>
     <button id="uppyModalOpener">Open Modal</button>
-    <script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+    <script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
     <script>
       const uppy = Uppy.Core({debug: true, autoProceed: false})
         .use(Uppy.Dashboard, { trigger: '#uppyModalOpener' })

+ 56 - 11
examples/dev/Dashboard.js

@@ -7,12 +7,36 @@ const Dropbox = require('@uppy/dropbox/src')
 const GoogleDrive = require('@uppy/google-drive/src')
 const Url = require('@uppy/url/src')
 const Webcam = require('@uppy/webcam/src')
+const GoldenRetriever = require('@uppy/golden-retriever/src')
 const Tus = require('@uppy/tus/src')
-// const XHRUpload = require('@uppy/xhr-upload/src')
+const AwsS3 = require('@uppy/tus/src')
+const XHRUpload = require('@uppy/xhr-upload/src')
+const Transloadit = require('@uppy/transloadit/src')
 const Form = require('@uppy/form/src')
 
+// DEV CONFIG: pick an uploader
+
+const UPLOADER = 'tus'
+// const UPLOADER = 's3'
+// const UPLOADER = 'xhr'
+// const UPLOADER = 'transloadit'
+
+// DEV CONFIG: Endpoint URLs
+
+const COMPANION_URL = 'http://localhost:3020'
 const TUS_ENDPOINT = 'https://master.tus.io/files/'
-// const XHR_ENDPOINT = 'https://upload-endpoint.uppy.io/upload'
+const XHR_ENDPOINT = 'https://upload-endpoint.uppy.io/upload'
+
+// DEV CONFIG: Transloadit keys
+
+const TRANSLOADIT_KEY = '...'
+const TRANSLOADIT_TEMPLATE = '...'
+
+// DEV CONFIG: enable or disable Golden Retriever
+
+const RESTORE = false
+
+// Rest is implementation! Obviously edit as necessary...
 
 module.exports = () => {
   const uppyDashboard = Uppy({
@@ -34,17 +58,38 @@ module.exports = () => {
       proudlyDisplayPoweredByUppy: true,
       note: '2 files, images and video only'
     })
-    .use(GoogleDrive, { target: Dashboard, companionUrl: 'http://localhost:3020' })
-    .use(Instagram, { target: Dashboard, companionUrl: 'http://localhost:3020' })
-    .use(Dropbox, { target: Dashboard, companionUrl: 'http://localhost:3020' })
-    .use(Facebook, { target: Dashboard, companionUrl: 'http://localhost:3020' })
-    .use(OneDrive, { target: Dashboard, companionUrl: 'http://localhost:3020' })
-    .use(Url, { target: Dashboard, companionUrl: 'http://localhost:3020' })
+    .use(GoogleDrive, { target: Dashboard, companionUrl: COMPANION_URL })
+    .use(Instagram, { target: Dashboard, companionUrl: COMPANION_URL })
+    .use(Dropbox, { target: Dashboard, companionUrl: COMPANION_URL })
+    .use(Facebook, { target: Dashboard, companionUrl: COMPANION_URL })
+    .use(OneDrive, { target: Dashboard, companionUrl: COMPANION_URL })
+    .use(Url, { target: Dashboard, companionUrl: COMPANION_URL })
     .use(Webcam, { target: Dashboard })
-    .use(Tus, { endpoint: TUS_ENDPOINT })
-    // .use(XHRUpload, { endpoint: XHR_ENDPOINT, bundle: true })
     .use(Form, { target: '#upload-form' })
-    // .use(GoldenRetriever, {serviceWorker: true})
+
+  switch (UPLOADER) {
+    case 'tus':
+      uppyDashboard.use(Tus, { endpoint: TUS_ENDPOINT })
+      break
+    case 's3':
+      uppyDashboard.use(AwsS3, { companionUrl: COMPANION_URL })
+      break
+    case 'xhr':
+      uppyDashboard.use(XHRUpload, { endpoint: XHR_ENDPOINT, bundle: true })
+      break
+    case 'transloadit':
+      uppyDashboard.use(Transloadit, {
+        params: {
+          auth: { key: TRANSLOADIT_KEY },
+          template_id: TRANSLOADIT_TEMPLATE
+        }
+      })
+      break
+  }
+
+  if (RESTORE) {
+    uppyDashboard.use(GoldenRetriever, { serviceWorker: true })
+  }
 
   window.uppy = uppyDashboard
 

+ 1 - 1
examples/transloadit-textarea/index.html

@@ -2,7 +2,7 @@
 <html>
   <head>
     <meta charset="utf-8">
-    <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.css">
+    <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.css">
     <style>
       body {
         font-family: Roboto, Open Sans;

+ 2 - 2
examples/uppy-with-companion/client/index.html

@@ -4,11 +4,11 @@
     <title></title>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
-    <link href="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css" rel="stylesheet">
+    <link href="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css" rel="stylesheet">
   </head>
   <body>
     <button id="uppyModalOpener">Open Modal</button>
-    <script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+    <script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
     <script>
       const uppy = Uppy.Core({debug: true, autoProceed: false})
         .use(Uppy.Dashboard, { trigger: '#uppyModalOpener' })

+ 2 - 2
netlify.toml

@@ -5,6 +5,6 @@ ID = "uppy"
 # (no main build settings, we use Github Pages)
 
 [context.deploy-preview]
-command = "npm run build && npm run web:inject-disc && npm run web:build"
-environment = { NODE_VERSION = "10" }
+command = "npx lerna bootstrap && npm run build && npm run web:inject-disc && npm run web:build"
+environment = { NODE_VERSION = "12" }
 publish = "website/public"

File diff suppressed because it is too large
+ 344 - 324
package-lock.json


+ 30 - 30
package.json

@@ -69,18 +69,18 @@
     "uppy.io": "file:website"
   },
   "devDependencies": {
-    "@babel/cli": "^7.4.4",
-    "@babel/core": "^7.4.5",
-    "@babel/plugin-proposal-class-properties": "^7.4.4",
-    "@babel/plugin-transform-object-assign": "^7.2.0",
-    "@babel/plugin-transform-proto-to-assign": "^7.4.4",
-    "@babel/plugin-transform-react-jsx": "^7.3.0",
+    "@babel/cli": "^7.7.5",
+    "@babel/core": "^7.7.5",
+    "@babel/plugin-proposal-class-properties": "^7.7.4",
+    "@babel/plugin-transform-object-assign": "^7.7.4",
+    "@babel/plugin-transform-proto-to-assign": "^7.7.4",
+    "@babel/plugin-transform-react-jsx": "^7.7.4",
     "@babel/polyfill": "^7.4.4",
-    "@babel/preset-env": "^7.4.5",
-    "@babel/register": "^7.4.4",
+    "@babel/preset-env": "^7.7.6",
+    "@babel/register": "^7.7.4",
     "@jamen/lorem": "^0.2.0",
     "@octokit/rest": "^16.25.0",
-    "@size-limit/preset-big-lib": "^2.1.1",
+    "@size-limit/preset-big-lib": "^2.2.2",
     "@types/aws-serverless-express": "^3.0.1",
     "@types/compression": "0.0.36",
     "@types/connect-redis": "0.0.7",
@@ -92,18 +92,18 @@
     "@types/lodash.merge": "^4.6.3",
     "@types/morgan": "^1.7.35",
     "@types/ms": "^0.7.30",
-    "@types/node": "^12.6.8",
-    "@types/react": "^16.8.10",
+    "@types/node": "^12.12.17",
+    "@types/react": "^16.9.16",
     "@types/request": "^2.0.9",
-    "@types/tus-js-client": "^1.4.1",
+    "@types/tus-js-client": "^1.8.0",
     "@types/uuid": "^3.4.3",
     "@types/ws": "^3.2.1",
-    "@wdio/cli": "^5.10.7",
-    "@wdio/local-runner": "^5.10.7",
-    "@wdio/mocha-framework": "^5.0.0",
-    "@wdio/sauce-service": "^5.0.0",
+    "@wdio/cli": "^5.16.15",
+    "@wdio/local-runner": "^5.16.15",
+    "@wdio/mocha-framework": "^5.16.15",
+    "@wdio/sauce-service": "^5.16.10",
     "aliasify": "^2.1.0",
-    "autoprefixer": "^9.5.1",
+    "autoprefixer": "^9.7.3",
     "babel-eslint": "^10.0.3",
     "babel-jest": "^24.9.0",
     "babel-plugin-inline-package-json": "^2.0.0",
@@ -120,16 +120,16 @@
     "enzyme": "^3.9.0",
     "enzyme-adapter-react-16": "^1.11.2",
     "es6-promise": "4.2.5",
-    "eslint": "^6.5.1",
+    "eslint": "^6.7.2",
     "eslint-config-standard": "^14.1.0",
     "eslint-config-standard-jsx": "^8.1.0",
     "eslint-plugin-compat": "^3.3.0",
-    "eslint-plugin-import": "^2.18.2",
+    "eslint-plugin-import": "^2.19.1",
     "eslint-plugin-jest": "^22.17.0",
     "eslint-plugin-jsdoc": "^15.5.3",
     "eslint-plugin-node": "^10.0.0",
     "eslint-plugin-promise": "^4.2.1",
-    "eslint-plugin-react": "^7.15.1",
+    "eslint-plugin-react": "^7.17.0",
     "eslint-plugin-standard": "^4.0.1",
     "events.once": "^2.0.2",
     "exorcist": "^1.0.1",
@@ -146,7 +146,7 @@
     "json3": "^3.3.2",
     "last-commit-message": "^1.0.0",
     "lerna": "^3.17.0",
-    "lint-staged": "^9.4.1",
+    "lint-staged": "^9.5.0",
     "mime-types": "2.1.24",
     "minify-stream": "^1.2.0",
     "mkdirp": "0.5.1",
@@ -156,18 +156,18 @@
     "node-sass": "^4.11.0",
     "nodemon": "^1.17.5",
     "npm-auth-to-token": "^1.0.0",
-    "npm-packlist": "^1.4.1",
+    "npm-packlist": "^1.4.7",
     "npm-run-all": "^4.1.5",
     "onchange": "^4.1.0",
-    "pacote": "^9.5.8",
-    "postcss": "^7.0.16",
+    "pacote": "^9.5.11",
+    "postcss": "^7.0.24",
     "postcss-safe-important": "^1.1.0",
     "pre-commit": "^1.2.2",
     "pretty-bytes": "^5.1.0",
     "react": "^16.8.6",
     "react-dom": "^16.8.6",
     "redux": "^4.0.1",
-    "replace-x": "^1.5.0",
+    "replace-x": "1.5.0",
     "rimraf": "^2.6.3",
     "stringify-object": "^3.3.0",
     "supertest": "3.0.0",
@@ -177,10 +177,10 @@
     "touch": "^3.1.0",
     "tsify": "^4.0.1",
     "tus-node-server": "^0.3.2",
-    "typescript": "^3.4.5",
+    "typescript": "^3.7.3",
     "verdaccio": "^4.2.1",
     "watchify": "^3.11.1",
-    "webdriverio": "^5.0.0",
+    "webdriverio": "^5.16.15",
     "webpack": "^4.41.1",
     "whatwg-fetch": "3.0.0"
   },
@@ -230,15 +230,15 @@
     "web:build-examples": "cd website && node build-examples.js",
     "web:build": "npm-run-all web:inject-bundles-misc web:generate web:build-examples web:inject-frontpagecodesample",
     "web:bundle-watch-inject": "onchange 'packages/uppy/dist/**/*.css' 'packages/uppy/dist/**/*.js' --initial --verbose -- npm run web:inject-bundles-misc",
-    "web:clean": "cd website && touch db.json && ../node_modules/.bin/hexo clean",
+    "web:clean": "cd website && touch db.json && ./node_modules/.bin/hexo clean",
     "web:deploy": "npm-run-all build web:clean web:inject-disc web:build && ./bin/web-deploy",
-    "web:generate": "cd website && touch db.json && ../node_modules/.bin/hexo generate",
+    "web:generate": "cd website && touch db.json && ./node_modules/.bin/hexo generate",
     "web:inject-bundles-misc": "cd website && node inject.js",
     "web:inject-disc": "npm run build:lib && node ./bin/disc.js",
     "web:inject-frontpagecodesample": "npm run web:generate && cp -f website/public/frontpage-code-sample.html website/themes/uppy/layout/partials/frontpage-code-sample.html && touch website/themes/uppy/layout/index.ejs",
     "web:start": "npm-run-all build:lib --parallel watch:css web:watch-examples web:bundle-watch-inject web:watch",
     "web:watch-examples": "cd website && node build-examples.js watch",
-    "web:watch": "cd website && touch db.json && ../node_modules/.bin/hexo server"
+    "web:watch": "cd website && touch db.json && ./node_modules/.bin/hexo server"
   },
   "jest": {
     "automock": false,

+ 2 - 1
packages/@uppy/aws-s3-multipart/package-lock.json

@@ -7,5 +7,6 @@
 			"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
 			"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
 		}
-	}
+	},
+	"version": "1.3.5"
 }

+ 1 - 1
packages/@uppy/aws-s3-multipart/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/aws-s3-multipart",
   "description": "Upload to Amazon S3 with Uppy and S3's Multipart upload strategy",
-  "version": "1.3.4",
+  "version": "1.3.5",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 8 - 3
packages/@uppy/aws-s3-multipart/src/MultipartUploader.js

@@ -160,8 +160,8 @@ class MultipartUploader {
         throw new TypeError('AwsS3/Multipart: Got incorrect result from `prepareUploadPart()`, expected an object `{ url }`.')
       }
       return result
-    }).then(({ url }) => {
-      this._uploadPartBytes(index, url)
+    }).then(({ url, headers }) => {
+      this._uploadPartBytes(index, url, headers)
     }, (err) => {
       this._onError(err)
     })
@@ -189,10 +189,15 @@ class MultipartUploader {
     this._uploadParts()
   }
 
-  _uploadPartBytes (index, url) {
+  _uploadPartBytes (index, url, headers) {
     const body = this.chunks[index]
     const xhr = new XMLHttpRequest()
     xhr.open('PUT', url, true)
+    if (headers) {
+      Object.keys(headers).map((key) => {
+        xhr.setRequestHeader(key, headers[key])
+      })
+    }
     xhr.responseType = 'text'
 
     this.uploading.push(xhr)

+ 1 - 1
packages/@uppy/aws-s3-multipart/types/index.d.ts

@@ -11,7 +11,7 @@ declare module AwsS3Multipart {
     companionUrl: string;
     createMultipartUpload(file: Uppy.UppyFile): Promise<{ uploadId: string, key: string }>;
     listParts(file: Uppy.UppyFile, opts: { uploadId: string, key: string }): Promise<AwsS3Part[]>;
-    prepareUploadPart(file: Uppy.UppyFile, partData: { uploadId: string, key: string, body: Blob, number: number }): Promise<{ url: string }>;
+    prepareUploadPart(file: Uppy.UppyFile, partData: { uploadId: string, key: string, body: Blob, number: number }): Promise<{ url: string, headers?: {[k: string]: string}}>;
     abortMultipartUpload(file: Uppy.UppyFile, opts: { uploadId: string, key: string }): Promise<void>;
     completeMultipartUpload(file: Uppy.UppyFile, opts: { uploadId: string, key: string, parts: AwsS3Part[] }): Promise<{ location?: string }>;
     timeout: number;

+ 2 - 1
packages/@uppy/aws-s3/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/aws-s3",
   "description": "Upload to Amazon S3 with Uppy",
-  "version": "1.3.3",
+  "version": "1.4.0",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",
@@ -25,6 +25,7 @@
     "@uppy/companion-client": "file:../companion-client",
     "@uppy/utils": "file:../utils",
     "@uppy/xhr-upload": "file:../xhr-upload",
+    "qs-stringify": "^1.1.0",
     "url-parse": "^1.4.7"
   },
   "peerDependencies": {

+ 33 - 6
packages/@uppy/aws-s3/src/index.js

@@ -5,14 +5,32 @@ const Translator = require('@uppy/utils/lib/Translator')
 const RateLimitedQueue = require('@uppy/utils/lib/RateLimitedQueue')
 const { RequestClient } = require('@uppy/companion-client')
 const XHRUpload = require('@uppy/xhr-upload')
+const qsStringify = require('qs-stringify')
 
 function resolveUrl (origin, link) {
   return new URL_(link, origin).toString()
 }
 
-function isXml (xhr) {
-  const contentType = xhr.headers ? xhr.headers['content-type'] : xhr.getResponseHeader('Content-Type')
-  return typeof contentType === 'string' && contentType.toLowerCase() === 'application/xml'
+function isXml (content, xhr) {
+  const rawContentType = (xhr.headers ? xhr.headers['content-type'] : xhr.getResponseHeader('Content-Type'))
+
+  if (rawContentType === null) {
+    return false
+  }
+
+  // Get rid of mime parameters like charset=utf-8
+  const contentType = rawContentType.replace(/;.*$/, '').toLowerCase()
+  if (typeof contentType === 'string') {
+    if (contentType === 'application/xml' || contentType === 'text/xml') {
+      return true
+    }
+    // GCS uses text/html for some reason
+    // https://github.com/transloadit/uppy/issues/896
+    if (contentType === 'text/html' && /^<\?xml /.test(content)) {
+      return true
+    }
+  }
+  return false
 }
 
 function getXmlValue (source, key) {
@@ -50,6 +68,7 @@ module.exports = class AwsS3 extends Plugin {
     const defaultOptions = {
       timeout: 30 * 1000,
       limit: 0,
+      metaFields: [], // have to opt in
       getUploadParameters: this.getUploadParameters.bind(this)
     }
 
@@ -80,7 +99,15 @@ module.exports = class AwsS3 extends Plugin {
 
     const filename = encodeURIComponent(file.meta.name)
     const type = encodeURIComponent(file.meta.type)
-    return this.client.get(`s3/params?filename=${filename}&type=${type}`)
+    const metadata = {}
+    this.opts.metaFields.forEach((key) => {
+      if (file.meta[key] != null) {
+        metadata[key] = file.meta[key].toString()
+      }
+    })
+
+    const query = qsStringify({ filename, type, metadata })
+    return this.client.get(`s3/params?${query}`)
       .then(assertServerError)
   }
 
@@ -201,7 +228,7 @@ module.exports = class AwsS3 extends Plugin {
 
         // If no response, we've hopefully done a PUT request to the file
         // in the bucket on its full URL.
-        if (!isXml(xhr)) {
+        if (!isXml(content, xhr)) {
           if (opts.method.toUpperCase() === 'POST') {
             if (!warnedSuccessActionStatus) {
               log('[AwsS3] No response data found, make sure to set the success_action_status AWS SDK option to 201. See https://uppy.io/docs/aws-s3/#POST-Uploads', 'warning')
@@ -237,7 +264,7 @@ module.exports = class AwsS3 extends Plugin {
       // `xhr` is the XMLHttpRequest instance.
       getResponseError (content, xhr) {
         // If no response, we don't have a specific error message, use the default.
-        if (!isXml(xhr)) {
+        if (!isXml(content, xhr)) {
           return
         }
         const error = getXmlValue(content, 'Message')

+ 19 - 19
packages/@uppy/companion/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@uppy/companion",
-  "version": "1.6.0",
+  "version": "1.7.0",
   "description": "OAuth helper and remote fetcher for Uppy's (https://uppy.io) extensible file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Dropbox and Google Drive, S3 and more :dog:",
   "main": "lib/companion.js",
   "types": "types/index.d.ts",
@@ -29,40 +29,40 @@
     "companion": "./bin/companion"
   },
   "dependencies": {
-    "@purest/providers": "1.0.0",
+    "@purest/providers": "1.0.1",
     "@uppy/fs-tail-stream": "1.2.0",
-    "atob": "2.1.0",
-    "aws-sdk": "2.388.0",
-    "body-parser": "1.18.2",
+    "atob": "2.1.2",
+    "aws-sdk": "2.587.0",
+    "body-parser": "1.19.0",
     "chalk": "2.4.2",
     "common-tags": "1.8.0",
     "connect-redis": "4.0.3",
-    "cookie-parser": "1.4.3",
+    "cookie-parser": "1.4.4",
     "express": "4.17.1",
     "express-interceptor": "1.2.0",
     "express-prom-bundle": "3.3.0",
     "express-request-id": "1.4.1",
     "express-session": "1.15.6",
     "grant": "4.6.5",
-    "helmet": "3.8.2",
+    "helmet": "3.21.2",
     "isobject": "3.0.1",
-    "jsonwebtoken": "8.3.0",
+    "jsonwebtoken": "8.5.1",
     "lodash.merge": "4.6.2",
-    "mime-types": "2.1.24",
+    "mime-types": "2.1.25",
     "morgan": "1.9.1",
-    "ms": "2.1.1",
-    "node-redis-pubsub": "2.0.0",
-    "node-schedule": "1.3.1",
-    "prom-client": "10.2.3",
-    "purest": "3.0.0",
+    "ms": "2.1.2",
+    "node-redis-pubsub": "4.0.0",
+    "node-schedule": "1.3.2",
+    "prom-client": "11.5.3",
+    "purest": "3.1.0",
     "redis": "2.8.0",
     "request": "2.88.0",
-    "semver": "6.1.1",
+    "semver": "6.3.0",
     "serialize-error": "^2.1.0",
-    "tus-js-client": "1.8.0-2",
-    "uuid": "2.0.2",
-    "validator": "^9.0.0",
-    "ws": "3.3.1"
+    "tus-js-client": "1.8.0",
+    "uuid": "3.3.3",
+    "validator": "^12.1.0",
+    "ws": "6.2.1"
   },
   "devDependencies": {
     "@types/node": "^12.6.8",

+ 4 - 1
packages/@uppy/companion/src/server/Uploader.js

@@ -84,6 +84,9 @@ class Uploader {
         this._paused = true
         if (this.tus) {
           const shouldTerminate = !!this.tus.url
+          // @todo remove the ts-ignore when the tus-js-client type definitions
+          // have been updated with this change https://github.com/DefinitelyTyped/DefinitelyTyped/pull/40629
+          // @ts-ignore
           this.tus.abort(shouldTerminate)
         }
         this.cleanUp()
@@ -510,7 +513,7 @@ class Uploader {
       return
     }
 
-    const filename = this.options.metadata.filename || path.basename(this.path)
+    const filename = this.options.metadata.name || path.basename(this.path)
     const { client, options } = this.options.s3
 
     const upload = client.upload({

+ 1 - 1
packages/@uppy/companion/src/server/controllers/get.js

@@ -8,7 +8,7 @@ function get (req, res, next) {
   const provider = req.companion.provider
 
   // get the file size before proceeding
-  provider.size({ id, token }, (err, size) => {
+  provider.size({ id, token, query: req.query }, (err, size) => {
     if (err) {
       return err.isAuthError ? res.sendStatus(401) : next(err)
     }

+ 11 - 2
packages/@uppy/companion/src/server/controllers/s3.js

@@ -16,6 +16,8 @@ module.exports = function s3 (config) {
    *  - filename - The name of the file, given to the `config.getKey`
    *    option to determine the object key name in the S3 bucket.
    *  - type - The MIME type of the file.
+   *  - metadata - Key/value pairs configuring S3 metadata. Both must be ASCII-safe.
+   *    Query parameters are formatted like `metadata[name]=value`.
    *
    * Response JSON:
    *  - method - The HTTP method to use to upload.
@@ -25,7 +27,8 @@ module.exports = function s3 (config) {
   function getUploadParameters (req, res, next) {
     // @ts-ignore The `companion` property is added by middleware before reaching here.
     const client = req.companion.s3Client
-    const key = config.getKey(req, req.query.filename)
+    const metadata = req.query.metadata || {}
+    const key = config.getKey(req, req.query.filename, metadata)
     if (typeof key !== 'string') {
       return res.status(500).json({ error: 's3: filename returned from `getKey` must be a string' })
     }
@@ -37,6 +40,10 @@ module.exports = function s3 (config) {
       'content-type': req.query.type
     }
 
+    Object.keys(metadata).forEach((key) => {
+      fields[`x-amz-meta-${key}`] = metadata[key]
+    })
+
     client.createPresignedPost({
       Bucket: config.bucket,
       Expires: ms('5 minutes') / 1000,
@@ -62,6 +69,8 @@ module.exports = function s3 (config) {
    *  - filename - The name of the file, given to the `config.getKey`
    *    option to determine the object key name in the S3 bucket.
    *  - type - The MIME type of the file.
+   *  - metadata - An object with the key/value pairs to set as metadata.
+   *    Keys and values must be ASCII-safe for S3.
    *
    * Response JSON:
    *  - key - The object key in the S3 bucket.
@@ -70,7 +79,7 @@ module.exports = function s3 (config) {
   function createMultipartUpload (req, res, next) {
     // @ts-ignore The `companion` property is added by middleware before reaching here.
     const client = req.companion.s3Client
-    const key = config.getKey(req, req.body.filename)
+    const key = config.getKey(req, req.body.filename, req.body.metadata || {})
     const { type, metadata } = req.body
     if (typeof key !== 'string') {
       return res.status(500).json({ error: 's3: filename returned from `getKey` must be a string' })

+ 13 - 2
packages/@uppy/companion/src/server/provider/onedrive/adapter.js

@@ -1,6 +1,10 @@
 const querystring = require('querystring')
 
 exports.isFolder = (item) => {
+  if (item.remoteItem) {
+    return !!item.remoteItem.folder
+  }
+
   return !!item.folder
 }
 
@@ -25,15 +29,22 @@ exports.getMimeType = (item) => {
 }
 
 exports.getItemId = (item) => {
+  if (item.remoteItem) {
+    return item.remoteItem.id
+  }
   return item.id
 }
 
 exports.getItemRequestPath = (item) => {
-  return exports.getItemId(item)
+  let query = `?driveId=${item.parentReference.driveId}`
+  if (item.remoteItem) {
+    query = `?driveId=${item.remoteItem.parentReference.driveId}`
+  }
+  return exports.getItemId(item) + query
 }
 
 exports.getItemModifiedDate = (item) => {
-  return item.fileSystemInfo.lastModifiedDateTime
+  return item.lastModifiedDateTime
 }
 
 exports.getItemThumbnailUrl = (item) => {

+ 8 - 5
packages/@uppy/companion/src/server/provider/onedrive/index.js

@@ -33,13 +33,14 @@ class OneDrive extends Provider {
    */
   list ({ directory, query, token }, done) {
     const path = directory ? `items/${directory}` : 'root'
+    const rootPath = query.driveId ? `/drives/${query.driveId}` : '/drive'
     const qs = { $expand: 'thumbnails' }
     if (query.cursor) {
       qs.$skiptoken = query.cursor
     }
 
     this.client
-      .get(`/drive/${path}/children`)
+      .get(`${rootPath}/${path}/children`)
       .qs(qs)
       .auth(token)
       .request((err, resp, body) => {
@@ -60,9 +61,10 @@ class OneDrive extends Provider {
       })
   }
 
-  download ({ id, token }, onData) {
+  download ({ id, token, query }, onData) {
+    const rootPath = query.driveId ? `/drives/${query.driveId}` : '/drive'
     return this.client
-      .get(`/drive/items/${id}/content`)
+      .get(`${rootPath}/items/${id}/content`)
       .auth(token)
       .request()
       .on('data', onData)
@@ -79,9 +81,10 @@ class OneDrive extends Provider {
     return done(err)
   }
 
-  size ({ id, token }, done) {
+  size ({ id, query, token }, done) {
+    const rootPath = query.driveId ? `/drives/${query.driveId}` : '/drive'
     return this.client
-      .get(`/drive/items/${id}`)
+      .get(`${rootPath}/items/${id}`)
       .auth(token)
       .request((err, resp, body) => {
         if (err || resp.statusCode !== 200) {

+ 51 - 13
packages/@uppy/companion/src/standalone/index.js

@@ -1,5 +1,6 @@
 const express = require('express')
 const qs = require('querystring')
+const urlParser = require('url')
 const companion = require('../companion')
 const helmet = require('helmet')
 const morgan = require('morgan')
@@ -36,21 +37,37 @@ app.use(addRequestId)
 // log server requests.
 app.use(morgan('combined'))
 morgan.token('url', (req, res) => {
-  const mask = (key) => {
-    // don't log access_tokens in urls
-    const query = Object.assign({}, req.query)
-    // replace logged access token with xxxx character
-    query[key] = 'x'.repeat(req.query[key].length)
-    return `${req.path}?${qs.stringify(query)}`
-  }
+  const query = Object.assign({}, req.query)
+  let hasQuery = false;
+  ['access_token', 'uppyAuthToken'].forEach((key) => {
+    if (req.query && req.query[key]) {
+      // replace logged access token with xxxx character
+      query[key] = 'x'.repeat(req.query[key].length)
+      hasQuery = true
+    }
+  })
 
-  if (req.query && req.query.access_token) {
-    return mask('access_token')
-  } else if (req.query && req.query.uppyAuthToken) {
-    return mask('uppyAuthToken')
-  }
+  return hasQuery ? `${req.path}?${qs.stringify(query)}` : req.originalUrl || req.url
+})
 
-  return req.originalUrl || req.url
+morgan.token('referrer', (req, res) => {
+  const ref = req.headers.referer || req.headers.referrer
+  if (typeof ref === 'string') {
+    // @todo drop the use of url.parse
+    // when support for node 6 is dropped
+    // eslint-disable-next-line
+    const parsed = urlParser.URL ? new urlParser.URL(ref) : urlParser.parse(ref)
+    const query = qs.parse(parsed.search.replace('?', ''));
+    ['uppyAuthToken', 'access_token'].forEach(key => {
+      if (query[key]) {
+        query[key] = 'x'.repeat(query[key].length)
+      }
+    })
+
+    const hasQuery = parsed.search
+    const newURL = `${parsed.href.split('?')[0]}?${qs.stringify(query)}`
+    return hasQuery ? newURL : parsed.href
+  }
 })
 
 // make app metrics available at '/metrics'.
@@ -136,6 +153,27 @@ if (process.env.COMPANION_PATH) {
   app.use(companion.app(companionOptions))
 }
 
+// WARNING: This route is added in order to validate your app with OneDrive.
+// Only set COMPANION_ONEDRIVE_DOMAIN_VALIDATION if you are sure that you are setting the
+// correct value for COMPANION_ONEDRIVE_KEY (i.e application ID). If there's a slightest possiblilty
+// that you might have mixed the values for COMPANION_ONEDRIVE_KEY and COMPANION_ONEDRIVE_SECRET,
+// please do not set a value for COMPANION_ONEDRIVE_DOMAIN_VALIDATION
+if (process.env.COMPANION_ONEDRIVE_DOMAIN_VALIDATION === 'true' && process.env.COMPANION_ONEDRIVE_KEY) {
+  app.get('/.well-known/microsoft-identity-association.json', (req, res) => {
+    const content = JSON.stringify({
+      associatedApplications: [
+        { applicationId: process.env.COMPANION_ONEDRIVE_KEY }
+      ]
+    })
+    res.header('Content-Length', `${Buffer.byteLength(content, 'utf8')}`)
+    // use writeHead to prevent 'charset' from being appended
+    // https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-configure-publisher-domain#to-select-a-verified-domain
+    res.writeHead(200, { 'Content-Type': 'application/json' })
+    res.write(content)
+    res.end()
+  })
+}
+
 app.use((req, res, next) => {
   return res.status(404).json({ message: 'Not Found' })
 })

+ 2 - 1
packages/@uppy/core/package-lock.json

@@ -40,5 +40,6 @@
 			"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
 			"integrity": "sha1-pwIEUwhNjNLv5wup02liY94XEKU="
 		}
-	}
+	},
+	"version": "1.7.0"
 }

+ 1 - 1
packages/@uppy/core/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/core",
   "description": "Core module for the extensible JavaScript file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Instagram, Dropbox, Google Drive, S3 and more :dog:",
-  "version": "1.6.0",
+  "version": "1.7.0",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 1 - 1
packages/@uppy/dashboard/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/dashboard",
   "description": "Universal UI plugin for Uppy.",
-  "version": "1.5.0",
+  "version": "1.5.1",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 4 - 2
packages/@uppy/dashboard/src/index.js

@@ -522,6 +522,10 @@ module.exports = class Dashboard extends Plugin {
     event.preventDefault()
     event.stopPropagation()
 
+    // 1. Add a small (+) icon on drop
+    // (and prevent browsers from interpreting this as files being _moved_ into the browser, https://github.com/transloadit/uppy/issues/1978)
+    event.dataTransfer.dropEffect = 'copy'
+
     clearTimeout(this.removeDragOverClassTimeout)
     this.setPluginState({ isDraggingOver: true })
   }
@@ -541,8 +545,6 @@ module.exports = class Dashboard extends Plugin {
     event.preventDefault()
     event.stopPropagation()
     clearTimeout(this.removeDragOverClassTimeout)
-    // 1. Add a small (+) icon on drop
-    event.dataTransfer.dropEffect = 'copy'
 
     // 2. Remove dragover class
     this.setPluginState({ isDraggingOver: false })

+ 1 - 1
packages/@uppy/drag-drop/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/drag-drop",
   "description": "Droppable zone UI for Uppy. Drag and drop files into it to upload.",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 4 - 2
packages/@uppy/drag-drop/src/index.js

@@ -100,8 +100,6 @@ module.exports = class DragDrop extends Plugin {
     event.preventDefault()
     event.stopPropagation()
     clearTimeout(this.removeDragOverClassTimeout)
-    // 1. Add a small (+) icon on drop
-    event.dataTransfer.dropEffect = 'copy'
 
     // 2. Remove dragover class
     this.setPluginState({ isDraggingOver: false })
@@ -121,6 +119,10 @@ module.exports = class DragDrop extends Plugin {
     event.preventDefault()
     event.stopPropagation()
 
+    // 1. Add a small (+) icon on drop
+    // (and prevent browsers from interpreting this as files being _moved_ into the browser, https://github.com/transloadit/uppy/issues/1978)
+    event.dataTransfer.dropEffect = 'copy'
+
     clearTimeout(this.removeDragOverClassTimeout)
     this.setPluginState({ isDraggingOver: true })
   }

+ 1 - 1
packages/@uppy/dropbox/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/dropbox",
   "description": "Import files from Dropbox, into Uppy.",
-  "version": "1.3.3",
+  "version": "1.3.4",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/facebook/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/facebook",
   "description": "Import files from Facebook, into Uppy.",
-  "version": "0.2.0",
+  "version": "0.2.1",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/file-input/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/file-input",
   "description": "Simple UI of a file input button that works with Uppy right out of the box",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 1 - 1
packages/@uppy/form/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/form",
   "description": "Connect Uppy to an existing HTML <form>.",
-  "version": "1.3.3",
+  "version": "1.3.4",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/golden-retriever/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/golden-retriever",
   "description": "The GoldenRetriever Uppy plugin saves selected files in browser cache to seamlessly resume uploding after browser crash or accidentally closed tab",
-  "version": "1.3.2",
+  "version": "1.3.3",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/google-drive/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/google-drive",
   "description": "The Google Drive plugin for Uppy lets users import files from their Google Drive account",
-  "version": "1.3.3",
+  "version": "1.3.4",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/informer/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/informer",
   "description": "A notification and error pop-up bar for Uppy.",
-  "version": "1.3.2",
+  "version": "1.3.3",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 1 - 1
packages/@uppy/instagram/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/instagram",
   "description": "Import photos and videos from Instagram, into Uppy.",
-  "version": "1.3.3",
+  "version": "1.3.4",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/locales/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/locales",
   "description": "Uppy language packs",
-  "version": "1.9.0",
+  "version": "1.10.0",
   "license": "MIT",
   "keywords": [
     "uppy",

+ 154 - 0
packages/@uppy/locales/src/ko_KR.js

@@ -0,0 +1,154 @@
+var ko_KR = {}
+ko_KR.strings = {
+  addMore: '파일 추가',
+  addMoreFiles: '파일 추가',
+  addingMoreFiles: '파일 추가 중',
+  allowAccessDescription: '카메라를 이용해 사진이나 영상을 찍기 위해서 이 사이트의 카메라 접근 권한을 허용해 주세요.',
+  allowAccessTitle: '카메라 사용 권한을 허용해 주세요.',
+  authenticateWith: '%{pluginName} 연결',
+  authenticateWithTitle: '파일을 선택하기 위해 %{pluginName}에 연결해 주세요.',
+  back: '뒤로',
+  browse: '찾아보기',
+  cancel: '취소',
+  cancelUpload: '업로드 취소',
+  chooseFiles: '파일 선택',
+  closeModal: '창 닫기',
+  companionAuthError: '인증이 필요함',
+  companionError: '연결 실패',
+  companionUnauthorizeHint: '%{provider} 연결 해제를 원하시면 %{url}에 방문하세요',
+  complete: '완료',
+  connectedToInternet: '인터넷에 연결됨',
+  copyLink: '링크 복사',
+  copyLinkToClipboardFallback: '아래 URL을 복사하세요',
+  copyLinkToClipboardSuccess: '링크가 클립보드에 저장됨',
+  creatingAssembly: '업로드 준비 중...',
+  creatingAssemblyFailed: 'Transloadit: 업로드를 생성할 수 없음',
+  dashboardTitle: '파일 업로더',
+  dashboardWindowTitle: '파일 업로더 창 (ESC를 누르면 닫힙니다.)',
+  dataUploadedOfTotal: '%{complete} / %{total}',
+  done: '완료',
+  dropHereOr: '파일을 드래그&드롭 또는 %{browse}',
+  dropHint: '파일을 여기에 놓으세요.',
+  dropPaste: '파일을 여기에 놓고 붙여넣기 또는 %{browse}',
+  dropPasteImport: '파일을 여기에 놓거나 붙여넣으세요. %{browse} 또는 가져오기',
+  edit: '수정',
+  editFile: '파일 수정',
+  editing: '%{file} 수정 중',
+  emptyFolderAdded: '빈 폴더입니다.',
+  encoding: '인코딩 중...',
+  enterCorrectUrl: '옳지 않은 URL: 파일 주소를 확인해 주세요.',
+  enterUrlToImport: '파일 URL을 입력해 주세요.',
+  exceedsSize: '업로드 허용 용량 초과',
+  failedToFetch: 'URL 가져오기 실패. 주소를 확인해 주세요.',
+  failedToUpload: '%{file} 업로드 실패',
+  fileSource: '파일 소스: %{name}',
+  filesUploadedOfTotal: {
+    '0': '%{complete} / %{smart_count} 완료됨',
+    '1': '%{complete} / %{smart_count} 완료됨',
+    '2': '%{complete} / %{smart_count} 완료됨'
+  },
+  filter: '필터',
+  finishEditingFile: '파일 수정을 완료하세요.',
+  folderAdded: {
+    '0': '%{folder}에서 파일 %{smart_count}개 추가',
+    '1': '%{folder}에서 파일 %{smart_count}개 추가',
+    '2': '%{folder}에서 파일 %{smart_count}개 추가'
+  },
+  generatingThumbnails: '썸네일 생성 중...',
+  import: '가져오기',
+  importFrom: '%{name}에서 가져오기',
+  link: '링크',
+  loading: '불러오는 중...',
+  logOut: '로그아웃',
+  myDevice: '내 기기',
+  noFilesFound: '파일이나 폴더가 없음',
+  noInternetConnection: '인터넷 연결 안 됨',
+  openFolderNamed: '%{name} 폴더 열기',
+  pause: '일시정지',
+  pauseUpload: '업로드 일시정지',
+  paused: '일시정지 됨',
+  poweredBy: 'Powered by',
+  preparingUpload: '업로드 준비 중...',
+  processingXFiles: {
+    '0': '%{smart_count}개의 파일 처리 중',
+    '1': '%{smart_count}개의 파일 처리 중',
+    '2': '%{smart_count}개의 파일 처리 중'
+  },
+  removeFile: '파일 제거',
+  resetFilter: '필터 초기화',
+  resume: '재개',
+  resumeUpload: '업로드 재개',
+  retry: '재시도',
+  retryUpload: '업로드 재시도',
+  saveChanges: '변경사항 저장',
+  selectAllFilesFromFolderNamed: '%{name} 폴더의 모든 파일 선택',
+  selectFileNamed: '%{name} 파일 선택',
+  selectX: {
+    '0': '%{smart_count}개 선택',
+    '1': '%{smart_count}개 선택',
+    '2': '%{smart_count}개 선택'
+  },
+  smile: 'Smile!',
+  startRecording: '비디오 녹화 시작',
+  stopRecording: '비디오 녹화 정지',
+  takePicture: '사진 촬영',
+  timedOut: '%{seconds}초 동안 업로드 정지되어 업로드를 취소합니다.',
+  unselectAllFilesFromFolderNamed: '%{name} 폴더의 모든 파일 선택 해제',
+  unselectFileNamed: '%{name} 파일 선택 해제',
+  upload: '업로드',
+  uploadComplete: '업로드 완료',
+  uploadFailed: '업로드 실패',
+  uploadPaused: '업로드 정지됨',
+  uploadXFiles: {
+    '0': '%{smart_count}개의 파일 업로드',
+    '1': '%{smart_count}개의 파일 업로드',
+    '2': '%{smart_count}개의 파일 업로드'
+  },
+  uploadXNewFiles: {
+    '0': '+%{smart_count}개의 파일 업로드',
+    '1': '+%{smart_count}개의 파일 업로드',
+    '2': '+%{smart_count}개의 파일 업로드'
+  },
+  uploading: '업로드 중',
+  uploadingXFiles: {
+    '0': '%{smart_count}개의 파일 업로드 중',
+    '1': '%{smart_count}개의 파일 업로드 중',
+    '2': '%{smart_count}개의 파일 업로드 중'
+  },
+  xFilesSelected: {
+    '0': '%{smart_count}개의 파일 선택됨',
+    '1': '%{smart_count}개의 파일 선택됨',
+    '2': '%{smart_count}개의 파일 선택됨'
+  },
+  xMoreFilesAdded: {
+    '0': '%{smart_count}개의 파일이 더 추가 됨',
+    '1': '%{smart_count}개의 파일이 더 추가 됨',
+    '2': '%{smart_count}개의 파일이 더 추가 됨'
+  },
+  xTimeLeft: '%{time} 남음',
+  youCanOnlyUploadFileTypes: '업로드 가능 형식: %{types}',
+  youCanOnlyUploadX: {
+    '0': '%{smart_count}개의 파일만 업로드할 수 있습니다',
+    '1': '%{smart_count}개의 파일만 업로드할 수 있습니다',
+    '2': '%{smart_count}개의 파일만 업로드할 수 있습니다'
+  },
+  youHaveToAtLeastSelectX: {
+    '0': '최소 %{smart_count}개의 파일을 선택해야 합니다',
+    '1': '최소 %{smart_count}개의 파일을 선택해야 합니다',
+    '2': '최소 %{smart_count}개의 파일을 선택해야 합니다'
+  }
+}
+
+ko_KR.pluralize = function (n) {
+  if (n === 1) {
+    return 0
+  }
+
+  return 1
+}
+
+if (typeof window !== 'undefined' && typeof window.Uppy !== 'undefined') {
+  window.Uppy.locales.ko_KR = ko_KR
+}
+
+module.exports = ko_KR

+ 155 - 0
packages/@uppy/locales/src/vi_VN.js

@@ -0,0 +1,155 @@
+const vi_VN = {}
+
+vi_VN.strings = {
+  addMore: 'Thêm',
+  addMoreFiles: 'Thêm tập tin',
+  addingMoreFiles: 'Đang thêm các tập tin',
+  allowAccessDescription: 'Để chụp ảnh hoặc quay video bằng camera, vui lòng cho phép trang web truy cập camera.',
+  allowAccessTitle: 'Vui lòng cho phép truy cập camera',
+  authenticateWith: 'Kết nối đến %{pluginName}',
+  authenticateWithTitle: 'Xác thực với %{pluginName} để chọn tập tin',
+  back: 'Quay lại',
+  browse: 'chọn',
+  cancel: 'Huỷ',
+  cancelUpload: 'Huỷ tải lên',
+  chooseFiles: 'Chọn tập tin',
+  closeModal: 'Đóng cửa sổ',
+  companionAuthError: 'Yêu cầu xác thực',
+  companionError: 'Kết nối thất bại',
+  companionUnauthorizeHint: 'Để huỷ uỷ quyền tài khoản %{provider}, truy cập %{url}',
+  complete: 'Xong',
+  connectedToInternet: 'Đã kết nối Internet',
+  copyLink: 'Sao chép liên kết',
+  copyLinkToClipboardFallback: 'Sao chép liên kết dưới',
+  copyLinkToClipboardSuccess: 'Đã chép liên kết vào bộ nhớ tạm',
+  creatingAssembly: 'Đang chuẩn bị tải lên...',
+  creatingAssemblyFailed: 'Transloadit: Không thể tạo nhóm',
+  dashboardTitle: 'Trình đăng tải tập tin',
+  dashboardWindowTitle: 'Cửa sổ tải lên (Ấn ESC để đóng)',
+  dataUploadedOfTotal: '%{complete} trong số %{total}',
+  done: 'Xong',
+  dropHereOr: 'Thả tập tin hoặc %{browse}',
+  dropHint: 'Thả tập tin vào đây',
+  dropPaste: 'Thả tập tin vào đây, dán hoặc %{browse}',
+  dropPasteImport: 'Thả tập tin vào đây, dán, %{browse} hoặc nhập từ',
+  edit: 'Sửa',
+  editFile: 'Sửa tập tin',
+  editing: 'Đang sửa %{file}',
+  emptyFolderAdded: 'Không có tập tin nào được thêm từ thư mục trống',
+  encoding: 'Đang encode...',
+  enterCorrectUrl: 'URL sai: Đảm bảo rằng bạn đang nhập một liên kết trực tiếp đến một tập tin',
+  enterUrlToImport: 'Nhập URL để nhập tập tin',
+  exceedsSize: 'Tập tin này vượt quá kích thước tối đa cho phép của',
+  failedToFetch: 'Thất bại khi lấy từ URL, hãy sửa lại cho đúng',
+  failedToUpload: 'Tải lên %{file} thất bại',
+  fileSource: 'Nguồn tập tin: %{name}',
+  filesUploadedOfTotal: {
+    '0': '%{complete} trong số %{smart_count} tập tin đã được tải lên',
+    '1': '%{complete} trong số %{smart_count} tập tin đã được tải lên',
+    '2': '%{complete} trong số %{smart_count} tập tin đã được tải lên'
+  },
+  filter: 'Bộ lọc',
+  finishEditingFile: 'Hoàn tất chỉnh sửa tập tin',
+  folderAdded: {
+    '0': 'Đã thêm %{smart_count} tập tin từ %{folder}',
+    '1': 'Đã thêm %{smart_count} tập tin từ %{folder}',
+    '2': 'Đã thêm %{smart_count} tập tin từ %{folder}'
+  },
+  generatingThumbnails: 'Đang tạo ảnh thu nhỏ...',
+  import: 'Nhập',
+  importFrom: 'Nhập từ %{name}',
+  link: 'Liên kết',
+  loading: 'Đang tải...',
+  logOut: 'Đăng xuất',
+  myDevice: 'Thiết bị của tôi',
+  noFilesFound: 'Không có tập tin hoặc thư mục nào',
+  noInternetConnection: 'Không có kết nối Internet',
+  openFolderNamed: 'Mở thư mục %{name}',
+  pause: 'Tạm dừng',
+  pauseUpload: 'Tạm dừng tải lên',
+  paused: 'Đã tạm dừng',
+  poweredBy: 'Cung cấp bởi',
+  preparingUpload: 'Đang chuẩn bị tải lên...',
+  processingXFiles: {
+    '0': 'Đang xử lí %{smart_count} tập tin',
+    '1': 'Đang xử lí %{smart_count} tập tin',
+    '2': 'Đang xử lí %{smart_count} tập tin'
+  },
+  recordingLength: 'Thời lượng ghi %{recording_length}',
+  removeFile: 'Bỏ tập tin',
+  resetFilter: 'Đặt lại bộ lọc',
+  resume: 'Tiếp tục',
+  resumeUpload: 'Tiếp tục tải lên',
+  retry: 'Thử lại',
+  retryUpload: 'Tải lên lại',
+  saveChanges: 'Lưu các thay đổi',
+  selectAllFilesFromFolderNamed: 'Chọn mọi tập tin từ thư mục %{name}',
+  selectFileNamed: 'Chọn tập tin %{name}',
+  selectX: {
+    '0': 'Chọn %{smart_count}',
+    '1': 'Chọn %{smart_count}',
+    '2': 'Chọn %{smart_count}'
+  },
+  smile: 'Cười lên!',
+  startRecording: 'Bắt đầu thu hình',
+  stopRecording: 'Dừng thu hình',
+  takePicture: 'Chụp ảnh',
+  timedOut: 'Tải lên bị đình trệ %{seconds} giây, đang huỷ.',
+  unselectAllFilesFromFolderNamed: ' Bỏ chọn mọi tập tin từ thư mục %{name}',
+  unselectFileNamed: 'Bỏ chọn tập tin %{name}',
+  upload: 'Tải lên',
+  uploadComplete: 'Tải lên hoàn tất',
+  uploadFailed: 'Tải lên thất bại',
+  uploadPaused: 'Đã tạm dừng tải lên',
+  uploadXFiles: {
+    '0': 'Tải lên %{smart_count} tập tin',
+    '1': 'Tải lên %{smart_count} tập tin',
+    '2': 'Tải lên %{smart_count} tập tin'
+  },
+  uploadXNewFiles: {
+    '0': 'Tải lên +%{smart_count} tập tin',
+    '1': 'Tải lên +%{smart_count} tập tin',
+    '2': 'Tải lên +%{smart_count} tập tin'
+  },
+  uploading: 'Uploading',
+  uploadingXFiles: {
+    '0': 'Đang tải lên %{smart_count} tập tin',
+    '1': 'Đang tải lên %{smart_count} tập tin',
+    '2': 'Đang tải lên %{smart_count} tập tin'
+  },
+  xFilesSelected: {
+    '0': 'Đã chọn %{smart_count} tập tin',
+    '1': 'Đã chọn %{smart_count} tập tin',
+    '2': 'Đã chọn %{smart_count} tập tin'
+  },
+  xMoreFilesAdded: {
+    '0': 'Đã thêm %{smart_count} tập tin',
+    '1': 'Đã thêm %{smart_count} tập tin',
+    '2': 'Đã thêm %{smart_count} tập tin'
+  },
+  xTimeLeft: '%{time} left',
+  youCanOnlyUploadFileTypes: 'Chỉ có thể tải lên: %{types}',
+  youCanOnlyUploadX: {
+    '0': 'Chỉ có thể tải lên %{smart_count} tập tin',
+    '1': 'Chỉ có thể tải lên %{smart_count} tập tin',
+    '2': 'Chỉ có thể tải lên %{smart_count} tập tin'
+  },
+  youHaveToAtLeastSelectX: {
+    '0': 'Chọn ít nhất %{smart_count} tập tin',
+    '1': 'Chọn ít nhất %{smart_count} tập tin',
+    '2': 'Chọn ít nhất %{smart_count} tập tin'
+  }
+}
+
+vi_VN.pluralize = function (n) {
+  if (n === 1) {
+    return 0
+  }
+  return 1
+}
+
+if (typeof window !== 'undefined' && typeof window.Uppy !== 'undefined') {
+  window.Uppy.locales.vi_VN = vi_VN
+}
+
+module.exports = vi_VN

+ 1 - 1
packages/@uppy/onedrive/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/onedrive",
   "description": "Import files from OneDrive, into Uppy.",
-  "version": "0.1.2",
+  "version": "0.1.3",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/progress-bar/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/progress-bar",
   "description": "A progress bar UI for Uppy",
-  "version": "1.3.2",
+  "version": "1.3.3",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 1 - 1
packages/@uppy/provider-views/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/provider-views",
   "description": "View library for Uppy remote provider plugins.",
-  "version": "1.5.0",
+  "version": "1.5.1",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 3 - 3
packages/@uppy/provider-views/src/style/uppy-ProviderBrowser-viewType--grid.scss

@@ -32,13 +32,13 @@
     }
   }
   li.uppy-ProviderBrowserItem--selected {
-    img, svg{
+    img, svg {
       opacity: 0.85;
     }
   }
   li.uppy-ProviderBrowserItem--noPreview {
     .uppy-ProviderBrowserItem-inner {
-      background-color: rgba($gray-500, 0.3);
+      background-color: rgba($gray-500, 0.2);
     }
     svg {
       fill: rgba($black, 0.7);
@@ -63,7 +63,7 @@
       outline: none;
       box-shadow: 0 0 0 3px rgba($blue, 0.9);
     }
-    img, svg {
+    img {
       width: 100%;
       height: 100%;
       object-fit: cover;

+ 1 - 1
packages/@uppy/react/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/react",
   "description": "React component wrappers around Uppy's official UI plugins.",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "index.js",
   "module": "index.mjs",

+ 5 - 8
packages/@uppy/react/src/DashboardModal.js

@@ -20,6 +20,11 @@ class DashboardModal extends React.Component {
       this.uninstallPlugin(prevProps)
       this.installPlugin()
     }
+    if (prevProps.open && !this.props.open) {
+      this.plugin.closeModal()
+    } else if (!prevProps.open && this.props.open) {
+      this.plugin.openModal()
+    }
   }
 
   componentWillUnmount () {
@@ -55,14 +60,6 @@ class DashboardModal extends React.Component {
     uppy.removePlugin(this.plugin)
   }
 
-  componentWillReceiveProps (nextProps) {
-    if (this.props.open && !nextProps.open) {
-      this.plugin.closeModal()
-    } else if (!this.props.open && nextProps.open) {
-      this.plugin.openModal()
-    }
-  }
-
   render () {
     return h('div', {
       ref: (container) => {

+ 2 - 2
packages/@uppy/robodog/README.md

@@ -18,8 +18,8 @@ We recommend installing from npm and then using a module bundler such as [Webpac
 Alternatively, you can also use this package in a pre-built bundle from Transloadit's CDN: Edgly.
 
 ```html
-<link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/v1.6.0/robodog.min.css">
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/robodog.min.js"></script>
+<link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/v1.7.0/robodog.min.css">
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/robodog.min.js"></script>
 ```
 
 Then, a global `Robodog` variable will be available. For usage instructions, please see the [main Robodog documentation](https://uppy.io/docs/robodog).

+ 1 - 1
packages/@uppy/robodog/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/robodog",
   "description": "Transloadit SDK for browsers based on Uppy",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "lib/index.js",
   "jsnext:main": "src/index.js",

+ 1 - 1
packages/@uppy/status-bar/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/status-bar",
   "description": "A progress bar for Uppy, with many bells and whistles.",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 2 - 1
packages/@uppy/thumbnail-generator/package-lock.json

@@ -7,5 +7,6 @@
 			"resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
 			"integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
 		}
-	}
+	},
+	"version": "1.5.1"
 }

+ 1 - 1
packages/@uppy/thumbnail-generator/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/thumbnail-generator",
   "description": "Uppy plugin that generates small previews of images to show on your upload UI.",
-  "version": "1.5.0",
+  "version": "1.5.1",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 0 - 4
packages/@uppy/thumbnail-generator/src/exif.js

@@ -457,8 +457,6 @@ function readTagValue (file, entryOffset, tiffStart, dirStart, bigEnd) {
         numerator = file.getUint32(valueOffset, !bigEnd)
         denominator = file.getUint32(valueOffset + 4, !bigEnd)
         val = +(numerator / denominator)
-        val.numerator = numerator
-        val.denominator = denominator
         return val
       } else {
         vals = []
@@ -466,8 +464,6 @@ function readTagValue (file, entryOffset, tiffStart, dirStart, bigEnd) {
           numerator = file.getUint32(valueOffset + 8 * n, !bigEnd)
           denominator = file.getUint32(valueOffset + 4 + 8 * n, !bigEnd)
           vals[n] = +(numerator / denominator)
-          vals[n].numerator = numerator
-          vals[n].denominator = denominator
         }
         return vals
       }

+ 2 - 1
packages/@uppy/transloadit/package-lock.json

@@ -227,5 +227,6 @@
 			"resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
 			"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
 		}
-	}
+	},
+	"version": "1.4.1"
 }

+ 1 - 1
packages/@uppy/transloadit/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/transloadit",
   "description": "The Transloadit plugin can be used to upload files to Transloadit for all kinds of processing, such as transcoding video, resizing images, zipping/unzipping, and more",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 2 - 2
packages/@uppy/tus/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/tus",
   "description": "Resumable uploads for Uppy using Tus.io",
-  "version": "1.5.0",
+  "version": "1.5.1",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",
@@ -24,7 +24,7 @@
   "dependencies": {
     "@uppy/companion-client": "file:../companion-client",
     "@uppy/utils": "file:../utils",
-    "tus-js-client": "^1.8.0-2"
+    "tus-js-client": "^1.8.0"
   },
   "peerDependencies": {
     "@uppy/core": "^1.0.0"

+ 9 - 4
packages/@uppy/tus/types/index.d.ts

@@ -2,12 +2,17 @@ import Uppy = require('@uppy/core');
 
 declare module Tus {
   export interface TusOptions extends Uppy.PluginOptions {
-    limit: number;
-    endpoint: string;
-    uploadUrl: string;
-    useFastRemoteRetry: boolean;
     resume: boolean;
+    removeFingerprintOnSuccess: boolean;
+    endpoint: string;
+    headers: object;
+    chunkSize: number;
+    withCredentials: boolean;
+    overridePatchMethod: boolean;
+    retryDelays: number[];
+    metaFields: string[] | null;
     autoRetry: boolean;
+    limit: number;
   }
 }
 

+ 1 - 1
packages/@uppy/url/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/url",
   "description": "The Url plugin lets users import files from the Internet. Paste any URL and it’ll be added!",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 1 - 1
packages/@uppy/utils/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/utils",
   "description": "Shared utility functions for Uppy Core and plugins maintained by the Uppy team.",
-  "version": "2.1.0",
+  "version": "2.1.1",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 1 - 1
packages/@uppy/utils/src/isPreviewSupported.js

@@ -2,7 +2,7 @@ module.exports = function isPreviewSupported (fileType) {
   if (!fileType) return false
   const fileTypeSpecific = fileType.split('/')[1]
   // list of images that browsers can preview
-  if (/^(jpe?g|gif|png|svg|svg\+xml|bmp)$/.test(fileTypeSpecific)) {
+  if (/^(jpe?g|gif|png|svg|svg\+xml|bmp|webp)$/.test(fileTypeSpecific)) {
     return true
   }
   return false

+ 1 - 1
packages/@uppy/utils/src/isPreviewSupported.test.js

@@ -2,7 +2,7 @@ const isPreviewSupported = require('./isPreviewSupported')
 
 describe('isPreviewSupported', () => {
   it('should return true for any filetypes that browsers can preview', () => {
-    const supported = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml', 'image/bmp', 'image/jpg']
+    const supported = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml', 'image/bmp', 'image/jpg', 'image/webp']
     supported.forEach(ext => {
       expect(isPreviewSupported(ext)).toEqual(true)
     })

+ 1 - 1
packages/@uppy/webcam/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/webcam",
   "description": "Uppy plugin that takes photos or records videos using the device's camera.",
-  "version": "1.4.0",
+  "version": "1.5.0",
   "license": "MIT",
   "main": "lib/index.js",
   "style": "dist/style.min.css",

+ 1 - 1
packages/@uppy/xhr-upload/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@uppy/xhr-upload",
   "description": "Plain and simple classic HTML multipart form uploads with Uppy, as well as uploads using the HTTP PUT method.",
-  "version": "1.4.0",
+  "version": "1.4.1",
   "license": "MIT",
   "main": "lib/index.js",
   "types": "types/index.d.ts",

+ 2 - 1
packages/@uppy/xhr-upload/src/index.js

@@ -581,7 +581,8 @@ module.exports = class XHRUpload extends Plugin {
       return Promise.resolve()
     }
 
-    if (this.opts.limit === 0) {
+    // no limit configured by the user, and no RateLimitedQueue passed in by a "parent" plugin (basically just AwsS3) using the top secret `__queue` option
+    if (this.opts.limit === 0 && !this.opts.__queue) {
       this.uppy.log(
         '[XHRUpload] When uploading multiple files at once, consider setting the `limit` option (to `10` for example), to limit the number of concurrent uploads, which helps prevent memory and network issues: https://uppy.io/docs/xhr-upload/#limit-0',
         'warning'

+ 1 - 1
packages/uppy/package.json

@@ -1,7 +1,7 @@
 {
   "name": "uppy",
   "description": "Extensible JavaScript file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Instagram, Dropbox, Google Drive, S3 and more :dog:",
-  "version": "1.6.0",
+  "version": "1.7.0",
   "license": "MIT",
   "main": "index.js",
   "module": "index.mjs",

+ 6 - 1
website/inject.js

@@ -67,6 +67,10 @@ inject().catch((err) => {
 
 async function getMinifiedSize (pkg, name) {
   const b = browserify(pkg)
+
+  const packageJSON = fs.readFileSync(path.join(pkg, 'package.json'))
+  const version = JSON.parse(packageJSON).version
+
   if (name !== '@uppy/core' && name !== 'uppy') {
     b.exclude('@uppy/core')
     // Already unconditionally included through @uppy/core
@@ -82,7 +86,8 @@ async function getMinifiedSize (pkg, name) {
 
   return {
     minified: bundle.length,
-    gzipped
+    gzipped,
+    version
   }
 }
 

+ 16 - 16
website/package.json

@@ -2,7 +2,7 @@
   "name": "uppy.io",
   "private": true,
   "hexo": {
-    "version": "3.8.0"
+    "version": "4.0.0"
   },
   "dependencies": {
     "@babel/core": "^7.4.4",
@@ -15,32 +15,32 @@
     "cssnano": "^4.1.10",
     "drag-drop": "^4.2.0",
     "glob": "^7.1.2",
-    "he": "^1.1.1",
-    "hexo": "3.8.0",
+    "he": "^1.2.0",
+    "hexo": "4.0.0",
+    "hexo-cli": "3.1.0",
     "hexo-browsersync": "^0.3.0",
-    "hexo-filter-github-emojis": "^2.1.0",
+    "hexo-filter-github-emojis": "arturi/hexo-filter-github-emojis",
     "hexo-generator-alias": "^0.1.3",
-    "hexo-generator-archive": "^0.1.5",
-    "hexo-generator-category": "^0.1.3",
-    "hexo-generator-feed": "^1.2.2",
-    "hexo-generator-index": "^0.2.1",
-    "hexo-generator-tag": "^0.2.0",
+    "hexo-generator-archive": "^1.0.0",
+    "hexo-generator-category": "^1.0.0",
+    "hexo-generator-feed": "^2.1.1",
+    "hexo-generator-index": "^1.0.0",
+    "hexo-generator-tag": "^1.0.0",
     "hexo-include-markdown": "^1.0.2",
-    "hexo-renderer-ejs": "^0.3.1",
-    "hexo-renderer-marked": "^0.3.2",
+    "hexo-renderer-marked": "2.0.0",
+    "hexo-renderer-ejs": "^1.0.0",
     "hexo-renderer-scss": "^1.2.0",
-    "hexo-server": "^0.3.2",
-    "hexo-tag-emojis": "^2.0.1",
-    "hexo-util": "^0.6.3",
+    "hexo-server": "^1.0.0",
+    "hexo-util": "^1.5.0",
     "js-yaml": "^3.13.1",
     "locale-code": "^2.0.2",
-    "marked": "^0.6.2",
+    "marked": "^0.7.0",
     "mdast-util-inject": "1.1.0",
     "mkdirp": "0.5.1",
     "multi-glob": "^1.0.2",
     "node-notifier": "^5.2.1",
     "postcss-inline-svg": "^3.1.1",
-    "prismjs": "^1.15.0",
+    "prismjs": "^1.17.1",
     "watchify": "^3.11.0"
   }
 }

+ 63 - 0
website/src/_posts/2019-12-1.7.md

@@ -0,0 +1,63 @@
+---
+title: "Uppy 1.7: A Small One"
+date: 2019-12-16
+author: renee
+published: false
+---
+
+Uppy 1.7 is out! This release adds Hebrew translations, a recording length timer for the `@uppy/webcam` plugin, and a collection of improvements to Companion.
+
+<!--more-->
+
+## showRecordingLength: true
+
+When recording audio or video using the `@uppy/webcam` plugin, this new option contributed by [@dominiceden](https://github.com/dominiceden) shows a timer in the bottom right, so your users can see how long they've been recording for:
+
+(this would be a good place for a video)
+
+## Companion
+
+The past month we've made some incremental improvements to Companion. We patched an issue where Companion could sometimes output remote provider authentication tokens into logs.
+We now run Companion tests on Node.js 6 on each commit, in addition to Node.js 10, to make sure that we don't break compatibility in a minor release. Node.js 6 support will be dropped in a future major release, and we recommend you upgrade soon if you are still using it.
+
+Uploading files from remote providers with the `@uppy/aws-s3-multipart` plugin now uses the correct file name in your S3 bucket by default, instead of the temporary filename that Companion uses internally.
+
+The `getKey()` option for S3 now has a [`metadata`](https://uppy.io/docs/companion/#s3-getKey-req-filename-metadata) parameter, so you can use file metadata from the client to determine the name of files in S3.
+
+## Locales
+
+The new Hebrew locale is available as:
+```js
+require('@uppy/locales/lib/he_IL')
+```
+
+Thanks to [@YehudaKremer](https://github.com/YehudaKremer) for the contribution!
+
+In 1.7, we also fixed the naming of the Galician locale. The locale names follow a `country_LANGUAGE` format. Previously, we used `es_GL` for Galician, which was intended to mean "Galician in Spain", but which _actually_ means "Spanish in Greenland"! The correct way to refer to Galician is as `gl_ES`:
+```js
+require('@uppy/locales/lib/gl_ES')
+```
+The old `es_GL` name is now an alias for `gl_ES`. It will be removed in a future major release, so we recommend updating your code if you were using the old name. If you do it now, the migration will be easier once 2.0 comes around :smile:
+
+## Misc
+
+- @uppy/aws-s3: add some tests (@bambii7, #1934)
+- @uppy/companion: add onedrive domain validation for the demo deployment (@ifedapoolarewaju, #1959)
+- @uppy/companion: change demo deployment type to stable API (@kiloreux, #1938)
+- @uppy/companion: rename uppy occurrences to companion (@ifedapoolarewaju, #1926)
+- @uppy/companion: upgrade `helmet` (@goto-bus-stop, [6b006ac](https://github.com/transloadit/uppy/commit/6b006ac42c20062c37bdcaf6a77e07b304da7957))
+- @uppy/core: make `uppy.on()` work better with IntelliSense (@bambii7, #1923)
+- @uppy/dashboard: hide top bar cancel button when `hideCancelButton: true` (@goto-bus-stop, #1955)
+- @uppy/thumbnail-generator: add webp to the list of supported types (@arturi, #1961)
+- @uppy/thumbnail-generator: vendor exif-js source in Uppy (@mskelton, #1940)
+- docs: FB and OneDrive are not yet in the CDN bundle (@goto-bus-stop, [61b54b9](https://github.com/transloadit/uppy/commit/61b54b914dd437d2e60362c4ece1429943b32555))
+- docs: add `companionHeaders` to s3-multipart docs (@goto-bus-stop, [a6e44a9](https://github.com/transloadit/uppy/commit/a6e44a953114e385466dcce884d37e433f030549))
+- docs: add reset-progress event to docs (@bambii7, #1922)
+- docs: make Robodog naming more consistent (@goto-bus-stop, #1935)
+- docs: make react sample code more standalone (@uxitten, #1864)
+- examples: remove `UPPYSERVER_` references (@goto-bus-stop, [e74690e](https://github.com/transloadit/uppy/commit/e74690e20cc0a1afd9156ce03b1ca6a5358cc7d9))
+- website: add facebook to dashboard example (@ifedapoolarewaju, #1930)
+- website: add plugin versions (@arturi, #1952)
+- website: enable onedrive on the website example (@ifedapoolarewaju, #1975)
+
+As always, you can find the full list of changes and package versions, as well as future plans, in our [changelog](https://github.com/transloadit/uppy/blob/master/CHANGELOG.md).

+ 10 - 1
website/src/docs/aws-s3-multipart.md

@@ -44,7 +44,15 @@ The maximum amount of chunks to upload simultaneously. Set to `0` to disable lim
 
 ### companionUrl: null
 
-The Companion URL to use for proxying calls to the S3 Multipart API.
+URL of the [Companion](/docs/companion) instance to use for proxying calls to the S3 Multipart API.
+
+This will be used by the default implementations of the upload-related functions below. If you provide your own implementations, a `companionUrl` is unnecessary.
+
+### companionHeaders: {}
+
+Custom headers that should be sent along to [Companion](/docs/companion) on every request.
+
+This will be used by the default implementations of the upload-related functions below. If you provide your own implementations, these headers are not sent automatically.
 
 ### createMultipartUpload(file)
 
@@ -95,6 +103,7 @@ Return a Promise for an object with keys:
      Expires: 5 * 60,
    }, (err, url) => { /* there's the url! */ })
    ```
+ - `headers` - **(Optional)** Custom headers that should be sent to the S3 presigned URL.
 
 ### abortMultipartUpload(file, { uploadId, key })
 

+ 7 - 0
website/src/docs/aws-s3.md

@@ -68,6 +68,13 @@ uppy.use(AwsS3, {
 
 Custom headers that should be sent along to [Companion][companion docs] on every request.
 
+### `metaFields: []`
+
+Pass an array of field names to specify the metadata fields that should be stored in S3 as Object Metadata. This takes values from each file's `file.meta` property.
+
+- Set this to `['name']` to only send the name field.
+- Set this to an empty array `[]` (the default) to not send any fields.
+
 ### `getUploadParameters(file)`
 
 > Note: When using [Companion][companion docs] to sign S3 uploads, do not define this option.

+ 15 - 5
website/src/docs/companion.md

@@ -241,7 +241,7 @@ See [env.example.sh](https://github.com/transloadit/uppy/blob/master/env.example
       secret: "***"
     },
     s3: {
-      getKey: (req, filename) => filename,
+      getKey: (req, filename, metadata) => filename,
       key: "***",
       secret: "***",
       bucket: "bucket-name",
@@ -292,21 +292,31 @@ See [env.example.sh](https://github.com/transloadit/uppy/blob/master/env.example
 
 The S3 uploader has some options in addition to the ones necessary for authentication.
 
-#### `s3.getKey(req, filename)`
+#### `s3.getKey(req, filename, metadata)`
+a
+Get the key name for a file. The key is the file path to which the file will be uploaded in your bucket. This option should be a function receiving three arguments:
+- `req`, the HTTP request, for _regular_ S3 uploads using the `@uppy/aws-s3` plugin. This parameter is _not_ available for multipart uploads using the `@uppy/aws-s3-multipart` plugin;
+- `filename`, the original name of the uploaded file;
+- `metadata`, user-provided metadata for the file. See the [`@uppy/aws-s3`](https://uppy.io/docs/aws-s3/#metaFields) docs. Currently, the `@uppy/aws-s3-multipart` plugin unconditionally sends all metadata fields, so all of them are available here.
 
-Get the key name for a file. The key is the file path to which the file will be uploaded in your bucket. This option should be a function receiving two arguments: `req`, the HTTP request, and the original `filename` of the uploaded file. It should return a string `key`. The `req` parameter can be used to upload to a user-specific folder in your bucket, for example:
+This function should return a string `key`. The `req` parameter can be used to upload to a user-specific folder in your bucket, for example:
 
 ```js
 app.use(authenticationMiddleware)
 app.use(uppy.app({
   s3: {
-    getKey: (req, filename) => `${req.user.id}/${filename}`,
+    getKey: (req, filename, metadata) => `${req.user.id}/${filename}`,
     /* auth options */
   }
 }))
 ```
 
-The default value simply returns `filename`, so all files will be uploaded to the root of the bucket as their original file name.
+The default implementation returns the `filename`, so all files will be uploaded to the root of the bucket as their original file name.
+```js
+({
+  getKey: (req, filename, metadata) => filename
+})
+```
 
 ### Running in Kubernetes
 

+ 0 - 6
website/src/docs/facebook.md

@@ -35,12 +35,6 @@ Install from NPM:
 npm install @uppy/facebook
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
-
-```js
-const Facebook = Uppy.Facebook
-```
-
 ## CSS
 
 Dashboard plugin is recommended as a container to all Provider plugins, including Facebook. If you are using Dashboard, it [comes with all the nessesary styles](/docs/dashboard/#CSS) for Dropbox as well.

+ 5 - 5
website/src/docs/index.md

@@ -19,12 +19,12 @@ Here’s the simplest example html page with Uppy (it uses a CDN bundle, while w
   <head>
     <meta charset="utf-8">
     <title>Uppy</title>
-    <link href="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css" rel="stylesheet">
+    <link href="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css" rel="stylesheet">
   </head>
   <body>
     <div id="drag-drop-area"></div>
 
-    <script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+    <script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
     <script>
       var uppy = Uppy.Core()
         .use(Uppy.Dashboard, {
@@ -113,12 +113,12 @@ You can also use a pre-built bundle from Transloadit's CDN: Edgly. `Uppy` will a
 1\. Add a script at the bottom of the closing `</body>` tag:
 
 ``` html
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
 ```
 
 2\. Add CSS to `<head>`:
 ``` html
-<link href="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css" rel="stylesheet">
+<link href="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css" rel="stylesheet">
 ```
 
 3\. Initialize at the bottom of the closing `</body>` tag:
@@ -169,5 +169,5 @@ const Uppy = require('@uppy/core')
 If you're using Uppy from CDN, `es6-promise` and  `whatwg-fetch` are already included in the bundle, no need to include anything additionally:
 
 ```html
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
 ```

+ 2 - 2
website/src/docs/locales.md

@@ -33,8 +33,8 @@ const uppy = Uppy({
 Add a `<script>` tag with Uppy bundle and the locale pack you’d like to use. You can copy/paste the link from the CDN column in the [locales table](#List-of-locale-packs). The locale will attach itself to the `Uppy.locales` object.
 
 ```html
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
-<script src="https://transloadit.edgly.net/releases/uppy/locales/v1.9.0/de_DE.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/locales/v1.10.0/de_DE.min.js"></script>
 
 <script>
 var uppy = Uppy.Core({

+ 0 - 6
website/src/docs/onedrive.md

@@ -35,12 +35,6 @@ Install from NPM:
 npm install @uppy/onedrive
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
-
-```js
-const OneDrive = Uppy.OneDrive
-```
-
 ## CSS
 
 Dashboard plugin is recommended as a container to all Provider plugins, including OneDrive. If you are using Dashboard, it [comes with all the nessesary styles](/docs/dashboard/#CSS) for Dropbox as well.

+ 2 - 0
website/src/docs/plugins.md

@@ -10,3 +10,5 @@ category: "Docs"
 ---
 
 Everything in Uppy is a Plugin. This lets us offer a wealth of features, but avoid bloating your JS bundle sizes if you don't need all of them.
+
+See [list of packages and sizes](#package-list) below to install what you need.

+ 4 - 4
website/src/docs/robodog-form.md

@@ -128,7 +128,7 @@ $(selector).transloadit({
 ```
 ```html
 <!-- The new Robodog way! -->
-<script src="//transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.js"></script>
+<script src="//transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.js"></script>
 
 <script>
 window.Robodog.form(selector, {
@@ -140,7 +140,7 @@ window.Robodog.form(selector, {
 Make sure to also include the Uppy css file in your `<head>` tag in case you want to use the `modal: true` option:
 ```html
 <head>
-  <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.css">
+  <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.css">
 </head>
 ```
 
@@ -152,7 +152,7 @@ Notice how the form is submitted to the inexistant `/uploads` route once all tra
 <html>
   <head>
     <title>Testing Robodog</title>
-    <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.css">
+    <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.css">
   </head>
   <body>
     <form id="upload-form" action="/uploads" enctype="multipart/form-data" method="POST">
@@ -162,7 +162,7 @@ Notice how the form is submitted to the inexistant `/uploads` route once all tra
       <button type="submit">Upload</button>
     </form>
 
-    <script src="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.js"></script>
+    <script src="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.js"></script>
     <script type="text/javascript">
     window.Robodog.form('#upload-form', {
       waitForEncoding: true,

+ 2 - 2
website/src/docs/robodog.md

@@ -31,8 +31,8 @@ require('@uppy/robodog/dist/robodog.css')
 If you are not using a bundler, you can also import Robodog using an HTML script tag.
 
 ```html
-<link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.css">
-<script src="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.js"></script>
+<link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.css">
+<script src="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.js"></script>
 <!-- you can now use: window.Robodog.pick() -->
 ```
 

+ 10 - 1
website/src/examples/dashboard/app.es6

@@ -6,6 +6,7 @@ const GoogleDrive = require('@uppy/google-drive')
 const Dropbox = require('@uppy/dropbox')
 const Instagram = require('@uppy/instagram')
 const Facebook = require('@uppy/facebook')
+const OneDrive = require('@uppy/onedrive')
 const Url = require('@uppy/url')
 const Webcam = require('@uppy/webcam')
 const Tus = require('@uppy/tus')
@@ -122,6 +123,14 @@ function uppySetOptions () {
     window.uppy.removePlugin(FacebookInstance)
   }
 
+  const OneDriveInstance = window.uppy.getPlugin('OneDrive')
+  if (opts.OneDrive && !OneDriveInstance) {
+    uppy.use(OneDrive, { target: Dashboard, companionUrl: COMPANION })
+  }
+  if (!opts.OneDrive && OneDriveInstance) {
+    window.uppy.removePlugin(OneDriveInstance)
+  }
+
   const WebcamInstance = window.uppy.getPlugin('Webcam')
   if (opts.Webcam && !WebcamInstance) {
     window.uppy.use(Webcam, { target: Dashboard, companionUrl: COMPANION })
@@ -145,7 +154,7 @@ function loadLocaleFromCDN (localeName) {
   var head = document.getElementsByTagName('head')[0]
   var js = document.createElement('script')
   js.type = 'text/javascript'
-  js.src = `https://transloadit.edgly.net/releases/uppy/locales/v1.9.0/${localeName}.min.js`
+  js.src = `https://transloadit.edgly.net/releases/uppy/locales/v1.10.0/${localeName}.min.js`
 
   head.appendChild(js)
 }

+ 3 - 0
website/src/examples/dashboard/app.html

@@ -14,6 +14,7 @@
     <li><label for="opts-Dropbox"><input type="checkbox" id="opts-Dropbox" checked/> Dropbox</label></li>
     <li><label for="opts-Instagram"><input type="checkbox" id="opts-Instagram" checked/> Instagram</label></li>
     <li><label for="opts-Facebook"><input type="checkbox" id="opts-Facebook" checked/> Facebook</label></li>
+    <li><label for="opts-OneDrive"><input type="checkbox" id="opts-OneDrive" checked/> OneDrive</label></li>
     <li><label for="opts-Url"><input type="checkbox" id="opts-Url" checked/> Url</label></li>
   </ul>
 
@@ -40,6 +41,7 @@
     Dropbox: document.querySelector('#opts-Dropbox'),
     Instagram: document.querySelector('#opts-Instagram'),
     Facebook: document.querySelector('#opts-Facebook'),
+    OneDrive: document.querySelector('#opts-OneDrive'),
     Url: document.querySelector('#opts-Url'),
     autoProceed: document.querySelector('#opts-autoProceed'),
     restrictions: document.querySelector('#opts-restrictions'),
@@ -52,6 +54,7 @@
     GoogleDrive: true,
     Instagram: true,
     Dropbox: true,
+    OneDrive: true,
     Facebook: false,
     Url: true,
     autoProceed: false,

+ 2 - 0
website/src/examples/dashboard/index.ejs

@@ -28,6 +28,7 @@ const GoogleDrive = require('@uppy/google-drive')
 const Dropbox = require('@uppy/dropbox')
 const Instagram = require('@uppy/instagram')
 const Facebook = require('@uppy/facebook')
+const OneDrive = require('@uppy/onedrive')
 const Webcam = require('@uppy/webcam')
 const Tus = require('@uppy/tus')
 
@@ -59,6 +60,7 @@ const uppy = Uppy({
 .use(Dropbox, { target: Dashboard, companionUrl: 'https://companion.uppy.io' })
 .use(Instagram, { target: Dashboard, companionUrl: 'https://companion.uppy.io' })
 .use(Facebook, { target: Dashboard, companionUrl: 'https://companion.uppy.io' })
+.use(OneDrive, { target: Dashboard, companionUrl: 'https://companion.uppy.io' })
 .use(Webcam, { target: Dashboard })
 .use(Tus, { endpoint: 'https://master.tus.io/files/' })
 

+ 3 - 3
website/src/examples/i18n/app.html

@@ -1,7 +1,7 @@
 <!-- Load Uppy CSS bundle. It is advisable to install Uppy 
   from npm/yarn instead, and pick and choose the plugins/styles you need.
   But for experimenting, you can use Transloadit’s CDN, Edgly: -->
-<link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css">
+<link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css">
 
 <div class="UppyDragDrop"></div>
 <div class="for-ProgressBar"></div>
@@ -12,8 +12,8 @@
 </div>
 
 <!-- Load Uppy JS bundle. -->
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
-<script src="https://transloadit.edgly.net/releases/uppy/locales/v1.9.0/ru_RU.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
+<script src="https://transloadit.edgly.net/releases/uppy/locales/v1.10.0/ru_RU.min.js"></script>
 <script>
   var uppy = Uppy.Core({ 
     debug: true, 

+ 1 - 1
website/src/examples/markdown-snippets/app.es6

@@ -3,7 +3,7 @@ const marked = require('marked')
 const dragdrop = require('drag-drop')
 // Add Robodog JS. It is advisable to install Robodog from npm/yarn.
 // But for experimenting, you can use also Transloadit’s CDN, Edgly:
-// <script src="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.js"></script>
+// <script src="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.js"></script>
 const robodog = require('@uppy/robodog')
 
 const TRANSLOADIT_EXAMPLE_KEY = '35c1aed03f5011e982b6afe82599b6a0'

+ 1 - 1
website/src/examples/markdown-snippets/app.html

@@ -1,6 +1,6 @@
 <!-- Add Robodog styles. It is advisable to install Robodog from npm/yarn.
   But for experimenting, you can use also Transloadit’s CDN, Edgly:
-  <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.0/robodog.min.css"> -->
+  <link rel="stylesheet" href="https://transloadit.edgly.net/releases/uppy/robodog/v1.4.1/robodog.min.css"> -->
   <link rel="stylesheet" href="/uppy/robodog.min.css">
   <form id="new" class="form-snippet">
     <h2>Create a new snippet</h2>

+ 1 - 0
website/src/frontpage-code-sample.ejs

@@ -1,5 +1,6 @@
 ---
 layout: false
+no-emoji: true
 ---
 <!--
 You can `npm run web:inject-frontpagecodesample` to render this code snippet and

+ 4 - 4
website/src/privacy.md

@@ -22,7 +22,7 @@ We receive the following **data** from you:
 3. Data entered on our website
 4. The browser session (identified through a cookie)
 5. Information used to analyze usage of our platform (through cookies from Google Analytics. More on cookies is explained below)
-6. Files you can optionally upload in example demos. Those files are stored temporarily for 24 hours, on tus.io or transloadit.com servers, and then deleted. See also Transloadit’s Privacy Policy: https://transloadit.com/legal/privacy/.
+6. Files you can optionally upload in example demos. Those files are stored temporarily for 24–72 hours, on uppy.io, tus.io or transloadit.com servers, and then deleted. See also Transloadit’s Privacy Policy: https://transloadit.com/legal/privacy/.
 
 All data that passes through demos is only used for demo purposes, and never sold or otherwise given away.
 
@@ -36,7 +36,7 @@ We use the following third-party services which also store data about you:
 | :-------------------- | :---------------------- | :--------------------------------------- | :-----------: | :---------: | :--------: | :-------: |
 | Transloadit           | end user (data subject) | browser identifiers                      |               |             | instantly  |           |
 | Transloadit           | end user (data subject) | test files                      |               |             | in 24h  |           |
-| Tus.io           | end user (data subject) | test files                      |               |             | in 24h  |           |
+| Tus.io               | end user (data subject) | test files                      |               |             | in 72h  |           |
 | Google Analytics      | customer (business)     | browser identifiers                      |               | ✅                      |           |
 
 - **anonymized**: Any data that can be used to identify the 'data subject' is scrubbed
@@ -90,7 +90,7 @@ Google will use this information to analyze your usage of our platform and to cr
 
 You can avoid any cookies being saved by changing the settings in your browser accordingly. Please be aware that if you choose to do so, you might not be able to make full use of our website and all of its features. You can also prevent the analysis of your browsing behavior on our platform through Google Analytics by installing the following browser plugin: http://tools.google.com/dlpage/gaoptout.
 
-Google, Inc. (“Google”)	head quarters are located at "1600 Amphitheatre Parkway Mountain View, California 94043, USA".
+Google, Inc. (“Google”) head quarters are located at "1600 Amphitheatre Parkway Mountain View, California 94043, USA".
 Their privacy policy is located here: https://policies.google.com/privacy.
 
 ## How to disable cookies
@@ -103,4 +103,4 @@ If you require a countersigned copy of our DPA, please  <a href="mailto:hello@tr
 
 ## Last Updated
 
-This privacy policy was last updated on Jan 23, 2018.
+This privacy policy was last updated on Nov 29, 2019.

+ 0 - 11
website/src/stats.ejs

@@ -1,11 +0,0 @@
----
-title: Stats
-type: docs
-layout: stats
-category: 'Contributing'
-permalink: docs/stats/
-alias:
-  - guide/stats/
-  - stats/
-order: 9
----

+ 1 - 1
website/themes/uppy/layout/example.ejs

@@ -23,7 +23,7 @@
   It is later made visible, and moved into the #console-wrapper to position it in layout how
   you see fit. -->
 
-  <blockquote>Files from the examples are uploaded to our test servers and deleted daily.</blockquote>
+  <blockquote>Files from the examples are uploaded to our test servers and deleted every 24-72 hours.</blockquote>
 
   <textarea id="console-log" class="Console"></textarea>
   <script>

+ 2 - 2
website/themes/uppy/layout/index.ejs

@@ -144,8 +144,8 @@
   <p>© <%- date(Date.now(), 'YYYY') %> <a href="https://transloadit.com" target="_blank">Transloadit</a></p>
 </footer>
 
-<link href="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.css" rel="stylesheet">
-<script src="https://transloadit.edgly.net/releases/uppy/v1.6.0/uppy.min.js"></script>
+<link href="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.css" rel="stylesheet">
+<script src="https://transloadit.edgly.net/releases/uppy/v1.7.0/uppy.min.js"></script>
 
 <script>
   var TUS_ENDPOINT = 'https://master.tus.io/files/'

+ 3 - 2
website/themes/uppy/layout/layout.ejs

@@ -51,12 +51,13 @@ if (page.series) {
 
         <span id="logo" class="MainLogo">
           <a class="MainLogo-link" href="/"><%- config.title %></a>
-          <a class="MainLogo-version" href="/blog/2019/04/1.0/">
+          <!-- Was used for 1.0, we can re-use for 2.0 or major announcements -->
+          <!-- <a class="MainLogo-version" href="/blog/2019/04/1.0/">
             1.0
             <span class="MainLogo-emoji">
               <img src="/images/party-popper.png" srcset="/images/party-popper@2x.png 2x" alt="🎉">
             </span>
-          </a>
+          </a> -->
         </span>
 
         <nav>

+ 2 - 1
website/themes/uppy/layout/page.ejs

@@ -7,7 +7,8 @@
     
     <% if (page.subtype === 'plugin-list') { %>
       <%- partial('partials/docs_menu', { only_modules: true, add_taglines: true, type: page.type, index: page.index, add_category_ids: true }) %>
-    <% } %>    
+      <%- partial('partials/plugin_list') %>
+    <% } %>
 
     <% if (page.type === 'guide') { %>
       <div class="guide-links">

+ 5 - 2
website/themes/uppy/layout/partials/frontpage-code-sample.html

@@ -1,4 +1,7 @@
-<figure class="highlight bash"><table><tbody><tr><td class="code"><pre>$ <span class="token function">npm</span> <span class="token function">install</span> @uppy/core @uppy/dashboard @uppy/instagram @uppy/tus </pre></td></tr></tbody></table></figure>
+<!--
+You can `npm run web:inject-frontpagecodesample` to render this code snippet and
+save it as a layout partial
+--><html><head></head><body><figure class="highlight bash"><table><tbody><tr><td class="code"><pre>$ <span class="token function">npm</span> <span class="token function">install</span> @uppy/core @uppy/dashboard @uppy/instagram @uppy/tus </pre></td></tr></tbody></table></figure>
 
 <figure class="highlight js"><table><tbody><tr><td class="code"><pre><span class="token keyword">import</span> Uppy <span class="token keyword">from</span> <span class="token string">'@uppy/core'</span>
 <span class="token keyword">import</span> Dashboard <span class="token keyword">from</span> <span class="token string">'@uppy/dashboard'</span>
@@ -36,4 +39,4 @@
             });
             document.body.appendChild(img);
           });
-      </script>
+      </script></body></html>

+ 48 - 0
website/themes/uppy/layout/partials/plugin_list.ejs

@@ -0,0 +1,48 @@
+<h2 id="package-list">List of Uppy Packages</h2>
+<p>Below is the list of Uppy packages, and their minified and gzipped sizes.</p>
+<small>
+   ⚠️ Note that this includes the dependencies for each package, some of which are shared when you install multiple plugins. For example, the <code>@uppy/dropbox</code> and <code>@uppy/instagram</code> package are both over 11kB including dependencies, but only sum up to about 15kB when they are used together.
+</small>
+<table class="Stats-bundleSizes">
+  <thead>
+    <tr>
+      <th class="Stats-bundleSizeHeader">Package</th>
+      <th class="Stats-bundleSizeHeader">Version</th>
+      <th class="Stats-bundleSizeHeader">Minified</th>
+      <th class="Stats-bundleSizeHeader">Gzip</th>
+    </tr>
+  </thead>
+  <tbody>
+    <% for (const [name, sizes] of Object.entries(theme.uppy_bundle_kb_sizes)) { %>
+      <% const { minified, gzipped, prettyMinified, prettyGzipped, version } = sizes %>
+      <tr>
+        <td><a class="Stats-package" target="_blank" href="https://npmjs.com/package/<%= name %>"><%= name %></a></td>
+        <td><%= version %></td>
+        <td><%= prettyMinified %></td>
+        <td class="
+          <% if (gzipped > 30 * 1000) { %>Stats-large<% } %>
+          <% if (gzipped < 10 * 1000) { %>Stats-small<% } %>
+        ">
+          <%= prettyGzipped %>
+        </td>
+      </tr>
+    <% } %>
+  </tbody>
+</table>
+
+<iframe scrolling="no" seamless="seamless" class="Disc" src="/disc.html"></iframe>
+<p>
+  This graph is built with
+  <a href="https://twitter.com/hughskennedy">Hugh Kennedy</a>’s excellent
+  <a href="http://hughsk.io/disc/">disc</a>.
+</p>
+
+<h2 id="browser-support">Browser Support</h2>
+
+<p>
+  <a href="https://saucelabs.com/u/transloadit-uppy">
+    <img src="https://saucelabs.com/browser-matrix/transloadit-uppy.svg" alt="Sauce Test Status"/>
+  </a>
+</p>
+<p>We currently aim to support IE11+ and recent versions of Safari, Edge, Chrome, Firefox and Opera.</p>
+<p>We still run end to end tests with IE10, but we are not actively supporting it or fixing visual / minor issues.</p>

+ 0 - 65
website/themes/uppy/layout/stats.ejs

@@ -1,65 +0,0 @@
-<%- partial('partials/sidebar', { type: page.type, index: page.index }) %>
-
-<div class="Content js-Content <%- page.type ? page.type + ' with-sidebar' : '' %>">
-  <h1><%- page.title %></h1>
-
-  <p class="Stats-infoText">
-    To keep Uppy lightweight, we’re aiming to carefully select what packages we include.
-    The graph below will help us discover low hanging fruit. Sizes and dependencies shown here
-    are for the bundled version of Uppy, which includes all plugins we offer. In production,
-    when you <a href="https://uppy.io/docs/#With-a-module-bundler">pick and choose just the ones you need</a>, the size will be much smaller:
-
-    <ul>
-      <li>Drag & Drop + Multipart uploads ≈ <code>18 Kb mingz</code></li>
-      <li>Full-featured Dashboard with image previews and progress indicators + tus resumable uploads ≈ <code>36 Kb mingz</code></li>
-    </ul>
-  </p>
-  <iframe scrolling="no" seamless="seamless" class="Disc" src="/disc.html"></iframe>
-  This graph is built with
-  <a href="https://twitter.com/hughskennedy">Hugh Kennedy</a>’s excellent
-  <a href="http://hughsk.io/disc/">disc</a>.
-  <hr />
-
-  <h2 id="bundle-sizes">Bundle Sizes</h2>
-  <p>
-    Below are the minified and gzipped sizes for each Uppy package. Note that this includes the dependencies for each package, some of which are shared when you install multiple plugins—for example, the <code>@uppy/dropbox</code> and <code>@uppy/instagram</code> package are both over 11kB including dependencies, but only sum up to about 15kB when they are used together.
-  </p>
-  <table class="Stats-bundleSizes">
-    <thead>
-      <tr>
-        <th class="Stats-bundleSizeHeader">Package</th>
-        <th class="Stats-bundleSizeHeader">Minified</th>
-        <th class="Stats-bundleSizeHeader">Gzip</th>
-      </tr>
-    </thead>
-    <tbody>
-      <% for (const [name, sizes] of Object.entries(theme.uppy_bundle_kb_sizes)) { %>
-        <% const { minified, gzipped, prettyMinified, prettyGzipped } = sizes %>
-        <tr>
-          <td><a class="Stats-package" target="_blank" href="https://npmjs.com/package/<%= name %>"><%= name %></a></td>
-          <td><%= prettyMinified %></td>
-          <td class="
-            <% if (gzipped > 30 * 1000) { %>Stats-large<% } %>
-            <% if (gzipped < 10 * 1000) { %>Stats-small<% } %>
-          ">
-            <%= prettyGzipped %>
-          </td>
-        </tr>
-      <% } %>
-    </tbody>
-  </table>
-
-  <h2>Browser support</h2>
-
-  <p>This reflects the current state of Uppy and is updated with every change.</p>
-
-  <a href="https://saucelabs.com/u/transloadit-uppy">
-    <img src="https://saucelabs.com/browser-matrix/transloadit-uppy.svg" alt="Sauce Test Status" width="100%">
-  </a>
-
-  <div class="footer">Caught a mistake or want to contribute to the documentation?
-    <a href="https://github.com/transloadit/uppy/blob/master/website/src/<%- page.source %>" rel="noreferrer noopener" target="_blank">
-      Edit/fork this page directly on Github
-    </a>!
-  </div>
-</div>

+ 23 - 21
website/themes/uppy/source/css/_common.scss

@@ -221,33 +221,35 @@ hr {
   font-weight: 700;
 
   @media #{$screen-medium} {
-    margin-right: 35px;
+    margin-right: 15px;
   }
 
   &-link {
     color: $color-primary;
   }
 
-  &-version {
-    display: inline-block;
-    padding: 0px 8px 1px;
-    background-color: $color-primary;
-    position: relative;
-    border-radius: 6px;
-    color: #fff;
-    font-size: 24px;
-
-    &:hover {
-      background-color: darken($color-primary, 7%);
-    }
-  }
-
-  &-emoji {
-    font-size: 16px;
-    position: absolute;
-    bottom: 3px;
-    right: -1em;
-  }
+  // Was used for 1.0, we can re-use for 2.0 or major announcements
+  // 
+  // &-version {
+  //   display: inline-block;
+  //   padding: 0px 8px 1px;
+  //   background-color: $color-primary;
+  //   position: relative;
+  //   border-radius: 6px;
+  //   color: #fff;
+  //   font-size: 24px;
+
+  //   &:hover {
+  //     background-color: darken($color-primary, 7%);
+  //   }
+  // }
+
+  // &-emoji {
+  //   font-size: 16px;
+  //   position: absolute;
+  //   bottom: 3px;
+  //   right: -1em;
+  // }
 }
 
 /**

+ 1 - 1
website/themes/uppy/source/css/_page.scss

@@ -363,7 +363,7 @@
   overflow: visible;
 }
 .page-docs-locales .highlight table {
-  overflow: scroll;
+  overflow: auto;
 }
 .page-docs-locales table td {
   white-space: nowrap;

+ 1 - 0
website/themes/uppy/source/css/_stats.scss

@@ -10,6 +10,7 @@
 }
 
 .Stats-bundleSizes {
+  margin-top: 1em;
   margin-bottom: 1em;
   width: 100%;
 

Some files were not shown because too many files changed in this diff