Commit graph

68 commits

Author SHA1 Message Date
Renée Kooi
2b91a96c95
Release 2020-01-15 16:39:45 +01:00
Renée Kooi
1463ee79ce
Improve performance of adding and removing files (#1949)
* 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:

![Flamegraph](https://i.imgur.com/08veuoU.png)

All of the downward peaks are `setState()` calls and GC.

Now it takes around 60ms, and looks like this:

![Flamegraph](https://i.imgur.com/xFdwVBV.png)

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.

![Flamegraph](https://i.imgur.com/KhuD035.png)

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.

![Flamegraph](https://i.imgur.com/ZQ1IhxI.png)

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>
2020-01-13 12:29:08 +01:00
Renée Kooi
18180d5778
Release 2019-12-16 12:53:23 +01:00
Renée Kooi
c370dba0b6
Release 2019-11-04 10:56:06 +01:00
Artur Paikin
4e54483e61 core: setOptions for Core and plugins (#1728)
* Add a method to update options in Core

* Add a method to update options in Plugin (for any plugins)

* Allow re-initializing i18n locales after they’ve been updated with .setOptions

* use rest spread instead of Object.assign

* override setOptions in plugins to include i18nInit

* merge restrictions object in setOptions

* check that newOpts exists

* add spread ...

* don’t double merge

* add i18nInit to all plugins that use translation strings

* add setOptions tests to Core and Dashboard

* add setOptions docs for Core and Plugins

* fix tests for thumbnail-generator by adding plugins: {} to mock core

cause ThumbnailGenerator now calls this.setPluginState, which expects `core.state.plugins`

* also update meta with setOptions if it’s passed, change the way this.opts is set in core

@goto-bus-stop does this look ok? merging restrictions opts in core

* if locale was passed to setOptions(), call plugin.setOptions() on all plugins, so that i18n updates

* add Dashboard test that checks if locale is updated from Core via setOptions()

* Reafactor website Dashboard example to use setOptions and allow selecting a locale

🎉
2019-11-04 10:33:30 +01:00
Renée Kooi
4e32e61d7c
Release 2019-10-09 21:00:46 +02:00
Renée Kooi
733de659da
Upgrade standard to v14 (#1860)
* Update eslint dependencies.

* standard --fix

* build: disable handler name lint rule

* status-bar: manually fix lint errors

* webcam: manually fix lint errors

* url: manually fix lint errors

* react-native: manually fix lint errors

* dashboard: manually fix lint errors

* informer: manually fix linting errors

* progress-bar: manually fix lint errors

* provider-views: manually fix lint errors

* redux-dev-tools: manually fix lint errors

* build: disable buggy no-unused-vars rule

* examples: manually fix lint errors

* ` quotes for code things, ' for text things
2019-10-09 14:53:02 +02:00
Artur Paikin
056a7114a1 Release 2019-08-30 15:24:04 +03:00
Renée Kooi
c62ec3665d Update eslint to v6 (#1777)
* 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
2019-08-13 21:45:30 +03:00
Renée Kooi
10bc79574e
lerna link convert (#1730)
* lerna link convert

* ci: use npm ci

* update lockfile

* companion: set `bin` to source file

Since typescript doesn't actually transform anything, we can just use
this.

In a next major version we could set `noEmit: true` in the tsconfig and
stop publishing `lib`.

* companion: do chmod +x on start-server.js

* build: remove obsolete lerna config

* build: explicitly install latest versions when building e2e tests for ci

* Remove versions from private packages

* fix regex

* try fix

* ci: force npm to install to endtoend folder

* ci: fold up e2e build output

* Update netlify deploy preview command

* Remove mentions of npm run bootstrap

* Edit .github/CONTRIBUTING.md instead

* companion: add proxy executable

* companion: fix publish

* Downgrade jest to appease create-react-app
2019-07-19 12:16:36 +02:00
Artur Paikin
bd2beedcff Release 2019-07-18 17:21:42 +02:00
Artur Paikin
5e35987079
Log error in uppy.addFile try/catch (#1680)
* Log error in uppy.addFile try/catch

* Add `.isRestriction` to a custom RestrictionError, check for that before logging

* keep throwing for robodog.upload

//cc @goto-bus-stop
2019-06-28 20:25:17 +03:00
Renée Kooi
d57403025e
robodog: use chooseFiles string like @uppy/file-input (#1669)
* robodog: use chooseFiles string like @uppy/file-input

* robodog: add default chooseFiles string

* file-input: add update notice above chooseFiles default

* Add locale docs
2019-06-17 18:38:47 +02:00
Artur Paikin
28d235fe2f Release 2019-06-05 19:07:20 +03:00
Renée Kooi
b64705fce2
New sync version (#1600)
New sync version
2019-06-05 16:19:48 +02:00
Artur Paikin
9926853b18 Clear input[type=file] in FileInput too, updated comments and changed ev to event 2019-05-30 17:46:58 +03:00
Renée Kooi
980210f76c
Add VERSION properties to all plugins.
And remove the proposal-object-rest-spread plugin because it is built
into preset-env now.
2019-05-27 16:53:47 +02:00
Artur Paikin
5c9e1a836d Release 2019-05-17 19:17:03 +03:00
Renée Kooi
1ad322497f
Release 2019-05-08 15:27:15 +02:00
Renée Kooi
fb053444f1 pin preact to 8.2.9 (#1513)
Webpack likes to pick the ES module versions of modules over CJS
versions. So, if we do `require('preact')`, we can get the ES module
version of it. preact in version 8.3.0 switched its file extension
from `.esm.js` to `.mjs`, which in webpack's default configuration meant
the module implementation became much stricter. The result is that we
get a different value in `require('preact')`.

This older version of preact doesn't use `.mjs` yet so we can safely
`require('preact')` it in webpack. It still picks the ESM version, but
now it uses the looser implementation which is interchangeable for our
purposes.
2019-05-01 15:06:44 +02:00
Artur Paikin
25d4b3678b Release 2019-04-25 23:03:25 +03:00
Artur Paikin
27424e37c7 update peerDependencies of @uppy/core to ^1.0.0 2019-04-25 22:50:05 +03:00
Artur Paikin
0f95529cc5 Release 2019-04-19 15:46:25 +03:00
Artur Paikin
28fce1a137 Default locale for all plugins (#1443)
* first swing at building locale pack

* expose default locale on the plugin instance

* write a pretty en_US locale to a file, using stringify-object and template.js

* generated locale pack

* start adding a script that checks for unused locale strings

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* Update bin/build-locale-pack.js

* Console output improvements

* Also sort plugin locale keys

* Support dependencies when digging up sources

because e.g. 'emptyFolderAdded' is used in provider-views but set in Dashboard's defaultLocale

* More complex matching

So can can support cases like: `uppy.i18n(error.isAuthError ? 'companionAuthError' : 'companionError')`

* Remaining const defaultLocale -> this.defaultLocale

* Update packages/@uppy/locales/en_US.js

* Mock browser environment so all plugins can be instantiated

* Clean up output a bit

* Update bin/build-locale-pack.js

* Add all remaining plugin's locales to en_US bundle

* Update packages/@uppy/dashboard/src/index.js

* Update en_US.js

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* remove unused strings

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* Also write csv because that makes it real easy to import to friendlier places for translators /cc @arturi

* don’t set locale: this.defaultLocale — it overrides the lang pack

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* Add 'russian plural' for english, for consistency

Allows us to signal that this is possible in new target languages, and also run better linting

* Cleanup

* No longer write csv

* WIP for NL

* Create package.json

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* move locales to /src

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* ignore locales themselves

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* build minified locale packs

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* expose Uppy.locale = {} placeholder object

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* Update ru_RU.js

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* add locale bundles to example

Co-Authored-By: Kevin van Zonneveld <kevin@transloadit.com>

* Upload locales to cdn

* Allow to run tests with upload-to-cdn by setting a versionSuffix

* Move locale build to function, to make room for test()

* Bring ru_RU in sync with English

now that we've added 3 plural types across the board

* Document using locales as a consuming dev, and plugin dev

* Add linting for missing/excess locale strings

* Add the locales we had to remove to the legacy folder

and explain why they cannot make it back

* Move legacy outside of src so they are definitely not transpiled, etc

* Update packages/@uppy/locales/src/nl_NL.js

* Update website/src/docs/uppy.md
2019-04-17 13:34:23 +02:00
Alexander Zaytsev
ea80f830d9 Rename missing color variables 2019-04-10 14:56:08 +03:00
Alexander Zaytsev
f1916f6712 Simplify color name: cornflower-blue -> blue 2019-04-09 15:42:04 +03:00
Artur Paikin
7ae8af44ab Release 2019-04-04 19:31:09 +03:00
Artur Paikin
27899d944f Release 2019-03-08 20:47:42 +03:00
Renée Kooi
fd6734be4d
docs: update webpack homepage URLs 2019-03-04 13:43:37 +01:00
Artur Paikin
f94bc77deb Publish
- uppy@0.30.2
 - @uppy/aws-s3-multipart@0.30.2
 - @uppy/aws-s3@0.30.2
 - @uppy/companion-client@0.28.2
 - @uppy/companion@0.17.2
 - @uppy/core@0.30.2
 - @uppy/dashboard@0.30.2
 - @uppy/drag-drop@0.30.2
 - @uppy/dropbox@0.30.2
 - @uppy/file-input@0.30.2
 - @uppy/form@0.30.2
 - @uppy/golden-retriever@0.30.2
 - @uppy/google-drive@0.30.2
 - @uppy/informer@0.30.2
 - @uppy/instagram@0.30.2
 - @uppy/progress-bar@0.30.2
 - @uppy/provider-views@0.30.2
 - @uppy/react@0.30.2
 - @uppy/redux-dev-tools@0.30.2
 - @uppy/robodog@0.30.2
 - @uppy/status-bar@0.30.2
 - @uppy/store-default@0.28.2
 - @uppy/store-redux@0.28.2
 - @uppy/thumbnail-generator@0.30.2
 - @uppy/transloadit@0.30.2
 - @uppy/tus@0.30.2
 - @uppy/url@0.30.2
 - @uppy/utils@0.30.2
 - @uppy/webcam@0.30.2
 - @uppy/xhr-upload@0.30.2
2019-02-22 22:43:58 +03:00
Artur Paikin
a5c39e9a35 Release 2019-02-21 19:09:22 +03:00
Artur Paikin
4dcef4c3b9 Release 2019-02-15 23:55:18 +03:00
Artur Paikin
ea0befe4ce update peerDependencies before release 2019-02-15 22:09:12 +03:00
Renée Kooi
24ec8f81d5
Merge branch 'master' into feature/tl-preset 2019-01-21 10:55:27 +01:00
Renée Kooi
5800fe9ed6
Merge branch 'master' into feature/tl-preset 2019-01-17 16:54:44 +01:00
Artur Paikin
3ddf4c7548 Release 2019-01-15 19:21:04 +03:00
Artur Paikin
9fce77830b
Remove jsnext:main since it’s been deprecated
https://github.com/stereobooster/package.json#jsnextmain
2019-01-15 18:22:15 +03:00
Renée Kooi
3710b19e1b
Use export = in @uppy/core typings. 2018-12-20 14:51:42 +01:00
Renée Kooi
dd718ac02e
Merge branch 'master' into feature/tl-preset 2018-12-13 16:10:15 +01:00
Renée Kooi
1a0878a851
Merge pull request #1131 from mattes3/master
Make Uppy's React components usable from Typescript
2018-12-10 15:50:12 +01:00
Artur Paikin
c68f2c7e68 Release 2018-11-29 23:36:16 +03:00
Artur Paikin
faefe0d5f0 @uppy/core peerDependency --> ^0.29.0 2018-11-29 21:34:56 +03:00
Artur Paikin
cd8fae0ac9 Don’t bundle Core styles with everything, because of CSS conflicts
To use Dashboard, you now have to include the following css:
```js
import '@uppy/core/dist/style.css'
import '@uppy/dashboard/dist/style.css'
```
2018-11-22 13:59:02 +03:00
Renée Kooi
615581501f
fix join() error 2018-11-15 13:19:16 +01:00
Renée Kooi
c51652bf6b
transloadit: Add AttachFileInputs plugin 2018-11-15 13:19:15 +01:00
Matthias Bohlen
c8cb89bde0 Convert to "export =" everywhere because...
...the *.js source files use "module.exports = " instead of
"export default".
2018-11-12 12:05:54 +01:00
Artur Paikin
47a68a6148 Release 2018-10-31 19:30:39 +03:00
Artur Paikin
09b6ca0c92 update plugin peerDependencies to "@uppy/core": "^0.28.0" before release 2018-10-31 15:47:27 +03:00
Artur Paikin
5ec15c11ca update this.translator = new Translator in all plugins that use i18n
I wonder if this could somehow be done in Plugin class once
2018-10-20 12:50:34 -04:00
Artur Paikin
113d6f09bb Release
- uppy@0.27.5
 - @uppy/aws-s3-multipart@0.27.4
 - @uppy/aws-s3@0.27.4
 - @uppy/core@0.27.3
 - @uppy/dashboard@0.27.5
 - @uppy/drag-drop@0.27.4
 - @uppy/dropbox@0.27.4
 - @uppy/file-input@0.27.4
 - @uppy/form@0.27.4
 - @uppy/golden-retriever@0.27.4
 - @uppy/google-drive@0.27.5
 - @uppy/informer@0.27.4
 - @uppy/instagram@0.27.5
 - @uppy/progress-bar@0.27.4
 - @uppy/provider-views@0.27.4
 - @uppy/react@0.27.5
 - @uppy/redux-dev-tools@0.27.4
 - @uppy/status-bar@0.27.4
 - @uppy/thumbnail-generator@0.27.4
 - @uppy/transloadit@0.27.5
 - @uppy/tus@0.27.5
 - @uppy/url@0.27.5
 - @uppy/webcam@0.27.4
 - @uppy/xhr-upload@0.27.4
2018-09-27 16:31:35 -04:00