mirror of
https://github.com/transloadit/uppy.git
synced 2026-07-17 16:50:22 +00:00
Merge branch 'main' of https://github.com/transloadit/uppy into 5.0
This commit is contained in:
commit
6a33652458
270 changed files with 9117 additions and 1751 deletions
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
"@uppy/vue": patch
|
||||
---
|
||||
|
||||
Fix uppy prop in UppyContextProvider
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
"@uppy/webcam": minor
|
||||
---
|
||||
|
||||
Add image preview with accept/discard buttons
|
||||
|
|
@ -7,5 +7,27 @@
|
|||
"access": "public",
|
||||
"baseBranch": "main",
|
||||
"updateInternalDependencies": "patch",
|
||||
"ignore": []
|
||||
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
|
||||
"onlyUpdatePeerDependentsWhenOutOfRange": true
|
||||
},
|
||||
"ignore": [
|
||||
"example-angular",
|
||||
"example-aws-companion",
|
||||
"example-aws-nodejs",
|
||||
"example-aws-php",
|
||||
"example-cdn",
|
||||
"example-companion",
|
||||
"example-companion-custom-provider",
|
||||
"example-companion-digitalocean-spaces",
|
||||
"example-react",
|
||||
"example-react-native-expo",
|
||||
"example-redux",
|
||||
"example-sveltekit",
|
||||
"example-transloadit",
|
||||
"example-vue",
|
||||
"example-xhr-bundle",
|
||||
"example-xhr-node",
|
||||
"example-xhr-php",
|
||||
"example-xhr-python"
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
"@uppy/core": patch
|
||||
---
|
||||
|
||||
Resolve stale state in `checkAndUpdateFileState`
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
"@uppy/companion": minor
|
||||
---
|
||||
|
||||
Add provider name to metadata for observability
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
"@uppy/companion": patch
|
||||
---
|
||||
|
||||
Make StreamableBlob spec compliant for Node.js 24+
|
||||
5
.changeset/pretty-zebras-chew.md
Normal file
5
.changeset/pretty-zebras-chew.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"@uppy/provider-views": patch
|
||||
---
|
||||
|
||||
VirtualList now virtualises rows in the file list, as was intented. This means better performance when scrolling thousands for files.
|
||||
5
.changeset/rude-onions-smoke.md
Normal file
5
.changeset/rude-onions-smoke.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"@uppy/core": patch
|
||||
---
|
||||
|
||||
Fix retry after setting missed metaFields requiring you to click "retry" and then "upload" again. Now "retry" immediately restarts the upload.
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
"@uppy/locales": minor
|
||||
---
|
||||
|
||||
Update Swedish translations
|
||||
5
.changeset/warm-bulldogs-relate.md
Normal file
5
.changeset/warm-bulldogs-relate.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"@uppy/thumbnail-generator": patch
|
||||
---
|
||||
|
||||
Make tiny/small thumbnails look better by not scaling them to cover the entire grid item
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
---
|
||||
"@uppy/audio": minor
|
||||
"@uppy/aws-s3": minor
|
||||
"@uppy/aws-s3-multipart": minor
|
||||
"@uppy/box": minor
|
||||
"@uppy/companion-client": minor
|
||||
"@uppy/components": minor
|
||||
"@uppy/compressor": minor
|
||||
"@uppy/core": minor
|
||||
"@uppy/dashboard": minor
|
||||
"@uppy/drag-drop": minor
|
||||
"@uppy/drop-target": minor
|
||||
"@uppy/dropbox": minor
|
||||
"@uppy/facebook": minor
|
||||
"@uppy/file-input": minor
|
||||
"@uppy/form": minor
|
||||
"@uppy/golden-retriever": minor
|
||||
"@uppy/google-drive": minor
|
||||
"@uppy/google-drive-picker": minor
|
||||
"@uppy/google-photos-picker": minor
|
||||
"@uppy/image-editor": minor
|
||||
"@uppy/informer": minor
|
||||
"@uppy/instagram": minor
|
||||
"@uppy/locales": minor
|
||||
"@uppy/onedrive": minor
|
||||
"@uppy/progress-bar": minor
|
||||
"@uppy/provider-views": minor
|
||||
"@uppy/react": minor
|
||||
"@uppy/redux-dev-tools": minor
|
||||
"@uppy/remote-sources": minor
|
||||
"@uppy/screen-capture": minor
|
||||
"@uppy/status-bar": minor
|
||||
"@uppy/store-default": minor
|
||||
"@uppy/store-redux": minor
|
||||
"@uppy/svelte": minor
|
||||
"@uppy/thumbnail-generator": minor
|
||||
"@uppy/transloadit": minor
|
||||
"@uppy/tus": minor
|
||||
"@uppy/unsplash": minor
|
||||
"@uppy/url": minor
|
||||
"@uppy/utils": minor
|
||||
"@uppy/vue": minor
|
||||
"@uppy/webcam": minor
|
||||
"@uppy/webdav": minor
|
||||
"@uppy/xhr-upload": minor
|
||||
"@uppy/zoom": minor
|
||||
"uppy": minor
|
||||
---
|
||||
|
||||
Use TypeScript compiler instead of Babel
|
||||
469
.github/CONTRIBUTING.md
vendored
469
.github/CONTRIBUTING.md
vendored
|
|
@ -7,7 +7,7 @@ instructions.
|
|||
After you have successfully forked the repository, clone it locally.
|
||||
|
||||
```sh
|
||||
git clone https://github.com/transloadit/uppy.git
|
||||
git clone https://github.com/[your-username]/uppy.git
|
||||
cd uppy
|
||||
```
|
||||
|
||||
|
|
@ -24,24 +24,37 @@ corepack enable
|
|||
|
||||
## Development
|
||||
|
||||
First of all, install Uppy dependencies:
|
||||
Install dependencies:
|
||||
|
||||
```bash
|
||||
yarn install
|
||||
```
|
||||
|
||||
### Basic
|
||||
|
||||
To run a basic development version of Uppy, run:
|
||||
Build all packages:
|
||||
|
||||
```bash
|
||||
yarn dev
|
||||
yarn build
|
||||
```
|
||||
|
||||
and go to http://localhost:5174 (or whatever link the yarn command outputted).
|
||||
As you edit Uppy code, the browser will live reload the changes.
|
||||
### Development Commands
|
||||
|
||||
### Companion
|
||||
- `yarn dev` - Start development server at http://localhost:5174
|
||||
- `yarn dev:with-companion` - Start dev server with Companion for cloud integrations
|
||||
- `yarn start:companion` - Start only Companion server at http://localhost:3020
|
||||
- `yarn build:watch` - Build packages in watch mode
|
||||
- `yarn test` - Run tests for all packages
|
||||
- `yarn test:watch` - Run tests in watch mode
|
||||
- `yarn typecheck` - Run TypeScript type checking
|
||||
- `yarn check` - Run Biome linting and formatting
|
||||
|
||||
### Headless components
|
||||
|
||||
When adding a new component to `@uppy/components`, you have to run `yarn migrate:components` from root
|
||||
to migrate the Preact components to React, Svelte, and Vue.
|
||||
|
||||
This is not needed for changing existing components.
|
||||
|
||||
## Companion
|
||||
|
||||
If you’d like to work on features that the basic development version of Uppy
|
||||
doesn’t support, such as Uppy integrations with Instagram/Google Drive/Facebook
|
||||
|
|
@ -62,12 +75,6 @@ This would get the Companion instance running on `http://localhost:3020`. It
|
|||
uses [nodemon](https://github.com/remy/nodemon) so it will automatically restart
|
||||
when files are changed.
|
||||
|
||||
### Live example
|
||||
|
||||
An example server is running at <https://companion.uppy.io>, which is deployed
|
||||
with
|
||||
[Kubernetes](https://github.com/transloadit/uppy/blob/main/packages/%40uppy/companion/KUBERNETES.md)
|
||||
|
||||
### How the Authentication and Token mechanism works
|
||||
|
||||
This section describes how Authentication works between Companion and Providers.
|
||||
|
|
@ -101,438 +108,6 @@ Authenticates and Uploads from Dropbox through Companion:
|
|||
- Companion reports progress to Uppy, as if it were a local upload.
|
||||
- Completed!
|
||||
|
||||
### Requiring files
|
||||
|
||||
- If we are `require()`ing a file from the same subpackage, we can freely use
|
||||
relative imports as long as the required file is under the `src` directory
|
||||
(for example to import `@uppy/dashboard/src/utils/hi.js` from
|
||||
`@uppy/dashboard/src/index.js`, use `require('./utils/hi.js')`).
|
||||
- But if we want to `require()` some file from another subpackage - we should
|
||||
use global @uppy requires, and they should always be in the form of
|
||||
`@uppy/:packageName/(lib instead of src)/(same path).js`
|
||||
|
||||
## Tests
|
||||
|
||||
### Unit tests
|
||||
|
||||
Unit tests are using Vitest and can be run with:
|
||||
|
||||
```bash
|
||||
yarn test:unit
|
||||
```
|
||||
|
||||
### End-to-End tests
|
||||
|
||||
We use [Cypress](https://www.cypress.io/) for our e2e test suite. Be sure to
|
||||
checkout
|
||||
“[Writing your first test](https://docs.cypress.io/guides/getting-started/writing-your-first-test#Add-a-test-file)”
|
||||
and the
|
||||
“[Introduction to Cypress](https://docs.cypress.io/guides/core-concepts/introduction-to-cypress#Cypress-Can-Be-Simple-Sometimes)”.
|
||||
You should also be aware of the
|
||||
“[Best Practices](https://docs.cypress.io/guides/references/best-practices)”.
|
||||
|
||||
To get started make sure you have your `.env` set up. Copy the contents of
|
||||
`.env.example` to a file named `.env` and add the values relevant for the
|
||||
test(s) you are trying to run.
|
||||
|
||||
To start the testing suite run:
|
||||
|
||||
```
|
||||
yarn e2e
|
||||
```
|
||||
|
||||
This will run Cypress in watch-mode, and it will pick up and rebuild any changes
|
||||
to JS files. If you need to change other files (like CSS for example), you need
|
||||
to run the respective `yarn build:*` scripts.
|
||||
|
||||
Alternatively the following command is the same as the above, except it doesn’t
|
||||
run `build` first:
|
||||
|
||||
```
|
||||
yarn e2e:skip-build
|
||||
```
|
||||
|
||||
To generate the boilerplate for a new test run:
|
||||
|
||||
```
|
||||
yarn e2e:generate
|
||||
```
|
||||
|
||||
## Releases
|
||||
|
||||
Releases are managed by GitHub Actions, here’s an overview of the process to
|
||||
release a new Uppy version:
|
||||
|
||||
- Run `yarn release` on your local machine.
|
||||
- Follow the instructions and select what packages to release. **Warning:**
|
||||
skipping packages results in those changes being “lost”, meaning they won’t be
|
||||
picked up in the changelog automatically next release. Always try to release
|
||||
all.
|
||||
- Before committing, check if the generated files look good.
|
||||
- When asked to edit the next CHANGELOG, only include changes related to the
|
||||
package(s) you selected for release.
|
||||
- Push to the Transloadit repository using the command given by the tool. Do not
|
||||
open a PR yourself, the GitHub Actions will create one and assign you to it.
|
||||
- Wait for all the GitHub Actions checks to pass. If one fails, try to figure
|
||||
out why. Do not go ahead without consulting the rest of the team.
|
||||
- Review the PR thoroughly, and if everything looks good to you, approve the PR.
|
||||
Do not merge it manually!
|
||||
- After the PR is automatically merged, the demos on transloadit.com should also
|
||||
be updated. Check that some things work locally:
|
||||
- the demos in the demo section work (try one that uses an import robot, and
|
||||
one that you need to upload to)
|
||||
- the demos on the homepage work and can import from Google Drive, Instagram,
|
||||
Dropbox, etc.
|
||||
|
||||
If you don’t have access to the transloadit.com source code ping @arturi or
|
||||
@goto-bus-stop and we’ll pick it up. :sparkles:
|
||||
|
||||
### Fixing a broken release
|
||||
|
||||
If the `Release` job fails, it will merge the release PR and deletes the branch
|
||||
and there’s no way of going back with that PR. Instead you have to reverse the
|
||||
release commit and run the Release candidate job again to create a new release
|
||||
PR:
|
||||
|
||||
1. Checkout `main` locally and reverse the automatically release commit
|
||||
2. Do whatever changes need to be done on `main`
|
||||
3. Commit and push `main`
|
||||
4. Now checkout the `release` branch and rebase it onto `main`, then push it
|
||||
5. A new release PR will now be created and you can start over
|
||||
6. Delete tags for the original release commit (`COMMIT_ID`):
|
||||
|
||||
```bash
|
||||
git tag --points-at COMMIT_ID | tee /dev/tty | xargs -n 1 git tag -d
|
||||
```
|
||||
|
||||
7. Push the deleted tags:
|
||||
|
||||
```bash
|
||||
git tag --points-at COMMIT_ID | xargs -n 1 -I {} echo ":refs/tags/{}" | xargs git push origin
|
||||
```
|
||||
|
||||
### Releasing hotfix patch
|
||||
|
||||
#### Companion hotfix
|
||||
|
||||
First checkout the tag of the version you want to patch:
|
||||
|
||||
```bash
|
||||
git checkout @uppy/companion@x.y.z
|
||||
```
|
||||
|
||||
Now create a branch for your hotfix:
|
||||
|
||||
```bash
|
||||
git checkout -b x.y.z-hotfix
|
||||
```
|
||||
|
||||
Run yarn to make sure all packages are consistent:
|
||||
|
||||
```bash
|
||||
corepack yarn
|
||||
```
|
||||
|
||||
Now navigate to the Companion workspace:
|
||||
|
||||
```bash
|
||||
cd packages/@uppy/companion
|
||||
```
|
||||
|
||||
**Now cherry pick your desired commits**.
|
||||
|
||||
Next edit `CHANGELOG.md` and then commit it:
|
||||
|
||||
```bash
|
||||
git add CHANGELOG.md
|
||||
git commit -m 'Update changelog'
|
||||
```
|
||||
|
||||
Now let’s create the version & tag:
|
||||
|
||||
```bash
|
||||
mkdir -p .git && npm version --workspaces-update=false --tag-version-prefix='@uppy/companion@' patch
|
||||
```
|
||||
|
||||
**Important:** Build Companion lib folder
|
||||
|
||||
```bash
|
||||
yarn run build
|
||||
```
|
||||
|
||||
Run a “dry-run” first:
|
||||
|
||||
```bash
|
||||
corepack yarn pack
|
||||
```
|
||||
|
||||
If the earlier command succeeded, let’s publish!
|
||||
|
||||
```bash
|
||||
corepack yarn npm publish --access public --tag=none
|
||||
```
|
||||
|
||||
Now we can push our branch and tags.
|
||||
|
||||
```bash
|
||||
git push && git push --tags
|
||||
```
|
||||
|
||||
#### Hotfix other packages
|
||||
|
||||
For other Uppy packages, the process should be like Companion, but hasn’t been
|
||||
documented yet. Make sure to remember to run `yarn` as well as building the
|
||||
package first, then you can release it. If you do release any other packages,
|
||||
please update this doc.
|
||||
|
||||
## CSS guidelines
|
||||
|
||||
The CSS standards followed in this project closely resemble those from
|
||||
[Medium’s CSS Guidelines](https://gist.github.com/fat/a47b882eb5f84293c4ed). If
|
||||
something is not mentioned here, follow their guidelines.
|
||||
|
||||
### Naming conventions
|
||||
|
||||
This project uses naming conventions adopted from the SUIT CSS framework.
|
||||
[Read about them here](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md).
|
||||
|
||||
To quickly summarize:
|
||||
|
||||
#### Utilities
|
||||
|
||||
Syntax: `u-[sm-|md-|lg-]<utilityName>`
|
||||
|
||||
```css
|
||||
.u-utilityName
|
||||
.u-floatLeft
|
||||
.u-lg-col6
|
||||
```
|
||||
|
||||
#### Components
|
||||
|
||||
Syntax: `[<namespace>-]<ComponentName>[-descendentName][--modifierName]`
|
||||
|
||||
```css
|
||||
.twt-Button /* Namespaced component */
|
||||
.MyComponent /* Components pascal cased */
|
||||
.Button--default /* Modified button style */
|
||||
.Button--large
|
||||
|
||||
.Tweet
|
||||
.Tweet-header /* Descendents */
|
||||
.Tweet-bodyText
|
||||
|
||||
.Accordion.is-collapsed /* State of component */
|
||||
.Accordion.is-expanded
|
||||
```
|
||||
|
||||
### SASS
|
||||
|
||||
This project uses SASS, with some limitations on nesting. One-level-deep nesting
|
||||
is allowed, but nesting may not extend a selector by using the `&` operator. For
|
||||
example:
|
||||
|
||||
```sass
|
||||
/* BAD */
|
||||
.Button {
|
||||
&--disabled {
|
||||
...
|
||||
}
|
||||
}
|
||||
|
||||
/* GOOD */
|
||||
.Button {
|
||||
...
|
||||
}
|
||||
|
||||
.Button--disabled {
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### Mobile-first responsive approach
|
||||
|
||||
Style to the mobile breakpoint with your selectors, then use `min-width` media
|
||||
queries to add any styles to the tablet or desktop breakpoints.
|
||||
|
||||
### Selector, rule ordering
|
||||
|
||||
- All selectors are sorted alphabetically and by type.
|
||||
- HTML elements go above classes and IDs in a file.
|
||||
- Rules are sorted alphabetically.
|
||||
|
||||
```scss
|
||||
/* BAD */
|
||||
.wrapper {
|
||||
width: 940px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.article {
|
||||
width: 100%;
|
||||
padding: 32px;
|
||||
}
|
||||
|
||||
/* GOOD */
|
||||
h1 {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.article {
|
||||
padding: 32px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
margin: auto;
|
||||
width: 940px;
|
||||
}
|
||||
```
|
||||
|
||||
## Adding a new integration
|
||||
|
||||
Before opening a pull request for the new integration, open an issue to discuss
|
||||
said integration with the Uppy team. After discussing the integration, you can
|
||||
get started on it. First off, you need to construct the basic components for
|
||||
your integration. The following components are the current standard:
|
||||
|
||||
- `Dashboard`: Inline Dashboard (`inline: true`)
|
||||
- `DashboardModal`: Dashboard as a modal
|
||||
- `DragDrop`
|
||||
- `ProgressBar`
|
||||
- `StatusBar`
|
||||
|
||||
All these components should function as references to the normal component.
|
||||
Depending on how the framework you’re using handles references to the DOM, your
|
||||
approach to creating these may be different. For example, in React, you can
|
||||
assign a property of the component to the reference of a component
|
||||
([see here](https://github.com/transloadit/uppy/blob/425f9ecfbc8bc48ce6b734e4fc14fa60d25daa97/packages/%40uppy/react/src/Dashboard.js#L47-L54)).
|
||||
This may differ in your framework, but from what we’ve found, the concepts are
|
||||
generally pretty similar.
|
||||
|
||||
If you’re familiar with React, Vue or soon Svelte, it might be useful to read
|
||||
through the code of those integrations, as they lay out a pretty good structure.
|
||||
After the basic components have been built, here are a few more important tasks
|
||||
to get done:
|
||||
|
||||
- Add TypeScript support in some capacity (if possible)
|
||||
- Write documentation
|
||||
- Add an example
|
||||
- Configuring the build system
|
||||
|
||||
### Common issues
|
||||
|
||||
Before going into these tasks, here are a few common gotchas that you should be
|
||||
aware of.
|
||||
|
||||
#### Dependencies
|
||||
|
||||
Your `package.json` should resemble something like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "@uppy/framework",
|
||||
"dependencies": {
|
||||
"@uppy/dashboard": "workspace:^",
|
||||
"@uppy/drag-drop": "workspace:^",
|
||||
"@uppy/progress-bar": "workspace:^",
|
||||
"@uppy/utils": "workspace:^",
|
||||
"prop-types": "^15.6.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@uppy/core": "workspace:^"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The most important part about this is that `@uppy/core` is a peer dependency. If
|
||||
your framework complains about `@uppy/core` not being resolved, you can also add
|
||||
it as a dev dependency
|
||||
|
||||
### Adding TypeScript Support
|
||||
|
||||
This section won’t be too in-depth, because TypeScript depends on your
|
||||
framework. As general advice, prefer using `d.ts` files and vanilla JavaScript
|
||||
over TypeScript files. This is circumstantial, but it makes handling the build
|
||||
system a lot easier when TypeScript doesn’t have to transpiled. The version of
|
||||
typescript in the monorepo is `4.1`.
|
||||
|
||||
### Writing docs
|
||||
|
||||
Generally, documentation for integrations can be broken down into a few pieces
|
||||
that apply to every component, and then documentation for each component. The
|
||||
structure should look something like this:
|
||||
|
||||
- Installation
|
||||
- Initializing Uppy (may vary depending on how the framework handles reactivity)
|
||||
- Usage
|
||||
- _For each component_
|
||||
- Loading CSS
|
||||
- Props
|
||||
|
||||
It may be easier to copy the documentation of earlier integrations and change
|
||||
the parts that need to be changed rather than writing this from scratch.
|
||||
Preferably, keep the documentation to one page. For the front-matter, write
|
||||
something like:
|
||||
|
||||
```markdown
|
||||
title: Framework Name type: docs module: "@uppy/framework" order: 0 category:
|
||||
"Other Integrations"
|
||||
```
|
||||
|
||||
This data is used to generate Uppy’s website.
|
||||
|
||||
Any change of the documentation that involves a security best practice must
|
||||
substantiated with an external reference. See
|
||||
[#3565](https://github.com/transloadit/uppy/issues/3565).
|
||||
|
||||
### Adding an example
|
||||
|
||||
You can likely use whatever code generation tool for your framework (ex.
|
||||
`create-react-app`) to create this example. Make sure you add the same version
|
||||
of `@uppy/core` to this as your peer dependency required, or you may run into
|
||||
strange issues. Try to include all the components are some of their
|
||||
functionality.
|
||||
[The React example](https://github.com/transloadit/uppy/blob/main/examples/react-example/App.tsx)
|
||||
is a great... well example of how to do this well.
|
||||
|
||||
### Integrating the build system
|
||||
|
||||
The biggest part of this is understanding Uppy’s build system. The high level
|
||||
description is that `babel` goes through almost all the packages and transpiles
|
||||
all the Javascript files in the `src` directory to more compatible JavaScript in
|
||||
the `lib` folder. If you’re using vanilla JavaScript for your integration (like
|
||||
React and Vue do), then you can use this build system and use the files
|
||||
generated as your entry points.
|
||||
|
||||
If you’re using some kind of more abstract file format (like Svelte), then you
|
||||
probably want do to a few things: add the directory name to
|
||||
[this `IGNORE` regex](https://github.com/transloadit/uppy/blob/425f9ecfbc8bc48ce6b734e4fc14fa60d25daa97/bin/build-lib.js#L15);
|
||||
add all your build dependencies to the root `package.json` (try to keep this
|
||||
small); add a new `build:framework` script to the root `package.json`. This
|
||||
script usually looks something like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"build:framework": "cd framework && yarn run build"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Then, add this script to the `build:js` script. Try running the `build:js`
|
||||
script and make sure it does not error. It may also be of use to make sure that
|
||||
global dependencies aren’t being used (ex. not having rollup locally and relying
|
||||
on a global install), as these dependencies won’t be present on the machine’s
|
||||
handling building.
|
||||
|
||||
## I18n and locales
|
||||
|
||||
For more information about how to contribute to translations, see
|
||||
|
|
|
|||
2
.github/workflows/bundlers.yml
vendored
2
.github/workflows/bundlers.yml
vendored
|
|
@ -24,7 +24,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run:
|
||||
|
|
|
|||
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
|
|
@ -37,7 +37,7 @@ jobs:
|
|||
node-version: [lts/*]
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run:
|
||||
|
|
@ -74,7 +74,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run:
|
||||
|
|
@ -103,7 +103,7 @@ jobs:
|
|||
SKIP_YARN_COREPACK_CHECK: true
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
|
|
|||
8
.github/workflows/companion-deploy.yml
vendored
8
.github/workflows/companion-deploy.yml
vendored
|
|
@ -20,7 +20,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Set SHA commit in version
|
||||
run:
|
||||
(cd packages/@uppy/companion && node -e 'const
|
||||
|
|
@ -46,7 +46,7 @@ jobs:
|
|||
COMPOSE_DOCKER_CLI_BUILD: 0
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Docker meta
|
||||
id: docker_meta
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
|
||||
|
|
@ -58,7 +58,7 @@ jobs:
|
|||
- uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
- uses: docker/setup-buildx-action@v3
|
||||
- name: Log in to DockerHub
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||
with:
|
||||
username: ${{secrets.DOCKER_USERNAME}}
|
||||
password: ${{secrets.DOCKER_PASSWORD}}
|
||||
|
|
@ -77,7 +77,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Alter dockerfile
|
||||
run: |
|
||||
sed -i 's/^EXPOSE 3020$/EXPOSE $PORT/g' Dockerfile
|
||||
|
|
|
|||
2
.github/workflows/e2e.yml
vendored
2
.github/workflows/e2e.yml
vendored
|
|
@ -36,7 +36,7 @@ jobs:
|
|||
diff: ${{ steps.diff.outputs.OUTPUT_DIFF }}
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 2
|
||||
ref: ${{ github.event.pull_request && format('refs/pull/{0}/merge', github.event.pull_request.number) || github.sha }}
|
||||
|
|
|
|||
2
.github/workflows/lockfile_check.yml
vendored
2
.github/workflows/lockfile_check.yml
vendored
|
|
@ -20,7 +20,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run:
|
||||
|
|
|
|||
2
.github/workflows/manual-cdn.yml
vendored
2
.github/workflows/manual-cdn.yml
vendored
|
|
@ -25,7 +25,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run:
|
||||
|
|
|
|||
78
.github/workflows/release.yml
vendored
78
.github/workflows/release.yml
vendored
|
|
@ -11,9 +11,14 @@ jobs:
|
|||
release:
|
||||
name: Release
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
companionWasReleased: ${{ steps.checkIfCompanionWasReleased.outputs.version }}
|
||||
published: ${{ steps.changesets.outputs.published }}
|
||||
steps:
|
||||
- name: Checkout Repo
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
|
@ -30,6 +35,13 @@ jobs:
|
|||
- name: Build
|
||||
run: corepack yarn build
|
||||
|
||||
- name: '@uppy/angular prepublish'
|
||||
run: corepack yarn workspace @uppy/angular prepublishOnly
|
||||
|
||||
- run: |
|
||||
echo '' >> .yarnrc.yml
|
||||
echo 'npmAuthToken: "${NPM_TOKEN}"' >> .yarnrc.yml
|
||||
|
||||
- name: Create Release Pull Request or Publish
|
||||
id: changesets
|
||||
uses: changesets/action@v1
|
||||
|
|
@ -41,3 +53,67 @@ jobs:
|
|||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
- name: Remove npmAuthToken from yarnrc
|
||||
run: |
|
||||
sed -i '/npmAuthToken:/d' .yarnrc.yml
|
||||
|
||||
- name: Check if Companion was released
|
||||
id: checkIfCompanionWasReleased
|
||||
if: steps.changesets.outputs.published == 'true'
|
||||
run: |
|
||||
git diff --exit-code --quiet HEAD^ -- packages/@uppy/companion/package.json || echo "version=$(jq -r .version < packages/@uppy/companion/package.json)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Upload `uppy` to CDN
|
||||
if: steps.changesets.outputs.published == 'true'
|
||||
run: node packages/uppy/upload-to-cdn.js uppy
|
||||
env:
|
||||
EDGLY_KEY: ${{secrets.EDGLY_KEY}}
|
||||
EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
|
||||
|
||||
- name: Upload `@uppy/locales` to CDN if it was released
|
||||
if: steps.changesets.outputs.published == 'true'
|
||||
run: node packages/uppy/upload-to-cdn.js @uppy/locales
|
||||
env:
|
||||
EDGLY_KEY: ${{secrets.EDGLY_KEY}}
|
||||
EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
|
||||
|
||||
|
||||
# See also companion-deploy.yml
|
||||
docker:
|
||||
name: DockerHub
|
||||
needs: release
|
||||
if: ${{ needs.release.outputs.published == 'true' && needs.release.outputs.companionWasReleased }}
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
DOCKER_BUILDKIT: 0
|
||||
COMPOSE_DOCKER_CLI_BUILD: 0
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v5
|
||||
- name: Docker meta
|
||||
id: docker_meta
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
|
||||
with:
|
||||
images: transloadit/companion
|
||||
tags: |
|
||||
type=edge
|
||||
type=semver,pattern={{version}},value=${{ needs.release.outputs.companionWasReleased }}
|
||||
# set latest tag for default branch
|
||||
type=raw,value=latest,enable=true
|
||||
- uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
- uses: docker/setup-buildx-action@v3
|
||||
- name: Log in to DockerHub
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||
with:
|
||||
username: ${{secrets.DOCKER_USERNAME}}
|
||||
password: ${{secrets.DOCKER_PASSWORD}}
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
|
||||
with:
|
||||
push: true
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
file: Dockerfile
|
||||
tags: ${{ steps.docker_meta.outputs.tags }}
|
||||
labels: ${{ steps.docker_meta.outputs.labels }}
|
||||
|
|
|
|||
1
.npmrc
Normal file
1
.npmrc
Normal file
|
|
@ -0,0 +1 @@
|
|||
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
|
||||
52
.yarn/patches/@changesets-cli-npm-2.29.5-68d8030bf3.patch
Normal file
52
.yarn/patches/@changesets-cli-npm-2.29.5-68d8030bf3.patch
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
diff --git a/dist/changesets-cli.cjs.js b/dist/changesets-cli.cjs.js
|
||||
index 82ed39a6b2a38fe0aaabb71c2ec745c502dbe06a..c779498212942c5ee822501a5630c3755e335db8 100644
|
||||
--- a/dist/changesets-cli.cjs.js
|
||||
+++ b/dist/changesets-cli.cjs.js
|
||||
@@ -634,9 +634,8 @@ async function getPublishTool(cwd) {
|
||||
const pm = await packageManagerDetector.detect({
|
||||
cwd
|
||||
});
|
||||
- if (!pm || pm.name !== "pnpm") return {
|
||||
- name: "npm"
|
||||
- };
|
||||
+ if (!pm) return { name: "npm" };
|
||||
+ if (pm.name === "yarn") return { name: "yarn" };
|
||||
try {
|
||||
let result = await spawn__default["default"]("pnpm", ["--version"], {
|
||||
cwd
|
||||
@@ -771,6 +770,9 @@ async function internalPublish(packageJson, opts, twoFactorState) {
|
||||
} = publishTool.name === "pnpm" ? await spawn__default["default"]("pnpm", ["publish", "--json", ...publishFlags], {
|
||||
env: Object.assign({}, process.env, envOverride),
|
||||
cwd: opts.cwd
|
||||
+ }) : publishTool.name === "yarn" ? await spawn__default["default"]("yarn", ["npm", "publish", ...publishFlags], {
|
||||
+ env: Object.assign({}, process.env, envOverride),
|
||||
+ cwd: opts.cwd,
|
||||
}) : await spawn__default["default"](publishTool.name, ["publish", opts.publishDir, "--json", ...publishFlags], {
|
||||
env: Object.assign({}, process.env, envOverride)
|
||||
});
|
||||
diff --git a/dist/changesets-cli.esm.js b/dist/changesets-cli.esm.js
|
||||
index 1e945455b39b9c6424b26960b3d26a095ad980e4..3a7339db5d9d1ffac16c0ef5a7d56a9d506483a4 100644
|
||||
--- a/dist/changesets-cli.esm.js
|
||||
+++ b/dist/changesets-cli.esm.js
|
||||
@@ -596,9 +596,8 @@ async function getPublishTool(cwd) {
|
||||
const pm = await detect({
|
||||
cwd
|
||||
});
|
||||
- if (!pm || pm.name !== "pnpm") return {
|
||||
- name: "npm"
|
||||
- };
|
||||
+ if (!pm) return { name: "npm" };
|
||||
+ if (pm.name === "yarn") return { name: "yarn" };
|
||||
try {
|
||||
let result = await spawn$1("pnpm", ["--version"], {
|
||||
cwd
|
||||
@@ -733,6 +732,9 @@ async function internalPublish(packageJson, opts, twoFactorState) {
|
||||
} = publishTool.name === "pnpm" ? await spawn$1("pnpm", ["publish", "--json", ...publishFlags], {
|
||||
env: Object.assign({}, process.env, envOverride),
|
||||
cwd: opts.cwd
|
||||
+ }) : publishTool.name === "yarn" ? await spawn$1("yarn", ["npm", "publish", ...publishFlags], {
|
||||
+ env: Object.assign({}, process.env, envOverride),
|
||||
+ cwd: opts.cwd,
|
||||
}) : await spawn$1(publishTool.name, ["publish", opts.publishDir, "--json", ...publishFlags], {
|
||||
env: Object.assign({}, process.env, envOverride)
|
||||
});
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
diff --git a/package.json b/package.json
|
||||
index d4133284745349488cf0e623b983c78fd7cc7fb7..52433fa0ecea99ebbfe5b94a8023f73350896f7d 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -6,6 +6,7 @@
|
||||
"repository": "sindresorhus/p-queue",
|
||||
"funding": "https://github.com/sponsors/sindresorhus",
|
||||
"type": "module",
|
||||
+ "main": "./dist/index.js",
|
||||
"exports": {
|
||||
"types": "./dist/index.d.ts",
|
||||
"default": "./dist/index.js"
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
diff --git a/src/index.d.ts b/src/index.d.ts
|
||||
index 74aacc0526ff554e9248c3f6fb44c353b5465efc..1b236d215a9db4cbc1c83f4d8bce24add202483e 100644
|
||||
--- a/src/index.d.ts
|
||||
+++ b/src/index.d.ts
|
||||
@@ -1,14 +1,3 @@
|
||||
-interface DOMRectReadOnly {
|
||||
- readonly x: number;
|
||||
- readonly y: number;
|
||||
- readonly width: number;
|
||||
- readonly height: number;
|
||||
- readonly top: number;
|
||||
- readonly right: number;
|
||||
- readonly bottom: number;
|
||||
- readonly left: number;
|
||||
-}
|
||||
-
|
||||
declare global {
|
||||
interface ResizeObserverCallback {
|
||||
(entries: ResizeObserverEntry[], observer: ResizeObserver): void
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
diff --git a/src/utils.js b/src/utils.js
|
||||
index 1f636c6617a71a68318dc587a1c9e6081020f9aa..b28e840ed08f26a4eadd242a6f541fbaefea0eda 100644
|
||||
--- a/src/utils.js
|
||||
+++ b/src/utils.js
|
||||
@@ -112,7 +112,7 @@ const getArguments = cliArgs => {
|
||||
}
|
||||
|
||||
function normalizeCommand (command) {
|
||||
- return UTILS.isPackageScriptName(command) ? `npm run ${command}` : command
|
||||
+ return UTILS.isPackageScriptName(command) ? `corepack yarn ${command}` : command
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
diff --git a/package.json b/package.json
|
||||
index f0ab3711ee4f490cbf961ebe6283ce2a28b6824b..644235a3ef52c974e946403a3fcdd137d01fad0c 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -25,6 +25,7 @@
|
||||
"require": "./dist/index.js",
|
||||
"import": "./wrapper.mjs"
|
||||
},
|
||||
+ "jest": "./dist/index.js",
|
||||
"default": "./dist/esm-browser/index.js"
|
||||
},
|
||||
"./package.json": "./package.json"
|
||||
|
|
@ -8,3 +8,6 @@ compressionLevel: mixed
|
|||
initScope: uppy
|
||||
|
||||
nodeLinker: node-modules
|
||||
|
||||
npmPublishAccess: public
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Hi, thanks for trying out the bundled version of the Uppy File Uploader. You can
|
||||
use this from a CDN
|
||||
(`<script src="https://releases.transloadit.com/uppy/v4.18.0/uppy.min.js"></script>`)
|
||||
(`<script src="https://releases.transloadit.com/uppy/v4.18.2/uppy.min.js"></script>`)
|
||||
or bundle it with your webapp.
|
||||
|
||||
Note that the recommended way to use Uppy is to install it with yarn/npm and use
|
||||
|
|
|
|||
37
README.md
37
README.md
|
|
@ -30,7 +30,7 @@ Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
|
|||
a versatile API to handle any file in your app.
|
||||
|
||||
<table>
|
||||
<tr><th>Tests</th><td><img src="https://github.com/transloadit/uppy/workflows/CI/badge.svg" alt="CI status for Uppy tests"></td><td><img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests"></td><td><img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests"></td></tr>
|
||||
<tr><th>Tests</th><td><img src="https://github.com/transloadit/uppy/workflows/CI/badge.svg" alt="CI status for Uppy tests"></td><td><img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests"></td></tr>
|
||||
<tr><th>Deploys</th><td><img src="https://github.com/transloadit/uppy/workflows/Release/badge.svg" alt="CI status for CDN deployment"></td><td><img src="https://github.com/transloadit/uppy/workflows/Companion%20Edge%20Deploy/badge.svg" alt="CI status for Companion deployment"></td><td><img src="https://github.com/transloadit/uppy.io/workflows/Deploy%20to%20GitHub%20Pages/badge.svg" alt="CI status for website deployment"></td></tr>
|
||||
</table>
|
||||
|
||||
|
|
@ -61,6 +61,22 @@ const uppy = new Uppy()
|
|||
**[read the docs](https://uppy.io/docs)** for more details on how to use Uppy
|
||||
and its plugins.
|
||||
|
||||
## Integrations
|
||||
|
||||
Uppy has first-class support for plain JS/HTML,
|
||||
[React](https://uppy.io/docs/react/), [Svelte](https://uppy.io/docs/svelte/),
|
||||
[Vue](https://uppy.io/docs/vue/), and [Angular](https://uppy.io/docs/angular/).
|
||||
|
||||
For the supported frameworks (except Angular) Uppy offers three ways to build user interfaces:
|
||||
|
||||
1. **Pre-composed, plug-and-play components.** Mainly `<Dashboard />`.
|
||||
The downside is that you can’t customize the UI.
|
||||
2. **Headless components.** Smaller components, easier to override the styles
|
||||
or compose them together with your own components.
|
||||
3. **Hooks.** Attach our logic to your own components, no restrictions, create a
|
||||
tailor-made UI.
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
- Lightweight, modular plugin-based architecture, light on dependencies :zap:
|
||||
|
|
@ -87,7 +103,7 @@ npm install @uppy/core @uppy/dashboard @uppy/tus
|
|||
```
|
||||
|
||||
Add CSS
|
||||
[uppy.min.css](https://releases.transloadit.com/uppy/v4.18.0/uppy.min.css),
|
||||
[uppy.min.css](https://releases.transloadit.com/uppy/v4.18.2/uppy.min.css),
|
||||
either to your HTML page’s `<head>` or include in JS, if your bundler of choice
|
||||
supports it.
|
||||
|
||||
|
|
@ -101,7 +117,7 @@ CDN. In that case `Uppy` will attach itself to the global `window.Uppy` object.
|
|||
```html
|
||||
<!-- 1. Add CSS to `<head>` -->
|
||||
<link
|
||||
href="https://releases.transloadit.com/uppy/v4.18.0/uppy.min.css"
|
||||
href="https://releases.transloadit.com/uppy/v4.18.2/uppy.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
|
||||
|
|
@ -112,7 +128,7 @@ CDN. In that case `Uppy` will attach itself to the global `window.Uppy` object.
|
|||
Uppy,
|
||||
Dashboard,
|
||||
Tus,
|
||||
} from 'https://releases.transloadit.com/uppy/v4.18.0/uppy.min.mjs'
|
||||
} from 'https://releases.transloadit.com/uppy/v4.18.2/uppy.min.mjs'
|
||||
|
||||
const uppy = new Uppy()
|
||||
uppy.use(Dashboard, { target: '#files-drag-drop' })
|
||||
|
|
@ -138,14 +154,7 @@ CDN. In that case `Uppy` will attach itself to the global `window.Uppy` object.
|
|||
- [`Dashboard`](https://uppy.io/docs/dashboard/) — universal UI with previews,
|
||||
progress bars, metadata editor and all the cool stuff. Required for most UI
|
||||
plugins like Webcam and Instagram
|
||||
- [`Progress Bar`](https://uppy.io/docs/progress-bar/) — minimal progress bar
|
||||
that fills itself when upload progresses
|
||||
- [`Status Bar`](https://uppy.io/docs/status-bar/) — more detailed progress,
|
||||
pause/resume/cancel buttons, percentage, speed, uploaded/total sizes (included
|
||||
by default with `Dashboard`)
|
||||
- [`Informer`](https://uppy.io/docs/informer/) — send notifications like “smile”
|
||||
before taking a selfie or “upload failed” when all is lost (also included by
|
||||
default with `Dashboard`)
|
||||
- Headless components ([react](https://uppy.io/docs/react/), [svelte](https://uppy.io/docs/svelte/), [vue](https://uppy.io/docs/vue/))
|
||||
|
||||
### Sources
|
||||
|
||||
|
|
@ -177,8 +186,6 @@ server-side component, is needed for a plugin to work.
|
|||
backend out there (like Apache, Nginx)
|
||||
- [`AWS S3`](https://uppy.io/docs/aws-s3/) — plain upload to AWS S3 or
|
||||
compatible services
|
||||
- [`AWS S3 Multipart`](https://uppy.io/docs/aws-s3-multipart/) — S3-style
|
||||
“Multipart” upload to AWS or compatible services
|
||||
|
||||
### File Processing
|
||||
|
||||
|
|
@ -194,6 +201,8 @@ server-side component, is needed for a plugin to work.
|
|||
image previews (included by default with `Dashboard`)
|
||||
- [`Form`](https://uppy.io/docs/form/) — collects metadata from `<form>` right
|
||||
before an Uppy upload, then optionally appends results back to the form
|
||||
- [`Redux`](https://uppy.io/docs/guides/custom-stores#reduxstore) — for your
|
||||
emerging [time traveling](https://github.com/gaearon/redux-devtools) needs
|
||||
|
||||
## React
|
||||
|
||||
|
|
|
|||
21
biome.json
21
biome.json
|
|
@ -10,6 +10,7 @@
|
|||
"includes": [
|
||||
"packages/**",
|
||||
"examples/**",
|
||||
"scripts/**",
|
||||
"bin/**",
|
||||
"e2e/**",
|
||||
"private/**",
|
||||
|
|
@ -26,14 +27,26 @@
|
|||
},
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"includes": ["!**/*.vue", "!**/*.svelte"],
|
||||
"includes": [
|
||||
"packages/**",
|
||||
"examples/**",
|
||||
"scripts/**",
|
||||
"private/**",
|
||||
"!packages/**/{dist,lib}/**",
|
||||
"!node_modules",
|
||||
"!.svelte-kit",
|
||||
"!packages/@uppy/components/src/input.css",
|
||||
"!**/*.vue",
|
||||
"!**/*.svelte"
|
||||
],
|
||||
"rules": {
|
||||
"recommended": true,
|
||||
"suspicious": {
|
||||
"noExplicitAny": "off"
|
||||
},
|
||||
"correctness": {
|
||||
"noUnusedImports": "off",
|
||||
"useExhaustiveDependencies": "error",
|
||||
"useHookAtTopLevel": "error",
|
||||
"noUnusedFunctionParameters": "off",
|
||||
"noUnusedVariables": {
|
||||
"level": "error",
|
||||
|
|
@ -47,6 +60,10 @@
|
|||
},
|
||||
"a11y": {
|
||||
"noSvgWithoutTitle": "off"
|
||||
},
|
||||
"nursery": {
|
||||
"noNestedComponentDefinitions": "error",
|
||||
"noReactPropAssign": "error"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -19,8 +19,11 @@
|
|||
"@angular/router": "^18.0.0",
|
||||
"@uppy/angular": "workspace:*",
|
||||
"@uppy/core": "workspace:*",
|
||||
"@uppy/dashboard": "workspace:*",
|
||||
"@uppy/google-drive": "workspace:*",
|
||||
"@uppy/progress-bar": "workspace:*",
|
||||
"@uppy/tus": "workspace:*",
|
||||
"@uppy/utils": "workspace:*",
|
||||
"@uppy/webcam": "workspace:*",
|
||||
"rxjs": "~7.8.0",
|
||||
"tslib": "^2.3.0",
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
"express": "^4.19.2",
|
||||
"express-session": "^1.17.3",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"private": true,
|
||||
"engines": {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
import { getAllowedHosts, Provider, tokenStorage } from '@uppy/companion-client'
|
||||
import { UIPlugin } from '@uppy/core'
|
||||
import { ProviderViews } from '@uppy/provider-views'
|
||||
import { h } from 'preact'
|
||||
|
||||
const defaultOptions = {}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
"express": "^4.19.2",
|
||||
"express-session": "^1.15.6",
|
||||
"npm-run-all": "^4.1.2",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "npm-run-all --parallel start:server start:client",
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
"devDependencies": {
|
||||
"dotenv": "^16.0.1",
|
||||
"express": "^4.19.2",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ const companionOptions = {
|
|||
},
|
||||
// you can also add options for additional providers here
|
||||
},
|
||||
corsOrigins: ['*'], // Note: this is not safe for production
|
||||
server: {
|
||||
host: 'localhost:3020',
|
||||
protocol: 'http',
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
"serve": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tailwindcss/vite": "^4.0.9",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"@uppy/core": "workspace:*",
|
||||
"@uppy/react": "workspace:*",
|
||||
"@uppy/remote-sources": "workspace:*",
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
"@vitest/browser": "^3.2.4",
|
||||
"playwright": "^1.53.2",
|
||||
"typescript": "^5.7.3",
|
||||
"vite": "^7.0.3",
|
||||
"vite": "^7.0.6",
|
||||
"vitest": "^3.2.4",
|
||||
"vitest-browser-react": "^1.0.0"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
import React from 'react'
|
||||
|
||||
type ButtonProps = {
|
||||
type: 'button'
|
||||
onClick: () => void
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { useScreenCapture } from '@uppy/react'
|
||||
import React, { useEffect } from 'react'
|
||||
import { useEffect } from 'react'
|
||||
import MediaCapture from './MediaCapture.tsx'
|
||||
|
||||
export interface ScreenCaptureProps {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { useWebcam } from '@uppy/react'
|
||||
import React, { useEffect } from 'react'
|
||||
import { useEffect } from 'react'
|
||||
import MediaCapture from './MediaCapture.tsx'
|
||||
|
||||
export interface WebcamProps {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
"type": "module",
|
||||
"devDependencies": {
|
||||
"npm-run-all": "^4.1.5",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"dependencies": {
|
||||
"@uppy/core": "workspace:*",
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ function Footer() {
|
|||
}
|
||||
|
||||
function FormFields(fields) {
|
||||
// biome-ignore lint/nursery/noNestedComponentDefinitions: not a react component
|
||||
function Field([name, value]) {
|
||||
if (name === 'transloadit') return ''
|
||||
let isValueJSON = false
|
||||
|
|
@ -75,6 +76,7 @@ function FormFields(fields) {
|
|||
}
|
||||
|
||||
function UploadsList(uploads) {
|
||||
// biome-ignore lint/nursery/noNestedComponentDefinitions: not a react component
|
||||
function Upload(upload) {
|
||||
return `<li>${e(upload.name)}</li>`
|
||||
}
|
||||
|
|
@ -87,10 +89,12 @@ function UploadsList(uploads) {
|
|||
}
|
||||
|
||||
function ResultsList(results) {
|
||||
// biome-ignore lint/nursery/noNestedComponentDefinitions: not a react component
|
||||
function Result(result) {
|
||||
return `<li>${e(result.name)} <a href="${result.ssl_url}" target="_blank">View</a></li>`
|
||||
}
|
||||
|
||||
// biome-ignore lint/nursery/noNestedComponentDefinitions: not a react component
|
||||
function ResultsSection(stepName) {
|
||||
return `
|
||||
<h2>${e(stepName)}</h2>
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@
|
|||
"vue": "^3.5.14"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/vite": "^4.0.0",
|
||||
"@vitejs/plugin-vue": "^5.0.0",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"@vitejs/plugin-vue": "^6.0.1",
|
||||
"@vitest/browser": "^3.2.4",
|
||||
"tailwindcss": "^4.0.0",
|
||||
"vite": "^6.2.0",
|
||||
"vite": "^7.0.6",
|
||||
"vitest": "^3.2.4",
|
||||
"vitest-browser-vue": "^1.0.0"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"npm-run-all": "^4.1.5",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"npm-run-all": "^4.1.3",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"npm-run-all": "^4.1.3",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"npm-run-all": "^4.1.3",
|
||||
"vite": "^5.4.17"
|
||||
"vite": "^7.0.6"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
|
|||
11
package.json
11
package.json
|
|
@ -12,8 +12,8 @@
|
|||
"private/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "turbo run build build:css --filter='./packages/@uppy/*' --filter='./packages/uppy'",
|
||||
"build:clean": "cp .gitignore .gitignore.bak && printf '!node_modules\n!**/node_modules/**/*\n' >> .gitignore; git clean -Xfd packages e2e .parcel-cache coverage .turbo; mv .gitignore.bak .gitignore",
|
||||
"build": "turbo run --no-daemon build build:css --filter='./packages/@uppy/*' --filter='./packages/uppy'",
|
||||
"build:clean": "git clean -Xfd packages e2e .parcel-cache coverage .turbo .turbo -e '!node_modules' -e '!**/node_modules/**/*'",
|
||||
"build:watch": "yarn build && turbo watch build build:css --filter='./packages/@uppy/*' --filter='./packages/uppy'",
|
||||
"migrate:components": "yarn workspace @uppy/components migrate",
|
||||
"check": "yarn exec biome check --write",
|
||||
|
|
@ -24,20 +24,19 @@
|
|||
"test": "turbo run test --filter='./packages/@uppy/*' --filter='./packages/uppy' --filter='./examples/{react,vue,sveltekit}'",
|
||||
"test:watch": "turbo watch test --filter='./packages/@uppy/*' --filter='./packages/uppy'",
|
||||
"typecheck": "turbo run typecheck --filter='./packages/@uppy/*' --filter='./packages/uppy'",
|
||||
"version": "changeset version && corepack yarn install --mode=update-lockfile",
|
||||
"version": "changeset version && corepack yarn install --mode=update-lockfile && node scripts/update-readme-versions.mjs",
|
||||
"release": "changeset publish"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "2.0.5",
|
||||
"@changesets/changelog-github": "^0.5.1",
|
||||
"@changesets/cli": "^2.29.5",
|
||||
"@changesets/cli": "patch:@changesets/cli@npm%3A2.29.5#~/.yarn/patches/@changesets-cli-npm-2.29.5-68d8030bf3.patch",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"turbo": "^2.5.4",
|
||||
"typescript": "^5.8.3"
|
||||
},
|
||||
"packageManager": "yarn@4.4.1+sha224.fd21d9eb5fba020083811af1d4953acc21eeb9f6ff97efd1b3f9d4de",
|
||||
"engines": {
|
||||
"node": "^16.15.0 || >=18.0.0",
|
||||
"yarn": "3.6.1"
|
||||
"node": ">=20.19.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
6
packages/@uppy/angular/.gitignore
vendored
6
packages/@uppy/angular/.gitignore
vendored
|
|
@ -39,3 +39,9 @@ testem.log
|
|||
# System files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Generated files from prepublishOnly
|
||||
projects/uppy/angular/.npmignore
|
||||
projects/uppy/angular/fesm2022/
|
||||
projects/uppy/angular/index.d.ts
|
||||
projects/uppy/angular/public-api.d.ts
|
||||
|
|
|
|||
|
|
@ -30,6 +30,9 @@
|
|||
"@types/jasmine": "~5.1.0",
|
||||
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
||||
"@typescript-eslint/parser": "^7.2.0",
|
||||
"@typescript-eslint/types": "^7.2.0",
|
||||
"@typescript-eslint/utils": "^7.2.0",
|
||||
"eslint": "^8.57.0",
|
||||
"jasmine-core": "~5.1.0",
|
||||
"karma": "~6.4.0",
|
||||
"karma-chrome-launcher": "~3.2.0",
|
||||
|
|
@ -37,6 +40,6 @@
|
|||
"karma-jasmine": "~5.1.0",
|
||||
"karma-jasmine-html-reporter": "~2.1.0",
|
||||
"ng-packagr": "^19.0.0",
|
||||
"typescript": "^5.6"
|
||||
"typescript": "~5.5.4"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
30
packages/@uppy/angular/projects/uppy/angular/CHANGELOG.md
Normal file
30
packages/@uppy/angular/projects/uppy/angular/CHANGELOG.md
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
# @uppy/angular
|
||||
|
||||
## 0.9.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 8f8ee09: Nothing changed, just a release to fix the broken previous release.
|
||||
|
||||
## 0.9.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 7eec173: Remove "files" array from package.json
|
||||
|
||||
## 0.9.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 8b8ab01: Declare components as standalone & support 20.x
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- @uppy/progress-bar@4.3.2
|
||||
- @uppy/status-bar@4.2.2
|
||||
- @uppy/dashboard@4.4.2
|
||||
- @uppy/drag-drop@4.2.2
|
||||
- @uppy/utils@6.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/angular",
|
||||
"description": "Angular component wrappers around Uppy's official UI plugins.",
|
||||
"version": "0.8.0",
|
||||
"version": "0.9.2",
|
||||
"license": "MIT",
|
||||
"homepage": "https://uppy.io",
|
||||
"keywords": [
|
||||
|
|
@ -25,8 +25,8 @@
|
|||
"tslib": "^2.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0",
|
||||
"@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0",
|
||||
"@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
|
||||
"@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
|
||||
"@uppy/core": "workspace:^",
|
||||
"@uppy/dashboard": "workspace:^",
|
||||
"@uppy/utils": "workspace:^"
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ import { ChangeDetectionStrategy, Component } from "@angular/core";
|
|||
import { Uppy } from "@uppy/core";
|
||||
import type * as Dashboard from "@uppy/dashboard";
|
||||
import type { Body, Meta } from "@uppy/utils";
|
||||
import { DashboardModalComponent } from "./dashboard-modal.component";
|
||||
|
||||
|
||||
@Component({
|
||||
selector: "uppy-dashboard-demo",
|
||||
|
|
@ -10,8 +12,10 @@ import type { Body, Meta } from "@uppy/utils";
|
|||
[props]="props"
|
||||
></uppy-dashboard-modal>`,
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
standalone: true,
|
||||
imports: [DashboardModalComponent],
|
||||
})
|
||||
export class DashboardModalDemoComponent<M extends Meta, B extends Body> {
|
||||
uppy: Uppy<M, B> = new Uppy({ debug: true, autoProceed: true });
|
||||
props?: Dashboard.DashboardOptions<M, B>;
|
||||
props: Dashboard.DashboardOptions<M, B> = {};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import { UppyAngularWrapper } from "../../utils/wrapper";
|
|||
selector: "uppy-dashboard-modal",
|
||||
template: "",
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
standalone: true,
|
||||
})
|
||||
export class DashboardModalComponent<M extends Meta, B extends Body>
|
||||
extends UppyAngularWrapper<M, B, DashboardOptions<M, B>, Dashboard<M, B>>
|
||||
|
|
|
|||
|
|
@ -2,13 +2,16 @@ import { ChangeDetectionStrategy, Component } from "@angular/core";
|
|||
import { Uppy } from "@uppy/core";
|
||||
import type * as Dashboard from "@uppy/dashboard";
|
||||
import type { Body, Meta } from "@uppy/utils";
|
||||
import { DashboardComponent } from "./dashboard.component";
|
||||
|
||||
@Component({
|
||||
selector: "uppy-dashboard-demo",
|
||||
template: `<uppy-dashboard [uppy]="uppy" [props]="props"></uppy-dashboard>`,
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
standalone: true,
|
||||
imports: [DashboardComponent],
|
||||
})
|
||||
export class DashboardDemoComponent<M extends Meta, B extends Body> {
|
||||
uppy: Uppy<M, B> = new Uppy({ debug: true, autoProceed: true });
|
||||
props?: Dashboard.DashboardOptions<M, B>;
|
||||
props: Dashboard.DashboardOptions<M, B> = {};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import { UppyAngularWrapper } from "../../utils/wrapper";
|
|||
selector: "uppy-dashboard",
|
||||
template: "",
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
standalone: true,
|
||||
})
|
||||
export class DashboardComponent<M extends Meta, B extends Body>
|
||||
extends UppyAngularWrapper<M, B, DashboardOptions<M, B>>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,27 @@
|
|||
# @uppy/audio
|
||||
|
||||
## 2.2.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- @uppy/utils@6.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
||||
## 2.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/core@4.5.0
|
||||
- @uppy/utils@6.2.0
|
||||
|
||||
## 2.1.3
|
||||
|
||||
Released: 2025-05-18
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/audio",
|
||||
"description": "Uppy plugin that records audio using the device’s microphone.",
|
||||
"version": "2.1.3",
|
||||
"version": "2.2.2",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"style": "dist/style.min.css",
|
||||
|
|
@ -27,6 +27,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./css/style.css": "./dist/style.css",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import type {
|
|||
import { UIPlugin } from '@uppy/core'
|
||||
import type { LocaleStrings } from '@uppy/utils'
|
||||
import { getFileTypeExtension } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
import packageJson from '../package.json' with { type: 'json' }
|
||||
import locale from './locale.js'
|
||||
import PermissionsScreen from './PermissionsScreen.js'
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
import { h } from 'preact'
|
||||
|
||||
export interface AudioSourceSelectProps {
|
||||
currentDeviceId: string | MediaStreamTrack | null | undefined
|
||||
audioSources: MediaDeviceInfo[]
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import type { I18n } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
|
||||
interface DiscardButtonProps {
|
||||
onDiscard: () => void
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import type { I18n } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
import type { h } from 'preact'
|
||||
|
||||
interface PermissionsScreenProps {
|
||||
icon: () => h.JSX.Element | null
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import type { I18n } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
|
||||
interface RecordButtonProps {
|
||||
recording: boolean
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import { h } from 'preact'
|
||||
import formatSeconds from './formatSeconds.js'
|
||||
|
||||
interface RecordingLengthProps {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import type { I18n } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
import { useEffect, useRef } from 'preact/hooks'
|
||||
import AudioSourceSelect, {
|
||||
type AudioSourceSelectProps,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import type { I18n } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
|
||||
interface SubmitButtonProps {
|
||||
onSubmit: () => void
|
||||
|
|
|
|||
|
|
@ -1,5 +1,29 @@
|
|||
# @uppy/aws-s3
|
||||
|
||||
## 4.3.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- @uppy/companion-client@4.5.2
|
||||
- @uppy/utils@6.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
||||
## 4.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/core@4.5.0
|
||||
- @uppy/companion-client@4.5.0
|
||||
- @uppy/utils@6.2.0
|
||||
|
||||
## 4.2.3
|
||||
|
||||
Released: 2025-01-22
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/aws-s3",
|
||||
"description": "Upload to Amazon S3 with Uppy",
|
||||
"version": "4.2.3",
|
||||
"version": "4.3.2",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"type": "module",
|
||||
|
|
@ -28,6 +28,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./package.json": "./package.json"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,32 @@
|
|||
# @uppy/box
|
||||
|
||||
## 3.3.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- Updated dependencies [c66fd85]
|
||||
- @uppy/companion-client@4.5.2
|
||||
- @uppy/provider-views@4.5.2
|
||||
- @uppy/utils@6.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
||||
## 3.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/core@4.5.0
|
||||
- @uppy/companion-client@4.5.0
|
||||
- @uppy/provider-views@4.5.0
|
||||
- @uppy/utils@6.2.0
|
||||
|
||||
## 3.2.3
|
||||
|
||||
Released: 2025-05-18
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/box",
|
||||
"description": "Import files from Box, into Uppy.",
|
||||
"version": "3.2.3",
|
||||
"version": "3.3.2",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"type": "module",
|
||||
|
|
@ -24,6 +24,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./package.json": "./package.json"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,27 @@
|
|||
# @uppy/companion-client
|
||||
|
||||
## 4.5.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- @uppy/utils@6.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
||||
## 4.5.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/core@4.5.0
|
||||
- @uppy/utils@6.2.0
|
||||
|
||||
## 4.4.2
|
||||
|
||||
Released: 2025-05-18
|
||||
|
|
@ -92,7 +114,7 @@ Included in: Uppy v3.22.2
|
|||
Released: 2024-02-19
|
||||
Included in: Uppy v3.22.0
|
||||
|
||||
- @uppy/aws-s3-multipart,@uppy/aws-s3,@uppy/companion-client,@uppy/tus,@uppy/xhr-upload: update `uppyfile` objects before emitting events (antoine du hamel / #4928)
|
||||
- @uppy/aws-s3-multipart,@uppy/aws-s3,@uppy/companion-client,@uppy/tus,@uppy/xhr-upload: update `uppyfile` objects before emitting events (antoine du hamel / #4928)
|
||||
- @uppy/companion-client: fix tests and linter (antoine du hamel / #4890)
|
||||
- @uppy/companion-client: migrate to ts (merlijn vos / #4864)
|
||||
- @uppy/companion-client: fix `typeerror` (antoine du hamel)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/companion-client",
|
||||
"description": "Client library for communication with Companion. Intended for use in Uppy plugins.",
|
||||
"version": "4.4.2",
|
||||
"version": "4.5.2",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"type": "module",
|
||||
|
|
@ -26,6 +26,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./package.json": "./package.json"
|
||||
|
|
|
|||
|
|
@ -1,12 +1,22 @@
|
|||
# @uppy/companion
|
||||
|
||||
## 5.9.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Add provider name to metadata for observability
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 0c24c5a: Make StreamableBlob spec compliant for Node.js 24+
|
||||
|
||||
## 5.8.0
|
||||
|
||||
Released: 2025-06-02
|
||||
Included in: Uppy v4.17.0
|
||||
|
||||
- @uppy/companion: add max filename length env var (Freeman / #5763)
|
||||
- @uppy/companion: fix cookie maxAge to milliseconds (zolotarov@brights.io / #5746)
|
||||
- @uppy/companion: fix cookie maxAge to milliseconds (zolotarov@brights.io / #5746)
|
||||
- @uppy/companion: improve Zoom folder structure (Merlijn Vos / #5739)
|
||||
|
||||
## 5.7.0
|
||||
|
|
@ -30,7 +40,7 @@ Released: 2025-02-25
|
|||
Included in: Uppy v4.13.3
|
||||
|
||||
- @uppy/companion: log when tus uploaded size differs (Mikael Finstad / #5647)
|
||||
- @uppy/companion: remove redundant HEAD request for file size (Mikael Finstad / #5648)
|
||||
- @uppy/companion: remove redundant HEAD request for file size (Mikael Finstad / #5648)
|
||||
|
||||
## 5.5.1
|
||||
|
||||
|
|
@ -80,7 +90,7 @@ Included in: Uppy v4.7.0
|
|||
Released: 2024-10-31
|
||||
Included in: Uppy v4.6.0
|
||||
|
||||
- docs,@uppy/companion: disallow corsOrigins "*" (Mikael Finstad / #5496)
|
||||
- docs,@uppy/companion: disallow corsOrigins "\*" (Mikael Finstad / #5496)
|
||||
|
||||
## 5.1.2
|
||||
|
||||
|
|
@ -237,7 +247,7 @@ Released: 2024-06-18
|
|||
Included in: Uppy v3.27.0
|
||||
|
||||
- @uppy/google-photos: add plugin (Mikael Finstad / #5061)
|
||||
- @uppy/companion: Bump ws from 8.8.1 to 8.17.1 (#5256)
|
||||
- @uppy/companion: Bump ws from 8.8.1 to 8.17.1 (#5256)
|
||||
|
||||
## 4.13.3
|
||||
|
||||
|
|
@ -284,9 +294,9 @@ Released: 2023-12-12
|
|||
Included in: Uppy v3.21.0
|
||||
|
||||
- @uppy/companion: fix double tus uploads (Mikael Finstad / #4816)
|
||||
- @uppy/companion: fix accelerated endpoints for presigned POST (Mikael Finstad / #4817)
|
||||
- @uppy/companion: fix accelerated endpoints for presigned POST (Mikael Finstad / #4817)
|
||||
- @uppy/companion: fix `authProvider` property inconsistency (Mikael Finstad / #4672)
|
||||
- @uppy/companion: send certain onedrive errors to the user (Mikael Finstad / #4671)
|
||||
- @uppy/companion: send certain onedrive errors to the user (Mikael Finstad / #4671)
|
||||
- @uppy/companion: Provider user sessions (Mikael Finstad / #4619)
|
||||
|
||||
## 4.11.0
|
||||
|
|
@ -384,7 +394,7 @@ Included in: Uppy v3.11.0
|
|||
Released: 2023-06-19
|
||||
Included in: Uppy v3.10.0
|
||||
|
||||
- @uppy/companion: switch from aws-sdk v2 to @aws-sdk/* (v3) (Scott Bessler / #4285)
|
||||
- @uppy/companion: switch from aws-sdk v2 to @aws-sdk/\* (v3) (Scott Bessler / #4285)
|
||||
- @uppy/companion,@uppy/core,@uppy/dashboard,@uppy/golden-retriever,@uppy/status-bar,@uppy/utils: Migrate all lodash' per-method-packages usage to lodash. (LinusMain / #4274)
|
||||
- @uppy/companion: revert randomness from file names (Mikael Finstad / #4509)
|
||||
- @uppy/companion: Custom provider fixes (Mikael Finstad / #4498)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@uppy/companion",
|
||||
"version": "5.8.0",
|
||||
"version": "5.9.1",
|
||||
"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": "lib/companion.d.ts",
|
||||
|
|
@ -88,7 +88,7 @@
|
|||
"@types/lodash": "4.14.191",
|
||||
"@types/morgan": "1.7.37",
|
||||
"@types/ms": "0.7.31",
|
||||
"@types/node": "^20.0.0",
|
||||
"@types/node": "^20.19.0",
|
||||
"@types/react": "^18.0.0",
|
||||
"@types/request": "2.48.8",
|
||||
"@types/webpack": "^5.28.0",
|
||||
|
|
|
|||
|
|
@ -42,12 +42,15 @@ const styleText =
|
|||
/**
|
||||
* message log
|
||||
*
|
||||
* @typedef {import('node:util').styleText} styleText
|
||||
* @typedef {Parameters<styleText>[0]} Colors
|
||||
*
|
||||
* @param {object} params
|
||||
* @param {string | Error} params.arg the message or error to log
|
||||
* @param {string} params.tag a unique tag to easily search for this message
|
||||
* @param {string} params.level error | info | debug
|
||||
* @param {string} [params.traceId] a unique id to easily trace logs tied to a request
|
||||
* @param {string[]} [params.color] Format(s) that can be passed to `util.styleText`.
|
||||
* @param {Colors} [params.color] Format(s) that can be passed to `util.styleText`.
|
||||
*/
|
||||
const log = ({ arg, tag = '', level, traceId = '', color = [] }) => {
|
||||
const time = new Date().toISOString()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,36 @@
|
|||
# @uppy/components
|
||||
|
||||
## 0.3.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- @uppy/remote-sources@2.4.2
|
||||
- @uppy/screen-capture@4.4.2
|
||||
- @uppy/image-editor@3.4.2
|
||||
- @uppy/webcam@4.3.2
|
||||
- @uppy/audio@2.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
||||
## 0.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/webcam@4.3.0
|
||||
- @uppy/core@4.5.0
|
||||
- @uppy/audio@2.2.0
|
||||
- @uppy/image-editor@3.4.0
|
||||
- @uppy/remote-sources@2.4.0
|
||||
- @uppy/screen-capture@4.4.0
|
||||
|
||||
## 0.2.0
|
||||
|
||||
Released: 2025-06-30
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/components",
|
||||
"description": "Headless Uppy components, made in Preact",
|
||||
"version": "0.2.0",
|
||||
"version": "0.3.2",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"type": "module",
|
||||
|
|
@ -23,6 +23,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc --build tsconfig.build.json",
|
||||
"build:css": "tailwindcss -m -i ./src/input.css -o ./dist/styles.css",
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import { clsx } from 'clsx'
|
||||
import { h } from 'preact'
|
||||
import { useMemo } from 'preact/hooks'
|
||||
import { createDropzone } from './hooks/dropzone.js'
|
||||
import type { NonNullableUppyContext, UppyContext } from './types.js'
|
||||
|
|
@ -29,7 +28,6 @@ export default function Dropzone(props: DropzoneProps) {
|
|||
className="uppy-reset"
|
||||
data-uppy-element="dropzone"
|
||||
role="presentation"
|
||||
tabIndex={0}
|
||||
>
|
||||
<input
|
||||
{...getInputProps()}
|
||||
|
|
@ -39,6 +37,8 @@ export default function Dropzone(props: DropzoneProps) {
|
|||
/>
|
||||
<div
|
||||
{...getRootProps()}
|
||||
// biome-ignore lint/a11y/noNoninteractiveTabindex: it is also a button. getRootProps returns keyboard event handlers
|
||||
tabIndex={0}
|
||||
style={{
|
||||
width: width || '100%',
|
||||
height: height || '100%',
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import type { Body, Meta, UppyEventMap, UppyFile } from '@uppy/core'
|
||||
import { clsx } from 'clsx'
|
||||
import { Fragment, h } from 'preact'
|
||||
import { Fragment } from 'preact'
|
||||
import { useEffect, useState } from 'preact/hooks'
|
||||
import prettyBytes from 'pretty-bytes'
|
||||
import { Thumbnail } from './index.js'
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import type { Body, Meta, UppyEventMap, UppyFile } from '@uppy/core'
|
||||
import { clsx } from 'clsx'
|
||||
import { Fragment, h } from 'preact'
|
||||
import { Fragment } from 'preact'
|
||||
import { useEffect, useState } from 'preact/hooks'
|
||||
import prettyBytes from 'pretty-bytes'
|
||||
import { Thumbnail, type UppyContext } from './index.js'
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import { h } from 'preact'
|
||||
import type { UppyContext } from './types.js'
|
||||
|
||||
export type ProviderIconProps = {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import type { Body, Meta, UppyFile } from '@uppy/core'
|
||||
import { h } from 'preact'
|
||||
import { useEffect, useMemo } from 'preact/hooks'
|
||||
import type { UppyContext } from './types.js'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import { clsx } from 'clsx'
|
||||
import { h } from 'preact'
|
||||
import type { UppyContext } from './types.js'
|
||||
|
||||
export type UploadButtonProps = {
|
||||
|
|
|
|||
|
|
@ -76,6 +76,18 @@ export function createDropzone<
|
|||
input?.click()
|
||||
}
|
||||
|
||||
const handleKeyPress = (event: KeyboardEvent) => {
|
||||
// taken from https://github.com/react-dropzone/react-dropzone/blob/d6911c991e077151e302b599b92269432ab0472b/src/index.js#L830C1-L836C1
|
||||
if (
|
||||
event.key === ' ' ||
|
||||
event.key === 'Enter' ||
|
||||
event.keyCode === 32 ||
|
||||
event.keyCode === 13
|
||||
) {
|
||||
handleClick()
|
||||
}
|
||||
}
|
||||
|
||||
const handleFileInputChange = (event: ChangeEventType) => {
|
||||
const input = event.target as HTMLInputElement
|
||||
const files = Array.from(input.files ?? [])
|
||||
|
|
@ -103,6 +115,7 @@ export function createDropzone<
|
|||
onDragLeave: handleDragLeave,
|
||||
onDrop: handleDrop,
|
||||
onClick: handleClick,
|
||||
onKeyPress: handleKeyPress,
|
||||
}),
|
||||
getInputProps: () => ({
|
||||
id: fileInputId,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,27 @@
|
|||
# @uppy/compressor
|
||||
|
||||
## 2.3.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- @uppy/utils@6.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
||||
## 2.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/core@4.5.0
|
||||
- @uppy/utils@6.2.0
|
||||
|
||||
## 2.2.0
|
||||
|
||||
Released: 2025-01-06
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/compressor",
|
||||
"description": "Uppy plugin that compresses images before upload, saving up to 60% in size",
|
||||
"version": "2.2.1",
|
||||
"version": "2.3.2",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"keywords": [
|
||||
|
|
@ -21,6 +21,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./package.json": "./package.json"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,27 @@
|
|||
# @uppy/core
|
||||
|
||||
## 4.5.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- @uppy/store-default@4.3.2
|
||||
- @uppy/utils@6.2.2
|
||||
|
||||
## 4.5.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 0c24c5a: Resolve stale state in `checkAndUpdateFileState`
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/store-default@4.3.0
|
||||
- @uppy/utils@6.2.0
|
||||
|
||||
## 4.4.6
|
||||
|
||||
Released: 2025-06-02
|
||||
|
|
|
|||
|
|
@ -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": "4.4.7",
|
||||
"version": "4.5.2",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"style": "dist/style.min.css",
|
||||
|
|
@ -28,6 +28,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./css/style.min.css": "./dist/style.min.css",
|
||||
|
|
|
|||
|
|
@ -1472,6 +1472,163 @@ describe('src/Core', () => {
|
|||
await core.retryAll()
|
||||
expect(onUpload).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
describe('with required metadata', () => {
|
||||
it('should not retry files that have missing required metadata', async () => {
|
||||
const onUpload = vi.fn()
|
||||
const onRetryAll = vi.fn()
|
||||
|
||||
const core = new Core({
|
||||
restrictions: {
|
||||
requiredMetaFields: ['caption'],
|
||||
},
|
||||
})
|
||||
core.on('upload', onUpload)
|
||||
core.on('retry-all', onRetryAll)
|
||||
|
||||
const fileId = core.addFile({
|
||||
source: 'vi',
|
||||
name: 'foo.jpg',
|
||||
type: 'image/jpeg',
|
||||
data: testImage,
|
||||
})
|
||||
|
||||
// Simulate an upload attempt which triggers metadata validation
|
||||
try {
|
||||
await core.upload()
|
||||
} catch (error) {
|
||||
expect(error).toBeInstanceOf(RestrictionError)
|
||||
expect(error.message).toContain('Missing required meta fields')
|
||||
}
|
||||
|
||||
// File should now have missing metadata error after upload attempt
|
||||
const file = core.getFile(fileId)
|
||||
expect(file.missingRequiredMetaFields).toEqual(['caption'])
|
||||
expect(file.error).toContain('Missing required meta fields in foo.jpg')
|
||||
|
||||
// Should not retry files with outstanding metadata issues
|
||||
await core.retryAll()
|
||||
expect(onRetryAll.mock.calls[0][0]).toEqual([])
|
||||
expect(onUpload).toHaveBeenCalledTimes(0)
|
||||
})
|
||||
|
||||
it('should retry files after metadata is corrected', async () => {
|
||||
const onUpload = vi.fn()
|
||||
const onRetryAll = vi.fn()
|
||||
|
||||
const core = new Core({
|
||||
restrictions: {
|
||||
requiredMetaFields: ['caption'],
|
||||
},
|
||||
})
|
||||
core.on('upload', onUpload)
|
||||
core.on('retry-all', onRetryAll)
|
||||
|
||||
const fileId = core.addFile({
|
||||
source: 'vi',
|
||||
name: 'foo.jpg',
|
||||
type: 'image/jpeg',
|
||||
data: testImage,
|
||||
})
|
||||
|
||||
try {
|
||||
await core.upload()
|
||||
} catch (error) {
|
||||
expect(error).toBeInstanceOf(RestrictionError)
|
||||
expect(error.message).toContain('Missing required meta fields')
|
||||
}
|
||||
|
||||
// Verify file has missing metadata error after upload attempt
|
||||
const file = core.getFile(fileId)
|
||||
expect(file.missingRequiredMetaFields).toEqual(['caption'])
|
||||
expect(file.error).toContain('Missing required meta fields in foo.jpg')
|
||||
|
||||
// Fix the metadata
|
||||
core.setFileMeta(fileId, { caption: 'Test caption' })
|
||||
|
||||
// Trigger the dashboard:file-edit-complete event to update validation state
|
||||
// @ts-ignore
|
||||
core.emit('dashboard:file-edit-complete', core.getFile(fileId))
|
||||
|
||||
const updatedFile = core.getFile(fileId)
|
||||
expect(updatedFile.missingRequiredMetaFields).toEqual([])
|
||||
|
||||
// Now retry should work
|
||||
await core.retryAll()
|
||||
expect(onRetryAll.mock.calls[0][0]).toContainEqual(
|
||||
expect.objectContaining({ id: fileId }),
|
||||
)
|
||||
expect(onUpload).toHaveBeenCalledTimes(1) // Called once during retry (initial upload failed at validation)
|
||||
})
|
||||
|
||||
it('should handle multiple files with mixed metadata states', async () => {
|
||||
const onUpload = vi.fn()
|
||||
const onRetryAll = vi.fn()
|
||||
|
||||
const core = new Core({
|
||||
restrictions: {
|
||||
requiredMetaFields: ['caption'],
|
||||
},
|
||||
})
|
||||
core.on('upload', onUpload)
|
||||
core.on('retry-all', onRetryAll)
|
||||
|
||||
// Add files with missing metadata
|
||||
const fileId1 = core.addFile({
|
||||
source: 'vi',
|
||||
name: 'file1.jpg',
|
||||
type: 'image/jpeg',
|
||||
data: testImage,
|
||||
})
|
||||
const _fileId2 = core.addFile({
|
||||
source: 'vi',
|
||||
name: 'file2.jpg',
|
||||
type: 'image/jpeg',
|
||||
data: testImage,
|
||||
})
|
||||
const fileId3 = core.addFile({
|
||||
source: 'vi',
|
||||
name: 'file3.jpg',
|
||||
type: 'image/jpeg',
|
||||
data: testImage,
|
||||
})
|
||||
|
||||
try {
|
||||
await core.upload()
|
||||
} catch (error) {
|
||||
expect(error).toBeInstanceOf(RestrictionError)
|
||||
expect(error.message).toContain('Missing required meta fields')
|
||||
}
|
||||
|
||||
// Give one file a different error (not metadata-related)
|
||||
core.setFileState(fileId3, {
|
||||
error: 'Network error',
|
||||
missingRequiredMetaFields: [],
|
||||
})
|
||||
|
||||
// Fix metadata for first file only
|
||||
core.setFileMeta(fileId1, { caption: 'Fixed caption' })
|
||||
// @ts-ignore
|
||||
core.emit('dashboard:file-edit-complete', core.getFile(fileId1))
|
||||
|
||||
// Add an error to file1 so it can be retried
|
||||
core.setFileState(fileId1, {
|
||||
error: 'Upload failed',
|
||||
})
|
||||
|
||||
// Retry should only include file1 and file3 (file2 still has missing metadata)
|
||||
await core.retryAll()
|
||||
|
||||
const retriedFiles = onRetryAll.mock.calls[0][0]
|
||||
expect(retriedFiles).toContainEqual(
|
||||
expect.objectContaining({ id: fileId1 }),
|
||||
)
|
||||
expect(retriedFiles).toContainEqual(
|
||||
expect.objectContaining({ id: fileId3 }),
|
||||
)
|
||||
expect(onUpload).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('restoring a file', () => {
|
||||
|
|
|
|||
|
|
@ -914,13 +914,18 @@ export class Uppy<
|
|||
this.#restricter.getMissingRequiredMetaFields(file)
|
||||
|
||||
if (missingFields.length > 0) {
|
||||
this.setFileState(file.id, { missingRequiredMetaFields: missingFields })
|
||||
this.setFileState(file.id, {
|
||||
missingRequiredMetaFields: missingFields,
|
||||
error: error.message,
|
||||
})
|
||||
this.log(error.message)
|
||||
this.emit('restriction-failed', file, error)
|
||||
return false
|
||||
}
|
||||
if (missingFields.length === 0 && file.missingRequiredMetaFields) {
|
||||
this.setFileState(file.id, { missingRequiredMetaFields: [] })
|
||||
this.setFileState(file.id, {
|
||||
missingRequiredMetaFields: [],
|
||||
})
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
|
@ -1374,8 +1379,14 @@ export class Uppy<
|
|||
|
||||
#getFilesToRetry() {
|
||||
const { files } = this.getState()
|
||||
return Object.keys(files).filter((file) => {
|
||||
return files[file].error
|
||||
return Object.keys(files).filter((fileId) => {
|
||||
const file = files[fileId]
|
||||
// Only retry files that have errors AND don't have missing required metadata
|
||||
return (
|
||||
file.error &&
|
||||
(!file.missingRequiredMetaFields ||
|
||||
file.missingRequiredMetaFields.length === 0)
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,44 @@
|
|||
# @uppy/dashboard
|
||||
|
||||
## 4.4.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- c15c6fd: Make each entry in `strings` in locale type optional
|
||||
- Updated dependencies [c15c6fd]
|
||||
- @uppy/status-bar@4.2.3
|
||||
|
||||
## 4.4.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1b1a9e3: Define "files" in package.json
|
||||
- Updated dependencies [1b1a9e3]
|
||||
- Updated dependencies [c66fd85]
|
||||
- @uppy/thumbnail-generator@4.2.2
|
||||
- @uppy/provider-views@4.5.2
|
||||
- @uppy/status-bar@4.2.2
|
||||
- @uppy/informer@4.3.2
|
||||
- @uppy/utils@6.2.2
|
||||
- @uppy/core@4.5.2
|
||||
|
||||
## 4.4.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 0c24c5a: Use TypeScript compiler instead of Babel
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0c24c5a]
|
||||
- Updated dependencies [0c24c5a]
|
||||
- @uppy/core@4.5.0
|
||||
- @uppy/informer@4.3.0
|
||||
- @uppy/provider-views@4.5.0
|
||||
- @uppy/status-bar@4.2.0
|
||||
- @uppy/thumbnail-generator@4.2.0
|
||||
- @uppy/utils@6.2.0
|
||||
|
||||
## 4.3.4
|
||||
|
||||
Released: 2025-05-18
|
||||
|
|
@ -47,8 +86,8 @@ Included in: Uppy v4.6.0
|
|||
Released: 2024-10-15
|
||||
Included in: Uppy v4.5.0
|
||||
|
||||
- @uppy/dashboard: Dashboard - convert some files to typescript (Evgenia Karunus / #5367)
|
||||
- @uppy/dashboard,@uppy/drag-drop,@uppy/file-input: `.handleInputChange()` - use `.currentTarget`; clear the input using `''` (Evgenia Karunus / #5381)
|
||||
- @uppy/dashboard: Dashboard - convert some files to typescript (Evgenia Karunus / #5367)
|
||||
- @uppy/dashboard,@uppy/drag-drop,@uppy/file-input: `.handleInputChange()` - use `.currentTarget`; clear the input using `''` (Evgenia Karunus / #5381)
|
||||
|
||||
## 4.1.0
|
||||
|
||||
|
|
@ -215,7 +254,7 @@ Included in: Uppy v3.16.0
|
|||
Released: 2023-09-05
|
||||
Included in: Uppy v3.15.0
|
||||
|
||||
- @uppy/dashboard: when showAddFilesPanel is true, aria-hidden should be the opposite (Artur Paikin / #4643)
|
||||
- @uppy/dashboard: when showAddFilesPanel is true, aria-hidden should be the opposite (Artur Paikin / #4643)
|
||||
|
||||
## 3.4.1
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@uppy/dashboard",
|
||||
"description": "Universal UI plugin for Uppy.",
|
||||
"version": "4.3.4",
|
||||
"version": "4.4.3",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"style": "dist/style.min.css",
|
||||
|
|
@ -31,6 +31,12 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/transloadit/uppy.git"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"lib",
|
||||
"dist",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./css/style.css": "./dist/style.css",
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ import type { LocaleStrings } from '@uppy/utils'
|
|||
import { findAllDOMElements, getDroppedFiles, toArray } from '@uppy/utils'
|
||||
import { nanoid } from 'nanoid/non-secure'
|
||||
import type { ComponentChild, VNode } from 'preact'
|
||||
import { h } from 'preact'
|
||||
import type { TargetedEvent } from 'preact/compat'
|
||||
import packageJson from '../package.json' with { type: 'json' }
|
||||
import DashboardUI from './components/Dashboard.js'
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import type { I18n, Translator } from '@uppy/utils'
|
||||
import { Component, type ComponentChild, Fragment, h } from 'preact'
|
||||
import { Component, type ComponentChild, Fragment } from 'preact'
|
||||
import type { TargetedEvent } from 'preact/compat'
|
||||
import type { DashboardState, TargetWithRender } from '../Dashboard.js'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import classNames from 'classnames'
|
||||
import { h } from 'preact'
|
||||
import AddFiles from './AddFiles.js'
|
||||
|
||||
type $TSFixMe = any
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ import type {
|
|||
import type { I18n, Translator } from '@uppy/utils'
|
||||
import { isDragDropSupported } from '@uppy/utils'
|
||||
import classNames from 'classnames'
|
||||
import { h } from 'preact'
|
||||
import type { TargetedEvent } from 'preact/compat'
|
||||
import type { DashboardState, TargetWithRender } from '../Dashboard.js'
|
||||
import AddFiles from './AddFiles.js'
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import classNames from 'classnames'
|
||||
import { h } from 'preact'
|
||||
|
||||
type $TSFixMe = any
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import classNames from 'classnames'
|
||||
import { nanoid } from 'nanoid/non-secure'
|
||||
import { h } from 'preact'
|
||||
import { useCallback, useEffect, useState } from 'preact/hooks'
|
||||
import getFileTypeIcon from '../../utils/getFileTypeIcon.js'
|
||||
import ignoreEvent from '../../utils/ignoreEvent.js'
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
import type Uppy from '@uppy/core'
|
||||
import type { Body, Meta, UppyFile } from '@uppy/core'
|
||||
import type { I18n } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
import type { DashboardState } from '../../../Dashboard.js'
|
||||
import copyToClipboard from '../../../utils/copyToClipboard.js'
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ import prettierBytes from '@transloadit/prettier-bytes'
|
|||
import type { UppyFile } from '@uppy/core'
|
||||
import type { I18n } from '@uppy/utils'
|
||||
import { truncateString } from '@uppy/utils'
|
||||
import { h } from 'preact'
|
||||
import type { DashboardState } from '../../../Dashboard.js'
|
||||
import MetaErrorMessage from '../MetaErrorMessage.js'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import { h } from 'preact'
|
||||
import getFileTypeIcon from '../../../utils/getFileTypeIcon.js'
|
||||
import FilePreview from '../../FilePreview.js'
|
||||
import MetaErrorMessage from '../MetaErrorMessage.js'
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue