* core: add an addFiles() method that only updates state once
Previously, adding 1300-ish files took around 260ms, and looked like
this in Firefox's performance tab:

All of the downward peaks are `setState()` calls and GC.
Now it takes around 60ms, and looks like this:

Here, most of the time is spent generating file IDs and guessing file
types. Those would be areas to look at next.
* dashboard: prevent frequent state update if nothing changed
After the last commit, `addFiles()` still spends a lot of time in
`emit()` and `hideAllPanels()`. The reason is that `addFiles()` still
emits all the hundreds of file-added events, and the Dashboard responds
to each with `hideAllPanels()`, which does a state update. But this all
happens synchronously, and the state almost certainly did not change
since the last `file-added` event that fired a millisecond ago.
This adds a check to avoid the state update if it is not necessary.

Adding 1300 files takes about 40ms now.
With this change, the `addFiles()` call is no longer the slowest
part—now preact rendering all the items is!
* utils: optimize generateFileID and getFileNameAndExtension
Replaces some clever things with more mundane and faster things!
Now, generateFileID is a bunch of string concatenations.
Now, getFileNameAndExtension uses `lastIndexOf()` instead of a regex.

Adding 1300 files takes about 25ms.
* dashboard: use preact-virtual-list
* thumbnail-generator: add `lazy` option
* dashboard: request thumbnails once file item renders the first time
* dashboard: fork preact-virtual-list
* core: add removeFiles() to remove files in bulk
* Implement removeFile() in terms of removeFiles()
* thumbnail-generator: only queue files that can be previewed
* rename size constants to accommodate WIDTH/HEIGHT
* Use new uppy.addFiles in DragDrop and FileInput
* utils: fix getFileNameAndExtension() type
* Rip out the lazy thumbnail generation
* Rip out virtualization.
* Remove virtualization leftovers
* tell future people that this is intentionally verbose
* Update package-lock.json
* henlo i am spell
* Make `addFiles()` respect maxNumberOfFiles
* core: show an informer error if some files fail in bulk add
* locales: fix quotes to make build:locale-pack happy
Co-authored-by: Artur Paikin <artur@arturpaikin.com>
* aws-s3-multipart: prevent deadlock in rate limit queue
* utils: fix RateLimitedQueue thrashing when aborting all items
* aws-s3-multipart: only send abort request if upload was already created, fixes#1146
* xhr-upload: redo limit option using different strategy
* xhr-upload: fix marking requests as done
* Move duplicate createEventTracker definitions to @uppy/utils
* tus: new cancellation for local uploads
* tus: fix cancelling queued uploads
* tus: fix wrong name
* aws-s3-multipart: smol refactor
* aws-s3-multipart: new cancellation style
* aws-s3: new cancellation
* utils: port limitPromises test to RateLimitedQueue
* timing fix?
* tus: new cancellation on websocket
* xhr-upload: implement cancellation for remote uploads
* aws-s3-multipart: port to new cancellation
* utils: remove limitPromises
* xhr-upload: remove pause/resume code
* xhr-upload: clean up event listeners
* xhr-upload: extract progress timer to separate class
* Move ProgressTimeout class to utils
* utils: update typings
* Fix lint
* tus: make pause/resume respect the rate limiting queue
* tus: try to explain some of the tricky things at play in the Tus#upload method
* aws-s3-multipart: add missing { abort: true }
* aws-s3-multipart: make pause/resume respect the rate limiting queue
* eslintrc.json - fixed eslint warnings for jsdoc
* Revert "eslintrc.json - fixed eslint warnings for jsdoc"
This reverts commit 50b24773ce.
* eslintrc.json - allow indentation in jsdoc comments
* xhr-upload: fix promise return value
* tus: fix promise return value
* tus: add missing `return () => {}`
* utils: typing export type fixes
* tus: add more jsdoc
* companion-client: add missing SocketOptions type
* utils: fix more export typings
* core,companion-client,tus: more typings tweaking
* companion-client: test fix 😩
* companion-client: add type for Socket#open
* tus: fix emit() call
* add local cancellation fuzz....ish? test
* Add file.data.relativePath to the file.id
* Don’t add/overwrite a file if a file with the same id already exsists, issue a warning
* override @uppy/tus fingerprint to uppy’s file.id
* combine cordove/react native handling, don’t log twice
* always use onError for errors in addFile
* use file.meta.relativePath instead of file.data.relativePath
what do you think, @lakesare?
* update tests to include allowing/diallowing duplicates and file.id generation with relativePath
* update tus-js-client
* refactor error handling for addFile and upload into a mutual _showOrLogErrorAndThrow method
* explain duplicate files and relativePath
* throw TypeError vs Error when allowedFileTypes is not an array
* fix tests
* tweak docs
* Emit restriction-failed for all restriction errors, move it to _showOrLogErrorAndThrow
* @utils/getDroppedFiles.js - mild refactoring
* @utils/getDroppedFiles.js - added .info and .log on drop error
* @utils/getDroppedFiles.js - one more refactor
* @utils/getDroppedFiles.js - log error objects instead of strings
* Update eslint
* Do eslint --fix
* Do not access Object.prototype method 'hasOwnProperty' from target object
* utils: add hasProperty
* eslint --fix
* Disable quote-props for locale files
* add back quotes in locale files
* revert locale files to state on master
* Update react-scripts
* core: add test for ID generation with non-latin names
* core: adjust ID generation to keep non-latin characters
This shouldn't be bc-breaking!
Now, non-latin characters are encoded as their charcode in base 32, so
files that only differ by name in a non-latin language will generate
different IDs.
* Replace prettier-bytes with its copy, only use 1024 instead of 1000 to justify KB vs kB
* Add tests
* added License
* pretty-bytes to @uppy/utils/lib/prettyBytes everywhere
* @uppy/provider-views - added accessibility
* @uppy/provider-views - simplified checkbox css
* @uppy/dashboard - on tab set focus to the current verlay
* @uppy/dashboard - factored out code related to focus into a separate file
* @uppy/dashboard, and connected plugins - made focus travel well, and be managed in a single place in Dashboard
* @uppy/dashboard - made modal opener button focus keep focus on modal close
* @uppy/dashboard - focus management for uploaded-files
* @uppy/dashboard - made informer read messages without interruption
* @uppy/provider-views - removed the bug of focus jumping on safari
* @uppy/dashboard - made focus travel well in instagram in firefox
* @uppy - moved lodash.debounce dependency from / to @uppy/dashboard
* everywhere - made <ul>s not focusable for firefox
* @uppy/provider-views - unnested scss, copypasted alex's :focus changes
* Added JSDoc eslint package and rules, and fixed some JSDoc comments
* .eslintrc - made jsdoc errors warnings instead
* package-lock.json for new package.json
* eslint fix
* @uppy/dashboard - avoid forcing focus when we are inline
* @uppy/dashboard - in firefox, made sure superfocus is not switching back to uppy
* @uppy/dashboard - no focus jump for .info() inline, fix for firefox
Made focus not interrupt .info() when we are in the inline mode;
Made firefox start superfocusing when we either tab into, or click on some element in Uppy
* @uppy/dashboard - only listen to click/focus on uppy
* @uppy/dashboard - started trapping focus in inline mode too
* @uppy/dashboard - restricted trapFocus() event listener to this.el
* @uppy/core - started throttling progress emits.
1. To fix heat up in firefox
2. To fix focus in firefox
* @uppy/core - fixed tests by adding .flush()-s for progress emits
* @uppy/dashboard - stopped trapping focus in inline mode, made background inert
* @uppy/dashboard - added MutationObserver polyfill
* tests - made locale-packs.js pass
* REVERTED last 3 commits that introduced inert
Inert requires too many polyfills, atm tests fail in IE 10.0, wicg-inert library reportedly has performance issues. We decided to at least wait until _some_ browser introduce inert html property natively.
* @uppy/dashboard - IE11 fix for focusing
* @uppy/dashboard - fix for a bug in Safari for long uploads with checkbox clicking
* RERUN TESTS - tiny commit to rerun tests
* @uppy/dashboard - removed useless touchstart event listener
* Cancel superFocus in recordIfFocusedOnUppyRecently, when focus moves away from Uppy
* @uppy/provider-views - made Filter not swallow letters
* @uppy/dashboard - stopped superfocus from refocusing if we're already in the overlay
* /examples/dev - added drag-drop plugin dev environment
* @uppy/drag-drop - moved isDragDropSupported() to @uppy/utils
* @uppy/drag-drop - got rid of drag-drop npm library
* examples/dev - made compiled files placed in /output instead of /lib
* ~/examples/dev - made watchify only watch files once
* @uppy/drag-drop - add onPaste
* /examples/dev - readded html css override-attempts
* @uppy/drag-drop - made whole area clickable, and made it accessible
* @uppy/drag-drop - removed excessive outline in firefox
* REVERTED last 2 commits
Mostly what @goto-bus-stop did in 4f51deaaf7 (diff-989af75a364b65c408abe1fc3e7ac0f4R34)
> This patch allows locale keys passed to the main Uppy instance to override default keys in plugins. It's just one idea to kick things off, I'm not attached to this particular implementation.
>
> If we do this we need to make sure that all keys have unique names and that things specific to eg. a single service are "namespaced" (`transloaditEncoding` instead of `encoding`).
>
> The benefit to this is that there is a central point of configuration for languages, so there could be language packs with strings for eg Czech at `@uppy/lang-cz` (or `@uppy/langs/cz`) that would be very easy to use.
If we can't determine the file type, use the generic
'application/octet-stream' type. This way `file.type` will always be
defined and uploaders don't have to worry about it being `null` or
whatever.
Available as `@uppy/utils/lib/Translator`.
The Translator tests were using `Core()` instead of `Translator()`, so I
changed it to using `Translator` instances directly. The functionality
being tested did not change.
Steps taken:
```bash
git mv src/core/Translator.* packages/@uppy/utils/src
sed -i 's/[./]*\/core\/Translator/@uppy\/utils\/lib\/Translator/' src/**/*.js
vim packages/@uppy/utils/src/Translator.test.js # Fix tests
```