Fix various deps and peer deps in packages (#6030)

**Fixes**

- `@uppy/components` incorrectly had a lot of packages in `dependencies`
while they should be `peerDependencies`. Also removed `remote-sources`
completely as this drags in a lot of plugins and we don't even need it
there.
- `@uppy/{react,vue,svelte}` now has to have the same `peerDependencies`
as `components` as the requirement has been moved up. We also mark them
as optional, they are only needed if you use a hook such as `useWebcam`
needing `@uppy/webcam`.
- Remove `companion-client` and `provider-views` from `transloadit`.
Those are never used by the package.
- Remove `@uppy/utils` from `@uppy/angular` and `@uppy/react`, we can
just use imports from `core`
- Place `@uppy/status-bar` back in peer deps. This is critical but
forgotten when status bar was put back inside frameworks.

**Implications**
- Moving peer deps to deps in `@uppy/components` now requires people to
install these dependencies. However, they kind of had to anyway before
as we require people to install the plugin on uppy (`.use(Webcam')`) if
you want to use `useWebcam` and if you try to import a dep you did not
install they would have gotten an error already.
- Note: this is not the same situation as with importing dashboard
component from @uppy/react which causes a runtime crash because
@uppy/dashboard is missing. In this case we only depend on _types_, so
we don't have this problem.
This commit is contained in:
Merlijn Vos 2025-10-28 09:55:21 +01:00 committed by GitHub
parent 9f60e630a2
commit 72d2d68ea3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 128 additions and 35 deletions

View file

@ -0,0 +1,8 @@
---
"@uppy/components": minor
"@uppy/svelte": minor
"@uppy/react": minor
"@uppy/vue": minor
---
Add @uppy/{screen-capture,status-bar,webcam} as optional peer dependencies

View file

@ -0,0 +1,5 @@
---
"@uppy/transloadit": minor
---
Remove unused @uppy/{companion-client,provider-views} dependencies

View file

@ -0,0 +1,5 @@
---
"@uppy/angular": minor
---
Remove @uppy/utils and add @uppy/status-bar to peerDependencies

View file

@ -29,7 +29,15 @@
"@angular/core": "^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/core": "workspace:^",
"@uppy/dashboard": "workspace:^", "@uppy/dashboard": "workspace:^",
"@uppy/utils": "workspace:^" "@uppy/status-bar": "workspace:^"
},
"peerDependenciesMeta": {
"@uppy/dashboard": {
"optional": true
},
"@uppy/status-bar": {
"optional": true
}
}, },
"sideEffects": false "sideEffects": false
} }

View file

@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, Component } from "@angular/core"; import { ChangeDetectionStrategy, Component } from "@angular/core";
import { Uppy } from "@uppy/core"; import { Uppy } from "@uppy/core";
import type * as Dashboard from "@uppy/dashboard"; import type * as Dashboard from "@uppy/dashboard";
import type { Body, Meta } from "@uppy/utils"; import type { Body, Meta } from "@uppy/core";
import { DashboardModalComponent } from "./dashboard-modal.component"; import { DashboardModalComponent } from "./dashboard-modal.component";

View file

@ -11,7 +11,7 @@ import {
import { Uppy } from "@uppy/core"; import { Uppy } from "@uppy/core";
import type { DashboardOptions } from "@uppy/dashboard"; import type { DashboardOptions } from "@uppy/dashboard";
import Dashboard from "@uppy/dashboard"; import Dashboard from "@uppy/dashboard";
import type { Body, Meta } from "@uppy/utils"; import type { Body, Meta } from "@uppy/core";
import { UppyAngularWrapper } from "../../utils/wrapper"; import { UppyAngularWrapper } from "../../utils/wrapper";
@Component({ @Component({

View file

@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, Component } from "@angular/core"; import { ChangeDetectionStrategy, Component } from "@angular/core";
import { Uppy } from "@uppy/core"; import { Uppy } from "@uppy/core";
import type * as Dashboard from "@uppy/dashboard"; import type * as Dashboard from "@uppy/dashboard";
import type { Body, Meta } from "@uppy/utils"; import type { Body, Meta } from "@uppy/core";
import { DashboardComponent } from "./dashboard.component"; import { DashboardComponent } from "./dashboard.component";
@Component({ @Component({

View file

@ -11,7 +11,7 @@ import {
import { Uppy } from "@uppy/core"; import { Uppy } from "@uppy/core";
import type { DashboardOptions } from "@uppy/dashboard"; import type { DashboardOptions } from "@uppy/dashboard";
import Dashboard from "@uppy/dashboard"; import Dashboard from "@uppy/dashboard";
import type { Body, Meta } from "@uppy/utils"; import type { Body, Meta } from "@uppy/core";
import { UppyAngularWrapper } from "../../utils/wrapper"; import { UppyAngularWrapper } from "../../utils/wrapper";
@Component({ @Component({

View file

@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, type OnInit } from "@angular/core";
import { Uppy } from "@uppy/core"; import { Uppy } from "@uppy/core";
import type * as StatusBar from "@uppy/status-bar"; import type * as StatusBar from "@uppy/status-bar";
import Tus from "@uppy/tus"; import Tus from "@uppy/tus";
import type { Body, Meta } from "@uppy/utils/lib/UppyFile"; import type { Body, Meta } from "@uppy/core";
import { StatusBarComponent } from "./status-bar.component"; import { StatusBarComponent } from "./status-bar.component";
@Component({ @Component({

View file

@ -11,7 +11,7 @@ import {
import { Uppy } from "@uppy/core"; import { Uppy } from "@uppy/core";
import type { StatusBarOptions } from "@uppy/status-bar"; import type { StatusBarOptions } from "@uppy/status-bar";
import StatusBar from "@uppy/status-bar"; import StatusBar from "@uppy/status-bar";
import type { Body, Meta } from "@uppy/utils"; import type { Body, Meta } from "@uppy/core";
import { UppyAngularWrapper } from "../../utils/wrapper"; import { UppyAngularWrapper } from "../../utils/wrapper";
@Component({ @Component({

View file

@ -1,7 +1,6 @@
import type { ElementRef, SimpleChanges } from "@angular/core"; import type { ElementRef, SimpleChanges } from "@angular/core";
import type { UIPlugin, UIPluginOptions, Uppy } from "@uppy/core"; import type { UIPlugin, UIPluginOptions, Uppy, Body, Meta } from "@uppy/core";
import type { DashboardOptions } from "@uppy/dashboard"; import type { DashboardOptions } from "@uppy/dashboard";
import type { Body, Meta } from "@uppy/utils";
export abstract class UppyAngularWrapper< export abstract class UppyAngularWrapper<
M extends Meta, M extends Meta,

View file

@ -40,12 +40,6 @@
"./package.json": "./package.json" "./package.json": "./package.json"
}, },
"dependencies": { "dependencies": {
"@uppy/audio": "workspace:^",
"@uppy/core": "workspace:^",
"@uppy/image-editor": "workspace:^",
"@uppy/remote-sources": "workspace:^",
"@uppy/screen-capture": "workspace:^",
"@uppy/webcam": "workspace:^",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dequal": "^2.0.3", "dequal": "^2.0.3",
"preact": "^10.5.13", "preact": "^10.5.13",
@ -53,7 +47,25 @@
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/cli": "^4.0.6", "@tailwindcss/cli": "^4.0.6",
"@uppy/core": "workspace:^",
"tailwindcss": "^4.0.6", "tailwindcss": "^4.0.6",
"typescript": "^5.8.3" "typescript": "^5.8.3"
},
"peerDependencies": {
"@uppy/core": "workspace:^",
"@uppy/image-editor": "workspace:^",
"@uppy/screen-capture": "workspace:^",
"@uppy/webcam": "workspace:^"
},
"peerDependenciesMeta": {
"@uppy/image-editor": {
"optional": true
},
"@uppy/screen-capture": {
"optional": true
},
"@uppy/webcam": {
"optional": true
}
} }
} }

View file

@ -6,11 +6,19 @@ import type {
UppyEventMap, UppyEventMap,
} from '@uppy/core' } from '@uppy/core'
import type { ProviderViews } from '@uppy/provider-views' import type { ProviderViews } from '@uppy/provider-views'
import type { AvailablePluginsKeys } from '@uppy/remote-sources'
import { dequal } from 'dequal/lite' import { dequal } from 'dequal/lite'
import { Subscribers } from './utils.js' import { Subscribers } from './utils.js'
export type { AvailablePluginsKeys as RemoteSourceKeys } export type RemoteSourceKeys =
| 'Box'
| 'Dropbox'
| 'Facebook'
| 'GoogleDrive'
| 'Instagram'
| 'OneDrive'
| 'Unsplash'
| 'Url'
| 'Zoom'
export type RemoteSourceSnapshot = { export type RemoteSourceSnapshot = {
state: UnknownProviderPluginState & { state: UnknownProviderPluginState & {
@ -35,7 +43,7 @@ export type RemoteSourceStore = {
export function createRemoteSourceController( export function createRemoteSourceController(
uppy: Uppy, uppy: Uppy,
sourceId: AvailablePluginsKeys, sourceId: RemoteSourceKeys,
): RemoteSourceStore { ): RemoteSourceStore {
const plugin = uppy.getPlugin<UnknownProviderPlugin<any, any>>(sourceId) const plugin = uppy.getPlugin<UnknownProviderPlugin<any, any>>(sourceId)
if (!plugin) { if (!plugin) {

View file

@ -2,7 +2,13 @@
"extends": ["//"], "extends": ["//"],
"tasks": { "tasks": {
"build": { "build": {
"dependsOn": ["^build", "@uppy/core#build"], "dependsOn": [
"^build",
"@uppy/core#build",
"@uppy/image-editor#build",
"@uppy/screen-capture#build",
"@uppy/webcam#build"
],
"outputs": ["lib/**"] "outputs": ["lib/**"]
}, },
"build:css": { "build:css": {

View file

@ -49,6 +49,7 @@
"@uppy/core": "workspace:^" "@uppy/core": "workspace:^"
}, },
"devDependencies": { "devDependencies": {
"@uppy/core": "workspace:^",
"@uppy/dashboard": "workspace:^", "@uppy/dashboard": "workspace:^",
"@uppy/xhr-upload": "workspace:^", "@uppy/xhr-upload": "workspace:^",
"@vitest/browser": "^3.2.4", "@vitest/browser": "^3.2.4",

View file

@ -36,7 +36,6 @@
], ],
"dependencies": { "dependencies": {
"@uppy/components": "workspace:^", "@uppy/components": "workspace:^",
"@uppy/utils": "workspace:^",
"preact": "^10.5.13", "preact": "^10.5.13",
"use-sync-external-store": "^1.3.0" "use-sync-external-store": "^1.3.0"
}, },
@ -65,6 +64,7 @@
"@uppy/core": "workspace:^", "@uppy/core": "workspace:^",
"@uppy/dashboard": "workspace:^", "@uppy/dashboard": "workspace:^",
"@uppy/screen-capture": "workspace:^", "@uppy/screen-capture": "workspace:^",
"@uppy/status-bar": "workspace:^",
"@uppy/webcam": "workspace:^", "@uppy/webcam": "workspace:^",
"react": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0",
"react-dom": "^18.0.0 || ^19.0.0" "react-dom": "^18.0.0 || ^19.0.0"

View file

@ -70,14 +70,23 @@
"peerDependencies": { "peerDependencies": {
"@uppy/core": "workspace:^", "@uppy/core": "workspace:^",
"@uppy/dashboard": "workspace:^", "@uppy/dashboard": "workspace:^",
"@uppy/screen-capture": "workspace:^",
"@uppy/status-bar": "workspace:^",
"@uppy/webcam": "workspace:^",
"svelte": "^4.0.0 || ^5.0.0" "svelte": "^4.0.0 || ^5.0.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@uppy/dashboard": { "@uppy/dashboard": {
"optional": true "optional": true
}, },
"@uppy/screen-capture": {
"optional": true
},
"@uppy/status-bar": { "@uppy/status-bar": {
"optional": true "optional": true
},
"@uppy/webcam": {
"optional": true
} }
}, },
"publishConfig": { "publishConfig": {

View file

@ -42,8 +42,6 @@
"./package.json": "./package.json" "./package.json": "./package.json"
}, },
"dependencies": { "dependencies": {
"@uppy/companion-client": "workspace:^",
"@uppy/provider-views": "workspace:^",
"@uppy/tus": "workspace:^", "@uppy/tus": "workspace:^",
"@uppy/utils": "workspace:^", "@uppy/utils": "workspace:^",
"component-emitter": "^2.0.0", "component-emitter": "^2.0.0",

View file

@ -38,14 +38,23 @@
"peerDependencies": { "peerDependencies": {
"@uppy/core": "workspace:^", "@uppy/core": "workspace:^",
"@uppy/dashboard": "workspace:^", "@uppy/dashboard": "workspace:^",
"@uppy/screen-capture": "workspace:^",
"@uppy/status-bar": "workspace:^",
"@uppy/webcam": "workspace:^",
"vue": ">=3.0.0" "vue": ">=3.0.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@uppy/dashboard": { "@uppy/dashboard": {
"optional": true "optional": true
}, },
"@uppy/screen-capture": {
"optional": true
},
"@uppy/status-bar": { "@uppy/status-bar": {
"optional": true "optional": true
},
"@uppy/webcam": {
"optional": true
} }
}, },
"publishConfig": { "publishConfig": {

View file

@ -10698,11 +10698,16 @@ __metadata:
"@angular/core": ^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/core": "workspace:^"
"@uppy/dashboard": "workspace:^" "@uppy/dashboard": "workspace:^"
"@uppy/utils": "workspace:^" "@uppy/status-bar": "workspace:^"
peerDependenciesMeta:
"@uppy/dashboard":
optional: true
"@uppy/status-bar":
optional: true
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@uppy/audio@workspace:*, @uppy/audio@workspace:^, @uppy/audio@workspace:packages/@uppy/audio": "@uppy/audio@workspace:*, @uppy/audio@workspace:packages/@uppy/audio":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@uppy/audio@workspace:packages/@uppy/audio" resolution: "@uppy/audio@workspace:packages/@uppy/audio"
dependencies: dependencies:
@ -10844,18 +10849,25 @@ __metadata:
resolution: "@uppy/components@workspace:packages/@uppy/components" resolution: "@uppy/components@workspace:packages/@uppy/components"
dependencies: dependencies:
"@tailwindcss/cli": "npm:^4.0.6" "@tailwindcss/cli": "npm:^4.0.6"
"@uppy/audio": "workspace:^"
"@uppy/core": "workspace:^" "@uppy/core": "workspace:^"
"@uppy/image-editor": "workspace:^"
"@uppy/remote-sources": "workspace:^"
"@uppy/screen-capture": "workspace:^"
"@uppy/webcam": "workspace:^"
clsx: "npm:^2.1.1" clsx: "npm:^2.1.1"
dequal: "npm:^2.0.3" dequal: "npm:^2.0.3"
preact: "npm:^10.5.13" preact: "npm:^10.5.13"
pretty-bytes: "npm:^6.1.1" pretty-bytes: "npm:^6.1.1"
tailwindcss: "npm:^4.0.6" tailwindcss: "npm:^4.0.6"
typescript: "npm:^5.8.3" typescript: "npm:^5.8.3"
peerDependencies:
"@uppy/core": "workspace:^"
"@uppy/image-editor": "workspace:^"
"@uppy/screen-capture": "workspace:^"
"@uppy/webcam": "workspace:^"
peerDependenciesMeta:
"@uppy/image-editor":
optional: true
"@uppy/screen-capture":
optional: true
"@uppy/webcam":
optional: true
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@ -11009,6 +11021,7 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@uppy/golden-retriever@workspace:packages/@uppy/golden-retriever" resolution: "@uppy/golden-retriever@workspace:packages/@uppy/golden-retriever"
dependencies: dependencies:
"@uppy/core": "workspace:^"
"@uppy/dashboard": "workspace:^" "@uppy/dashboard": "workspace:^"
"@uppy/utils": "workspace:^" "@uppy/utils": "workspace:^"
"@uppy/xhr-upload": "workspace:^" "@uppy/xhr-upload": "workspace:^"
@ -11066,7 +11079,7 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@uppy/image-editor@workspace:*, @uppy/image-editor@workspace:^, @uppy/image-editor@workspace:packages/@uppy/image-editor": "@uppy/image-editor@workspace:*, @uppy/image-editor@workspace:packages/@uppy/image-editor":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@uppy/image-editor@workspace:packages/@uppy/image-editor" resolution: "@uppy/image-editor@workspace:packages/@uppy/image-editor"
dependencies: dependencies:
@ -11160,7 +11173,6 @@ __metadata:
"@types/use-sync-external-store": "npm:^0.0.6" "@types/use-sync-external-store": "npm:^0.0.6"
"@uppy/components": "workspace:^" "@uppy/components": "workspace:^"
"@uppy/core": "workspace:^" "@uppy/core": "workspace:^"
"@uppy/utils": "workspace:^"
jsdom: "npm:^26.1.0" jsdom: "npm:^26.1.0"
preact: "npm:^10.5.13" preact: "npm:^10.5.13"
react: "npm:^18.2.0" react: "npm:^18.2.0"
@ -11172,6 +11184,7 @@ __metadata:
"@uppy/core": "workspace:^" "@uppy/core": "workspace:^"
"@uppy/dashboard": "workspace:^" "@uppy/dashboard": "workspace:^"
"@uppy/screen-capture": "workspace:^" "@uppy/screen-capture": "workspace:^"
"@uppy/status-bar": "workspace:^"
"@uppy/webcam": "workspace:^" "@uppy/webcam": "workspace:^"
react: ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0
@ -11187,7 +11200,7 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@uppy/remote-sources@workspace:*, @uppy/remote-sources@workspace:^, @uppy/remote-sources@workspace:packages/@uppy/remote-sources": "@uppy/remote-sources@workspace:*, @uppy/remote-sources@workspace:packages/@uppy/remote-sources":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@uppy/remote-sources@workspace:packages/@uppy/remote-sources" resolution: "@uppy/remote-sources@workspace:packages/@uppy/remote-sources"
dependencies: dependencies:
@ -11211,7 +11224,7 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@uppy/screen-capture@workspace:*, @uppy/screen-capture@workspace:^, @uppy/screen-capture@workspace:packages/@uppy/screen-capture": "@uppy/screen-capture@workspace:*, @uppy/screen-capture@workspace:packages/@uppy/screen-capture":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@uppy/screen-capture@workspace:packages/@uppy/screen-capture" resolution: "@uppy/screen-capture@workspace:packages/@uppy/screen-capture"
dependencies: dependencies:
@ -11274,12 +11287,19 @@ __metadata:
peerDependencies: peerDependencies:
"@uppy/core": "workspace:^" "@uppy/core": "workspace:^"
"@uppy/dashboard": "workspace:^" "@uppy/dashboard": "workspace:^"
"@uppy/screen-capture": "workspace:^"
"@uppy/status-bar": "workspace:^"
"@uppy/webcam": "workspace:^"
svelte: ^4.0.0 || ^5.0.0 svelte: ^4.0.0 || ^5.0.0
peerDependenciesMeta: peerDependenciesMeta:
"@uppy/dashboard": "@uppy/dashboard":
optional: true optional: true
"@uppy/screen-capture":
optional: true
"@uppy/status-bar": "@uppy/status-bar":
optional: true optional: true
"@uppy/webcam":
optional: true
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@ -11302,9 +11322,7 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@uppy/transloadit@workspace:packages/@uppy/transloadit" resolution: "@uppy/transloadit@workspace:packages/@uppy/transloadit"
dependencies: dependencies:
"@uppy/companion-client": "workspace:^"
"@uppy/core": "workspace:^" "@uppy/core": "workspace:^"
"@uppy/provider-views": "workspace:^"
"@uppy/tus": "workspace:^" "@uppy/tus": "workspace:^"
"@uppy/utils": "workspace:^" "@uppy/utils": "workspace:^"
component-emitter: "npm:^2.0.0" component-emitter: "npm:^2.0.0"
@ -11398,12 +11416,19 @@ __metadata:
peerDependencies: peerDependencies:
"@uppy/core": "workspace:^" "@uppy/core": "workspace:^"
"@uppy/dashboard": "workspace:^" "@uppy/dashboard": "workspace:^"
"@uppy/screen-capture": "workspace:^"
"@uppy/status-bar": "workspace:^"
"@uppy/webcam": "workspace:^"
vue: ">=3.0.0" vue: ">=3.0.0"
peerDependenciesMeta: peerDependenciesMeta:
"@uppy/dashboard": "@uppy/dashboard":
optional: true optional: true
"@uppy/screen-capture":
optional: true
"@uppy/status-bar": "@uppy/status-bar":
optional: true optional: true
"@uppy/webcam":
optional: true
languageName: unknown languageName: unknown
linkType: soft linkType: soft