` or include in JS, if your bundler of choice
supports it.
@@ -101,7 +101,7 @@ CDN. In that case `Uppy` will attach itself to the global `window.Uppy` object.
```html
@@ -112,7 +112,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.9.0/uppy.min.mjs'
+ } from 'https://releases.transloadit.com/uppy/v4.13.1/uppy.min.mjs'
const uppy = new Uppy()
uppy.use(Dashboard, { target: '#files-drag-drop' })
@@ -297,10 +297,10 @@ Use Uppy in your project?
-
-
-
-
+
+
+
+
@@ -315,56 +315,57 @@ Use Uppy in your project?
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bin/build-css.js b/bin/build-css.js
index ad1460382c..d780ddc091 100644
--- a/bin/build-css.js
+++ b/bin/build-css.js
@@ -73,6 +73,7 @@ async function compileCSS () {
}
await mkdir(outdir, { recursive: true })
await writeFile(outfile, postcssResult.css)
+ await writeFile(path.join(outdir, 'style.d.css.ts'), 'export {}\n')
console.info(
chalk.green('✓ Built Uppy CSS:'),
chalk.magenta(path.relative(cwd, outfile)),
@@ -85,6 +86,7 @@ async function compileCSS () {
console.warn(warn.toString())
})
await writeFile(outfile.replace(/\.css$/, '.min.css'), minifiedResult.css)
+ await writeFile(path.join(outdir, 'style.min.d.css.ts'), 'export {}\n')
console.info(
chalk.green('✓ Minified Bundle CSS:'),
chalk.magenta(path.relative(cwd, outfile).replace(/\.css$/, '.min.css')),
diff --git a/examples/cdn-example/index.html b/examples/cdn-example/index.html
index e8061fc009..9ff3abd770 100644
--- a/examples/cdn-example/index.html
+++ b/examples/cdn-example/index.html
@@ -5,7 +5,7 @@
@@ -19,7 +19,7 @@
Dashboard,
Webcam,
Tus,
- } from 'https://releases.transloadit.com/uppy/v4.9.0/uppy.min.mjs'
+ } from 'https://releases.transloadit.com/uppy/v4.13.1/uppy.min.mjs'
const uppy = new Uppy({ debug: true, autoProceed: false })
.use(Dashboard, { trigger: '#uppyModalOpener' })
diff --git a/examples/custom-provider/server/index.cjs b/examples/custom-provider/server/index.cjs
index fb9dc91ab7..e7f8538b73 100644
--- a/examples/custom-provider/server/index.cjs
+++ b/examples/custom-provider/server/index.cjs
@@ -71,7 +71,7 @@ app.use((req, res) => {
// handle server errors
app.use((err, req, res) => {
console.error('\x1b[31m', err.stack, '\x1b[0m')
- res.status(err.status || 500).json({ message: err.message, error: err })
+ res.status(500).json({ message: err.message, error: err })
})
uppy.socket(app.listen(3020), uppyOptions)
diff --git a/examples/svelte-example/package.json b/examples/svelte-example/package.json
index b19338ccc9..036743d2d6 100644
--- a/examples/svelte-example/package.json
+++ b/examples/svelte-example/package.json
@@ -12,7 +12,7 @@
},
"devDependencies": {
"@sveltejs/adapter-static": "^3.0.1",
- "@sveltejs/kit": "^2.0.0",
+ "@sveltejs/kit": "^2.8.3",
"@sveltejs/vite-plugin-svelte": "^3.0.0",
"@types/formidable": "^3",
"npm-run-all": "^4.1.5",
diff --git a/examples/uppy-with-companion/client/index.html b/examples/uppy-with-companion/client/index.html
index 99c6168678..78a88ae83a 100644
--- a/examples/uppy-with-companion/client/index.html
+++ b/examples/uppy-with-companion/client/index.html
@@ -5,7 +5,7 @@
@@ -19,7 +19,7 @@
Instagram,
GoogleDrive,
Tus,
- } from 'https://releases.transloadit.com/uppy/v4.9.0/uppy.min.mjs'
+ } from 'https://releases.transloadit.com/uppy/v4.13.1/uppy.min.mjs'
const uppy = new Uppy({ debug: true, autoProceed: false })
.use(Dashboard, { trigger: '#uppyModalOpener' })
diff --git a/examples/uppy-with-companion/server/index.js b/examples/uppy-with-companion/server/index.js
index 204fc4b27a..ed85fa3f79 100644
--- a/examples/uppy-with-companion/server/index.js
+++ b/examples/uppy-with-companion/server/index.js
@@ -64,7 +64,7 @@ app.use((req, res) => {
// handle server errors
app.use((err, req, res) => {
console.error('\x1b[31m', err.stack, '\x1b[0m')
- res.status(err.status || 500).json({ message: err.message, error: err })
+ res.status(500).json({ message: err.message, error: err })
})
companion.socket(app.listen(3020))
diff --git a/packages/@uppy/angular/tsconfig.json b/packages/@uppy/angular/tsconfig.json
index 82405cd2ca..eae21ced29 100644
--- a/packages/@uppy/angular/tsconfig.json
+++ b/packages/@uppy/angular/tsconfig.json
@@ -2,15 +2,13 @@
{
"compileOnSave": false,
"compilerOptions": {
- "paths": {
- "@uppy/angular": ["dist/uppy/angular"],
- },
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
+ "useUnknownInCatchVariables": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": true,
diff --git a/packages/@uppy/audio/CHANGELOG.md b/packages/@uppy/audio/CHANGELOG.md
index 9f1adfef9d..3e6b1a4d50 100644
--- a/packages/@uppy/audio/CHANGELOG.md
+++ b/packages/@uppy/audio/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/audio
+## 2.1.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 2.0.2
Released: 2024-12-05
diff --git a/packages/@uppy/audio/package.json b/packages/@uppy/audio/package.json
index 1482e8db13..f6c2f15a5e 100644
--- a/packages/@uppy/audio/package.json
+++ b/packages/@uppy/audio/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/audio",
"description": "Uppy plugin that records audio using the device’s microphone.",
- "version": "2.0.2",
+ "version": "2.1.1",
"license": "MIT",
"main": "lib/index.js",
"style": "dist/style.min.css",
diff --git a/packages/@uppy/audio/src/Audio.tsx b/packages/@uppy/audio/src/Audio.tsx
index c3822e9a58..1428e7eca2 100644
--- a/packages/@uppy/audio/src/Audio.tsx
+++ b/packages/@uppy/audio/src/Audio.tsx
@@ -1,18 +1,19 @@
import { h } from 'preact'
-import { UIPlugin, type UIPluginOptions } from '@uppy/core'
+import { UIPlugin } from '@uppy/core'
import type {
+ Uppy,
+ UIPluginOptions,
Body,
Meta,
MinimalRequiredUppyFile,
-} from '@uppy/utils/lib/UppyFile'
-import type { Uppy } from '@uppy/core/lib/Uppy.js'
+} from '@uppy/core'
import getFileTypeExtension from '@uppy/utils/lib/getFileTypeExtension'
-import supportsMediaRecorder from './supportsMediaRecorder.ts'
-import RecordingScreen from './RecordingScreen.tsx'
-import PermissionsScreen from './PermissionsScreen.tsx'
-import locale from './locale.ts'
+import supportsMediaRecorder from './supportsMediaRecorder.js'
+import RecordingScreen from './RecordingScreen.jsx'
+import PermissionsScreen from './PermissionsScreen.jsx'
+import locale from './locale.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
diff --git a/packages/@uppy/audio/src/RecordingLength.tsx b/packages/@uppy/audio/src/RecordingLength.tsx
index 73098a6298..cde1e6760a 100644
--- a/packages/@uppy/audio/src/RecordingLength.tsx
+++ b/packages/@uppy/audio/src/RecordingLength.tsx
@@ -1,6 +1,6 @@
import { h } from 'preact'
import type { I18n } from '@uppy/utils/lib/Translator'
-import formatSeconds from './formatSeconds.ts'
+import formatSeconds from './formatSeconds.js'
interface RecordingLengthProps {
recordingLengthSeconds: number
diff --git a/packages/@uppy/audio/src/RecordingScreen.tsx b/packages/@uppy/audio/src/RecordingScreen.tsx
index 4e1513b8aa..dd2ecc9085 100644
--- a/packages/@uppy/audio/src/RecordingScreen.tsx
+++ b/packages/@uppy/audio/src/RecordingScreen.tsx
@@ -2,14 +2,14 @@
import { h } from 'preact'
import { useEffect, useRef } from 'preact/hooks'
import type { I18n } from '@uppy/utils/lib/Translator'
-import RecordButton from './RecordButton.tsx'
-import RecordingLength from './RecordingLength.tsx'
+import RecordButton from './RecordButton.jsx'
+import RecordingLength from './RecordingLength.jsx'
import AudioSourceSelect, {
type AudioSourceSelectProps,
-} from './AudioSourceSelect.tsx'
-import AudioOscilloscope from './audio-oscilloscope/index.ts'
-import SubmitButton from './SubmitButton.tsx'
-import DiscardButton from './DiscardButton.tsx'
+} from './AudioSourceSelect.jsx'
+import AudioOscilloscope from './audio-oscilloscope/index.js'
+import SubmitButton from './SubmitButton.jsx'
+import DiscardButton from './DiscardButton.jsx'
interface RecordingScreenProps extends AudioSourceSelectProps {
stream: MediaStream | null | undefined
diff --git a/packages/@uppy/audio/src/formatSeconds.test.ts b/packages/@uppy/audio/src/formatSeconds.test.ts
index 6e5c746611..9ddcc35cfc 100644
--- a/packages/@uppy/audio/src/formatSeconds.test.ts
+++ b/packages/@uppy/audio/src/formatSeconds.test.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest'
-import formatSeconds from './formatSeconds.ts'
+import formatSeconds from './formatSeconds.js'
describe('formatSeconds', () => {
it("should return a value of '0:43' when an argument of 43 seconds is supplied", () => {
diff --git a/packages/@uppy/audio/src/index.ts b/packages/@uppy/audio/src/index.ts
index 178ea5b00d..dcc93c6646 100644
--- a/packages/@uppy/audio/src/index.ts
+++ b/packages/@uppy/audio/src/index.ts
@@ -1,2 +1,2 @@
-export { default } from './Audio.tsx'
-export type { AudioOptions } from './Audio.tsx'
+export { default } from './Audio.jsx'
+export type { AudioOptions } from './Audio.jsx'
diff --git a/packages/@uppy/audio/src/supportsMediaRecorder.test.ts b/packages/@uppy/audio/src/supportsMediaRecorder.test.ts
index 8c1e12919e..04c0fcaf4b 100644
--- a/packages/@uppy/audio/src/supportsMediaRecorder.test.ts
+++ b/packages/@uppy/audio/src/supportsMediaRecorder.test.ts
@@ -1,6 +1,6 @@
/* eslint-disable max-classes-per-file, compat/compat */
import { describe, expect, it } from 'vitest'
-import supportsMediaRecorder from './supportsMediaRecorder.ts'
+import supportsMediaRecorder from './supportsMediaRecorder.js'
describe('supportsMediaRecorder', () => {
it('should return true if MediaRecorder is supported', () => {
diff --git a/packages/@uppy/audio/tsconfig.build.json b/packages/@uppy/audio/tsconfig.build.json
index 8d9ed22fa5..bbf30b5b43 100644
--- a/packages/@uppy/audio/tsconfig.build.json
+++ b/packages/@uppy/audio/tsconfig.build.json
@@ -2,11 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/audio/tsconfig.json b/packages/@uppy/audio/tsconfig.json
index a76c3b714a..47ece599c6 100644
--- a/packages/@uppy/audio/tsconfig.json
+++ b/packages/@uppy/audio/tsconfig.json
@@ -3,11 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/aws-s3/CHANGELOG.md b/packages/@uppy/aws-s3/CHANGELOG.md
index ed8fea8f52..54c5b46aae 100644
--- a/packages/@uppy/aws-s3/CHANGELOG.md
+++ b/packages/@uppy/aws-s3/CHANGELOG.md
@@ -1,5 +1,28 @@
# @uppy/aws-s3
+## 4.2.3
+
+Released: 2025-01-22
+Included in: Uppy v4.13.1
+
+- @uppy/aws-s3: Fixed default shouldUseMultipart (Mika Laitinen / #5613)
+- @uppy/aws-s3: remove console.error (Mikael Finstad / #5607)
+
+## 4.2.2
+
+Released: 2025-01-15
+Included in: Uppy v4.13.0
+
+- @uppy/aws-s3: always set S3 meta to UppyFile & include key (Merlijn Vos / #5602)
+- @uppy/aws-s3: allow uploads to fail/succeed independently (Merlijn Vos / #5603)
+
+## 4.2.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 4.1.3
Released: 2024-12-05
diff --git a/packages/@uppy/aws-s3/package.json b/packages/@uppy/aws-s3/package.json
index 1e3488dd1a..2b01e5c7b8 100644
--- a/packages/@uppy/aws-s3/package.json
+++ b/packages/@uppy/aws-s3/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/aws-s3",
"description": "Upload to Amazon S3 with Uppy",
- "version": "4.1.3",
+ "version": "4.2.3",
"license": "MIT",
"main": "lib/index.js",
"type": "module",
diff --git a/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts b/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts
index c015633ad9..76c62c0acf 100644
--- a/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts
+++ b/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts
@@ -1,13 +1,13 @@
-import type { Meta, Body, UppyFile } from '@uppy/utils/lib/UppyFile'
+import type { Meta, Body, UppyFile } from '@uppy/core'
import type {
RateLimitedQueue,
WrapPromiseFunctionType,
} from '@uppy/utils/lib/RateLimitedQueue'
-import { pausingUploadReason, type Chunk } from './MultipartUploader.ts'
-import type AwsS3Multipart from './index.ts'
-import { throwIfAborted } from './utils.ts'
-import type { UploadPartBytesResult, UploadResult } from './utils.ts'
-import type { AwsS3MultipartOptions, uploadPartBytes } from './index.ts'
+import { pausingUploadReason, type Chunk } from './MultipartUploader.js'
+import type AwsS3Multipart from './index.js'
+import { throwIfAborted } from './utils.js'
+import type { UploadPartBytesResult, UploadResult } from './utils.js'
+import type { AwsS3MultipartOptions, uploadPartBytes } from './index.js'
function removeMetadataFromURL(urlString: string) {
const urlObject = new URL(urlString)
@@ -276,15 +276,18 @@ export class HTTPCommunicationQueue {
signal,
}).abortOn(signal)) as unknown as B // todo this doesn't make sense
- // location will be missing from result if CORS is not correctly set up on the bucket.
- return 'location' in result ? result : (
- {
- // todo `url` is not really the final location URL of the resulting file, it's just the base URL of the bucket
- // https://github.com/transloadit/uppy/issues/5388
- location: removeMetadataFromURL(url),
- ...result,
- }
- )
+ // Note: `fields.key` is not returned by old Companion versions.
+ // See https://github.com/transloadit/uppy/pull/5602
+ const key = fields?.key
+ this.#setS3MultipartState(file, { key: key! })
+
+ return {
+ ...result,
+ location:
+ (result.location as string | undefined) ?? removeMetadataFromURL(url),
+ bucket: fields?.bucket,
+ key,
+ }
}
async uploadFile(
@@ -393,7 +396,8 @@ export class HTTPCommunicationQueue {
try {
signature = await this.#fetchSignature(this.#getFile(file), {
- uploadId,
+ // Always defined for multipart uploads
+ uploadId: uploadId!,
key,
partNumber,
body: chunkData,
diff --git a/packages/@uppy/aws-s3/src/MultipartUploader.ts b/packages/@uppy/aws-s3/src/MultipartUploader.ts
index 6f5397a7fd..c32b9d5efb 100644
--- a/packages/@uppy/aws-s3/src/MultipartUploader.ts
+++ b/packages/@uppy/aws-s3/src/MultipartUploader.ts
@@ -1,7 +1,7 @@
import type { Uppy } from '@uppy/core'
import { AbortController } from '@uppy/utils/lib/AbortController'
import type { Meta, Body, UppyFile } from '@uppy/utils/lib/UppyFile'
-import type { HTTPCommunicationQueue } from './HTTPCommunicationQueue.ts'
+import type { HTTPCommunicationQueue } from './HTTPCommunicationQueue.js'
const MB = 1024 * 1024
@@ -16,7 +16,7 @@ interface MultipartUploaderOptions {
file: UppyFile
log: Uppy['log']
- uploadId: string
+ uploadId?: string
key: string
}
diff --git a/packages/@uppy/aws-s3/src/createSignedURL.test.ts b/packages/@uppy/aws-s3/src/createSignedURL.test.ts
index 65000414da..a02fb54c2e 100644
--- a/packages/@uppy/aws-s3/src/createSignedURL.test.ts
+++ b/packages/@uppy/aws-s3/src/createSignedURL.test.ts
@@ -6,7 +6,7 @@ import {
PutObjectCommand,
} from '@aws-sdk/client-s3'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
-import createSignedURL from './createSignedURL.ts'
+import createSignedURL from './createSignedURL.js'
const bucketName = 'some-bucket.with.dots'
const s3ClientOptions = {
diff --git a/packages/@uppy/aws-s3/src/index.test.ts b/packages/@uppy/aws-s3/src/index.test.ts
index afe1c1eda4..7faf2cfae6 100644
--- a/packages/@uppy/aws-s3/src/index.test.ts
+++ b/packages/@uppy/aws-s3/src/index.test.ts
@@ -2,8 +2,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import 'whatwg-fetch'
import nock from 'nock'
-import Core from '@uppy/core'
-import AwsS3Multipart, { type AwsBody } from './index.ts'
+import Core, { type UppyFile } from '@uppy/core'
+import AwsS3Multipart, {
+ type AwsBody,
+ type AwsS3MultipartOptions,
+} from './index.js'
const KB = 1024
const MB = KB * KB
@@ -21,6 +24,92 @@ describe('AwsS3Multipart', () => {
expect(pluginNames).toContain('AwsS3Multipart')
})
+ describe('defaultOptions', () => {
+ let opts: Partial>
+
+ beforeEach(() => {
+ const core = new Core().use(AwsS3Multipart)
+ const awsS3Multipart = core.getPlugin('AwsS3Multipart') as any
+ opts = awsS3Multipart.opts
+ })
+
+ it('allowedMetaFields is true', () => {
+ expect(opts.allowedMetaFields).toBe(true)
+ })
+
+ it('limit is 6', () => {
+ expect(opts.limit).toBe(6)
+ })
+
+ it('getTemporarySecurityCredentials is false', () => {
+ expect(opts.getTemporarySecurityCredentials).toBe(false)
+ })
+
+ describe('shouldUseMultipart', () => {
+ const MULTIPART_THRESHOLD = 100 * MB
+
+ let shouldUseMultipart: (file: UppyFile) => boolean
+
+ beforeEach(() => {
+ shouldUseMultipart = opts.shouldUseMultipart as (
+ file: UppyFile,
+ ) => boolean
+ })
+
+ const createFile = (size: number): UppyFile => ({
+ size,
+ data: new Blob(),
+ extension: '',
+ id: '',
+ isRemote: false,
+ isGhost: false,
+ meta: undefined,
+ progress: {
+ percentage: 0,
+ bytesUploaded: 0,
+ bytesTotal: size,
+ uploadComplete: false,
+ uploadStarted: 0,
+ },
+ type: '',
+ })
+
+ it('returns true for files larger than 100MB', () => {
+ const file = createFile(MULTIPART_THRESHOLD + 1)
+ expect(shouldUseMultipart(file)).toBe(true)
+ })
+
+ it('returns false for files exactly 100MB', () => {
+ const file = createFile(MULTIPART_THRESHOLD)
+ expect(shouldUseMultipart(file)).toBe(false)
+ })
+
+ it('returns false for files smaller than 100MB', () => {
+ const file = createFile(MULTIPART_THRESHOLD - 1)
+ expect(shouldUseMultipart(file)).toBe(false)
+ })
+
+ it('returns true for large files (~70GB)', () => {
+ const file = createFile(70 * 1024 * MB)
+ expect(shouldUseMultipart(file)).toBe(true)
+ })
+
+ it('returns true for very large files (~400GB)', () => {
+ const file = createFile(400 * 1024 * MB)
+ expect(shouldUseMultipart(file)).toBe(true)
+ })
+
+ it('returns false for files with size 0', () => {
+ const file = createFile(0)
+ expect(shouldUseMultipart(file)).toBe(false)
+ })
+ })
+
+ it('retryDelays is [0, 1000, 3000, 5000]', () => {
+ expect(opts.retryDelays).toEqual([0, 1000, 3000, 5000])
+ })
+ })
+
describe('companionUrl assertion', () => {
it('Throws an error for main functions if configured without companionUrl', () => {
const core = new Core().use(AwsS3Multipart)
@@ -50,7 +139,10 @@ describe('AwsS3Multipart', () => {
getUploadParameters: () => ({
method: 'POST',
url: 'https://bucket.s3.us-east-2.amazonaws.com/',
- fields: {},
+ fields: {
+ key: 'file',
+ bucket: 'https://bucket.s3.us-east-2.amazonaws.com/',
+ },
}),
})
const scope = nock(
@@ -89,6 +181,8 @@ describe('AwsS3Multipart', () => {
ETag: 'test',
etag: 'test',
location: 'http://example.com',
+ key: 'file',
+ bucket: 'https://bucket.s3.us-east-2.amazonaws.com/',
},
status: 200,
uploadURL: 'http://example.com',
@@ -239,7 +333,7 @@ describe('AwsS3Multipart', () => {
const signPart = vi.fn(async (file, { partNumber }) => {
return {
- url: `https://bucket.s3.us-east-2.amazonaws.com/test/upload/multitest.dat?partNumber=${partNumber}&uploadId=6aeb1980f3fc7ce0b5454d25b71992&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIATEST%2F20210729%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210729T014044Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=test`,
+ url: `https://bucket.s3.us-east-2.amazonaws.com/test/upload/${file.name}?partNumber=${partNumber}&uploadId=6aeb1980f3fc7ce0b5454d25b71992&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIATEST%2F20210729%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210729T014044Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=test`,
}
})
@@ -286,34 +380,61 @@ describe('AwsS3Multipart', () => {
const core = new Core().use(AwsS3Multipart, {
shouldUseMultipart: true,
retryDelays: [10],
- createMultipartUpload,
+ createMultipartUpload: vi.fn((file) => ({
+ uploadId: '6aeb1980f3fc7ce0b5454d25b71992',
+ key: `test/upload/${file.name}`,
+ })),
completeMultipartUpload: vi.fn(async () => ({ location: 'test' })),
abortMultipartUpload: vi.fn(),
signPart,
- uploadPartBytes: uploadPartBytes.mockImplementation(() =>
+ uploadPartBytes: uploadPartBytes.mockImplementation((options) => {
+ if (options.signature.url.includes('succeed.dat')) {
+ return new Promise((resolve) => {
+ // delay until after multitest.dat has failed.
+ setTimeout(() => resolve({ status: 200 }), 100)
+ })
+ }
// eslint-disable-next-line prefer-promise-reject-errors
- Promise.reject({ source: { status: 500 } }),
- ),
+ return Promise.reject({ source: { status: 500 } })
+ }),
listParts: undefined as any,
})
- const awsS3Multipart = core.getPlugin('AwsS3Multipart')!
const fileSize = 5 * MB + 1 * MB
- const mock = vi.fn()
- core.on('upload-error', mock)
+ const awsS3Multipart = core.getPlugin('AwsS3Multipart')!
+ const uploadErrorMock = vi.fn()
+ const uploadSuccessMock = vi.fn()
+ core.on('upload-error', uploadErrorMock)
+ core.on('upload-success', uploadSuccessMock)
core.addFile({
source: 'vi',
- name: 'multitest.dat',
+ name: 'fail.dat',
type: 'application/octet-stream',
data: new File([new Uint8Array(fileSize)], '', {
type: 'application/octet-stream',
}),
})
- await expect(core.upload()).rejects.toEqual({ source: { status: 500 } })
+ core.addFile({
+ source: 'vi',
+ name: 'succeed.dat',
+ type: 'application/octet-stream',
+ data: new File([new Uint8Array(fileSize)], '', {
+ type: 'application/octet-stream',
+ }),
+ })
- expect(awsS3Multipart.opts.uploadPartBytes.mock.calls.length).toEqual(3)
- expect(mock.mock.calls.length).toEqual(1)
+ try {
+ const results = await core.upload()
+ expect(results!.successful!.length).toEqual(1)
+ expect(results!.failed!.length).toEqual(1)
+ } catch {
+ // Catch Promise.all reject
+ }
+
+ expect(awsS3Multipart.opts.uploadPartBytes.mock.calls.length).toEqual(5)
+ expect(uploadErrorMock.mock.calls.length).toEqual(1)
+ expect(uploadSuccessMock.mock.calls.length).toEqual(1) // This fails for me becuase upload returned early.
})
})
diff --git a/packages/@uppy/aws-s3/src/index.ts b/packages/@uppy/aws-s3/src/index.ts
index 8892f4c278..3f7f0fcbe9 100644
--- a/packages/@uppy/aws-s3/src/index.ts
+++ b/packages/@uppy/aws-s3/src/index.ts
@@ -1,11 +1,12 @@
-import BasePlugin, {
+import {
type DefinePluginOpts,
type PluginOpts,
-} from '@uppy/core/lib/BasePlugin.js'
+ Uppy,
+ BasePlugin,
+} from '@uppy/core'
import { RequestClient } from '@uppy/companion-client'
import type { RequestOptions } from '@uppy/utils/lib/CompanionClientProvider'
import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile'
-import type { Uppy } from '@uppy/core'
import EventManager from '@uppy/core/lib/EventManager.js'
import { RateLimitedQueue } from '@uppy/utils/lib/RateLimitedQueue'
import {
@@ -14,16 +15,16 @@ import {
} from '@uppy/utils/lib/fileFilters'
import { createAbortError } from '@uppy/utils/lib/AbortController'
import getAllowedMetaFields from '@uppy/utils/lib/getAllowedMetaFields'
-import MultipartUploader from './MultipartUploader.ts'
-import { throwIfAborted } from './utils.ts'
+import MultipartUploader from './MultipartUploader.js'
+import { throwIfAborted } from './utils.js'
import type {
UploadResult,
UploadResultWithSignal,
MultipartUploadResultWithSignal,
UploadPartBytesResult,
-} from './utils.ts'
-import createSignedURL from './createSignedURL.ts'
-import { HTTPCommunicationQueue } from './HTTPCommunicationQueue.ts'
+} from './utils.js'
+import createSignedURL from './createSignedURL.js'
+import { HTTPCommunicationQueue } from './HTTPCommunicationQueue.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
@@ -283,14 +284,12 @@ const defaultOptions = {
allowedMetaFields: true,
limit: 6,
getTemporarySecurityCredentials: false as any,
- // eslint-disable-next-line no-bitwise
shouldUseMultipart: ((file: UppyFile) =>
- // eslint-disable-next-line no-bitwise
- (file.size! >> 10) >> 10 > 100) as any as true,
+ (file.size || 0) > 100 * 1024 * 1024) as any as true,
retryDelays: [0, 1000, 3000, 5000],
} satisfies Partial>
-export type { AwsBody } from './utils.ts'
+export type { AwsBody } from './utils.js'
export default class AwsS3Multipart<
M extends Meta,
@@ -509,7 +508,7 @@ export default class AwsS3Multipart<
return this.#client
.get<
AwsS3Part[]
- >(`s3/multipart/${encodeURIComponent(uploadId)}?key=${filename}`, { signal })
+ >(`s3/multipart/${encodeURIComponent(uploadId!)}?key=${filename}`, { signal })
.then(assertServerError)
}
@@ -523,7 +522,7 @@ export default class AwsS3Multipart<
throwIfAborted(signal)
const filename = encodeURIComponent(key)
- const uploadIdEnc = encodeURIComponent(uploadId)
+ const uploadIdEnc = encodeURIComponent(uploadId!)
return this.#client
.post(
`s3/multipart/${uploadIdEnc}/complete?key=${filename}`,
@@ -632,7 +631,7 @@ export default class AwsS3Multipart<
this.#assertHost('abortMultipartUpload')
const filename = encodeURIComponent(key)
- const uploadIdEnc = encodeURIComponent(uploadId)
+ const uploadIdEnc = encodeURIComponent(uploadId!)
return this.#client
.delete(`s3/multipart/${uploadIdEnc}?key=${filename}`, undefined, {
signal,
@@ -985,7 +984,7 @@ export default class AwsS3Multipart<
return this.#uploadLocalFile(file)
})
- const upload = await Promise.all(promises)
+ const upload = await Promise.allSettled(promises)
// After the upload is done, another upload may happen with only local files.
// We reset the capability so that the next upload can use resumable uploads.
this.#setResumableUploadsCapability(true)
diff --git a/packages/@uppy/aws-s3/src/utils.ts b/packages/@uppy/aws-s3/src/utils.ts
index 278ca6054f..924e448e94 100644
--- a/packages/@uppy/aws-s3/src/utils.ts
+++ b/packages/@uppy/aws-s3/src/utils.ts
@@ -1,7 +1,7 @@
import { createAbortError } from '@uppy/utils/lib/AbortController'
import type { Body } from '@uppy/utils/lib/UppyFile'
-import type { AwsS3Part } from './index.ts'
+import type { AwsS3Part } from './index.js'
export function throwIfAborted(signal?: AbortSignal | null): void {
if (signal?.aborted) {
@@ -11,7 +11,7 @@ export function throwIfAborted(signal?: AbortSignal | null): void {
}
}
-export type UploadResult = { key: string; uploadId: string }
+export type UploadResult = { key: string; uploadId?: string; bucket?: string }
export type UploadResultWithSignal = UploadResult & { signal?: AbortSignal }
export type MultipartUploadResult = UploadResult & { parts: AwsS3Part[] }
export type MultipartUploadResultWithSignal = MultipartUploadResult & {
@@ -25,4 +25,6 @@ export type UploadPartBytesResult = {
export interface AwsBody extends Body {
location: string
+ key: string
+ bucket: string
}
diff --git a/packages/@uppy/aws-s3/tsconfig.build.json b/packages/@uppy/aws-s3/tsconfig.build.json
index b61a0f40cb..bd96ae4f3c 100644
--- a/packages/@uppy/aws-s3/tsconfig.build.json
+++ b/packages/@uppy/aws-s3/tsconfig.build.json
@@ -2,13 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/aws-s3/tsconfig.json b/packages/@uppy/aws-s3/tsconfig.json
index f43408fa18..2355b5c43d 100644
--- a/packages/@uppy/aws-s3/tsconfig.json
+++ b/packages/@uppy/aws-s3/tsconfig.json
@@ -3,13 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/box/CHANGELOG.md b/packages/@uppy/box/CHANGELOG.md
index b8a859813b..f36a0c20e5 100644
--- a/packages/@uppy/box/CHANGELOG.md
+++ b/packages/@uppy/box/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/box
+## 3.2.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 3.1.2
Released: 2024-12-05
diff --git a/packages/@uppy/box/package.json b/packages/@uppy/box/package.json
index 9b3bb3a4d1..6d94d1c921 100644
--- a/packages/@uppy/box/package.json
+++ b/packages/@uppy/box/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/box",
"description": "Import files from Box, into Uppy.",
- "version": "3.1.2",
+ "version": "3.2.1",
"license": "MIT",
"main": "lib/index.js",
"type": "module",
diff --git a/packages/@uppy/box/src/Box.tsx b/packages/@uppy/box/src/Box.tsx
index e004aff38b..3171f269e9 100644
--- a/packages/@uppy/box/src/Box.tsx
+++ b/packages/@uppy/box/src/Box.tsx
@@ -8,13 +8,15 @@ import { UIPlugin, Uppy } from '@uppy/core'
import { ProviderViews } from '@uppy/provider-views'
import { h, type ComponentChild } from 'preact'
-import type { UppyFile, Body, Meta } from '@uppy/utils/lib/UppyFile'
import type {
+ UppyFile,
+ Body,
+ Meta,
AsyncStore,
UnknownProviderPlugin,
UnknownProviderPluginState,
-} from '@uppy/core/lib/Uppy.js'
-import locale from './locale.ts'
+} from '@uppy/core'
+import locale from './locale.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
diff --git a/packages/@uppy/box/src/index.ts b/packages/@uppy/box/src/index.ts
index 60192cdf13..466dbe9bcc 100644
--- a/packages/@uppy/box/src/index.ts
+++ b/packages/@uppy/box/src/index.ts
@@ -1,2 +1,2 @@
-export { default } from './Box.tsx'
-export type { BoxOptions } from './Box.tsx'
+export { default } from './Box.jsx'
+export type { BoxOptions } from './Box.jsx'
diff --git a/packages/@uppy/box/tsconfig.build.json b/packages/@uppy/box/tsconfig.build.json
index 0b2f94bc10..82e187bca0 100644
--- a/packages/@uppy/box/tsconfig.build.json
+++ b/packages/@uppy/box/tsconfig.build.json
@@ -2,15 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/box/tsconfig.json b/packages/@uppy/box/tsconfig.json
index e5220fb5ab..b90847da71 100644
--- a/packages/@uppy/box/tsconfig.json
+++ b/packages/@uppy/box/tsconfig.json
@@ -3,15 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/companion-client/CHANGELOG.md b/packages/@uppy/companion-client/CHANGELOG.md
index 304dd6ef92..648bc91cb9 100644
--- a/packages/@uppy/companion-client/CHANGELOG.md
+++ b/packages/@uppy/companion-client/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/companion-client
+## 4.4.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 4.2.0
Released: 2024-12-05
diff --git a/packages/@uppy/companion-client/package.json b/packages/@uppy/companion-client/package.json
index 1e6b248fb8..62ae4897ae 100644
--- a/packages/@uppy/companion-client/package.json
+++ b/packages/@uppy/companion-client/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/companion-client",
"description": "Client library for communication with Companion. Intended for use in Uppy plugins.",
- "version": "4.3.0",
+ "version": "4.4.1",
"license": "MIT",
"main": "lib/index.js",
"type": "module",
diff --git a/packages/@uppy/companion-client/src/CompanionPluginOptions.ts b/packages/@uppy/companion-client/src/CompanionPluginOptions.ts
index a923952e75..decfdecabb 100644
--- a/packages/@uppy/companion-client/src/CompanionPluginOptions.ts
+++ b/packages/@uppy/companion-client/src/CompanionPluginOptions.ts
@@ -1,5 +1,4 @@
-import type { UIPluginOptions } from '@uppy/core'
-import type { AsyncStore } from '@uppy/core/lib/Uppy.js'
+import type { UIPluginOptions, AsyncStore } from '@uppy/core'
export interface CompanionPluginOptions extends UIPluginOptions {
storage?: AsyncStore
diff --git a/packages/@uppy/companion-client/src/Provider.ts b/packages/@uppy/companion-client/src/Provider.ts
index 2aff9879d2..3a716c3df4 100644
--- a/packages/@uppy/companion-client/src/Provider.ts
+++ b/packages/@uppy/companion-client/src/Provider.ts
@@ -1,14 +1,17 @@
-import type { Uppy } from '@uppy/core'
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
-import type { PluginOpts } from '@uppy/core/lib/BasePlugin.js'
+import type {
+ Uppy,
+ Body,
+ Meta,
+ PluginOpts,
+ UnknownProviderPlugin,
+} from '@uppy/core'
import type {
RequestOptions,
CompanionClientProvider,
} from '@uppy/utils/lib/CompanionClientProvider'
-import type { UnknownProviderPlugin } from '@uppy/core/lib/Uppy.js'
-import RequestClient, { authErrorStatusCode } from './RequestClient.ts'
-import type { CompanionPluginOptions } from './index.ts'
-import { isOriginAllowed } from './getAllowedHosts.ts'
+import RequestClient, { authErrorStatusCode } from './RequestClient.js'
+import type { CompanionPluginOptions } from './index.js'
+import { isOriginAllowed } from './getAllowedHosts.js'
export interface Opts extends PluginOpts, CompanionPluginOptions {
pluginId: string
diff --git a/packages/@uppy/companion-client/src/RequestClient.test.ts b/packages/@uppy/companion-client/src/RequestClient.test.ts
index 2277387c4e..f7dd1fe9a0 100644
--- a/packages/@uppy/companion-client/src/RequestClient.test.ts
+++ b/packages/@uppy/companion-client/src/RequestClient.test.ts
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest'
-import RequestClient from './RequestClient.ts'
+import RequestClient from './RequestClient.js'
describe('RequestClient', () => {
it('has a hostname without trailing slash', () => {
diff --git a/packages/@uppy/companion-client/src/RequestClient.ts b/packages/@uppy/companion-client/src/RequestClient.ts
index d8f3702e64..4ac1199fe5 100644
--- a/packages/@uppy/companion-client/src/RequestClient.ts
+++ b/packages/@uppy/companion-client/src/RequestClient.ts
@@ -9,7 +9,7 @@ import getSocketHost from '@uppy/utils/lib/getSocketHost'
import type Uppy from '@uppy/core'
import type { UppyFile, Meta, Body } from '@uppy/utils/lib/UppyFile'
import type { RequestOptions } from '@uppy/utils/lib/CompanionClientProvider'
-import AuthError from './AuthError.ts'
+import AuthError from './AuthError.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
diff --git a/packages/@uppy/companion-client/src/SearchProvider.ts b/packages/@uppy/companion-client/src/SearchProvider.ts
index b0c83b5fdd..7a9b266c72 100644
--- a/packages/@uppy/companion-client/src/SearchProvider.ts
+++ b/packages/@uppy/companion-client/src/SearchProvider.ts
@@ -1,7 +1,6 @@
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
-import type { Uppy } from '@uppy/core'
+import type { Body, Meta, Uppy } from '@uppy/core'
import type { CompanionClientSearchProvider } from '@uppy/utils/lib/CompanionClientProvider'
-import RequestClient, { type Opts } from './RequestClient.ts'
+import RequestClient, { type Opts } from './RequestClient.js'
const getName = (id: string): string => {
return id
diff --git a/packages/@uppy/companion-client/src/getAllowedHosts.test.ts b/packages/@uppy/companion-client/src/getAllowedHosts.test.ts
index 92dd634524..a58893a058 100644
--- a/packages/@uppy/companion-client/src/getAllowedHosts.test.ts
+++ b/packages/@uppy/companion-client/src/getAllowedHosts.test.ts
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest'
-import getAllowedHosts, { isOriginAllowed } from './getAllowedHosts.ts'
+import getAllowedHosts, { isOriginAllowed } from './getAllowedHosts.js'
describe('getAllowedHosts', () => {
it('can convert companionAllowedHosts', () => {
diff --git a/packages/@uppy/companion-client/src/index.ts b/packages/@uppy/companion-client/src/index.ts
index 9d5e7413e1..7a22cdea1d 100644
--- a/packages/@uppy/companion-client/src/index.ts
+++ b/packages/@uppy/companion-client/src/index.ts
@@ -2,12 +2,12 @@
* Manages communications with Companion
*/
-export { default as RequestClient } from './RequestClient.ts'
-export { default as Provider } from './Provider.ts'
-export { default as SearchProvider } from './SearchProvider.ts'
+export { default as RequestClient } from './RequestClient.js'
+export { default as Provider } from './Provider.js'
+export { default as SearchProvider } from './SearchProvider.js'
-export { default as getAllowedHosts } from './getAllowedHosts.ts'
+export { default as getAllowedHosts } from './getAllowedHosts.js'
-export * as tokenStorage from './tokenStorage.ts'
+export * as tokenStorage from './tokenStorage.js'
-export type { CompanionPluginOptions } from './CompanionPluginOptions.ts'
+export type { CompanionPluginOptions } from './CompanionPluginOptions.js'
diff --git a/packages/@uppy/companion-client/tsconfig.build.json b/packages/@uppy/companion-client/tsconfig.build.json
index 8d9ed22fa5..bbf30b5b43 100644
--- a/packages/@uppy/companion-client/tsconfig.build.json
+++ b/packages/@uppy/companion-client/tsconfig.build.json
@@ -2,11 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/companion-client/tsconfig.json b/packages/@uppy/companion-client/tsconfig.json
index a76c3b714a..47ece599c6 100644
--- a/packages/@uppy/companion-client/tsconfig.json
+++ b/packages/@uppy/companion-client/tsconfig.json
@@ -3,11 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/companion/CHANGELOG.md b/packages/@uppy/companion/CHANGELOG.md
index 1472a68a8b..adf4aa6d1c 100644
--- a/packages/@uppy/companion/CHANGELOG.md
+++ b/packages/@uppy/companion/CHANGELOG.md
@@ -1,5 +1,34 @@
# @uppy/companion
+## 5.5.1
+
+Released: 2025-01-22
+Included in: Uppy v4.13.1
+
+- @uppy/companion: unify http error responses (Mikael Finstad / #5595)
+
+## 5.5.0
+
+Released: 2025-01-15
+Included in: Uppy v4.13.0
+
+- @uppy/companion: fix forcePathStyle boolean conversion (Mikael Finstad / #5308)
+- @uppy/companion: add COMPANION_TUS_DEFERRED_UPLOAD_LENGTH (Dominik Schmidt / #5561)
+
+## 5.4.1
+
+Released: 2025-01-08
+Included in: Uppy v4.12.1
+
+- @uppy/companion: upgrade express & express-session (Merlijn Vos / #5582)
+
+## 5.4.0
+
+Released: 2025-01-06
+Included in: Uppy v4.10.0
+
+- @uppy/companion: pass fetched origins to window.postMessage() (Merlijn Vos / #5529)
+
## 5.2.0
Released: 2024-12-05
diff --git a/packages/@uppy/companion/KUBERNETES.md b/packages/@uppy/companion/KUBERNETES.md
index b9c908bb3a..5b148a4780 100644
--- a/packages/@uppy/companion/KUBERNETES.md
+++ b/packages/@uppy/companion/KUBERNETES.md
@@ -28,6 +28,7 @@ data:
COMPANION_DOMAINS: 'sub1.domain.com,sub2.domain.com,sub3.domain.com'
COMPANION_PROTOCOL: 'YOUR SERVER PROTOCOL'
COMPANION_STREAMING_UPLOAD: true
+ COMPANION_TUS_DEFERRED_UPLOAD_LENGTH: true
COMPANION_REDIS_URL: redis://:superSecretPassword@uppy-redis.uppy.svc.cluster.local:6379
COMPANION_SECRET: 'shh!Issa Secret!'
COMPANION_PREAUTH_SECRET: 'another secret'
diff --git a/packages/@uppy/companion/env_example b/packages/@uppy/companion/env_example
index 08b3e0acf1..b166facda9 100644
--- a/packages/@uppy/companion/env_example
+++ b/packages/@uppy/companion/env_example
@@ -5,6 +5,7 @@ COMPANION_SELF_ENDPOINT=uppy.xxxx.com
COMPANION_HIDE_METRICS=false
COMPANION_HIDE_WELCOME=false
COMPANION_STREAMING_UPLOAD=true
+COMPANION_TUS_DEFERRED_UPLOAD_LENGTH=true
COMPANION_PROTOCOL=https
COMPANION_DATADIR=/mnt/uppy-server-data
diff --git a/packages/@uppy/companion/package.json b/packages/@uppy/companion/package.json
index 68a500b6ef..37b987bb52 100644
--- a/packages/@uppy/companion/package.json
+++ b/packages/@uppy/companion/package.json
@@ -1,6 +1,6 @@
{
"name": "@uppy/companion",
- "version": "5.3.0",
+ "version": "5.5.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",
@@ -41,10 +41,10 @@
"cors": "^2.8.5",
"escape-goat": "3.0.0",
"escape-string-regexp": "4.0.0",
- "express": "4.19.2",
+ "express": "4.21.2",
"express-interceptor": "1.2.0",
"express-prom-bundle": "7.0.0",
- "express-session": "1.18.0",
+ "express-session": "1.18.1",
"fast-safe-stringify": "^2.1.1",
"got": "^13.0.0",
"grant": "5.4.22",
diff --git a/packages/@uppy/companion/src/server/Uploader.js b/packages/@uppy/companion/src/server/Uploader.js
index 9c2e3dd64b..9f8014549d 100644
--- a/packages/@uppy/companion/src/server/Uploader.js
+++ b/packages/@uppy/companion/src/server/Uploader.js
@@ -509,9 +509,7 @@ class Uploader {
const tusOptions = {
endpoint: this.options.endpoint,
uploadUrl: this.options.uploadUrl,
- uploadLengthDeferred: !isFileStream,
retryDelays: [0, 1000, 3000, 5000],
- uploadSize: isFileStream ? this.size : undefined,
chunkSize,
headers: headerSanitize(this.options.headers),
addRequestId: true,
@@ -553,6 +551,16 @@ class Uploader {
},
}
+ if (this.options.companionOptions.tusDeferredUploadLength && !isFileStream) {
+ tusOptions.uploadLengthDeferred = true
+ } else {
+ if (!this.size) {
+ reject(new Error('tusDeferredUploadLength needs to be enabled if no file size is provided by the provider'))
+ }
+ tusOptions.uploadLengthDeferred = false
+ tusOptions.uploadSize = this.size
+ }
+
this.tus = new tus.Upload(stream, tusOptions)
this.tus.start()
diff --git a/packages/@uppy/companion/src/server/controllers/get.js b/packages/@uppy/companion/src/server/controllers/get.js
index 6364399967..75406f33c1 100644
--- a/packages/@uppy/companion/src/server/controllers/get.js
+++ b/packages/@uppy/companion/src/server/controllers/get.js
@@ -1,5 +1,7 @@
const logger = require('../logger')
const { startDownUpload } = require('../helpers/upload')
+const { respondWithError } = require('../provider/error')
+
async function get (req, res) {
const { id } = req.params
@@ -17,6 +19,7 @@ async function get (req, res) {
await startDownUpload({ req, res, getSize, download })
} catch (err) {
logger.error(err, 'controller.get.error', req.id)
+ if (respondWithError(err, res)) return
res.status(500).json({ message: 'Failed to download file' })
}
}
diff --git a/packages/@uppy/companion/src/server/controllers/googlePicker.js b/packages/@uppy/companion/src/server/controllers/googlePicker.js
index 4b3dd051ee..b08d66a605 100644
--- a/packages/@uppy/companion/src/server/controllers/googlePicker.js
+++ b/packages/@uppy/companion/src/server/controllers/googlePicker.js
@@ -7,6 +7,7 @@ const { getURLMeta } = require('../helpers/request')
const logger = require('../logger')
const { downloadURL } = require('../download')
const { getGoogleFileSize, streamGoogleFile } = require('../provider/google/drive');
+const { respondWithError } = require('../provider/error')
const getAuthHeader = (token) => ({ authorization: `Bearer ${token}` });
@@ -49,7 +50,8 @@ const get = async (req, res) => {
await startDownUpload({ req, res, getSize, download })
} catch (err) {
logger.error(err, 'controller.googlePicker.error', req.id)
- res.status(err.status || 500).json({ message: 'failed to fetch Google Picker URL' })
+ if (respondWithError(err, res)) return
+ res.status(500).json({ message: 'failed to fetch Google Picker URL' })
}
}
diff --git a/packages/@uppy/companion/src/server/controllers/s3.js b/packages/@uppy/companion/src/server/controllers/s3.js
index a084de2cbe..19a91796c7 100644
--- a/packages/@uppy/companion/src/server/controllers/s3.js
+++ b/packages/@uppy/companion/src/server/controllers/s3.js
@@ -135,6 +135,7 @@ module.exports = function s3 (config) {
res.json({
key: data.Key,
uploadId: data.UploadId,
+ bucket: data.Bucket
})
}, next)
}
@@ -360,6 +361,8 @@ module.exports = function s3 (config) {
})).then(data => {
res.json({
location: data.Location,
+ key: data.Key,
+ bucket: data.Bucket
})
}, next)
}
diff --git a/packages/@uppy/companion/src/server/controllers/url.js b/packages/@uppy/companion/src/server/controllers/url.js
index 838d659ee7..99b1e96667 100644
--- a/packages/@uppy/companion/src/server/controllers/url.js
+++ b/packages/@uppy/companion/src/server/controllers/url.js
@@ -5,6 +5,7 @@ const { downloadURL } = require('../download')
const { validateURL } = require('../helpers/request')
const { getURLMeta } = require('../helpers/request')
const logger = require('../logger')
+const { respondWithError } = require('../provider/error')
/**
* @callback downloadCallback
@@ -24,14 +25,16 @@ const meta = async (req, res) => {
const { allowLocalUrls } = req.companion.options
if (!validateURL(req.body.url, allowLocalUrls)) {
logger.debug('Invalid request body detected. Exiting url meta handler.', null, req.id)
- return res.status(400).json({ error: 'Invalid request body' })
+ res.status(400).json({ error: 'Invalid request body' })
+ return
}
const urlMeta = await getURLMeta(req.body.url, allowLocalUrls)
- return res.json(urlMeta)
+ res.json(urlMeta)
} catch (err) {
logger.error(err, 'controller.url.meta.error', req.id)
- return res.status(err.status || 500).json({ message: 'failed to fetch URL metadata' })
+ if (respondWithError(err, res)) return
+ res.status(500).json({ message: 'failed to fetch URL metadata' })
}
}
@@ -62,7 +65,8 @@ const get = async (req, res) => {
await startDownUpload({ req, res, getSize, download })
} catch (err) {
logger.error(err, 'controller.url.error', req.id)
- res.status(err.status || 500).json({ message: 'failed to fetch URL' })
+ if (respondWithError(err, res)) return
+ res.status(500).json({ message: 'failed to fetch URL' })
}
}
diff --git a/packages/@uppy/companion/src/server/helpers/upload.js b/packages/@uppy/companion/src/server/helpers/upload.js
index b628634eeb..b508c52dff 100644
--- a/packages/@uppy/companion/src/server/helpers/upload.js
+++ b/packages/@uppy/companion/src/server/helpers/upload.js
@@ -1,51 +1,38 @@
const Uploader = require('../Uploader')
const logger = require('../logger')
-const { respondWithError } = require('../provider/error')
async function startDownUpload({ req, res, getSize, download }) {
- try {
- logger.debug('Starting download stream.', null, req.id)
- const { stream, size: maybeSize } = await download()
+ logger.debug('Starting download stream.', null, req.id)
+ const { stream, size: maybeSize } = await download()
- let size
- // if the provider already knows the size, we can use that
- if (typeof maybeSize === 'number' && !Number.isNaN(maybeSize) && maybeSize > 0) {
- size = maybeSize
- }
- // if not we need to get the size
- if (size == null) {
- size = await getSize()
- }
- const { clientSocketConnectTimeout } = req.companion.options
-
- logger.debug('Instantiating uploader.', null, req.id)
- const uploader = new Uploader(Uploader.reqToOptions(req, size))
-
- // "Forking" off the upload operation to background, so we can return the http request:
- ; (async () => {
- // wait till the client has connected to the socket, before starting
- // the download, so that the client can receive all download/upload progress.
- logger.debug('Waiting for socket connection before beginning remote download/upload.', null, req.id)
- await uploader.awaitReady(clientSocketConnectTimeout)
- logger.debug('Socket connection received. Starting remote download/upload.', null, req.id)
+ let size
+ // if the provider already knows the size, we can use that
+ if (typeof maybeSize === 'number' && !Number.isNaN(maybeSize) && maybeSize > 0) {
+ size = maybeSize
+ }
+ // if not we need to get the size
+ if (size == null) {
+ size = await getSize()
+ }
+ const { clientSocketConnectTimeout } = req.companion.options
- await uploader.tryUploadStream(stream, req)
- })().catch((err) => logger.error(err))
+ logger.debug('Instantiating uploader.', null, req.id)
+ const uploader = new Uploader(Uploader.reqToOptions(req, size))
- // Respond the request
- // NOTE: the Uploader will continue running after the http request is responded
- res.status(200).json({ token: uploader.token })
- } catch (err) {
- if (err.name === 'ValidationError') {
- logger.debug(err.message, 'uploader.validator.fail')
- res.status(400).json({ message: err.message })
- return
- }
+ // "Forking" off the upload operation to background, so we can return the http request:
+ ; (async () => {
+ // wait till the client has connected to the socket, before starting
+ // the download, so that the client can receive all download/upload progress.
+ logger.debug('Waiting for socket connection before beginning remote download/upload.', null, req.id)
+ await uploader.awaitReady(clientSocketConnectTimeout)
+ logger.debug('Socket connection received. Starting remote download/upload.', null, req.id)
- if (respondWithError(err, res)) return
+ await uploader.tryUploadStream(stream, req)
+ })().catch((err) => logger.error(err))
- throw err
- }
+ // Respond the request
+ // NOTE: the Uploader will continue running after the http request is responded
+ res.status(200).json({ token: uploader.token })
}
module.exports = { startDownUpload }
diff --git a/packages/@uppy/companion/src/server/helpers/utils.js b/packages/@uppy/companion/src/server/helpers/utils.js
index 4578f0d224..26fb46c330 100644
--- a/packages/@uppy/companion/src/server/helpers/utils.js
+++ b/packages/@uppy/companion/src/server/helpers/utils.js
@@ -148,6 +148,9 @@ module.exports.decrypt = (encrypted, secret) => {
module.exports.defaultGetKey = ({ filename }) => `${crypto.randomUUID()}-${filename}`
+/**
+ * Our own HttpError in cases where we can't use `got`'s `HTTPError`
+ */
class HttpError extends Error {
statusCode
@@ -176,7 +179,7 @@ module.exports.prepareStream = async (stream) => new Promise((resolve, reject) =
})
.on('error', (err) => {
// In this case the error object is not a normal GOT HTTPError where json is already parsed,
- // we create our own HttpError error for this case
+ // we use our own HttpError error for this scenario.
if (typeof err.response?.body === 'string' && typeof err.response?.statusCode === 'number') {
let responseJson
try {
diff --git a/packages/@uppy/companion/src/server/provider/error.js b/packages/@uppy/companion/src/server/provider/error.js
index efb4a53381..1f76212bff 100644
--- a/packages/@uppy/companion/src/server/provider/error.js
+++ b/packages/@uppy/companion/src/server/provider/error.js
@@ -30,6 +30,8 @@ class ProviderUserError extends ProviderApiError {
/**
* AuthError is error returned when an adapter encounters
* an authorization error while communication with its corresponding provider
+ * this signals to the client that the access token is invalid and needs to be
+ * refreshed or the user needs to re-authenticate
*/
class ProviderAuthError extends ProviderApiError {
constructor() {
@@ -39,10 +41,27 @@ class ProviderAuthError extends ProviderApiError {
}
}
+function parseHttpError(err) {
+ if (err?.name === 'HTTPError') {
+ return {
+ statusCode: err.response?.statusCode,
+ body: err.response?.body,
+ }
+ }
+ if (err?.name === 'HttpError') {
+ return {
+ statusCode: err.statusCode,
+ body: err.responseJson,
+ }
+ }
+ return undefined
+}
+
/**
* Convert an error instance to an http response if possible
*
* @param {Error | ProviderApiError} err the error instance to convert to an http json response
+ * @returns {object | undefined} an object with a code and json field if the error can be converted to a response
*/
function errorToResponse(err) {
// @ts-ignore
@@ -50,6 +69,10 @@ function errorToResponse(err) {
return { code: 401, json: { message: err.message } }
}
+ if (err?.name === 'ValidationError') {
+ return { code: 400, json: { message: err.message } }
+ }
+
if (err?.name === 'ProviderUserError') {
// @ts-ignore
return { code: 400, json: err.json }
@@ -74,6 +97,12 @@ function errorToResponse(err) {
}
}
+ const httpError = parseHttpError(err)
+ if (httpError) {
+ // We proxy the response purely for ease of debugging
+ return { code: 500, json: { statusCode: httpError.statusCode, body: httpError.body } }
+ }
+
return undefined
}
@@ -86,4 +115,4 @@ function respondWithError(err, res) {
return false
}
-module.exports = { ProviderAuthError, ProviderApiError, ProviderUserError, respondWithError }
+module.exports = { ProviderAuthError, ProviderApiError, ProviderUserError, respondWithError, parseHttpError }
diff --git a/packages/@uppy/companion/src/server/provider/providerErrors.js b/packages/@uppy/companion/src/server/provider/providerErrors.js
index 2497efff63..621fec9209 100644
--- a/packages/@uppy/companion/src/server/provider/providerErrors.js
+++ b/packages/@uppy/companion/src/server/provider/providerErrors.js
@@ -1,5 +1,5 @@
const logger = require('../logger')
-const { ProviderApiError, ProviderUserError, ProviderAuthError } = require('./error')
+const { ProviderApiError, ProviderUserError, ProviderAuthError, parseHttpError } = require('./error')
/**
*
@@ -37,18 +37,11 @@ async function withProviderErrorHandling({
try {
return await fn()
} catch (err) {
- let statusCode
- let body
+ const httpError = parseHttpError(err)
- if (err?.name === 'HTTPError') {
- statusCode = err.response?.statusCode
- body = err.response?.body
- } else if (err?.name === 'HttpError') {
- statusCode = err.statusCode
- body = err.responseJson
- }
-
- if (statusCode != null) {
+ // Wrap all HTTP errors according to the provider's desired error handling
+ if (httpError) {
+ const { statusCode, body } = httpError
let knownErr
if (isAuthError({ statusCode, body })) {
knownErr = new ProviderAuthError()
@@ -62,8 +55,8 @@ async function withProviderErrorHandling({
throw knownErr
}
+ // non HTTP errors will be passed through
logger.error(err, tag)
-
throw err
}
}
@@ -81,4 +74,4 @@ async function withGoogleErrorHandling (providerName, tag, fn) {
})
}
-module.exports = { withProviderErrorHandling, withGoogleErrorHandling }
+module.exports = { withProviderErrorHandling, withGoogleErrorHandling, parseHttpError }
diff --git a/packages/@uppy/companion/src/server/s3-client.js b/packages/@uppy/companion/src/server/s3-client.js
index 74717d2383..f70a38c9d2 100644
--- a/packages/@uppy/companion/src/server/s3-client.js
+++ b/packages/@uppy/companion/src/server/s3-client.js
@@ -29,7 +29,7 @@ module.exports = (companionOptions, createPresignedPostMode = false) => {
/** @type {import('@aws-sdk/client-s3').S3ClientConfig} */
let s3ClientOptions = {
region: s3.region,
- forcePathStyle: Boolean(s3.forcePathStyle)
+ forcePathStyle: s3.forcePathStyle
}
if (s3.useAccelerateEndpoint) {
diff --git a/packages/@uppy/companion/src/standalone/helper.js b/packages/@uppy/companion/src/standalone/helper.js
index 57494dadb8..4db99e03e7 100644
--- a/packages/@uppy/companion/src/standalone/helper.js
+++ b/packages/@uppy/companion/src/standalone/helper.js
@@ -183,6 +183,7 @@ const getConfigFromEnv = () => {
// cookieDomain is kind of a hack to support distributed systems. This should be improved but we never got so far.
cookieDomain: process.env.COMPANION_COOKIE_DOMAIN,
streamingUpload: process.env.COMPANION_STREAMING_UPLOAD ? process.env.COMPANION_STREAMING_UPLOAD === 'true' : undefined,
+ tusDeferredUploadLength: process.env.COMPANION_TUS_DEFERRED_UPLOAD_LENGTH ? process.env.COMPANION_TUS_DEFERRED_UPLOAD_LENGTH === 'true' : true,
maxFileSize: process.env.COMPANION_MAX_FILE_SIZE ? parseInt(process.env.COMPANION_MAX_FILE_SIZE, 10) : undefined,
chunkSize: process.env.COMPANION_CHUNK_SIZE ? parseInt(process.env.COMPANION_CHUNK_SIZE, 10) : undefined,
clientSocketConnectTimeout: process.env.COMPANION_CLIENT_SOCKET_CONNECT_TIMEOUT
diff --git a/packages/@uppy/companion/src/standalone/index.js b/packages/@uppy/companion/src/standalone/index.js
index fefaf64f8e..5afa2f2fde 100644
--- a/packages/@uppy/companion/src/standalone/index.js
+++ b/packages/@uppy/companion/src/standalone/index.js
@@ -182,10 +182,10 @@ module.exports = function server(inputCompanionOptions) {
} else {
logger.error(err, 'root.error', req.id)
}
- res.status(err.status || 500).json({ message: 'Something went wrong', requestId: req.id })
+ res.status(500).json({ message: 'Something went wrong', requestId: req.id })
} else {
logger.error(err, 'root.error', req.id)
- res.status(err.status || 500).json({ message: err.message, error: err, requestId: req.id })
+ res.status(500).json({ message: err.message, error: err, requestId: req.id })
}
})
diff --git a/packages/@uppy/companion/test/mockserver.js b/packages/@uppy/companion/test/mockserver.js
index 9ee1779e96..329e4d2d2f 100644
--- a/packages/@uppy/companion/test/mockserver.js
+++ b/packages/@uppy/companion/test/mockserver.js
@@ -12,6 +12,7 @@ const defaultEnv = {
COMPANION_HIDE_WELCOME: 'false',
COMPANION_STREAMING_UPLOAD: 'true',
+ COMPANION_TUS_DEFERRED_UPLOAD_LENGTH: 'true',
COMPANION_ALLOW_LOCAL_URLS: 'false',
COMPANION_PROTOCOL: 'http',
diff --git a/packages/@uppy/compressor/CHANGELOG.md b/packages/@uppy/compressor/CHANGELOG.md
index b2ac4d83e7..8837dbf4e2 100644
--- a/packages/@uppy/compressor/CHANGELOG.md
+++ b/packages/@uppy/compressor/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/compressor
+## 2.2.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 2.1.1
Released: 2024-12-05
diff --git a/packages/@uppy/compressor/package.json b/packages/@uppy/compressor/package.json
index b4eb67dfd4..002952ff7c 100644
--- a/packages/@uppy/compressor/package.json
+++ b/packages/@uppy/compressor/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/compressor",
"description": "Uppy plugin that compresses images before upload, saving up to 60% in size",
- "version": "2.1.1",
+ "version": "2.2.1",
"license": "MIT",
"main": "lib/index.js",
"style": "dist/style.min.css",
diff --git a/packages/@uppy/compressor/src/index.test.ts b/packages/@uppy/compressor/src/index.test.ts
index 9eff543c13..91fbac5fbb 100644
--- a/packages/@uppy/compressor/src/index.test.ts
+++ b/packages/@uppy/compressor/src/index.test.ts
@@ -3,7 +3,7 @@ import Core from '@uppy/core'
import getFileNameAndExtension from '@uppy/utils/lib/getFileNameAndExtension'
import fs from 'node:fs'
import path from 'node:path'
-import CompressorPlugin from './index.ts'
+import CompressorPlugin from './index.js'
// Compressor uses browser canvas API, so need to mock compress()
// @ts-expect-error mocked
diff --git a/packages/@uppy/compressor/src/index.ts b/packages/@uppy/compressor/src/index.ts
index c57fea1664..2e7d2d87be 100644
--- a/packages/@uppy/compressor/src/index.ts
+++ b/packages/@uppy/compressor/src/index.ts
@@ -7,9 +7,9 @@ import prettierBytes from '@transloadit/prettier-bytes'
import CompressorJS from 'compressorjs'
import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile'
-import type { DefinePluginOpts, PluginOpts } from '@uppy/core/lib/BasePlugin.js'
+import type { DefinePluginOpts, PluginOpts } from '@uppy/core'
-import locale from './locale.ts'
+import locale from './locale.js'
declare module '@uppy/core' {
export interface UppyEventMap {
diff --git a/packages/@uppy/compressor/tsconfig.build.json b/packages/@uppy/compressor/tsconfig.build.json
index 8d9ed22fa5..bbf30b5b43 100644
--- a/packages/@uppy/compressor/tsconfig.build.json
+++ b/packages/@uppy/compressor/tsconfig.build.json
@@ -2,11 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/compressor/tsconfig.json b/packages/@uppy/compressor/tsconfig.json
index a76c3b714a..47ece599c6 100644
--- a/packages/@uppy/compressor/tsconfig.json
+++ b/packages/@uppy/compressor/tsconfig.json
@@ -3,11 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/core/CHANGELOG.md b/packages/@uppy/core/CHANGELOG.md
index e067fc3783..fe5fcb3678 100644
--- a/packages/@uppy/core/CHANGELOG.md
+++ b/packages/@uppy/core/CHANGELOG.md
@@ -1,5 +1,19 @@
# @uppy/core
+## 4.4.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
+## 4.3.2
+
+Released: 2025-01-06
+Included in: Uppy v4.10.0
+
+- @uppy/core,@uppy/dashboard,@uppy/provider-views,@uppy/store-redux,@uppy/url: build(deps): bump nanoid from 5.0.7 to 5.0.9 (dependabot[bot] / #5544)
+
## 4.3.1
Released: 2024-12-17
diff --git a/packages/@uppy/core/package.json b/packages/@uppy/core/package.json
index 0d97331297..3d77730240 100644
--- a/packages/@uppy/core/package.json
+++ b/packages/@uppy/core/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/core",
"description": "Core module for the extensible JavaScript file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Instagram, Dropbox, Google Drive, S3 and more :dog:",
- "version": "4.3.1",
+ "version": "4.4.1",
"license": "MIT",
"main": "lib/index.js",
"style": "dist/style.min.css",
diff --git a/packages/@uppy/core/src/BasePlugin.ts b/packages/@uppy/core/src/BasePlugin.ts
index 8713e6ee49..708865be80 100644
--- a/packages/@uppy/core/src/BasePlugin.ts
+++ b/packages/@uppy/core/src/BasePlugin.ts
@@ -16,7 +16,7 @@ import type {
OptionalPluralizeLocale,
} from '@uppy/utils/lib/Translator'
import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
-import type { State, UnknownPlugin, Uppy } from './Uppy.ts'
+import type { State, UnknownPlugin, Uppy } from './Uppy.js'
export type PluginOpts = {
locale?: Locale
diff --git a/packages/@uppy/core/src/EventManager.ts b/packages/@uppy/core/src/EventManager.ts
index 529c38fe62..bb556a9cfe 100644
--- a/packages/@uppy/core/src/EventManager.ts
+++ b/packages/@uppy/core/src/EventManager.ts
@@ -1,5 +1,5 @@
import type { Meta, Body, UppyFile } from '@uppy/utils/lib/UppyFile'
-import type { Uppy, UppyEventMap, _UppyEventMap } from './Uppy.ts'
+import type { Uppy, UppyEventMap, _UppyEventMap } from './Uppy.js'
/**
* Create a wrapper around an event emitter with a `remove` method to remove
diff --git a/packages/@uppy/core/src/Restricter.ts b/packages/@uppy/core/src/Restricter.ts
index 09c8622a20..a0a490890a 100644
--- a/packages/@uppy/core/src/Restricter.ts
+++ b/packages/@uppy/core/src/Restricter.ts
@@ -5,7 +5,7 @@ import prettierBytes from '@transloadit/prettier-bytes'
import match from 'mime-match'
import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile'
import type { I18n } from '@uppy/utils/lib/Translator'
-import type { State, NonNullableUppyOptions } from './Uppy.ts'
+import type { State, NonNullableUppyOptions } from './Uppy.js'
export type Restrictions = {
maxFileSize: number | null
diff --git a/packages/@uppy/core/src/UIPlugin.test.ts b/packages/@uppy/core/src/UIPlugin.test.ts
index 1efd66ebc8..fe6ccdd3df 100644
--- a/packages/@uppy/core/src/UIPlugin.test.ts
+++ b/packages/@uppy/core/src/UIPlugin.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest'
-import UIPlugin from './UIPlugin.ts'
-import Core from './index.ts'
+import UIPlugin from './UIPlugin.js'
+import Core from './index.js'
describe('UIPlugin', () => {
describe('getPluginState', () => {
diff --git a/packages/@uppy/core/src/UIPlugin.ts b/packages/@uppy/core/src/UIPlugin.ts
index 7aa3614e0f..b6be19d097 100644
--- a/packages/@uppy/core/src/UIPlugin.ts
+++ b/packages/@uppy/core/src/UIPlugin.ts
@@ -4,9 +4,9 @@ import findDOMElement from '@uppy/utils/lib/findDOMElement'
import getTextDirection from '@uppy/utils/lib/getTextDirection'
import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
-import BasePlugin from './BasePlugin.ts'
-import type { PluginOpts } from './BasePlugin.ts'
-import type { State } from './Uppy.ts'
+import BasePlugin from './BasePlugin.js'
+import type { PluginOpts } from './BasePlugin.js'
+import type { State } from './Uppy.js'
/**
* Defer a frequent call to the microtask queue.
diff --git a/packages/@uppy/core/src/Uppy.test.ts b/packages/@uppy/core/src/Uppy.test.ts
index cb6b985a84..86815dba6f 100644
--- a/packages/@uppy/core/src/Uppy.test.ts
+++ b/packages/@uppy/core/src/Uppy.test.ts
@@ -6,23 +6,23 @@ import assert from 'node:assert'
import fs from 'node:fs'
import path from 'node:path'
import prettierBytes from '@transloadit/prettier-bytes'
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
+import type { Body, Meta } from '@uppy/core'
import type { Locale } from '@uppy/utils/lib/Translator'
-import Core from './index.ts'
-import UIPlugin from './UIPlugin.ts'
+import Core from './index.js'
+import UIPlugin from './UIPlugin.js'
import BasePlugin, {
type DefinePluginOpts,
type PluginOpts,
-} from './BasePlugin.ts'
-import { debugLogger } from './loggers.ts'
-import AcquirerPlugin1 from './mocks/acquirerPlugin1.ts'
-import AcquirerPlugin2 from './mocks/acquirerPlugin2.ts'
-import InvalidPlugin from './mocks/invalidPlugin.ts'
-import InvalidPluginWithoutId from './mocks/invalidPluginWithoutId.ts'
-import InvalidPluginWithoutType from './mocks/invalidPluginWithoutType.ts'
+} from './BasePlugin.js'
+import { debugLogger } from './loggers.js'
+import AcquirerPlugin1 from './mocks/acquirerPlugin1.js'
+import AcquirerPlugin2 from './mocks/acquirerPlugin2.js'
+import InvalidPlugin from './mocks/invalidPlugin.js'
+import InvalidPluginWithoutId from './mocks/invalidPluginWithoutId.js'
+import InvalidPluginWithoutType from './mocks/invalidPluginWithoutType.js'
// @ts-expect-error trying to import a file from outside the package
import DeepFrozenStore from '../../../../e2e/cypress/fixtures/DeepFrozenStore.mjs'
-import type { State } from './Uppy.ts'
+import type { State } from './Uppy.js'
const sampleImage = fs.readFileSync(
// eslint-disable-next-line no-restricted-globals
diff --git a/packages/@uppy/core/src/Uppy.ts b/packages/@uppy/core/src/Uppy.ts
index 09367bc1af..3627de3eda 100644
--- a/packages/@uppy/core/src/Uppy.ts
+++ b/packages/@uppy/core/src/Uppy.ts
@@ -32,21 +32,21 @@ import type {
I18n,
OptionalPluralizeLocale,
} from '@uppy/utils/lib/Translator'
-import supportsUploadProgress from './supportsUploadProgress.ts'
-import getFileName from './getFileName.ts'
-import { justErrorsLogger, debugLogger } from './loggers.ts'
+import supportsUploadProgress from './supportsUploadProgress.js'
+import getFileName from './getFileName.js'
+import { justErrorsLogger, debugLogger } from './loggers.js'
import {
Restricter,
defaultOptions as defaultRestrictionOptions,
RestrictionError,
-} from './Restricter.ts'
+} from './Restricter.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
-import locale from './locale.ts'
+import locale from './locale.js'
-import type BasePlugin from './BasePlugin.ts'
-import type { Restrictions, ValidateableFile } from './Restricter.ts'
+import type BasePlugin from './BasePlugin.js'
+import type { Restrictions, ValidateableFile } from './Restricter.js'
type Processor = (
fileIDs: string[],
diff --git a/packages/@uppy/core/src/index.ts b/packages/@uppy/core/src/index.ts
index 358dea36ea..1e860537e4 100644
--- a/packages/@uppy/core/src/index.ts
+++ b/packages/@uppy/core/src/index.ts
@@ -1,20 +1,37 @@
-export { default } from './Uppy.ts'
-export {
- default as Uppy,
- type State,
- type UnknownPlugin,
- type UnknownProviderPlugin,
- type UnknownSearchProviderPlugin,
- type UploadResult,
- type UppyEventMap,
- type UppyOptions,
-} from './Uppy.ts'
-export { default as UIPlugin } from './UIPlugin.ts'
-export { default as BasePlugin } from './BasePlugin.ts'
-export { debugLogger } from './loggers.ts'
+export { default, default as Uppy } from './Uppy.js'
+export type {
+ State,
+ BaseProviderPlugin,
+ PartialTree,
+ PartialTreeFile,
+ PartialTreeFolder,
+ PartialTreeFolderNode,
+ PartialTreeFolderRoot,
+ PartialTreeId,
+ UnknownPlugin,
+ UnknownProviderPlugin,
+ UnknownProviderPluginState,
+ UnknownSearchProviderPlugin,
+ UnknownSearchProviderPluginState,
+ UploadResult,
+ UppyEventMap,
+ UppyOptions,
+ AsyncStore,
+} from './Uppy.js'
-export type { Store } from '@uppy/store-default'
+export { default as UIPlugin } from './UIPlugin.js'
+export type { UIPluginOptions } from './UIPlugin.js'
+
+export { default as BasePlugin } from './BasePlugin.js'
+export type { DefinePluginOpts, PluginOpts } from './BasePlugin.js'
-export type { UIPluginOptions } from './UIPlugin.ts'
+export { debugLogger } from './loggers.js'
+
+export type { Store } from '@uppy/store-default'
-export type { UppyFile, Meta, Body } from '@uppy/utils/lib/UppyFile'
+export type {
+ UppyFile,
+ MinimalRequiredUppyFile,
+ Meta,
+ Body,
+} from '@uppy/utils/lib/UppyFile'
diff --git a/packages/@uppy/core/src/mocks/acquirerPlugin1.ts b/packages/@uppy/core/src/mocks/acquirerPlugin1.ts
index 0f3516690d..9ff80f0e62 100644
--- a/packages/@uppy/core/src/mocks/acquirerPlugin1.ts
+++ b/packages/@uppy/core/src/mocks/acquirerPlugin1.ts
@@ -1,6 +1,6 @@
import { vi } from 'vitest' // eslint-disable-line import/no-extraneous-dependencies
-import UIPlugin from '../UIPlugin.ts'
-import type Uppy from '../Uppy.ts'
+import UIPlugin from '../UIPlugin.js'
+import type Uppy from '../Uppy.js'
type mock = ReturnType
diff --git a/packages/@uppy/core/src/mocks/acquirerPlugin2.ts b/packages/@uppy/core/src/mocks/acquirerPlugin2.ts
index 9d2290b69d..54c9f56e33 100644
--- a/packages/@uppy/core/src/mocks/acquirerPlugin2.ts
+++ b/packages/@uppy/core/src/mocks/acquirerPlugin2.ts
@@ -1,6 +1,6 @@
import { vi } from 'vitest' // eslint-disable-line import/no-extraneous-dependencies
-import UIPlugin from '../UIPlugin.ts'
-import type Uppy from '../Uppy.ts'
+import UIPlugin from '../UIPlugin.js'
+import type Uppy from '../Uppy.js'
type mock = ReturnType
diff --git a/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts b/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts
index d2c02e30dc..75e1f3b52c 100644
--- a/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts
+++ b/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts
@@ -1,5 +1,5 @@
-import UIPlugin from '../UIPlugin.ts'
-import type Uppy from '../Uppy.ts'
+import UIPlugin from '../UIPlugin.js'
+import type Uppy from '../Uppy.js'
export default class InvalidPluginWithoutName extends UIPlugin {
public type: string
diff --git a/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts b/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts
index 4baeb573c9..19f404eb66 100644
--- a/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts
+++ b/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts
@@ -1,5 +1,5 @@
-import UIPlugin from '../UIPlugin.ts'
-import type Uppy from '../Uppy.ts'
+import UIPlugin from '../UIPlugin.js'
+import type Uppy from '../Uppy.js'
export default class InvalidPluginWithoutType extends UIPlugin {
public id: string
diff --git a/packages/@uppy/core/src/supportsUploadProgress.test.ts b/packages/@uppy/core/src/supportsUploadProgress.test.ts
index 6dc2f8f478..7bb10151a8 100644
--- a/packages/@uppy/core/src/supportsUploadProgress.test.ts
+++ b/packages/@uppy/core/src/supportsUploadProgress.test.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest'
-import supportsUploadProgress from './supportsUploadProgress.ts'
+import supportsUploadProgress from './supportsUploadProgress.js'
describe('supportsUploadProgress', () => {
it('returns true in working browsers', () => {
diff --git a/packages/@uppy/core/src/types.test.ts b/packages/@uppy/core/src/types.test.ts
index 1a03591d02..bb906e78b5 100644
--- a/packages/@uppy/core/src/types.test.ts
+++ b/packages/@uppy/core/src/types.test.ts
@@ -1,8 +1,8 @@
import { expectTypeOf, test } from 'vitest'
import type { Body, InternalMetadata, Meta } from '@uppy/utils/lib/UppyFile'
-import Uppy, { type UnknownPlugin } from './Uppy.ts'
-import UIPlugin, { type UIPluginOptions } from './UIPlugin.ts'
+import Uppy, { type UnknownPlugin } from './Uppy.js'
+import UIPlugin, { type UIPluginOptions } from './UIPlugin.js'
interface Opts extends UIPluginOptions {
foo: string
diff --git a/packages/@uppy/core/tsconfig.build.json b/packages/@uppy/core/tsconfig.build.json
index 349b88d0f1..1a780f2c3d 100644
--- a/packages/@uppy/core/tsconfig.build.json
+++ b/packages/@uppy/core/tsconfig.build.json
@@ -3,12 +3,7 @@
"compilerOptions": {
"outDir": "./lib",
"rootDir": "./src",
- "resolveJsonModule": false,
- "paths": {
- "@uppy/store-default": ["../store-default/src/index.js"],
- "@uppy/store-default/lib/*": ["../store-default/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"]
- }
+ "resolveJsonModule": false
},
"include": ["./src/**/*.*"],
"exclude": ["./src/**/*.test.ts"],
diff --git a/packages/@uppy/core/tsconfig.json b/packages/@uppy/core/tsconfig.json
index e5d13ad812..5e81a7a296 100644
--- a/packages/@uppy/core/tsconfig.json
+++ b/packages/@uppy/core/tsconfig.json
@@ -3,11 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/store-default": ["../store-default/src/index.js"],
- "@uppy/store-default/lib/*": ["../store-default/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/dashboard/CHANGELOG.md b/packages/@uppy/dashboard/CHANGELOG.md
index 463e40df14..02335b4810 100644
--- a/packages/@uppy/dashboard/CHANGELOG.md
+++ b/packages/@uppy/dashboard/CHANGELOG.md
@@ -1,5 +1,19 @@
# @uppy/dashboard
+## 4.3.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
+## 4.2.0
+
+Released: 2025-01-06
+Included in: Uppy v4.10.0
+
+- @uppy/core,@uppy/dashboard,@uppy/provider-views,@uppy/store-redux,@uppy/url: build(deps): bump nanoid from 5.0.7 to 5.0.9 (dependabot[bot] / #5544)
+
## 4.1.3
Released: 2024-12-05
diff --git a/packages/@uppy/dashboard/package.json b/packages/@uppy/dashboard/package.json
index a476aceec3..641b67ad87 100644
--- a/packages/@uppy/dashboard/package.json
+++ b/packages/@uppy/dashboard/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/dashboard",
"description": "Universal UI plugin for Uppy.",
- "version": "4.1.3",
+ "version": "4.3.1",
"license": "MIT",
"main": "lib/index.js",
"style": "dist/style.min.css",
diff --git a/packages/@uppy/dashboard/src/Dashboard.tsx b/packages/@uppy/dashboard/src/Dashboard.tsx
index dc9a7f5768..644f5c2cd6 100644
--- a/packages/@uppy/dashboard/src/Dashboard.tsx
+++ b/packages/@uppy/dashboard/src/Dashboard.tsx
@@ -1,14 +1,16 @@
-import {
- UIPlugin,
- type UIPluginOptions,
- type UnknownPlugin,
- type Uppy,
- type UploadResult,
- type State,
-} from '@uppy/core'
import type { ComponentChild, VNode } from 'preact'
-import type { DefinePluginOpts } from '@uppy/core/lib/BasePlugin.js'
-import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile'
+import { UIPlugin } from '@uppy/core'
+import type {
+ Body,
+ Meta,
+ UppyFile,
+ UIPluginOptions,
+ UnknownPlugin,
+ Uppy,
+ UploadResult,
+ State,
+ DefinePluginOpts,
+} from '@uppy/core'
import StatusBar from '@uppy/status-bar'
import Informer from '@uppy/informer'
import ThumbnailGenerator from '@uppy/thumbnail-generator'
@@ -20,14 +22,14 @@ import { defaultPickerIcon } from '@uppy/provider-views'
import type { TargetedEvent } from 'preact/compat'
import { nanoid } from 'nanoid/non-secure'
import memoizeOne from 'memoize-one'
-import * as trapFocus from './utils/trapFocus.ts'
-import createSuperFocus from './utils/createSuperFocus.ts'
-import DashboardUI from './components/Dashboard.tsx'
+import * as trapFocus from './utils/trapFocus.js'
+import createSuperFocus from './utils/createSuperFocus.js'
+import DashboardUI from './components/Dashboard.jsx'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
-import locale from './locale.ts'
+import locale from './locale.js'
type GenericEventCallback = () => void
export type DashboardFileEditStartCallback = (
diff --git a/packages/@uppy/dashboard/src/components/AddFilesPanel.tsx b/packages/@uppy/dashboard/src/components/AddFilesPanel.tsx
index f0faea74af..9b85dd63f5 100644
--- a/packages/@uppy/dashboard/src/components/AddFilesPanel.tsx
+++ b/packages/@uppy/dashboard/src/components/AddFilesPanel.tsx
@@ -1,7 +1,7 @@
/* eslint-disable react/destructuring-assignment */
import { h } from 'preact'
import classNames from 'classnames'
-import AddFiles from './AddFiles.tsx'
+import AddFiles from './AddFiles.jsx'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/components/Dashboard.tsx b/packages/@uppy/dashboard/src/components/Dashboard.tsx
index 36d185e3f9..4caa2936a1 100644
--- a/packages/@uppy/dashboard/src/components/Dashboard.tsx
+++ b/packages/@uppy/dashboard/src/components/Dashboard.tsx
@@ -2,19 +2,26 @@
import { h } from 'preact'
import classNames from 'classnames'
import isDragDropSupported from '@uppy/utils/lib/isDragDropSupported'
-import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile'
-import type { State, UIPlugin, UIPluginOptions, Uppy } from '@uppy/core'
+import type {
+ Body,
+ Meta,
+ UppyFile,
+ State,
+ UIPlugin,
+ UIPluginOptions,
+ Uppy,
+} from '@uppy/core'
import type { I18n } from '@uppy/utils/lib/Translator'
import type Translator from '@uppy/utils/lib/Translator'
import type { TargetedEvent } from 'preact/compat'
-import FileList from './FileList.tsx'
-import AddFiles from './AddFiles.tsx'
-import AddFilesPanel from './AddFilesPanel.tsx'
-import PickerPanelContent from './PickerPanelContent.tsx'
-import EditorPanel from './EditorPanel.tsx'
-import PanelTopBar from './PickerPanelTopBar.tsx'
-import FileCard from './FileCard/index.tsx'
-import Slide from './Slide.tsx'
+import FileList from './FileList.jsx'
+import AddFiles from './AddFiles.jsx'
+import AddFilesPanel from './AddFilesPanel.jsx'
+import PickerPanelContent from './PickerPanelContent.jsx'
+import EditorPanel from './EditorPanel.jsx'
+import PanelTopBar from './PickerPanelTopBar.jsx'
+import FileCard from './FileCard/index.jsx'
+import Slide from './Slide.jsx'
import type { DashboardState, TargetWithRender } from '../Dashboard'
// http://dev.edenspiekermann.com/2016/02/11/introducing-accessible-modal-dialog
diff --git a/packages/@uppy/dashboard/src/components/FileCard/index.tsx b/packages/@uppy/dashboard/src/components/FileCard/index.tsx
index 49dbb85de2..8bb890db00 100644
--- a/packages/@uppy/dashboard/src/components/FileCard/index.tsx
+++ b/packages/@uppy/dashboard/src/components/FileCard/index.tsx
@@ -2,10 +2,10 @@ import { h } from 'preact'
import { useEffect, useState, useCallback } from 'preact/hooks'
import classNames from 'classnames'
import { nanoid } from 'nanoid/non-secure'
-import getFileTypeIcon from '../../utils/getFileTypeIcon.tsx'
-import ignoreEvent from '../../utils/ignoreEvent.ts'
-import FilePreview from '../FilePreview.tsx'
-import RenderMetaFields from './RenderMetaFields.tsx'
+import getFileTypeIcon from '../../utils/getFileTypeIcon.jsx'
+import ignoreEvent from '../../utils/ignoreEvent.js'
+import FilePreview from '../FilePreview.jsx'
+import RenderMetaFields from './RenderMetaFields.jsx'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/components/FileItem/Buttons/index.tsx b/packages/@uppy/dashboard/src/components/FileItem/Buttons/index.tsx
index 53b0d32b56..d7d6fbd3f0 100644
--- a/packages/@uppy/dashboard/src/components/FileItem/Buttons/index.tsx
+++ b/packages/@uppy/dashboard/src/components/FileItem/Buttons/index.tsx
@@ -1,9 +1,9 @@
import { h } from 'preact'
-import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile'
+import type { Body, Meta, UppyFile } from '@uppy/core'
import type Uppy from '@uppy/core'
import type { I18n } from '@uppy/utils/lib/Translator'
-import copyToClipboard from '../../../utils/copyToClipboard.ts'
-import type { DashboardState } from '../../../Dashboard.ts'
+import copyToClipboard from '../../../utils/copyToClipboard.js'
+import type { DashboardState } from '../../../Dashboard.js'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/components/FileItem/FileInfo/index.tsx b/packages/@uppy/dashboard/src/components/FileItem/FileInfo/index.tsx
index 555f2364c0..3def4903e3 100644
--- a/packages/@uppy/dashboard/src/components/FileItem/FileInfo/index.tsx
+++ b/packages/@uppy/dashboard/src/components/FileItem/FileInfo/index.tsx
@@ -4,8 +4,8 @@ import prettierBytes from '@transloadit/prettier-bytes'
import truncateString from '@uppy/utils/lib/truncateString'
import type { I18n } from '@uppy/utils/lib/Translator'
import type { UppyFile } from '@uppy/core'
-import MetaErrorMessage from '../MetaErrorMessage.tsx'
-import type { DashboardState } from '../../../Dashboard.ts'
+import MetaErrorMessage from '../MetaErrorMessage.jsx'
+import type { DashboardState } from '../../../Dashboard.js'
const renderFileName = (props: {
file: UppyFile
diff --git a/packages/@uppy/dashboard/src/components/FileItem/FilePreviewAndLink/index.tsx b/packages/@uppy/dashboard/src/components/FileItem/FilePreviewAndLink/index.tsx
index e2bf22c867..d7709c2a0d 100644
--- a/packages/@uppy/dashboard/src/components/FileItem/FilePreviewAndLink/index.tsx
+++ b/packages/@uppy/dashboard/src/components/FileItem/FilePreviewAndLink/index.tsx
@@ -1,7 +1,7 @@
import { h } from 'preact'
-import FilePreview from '../../FilePreview.tsx'
-import MetaErrorMessage from '../MetaErrorMessage.tsx'
-import getFileTypeIcon from '../../../utils/getFileTypeIcon.tsx'
+import FilePreview from '../../FilePreview.jsx'
+import MetaErrorMessage from '../MetaErrorMessage.jsx'
+import getFileTypeIcon from '../../../utils/getFileTypeIcon.jsx'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/components/FileItem/FileProgress/index.tsx b/packages/@uppy/dashboard/src/components/FileItem/FileProgress/index.tsx
index 1147d7a9d8..f3cc2566c2 100644
--- a/packages/@uppy/dashboard/src/components/FileItem/FileProgress/index.tsx
+++ b/packages/@uppy/dashboard/src/components/FileItem/FileProgress/index.tsx
@@ -1,8 +1,7 @@
/* eslint-disable react/no-unused-prop-types */
/* eslint-disable react/destructuring-assignment */
-import type { State, Uppy, UppyFile } from '@uppy/core'
+import type { Body, Meta, State, Uppy, UppyFile } from '@uppy/core'
import type { I18n } from '@uppy/utils/lib/Translator'
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
import { h, type ComponentChild } from 'preact'
interface Props {
diff --git a/packages/@uppy/dashboard/src/components/FileItem/index.tsx b/packages/@uppy/dashboard/src/components/FileItem/index.tsx
index ab284fd19b..86246fd474 100644
--- a/packages/@uppy/dashboard/src/components/FileItem/index.tsx
+++ b/packages/@uppy/dashboard/src/components/FileItem/index.tsx
@@ -2,15 +2,14 @@
import { h, Component, type ComponentChild } from 'preact'
import classNames from 'classnames'
import { shallowEqualObjects } from 'shallow-equal'
-import type { UppyFile, Body, Meta } from '@uppy/utils/lib/UppyFile'
+import type { UppyFile, Body, Meta, State } from '@uppy/core'
import type { I18n } from '@uppy/utils/lib/Translator'
import type Uppy from '@uppy/core'
-import type { State } from '@uppy/core'
-import FilePreviewAndLink from './FilePreviewAndLink/index.tsx'
-import FileProgress from './FileProgress/index.tsx'
-import FileInfo from './FileInfo/index.tsx'
-import Buttons from './Buttons/index.tsx'
-import type { DashboardState } from '../../Dashboard.ts'
+import FilePreviewAndLink from './FilePreviewAndLink/index.jsx'
+import FileProgress from './FileProgress/index.jsx'
+import FileInfo from './FileInfo/index.jsx'
+import Buttons from './Buttons/index.jsx'
+import type { DashboardState } from '../../Dashboard.js'
type Props = {
file: UppyFile
diff --git a/packages/@uppy/dashboard/src/components/FileList.tsx b/packages/@uppy/dashboard/src/components/FileList.tsx
index 2f6c34bd49..8c8fdba147 100644
--- a/packages/@uppy/dashboard/src/components/FileList.tsx
+++ b/packages/@uppy/dashboard/src/components/FileList.tsx
@@ -3,11 +3,10 @@ import { useMemo } from 'preact/hooks'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore untyped
import VirtualList from '@uppy/utils/lib/VirtualList'
-import type { UppyFile, Uppy, State } from '@uppy/core'
+import type { UppyFile, Uppy, State, Body, Meta } from '@uppy/core'
import type { I18n } from '@uppy/utils/lib/Translator'
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
-import FileItem from './FileItem/index.tsx'
-import type { DashboardState } from '../Dashboard.ts'
+import FileItem from './FileItem/index.jsx'
+import type { DashboardState } from '../Dashboard.js'
type FileListProps = {
id: string
diff --git a/packages/@uppy/dashboard/src/components/FilePreview.tsx b/packages/@uppy/dashboard/src/components/FilePreview.tsx
index 84043cc336..8efd15b0b8 100644
--- a/packages/@uppy/dashboard/src/components/FilePreview.tsx
+++ b/packages/@uppy/dashboard/src/components/FilePreview.tsx
@@ -1,5 +1,5 @@
import { h } from 'preact'
-import getFileTypeIcon from '../utils/getFileTypeIcon.tsx'
+import getFileTypeIcon from '../utils/getFileTypeIcon.jsx'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/components/PickerPanelContent.tsx b/packages/@uppy/dashboard/src/components/PickerPanelContent.tsx
index 7a795ec9f1..0944002a67 100644
--- a/packages/@uppy/dashboard/src/components/PickerPanelContent.tsx
+++ b/packages/@uppy/dashboard/src/components/PickerPanelContent.tsx
@@ -1,7 +1,7 @@
import { h } from 'preact'
import classNames from 'classnames'
import { useRef } from 'preact/hooks'
-import ignoreEvent from '../utils/ignoreEvent.ts'
+import ignoreEvent from '../utils/ignoreEvent.js'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/components/PickerPanelTopBar.tsx b/packages/@uppy/dashboard/src/components/PickerPanelTopBar.tsx
index f00d1fb7a0..02a19abf61 100644
--- a/packages/@uppy/dashboard/src/components/PickerPanelTopBar.tsx
+++ b/packages/@uppy/dashboard/src/components/PickerPanelTopBar.tsx
@@ -1,4 +1,4 @@
-import type { UppyFile } from '@uppy/utils/lib/UppyFile'
+import type { UppyFile } from '@uppy/core'
import { h } from 'preact'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/index.test.ts b/packages/@uppy/dashboard/src/index.test.ts
index 07693700f7..6a3b28fbb6 100644
--- a/packages/@uppy/dashboard/src/index.test.ts
+++ b/packages/@uppy/dashboard/src/index.test.ts
@@ -11,7 +11,7 @@ import WebcamPlugin from '@uppy/webcam'
import Url from '@uppy/url'
import resizeObserverPolyfill from 'resize-observer-polyfill'
-import DashboardPlugin from './index.ts'
+import DashboardPlugin from './index.js'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/index.ts b/packages/@uppy/dashboard/src/index.ts
index 9f28d9d36c..a0dda11bbd 100644
--- a/packages/@uppy/dashboard/src/index.ts
+++ b/packages/@uppy/dashboard/src/index.ts
@@ -1,2 +1,2 @@
-export { default } from './Dashboard.tsx'
-export type { DashboardOptions } from './Dashboard.tsx'
+export { default } from './Dashboard.jsx'
+export type { DashboardOptions } from './Dashboard.jsx'
diff --git a/packages/@uppy/dashboard/src/utils/copyToClipboard.test.ts b/packages/@uppy/dashboard/src/utils/copyToClipboard.test.ts
index df8e9d9a5e..328ee49588 100644
--- a/packages/@uppy/dashboard/src/utils/copyToClipboard.test.ts
+++ b/packages/@uppy/dashboard/src/utils/copyToClipboard.test.ts
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest'
-import copyToClipboard from './copyToClipboard.ts'
+import copyToClipboard from './copyToClipboard.js'
describe('copyToClipboard', () => {
it.skip('should copy the specified text to the clipboard', () => {
diff --git a/packages/@uppy/dashboard/src/utils/createSuperFocus.test.ts b/packages/@uppy/dashboard/src/utils/createSuperFocus.test.ts
index 1230dbf471..f30f1bc22d 100644
--- a/packages/@uppy/dashboard/src/utils/createSuperFocus.test.ts
+++ b/packages/@uppy/dashboard/src/utils/createSuperFocus.test.ts
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest'
-import createSuperFocus from './createSuperFocus.ts'
+import createSuperFocus from './createSuperFocus.js'
describe('createSuperFocus', () => {
// superFocus.cancel() is used in dashboard
diff --git a/packages/@uppy/dashboard/src/utils/createSuperFocus.ts b/packages/@uppy/dashboard/src/utils/createSuperFocus.ts
index 9ea865748c..3ae7f08753 100644
--- a/packages/@uppy/dashboard/src/utils/createSuperFocus.ts
+++ b/packages/@uppy/dashboard/src/utils/createSuperFocus.ts
@@ -2,7 +2,7 @@ import debounce from 'lodash/debounce.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore untyped
import FOCUSABLE_ELEMENTS from '@uppy/utils/lib/FOCUSABLE_ELEMENTS'
-import getActiveOverlayEl from './getActiveOverlayEl.ts'
+import getActiveOverlayEl from './getActiveOverlayEl.js'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/src/utils/trapFocus.ts b/packages/@uppy/dashboard/src/utils/trapFocus.ts
index 84248498c0..bbe24aab8f 100644
--- a/packages/@uppy/dashboard/src/utils/trapFocus.ts
+++ b/packages/@uppy/dashboard/src/utils/trapFocus.ts
@@ -2,7 +2,7 @@ import toArray from '@uppy/utils/lib/toArray'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore untyped
import FOCUSABLE_ELEMENTS from '@uppy/utils/lib/FOCUSABLE_ELEMENTS'
-import getActiveOverlayEl from './getActiveOverlayEl.ts'
+import getActiveOverlayEl from './getActiveOverlayEl.js'
type $TSFixMe = any
diff --git a/packages/@uppy/dashboard/tsconfig.build.json b/packages/@uppy/dashboard/tsconfig.build.json
index 5fde2c8b54..4e7253b386 100644
--- a/packages/@uppy/dashboard/tsconfig.build.json
+++ b/packages/@uppy/dashboard/tsconfig.build.json
@@ -2,25 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/informer": ["../informer/src/index.js"],
- "@uppy/informer/lib/*": ["../informer/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/status-bar": ["../status-bar/src/index.js"],
- "@uppy/status-bar/lib/*": ["../status-bar/src/*"],
- "@uppy/thumbnail-generator": ["../thumbnail-generator/src/index.js"],
- "@uppy/thumbnail-generator/lib/*": ["../thumbnail-generator/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- "@uppy/google-drive": ["../google-drive/src/index.js"],
- "@uppy/google-drive/lib/*": ["../google-drive/src/*"],
- "@uppy/url": ["../url/src/index.js"],
- "@uppy/url/lib/*": ["../url/src/*"],
- "@uppy/webcam": ["../webcam/src/index.js"],
- "@uppy/webcam/lib/*": ["../webcam/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/dashboard/tsconfig.json b/packages/@uppy/dashboard/tsconfig.json
index 46cc2296b0..22f32fe820 100644
--- a/packages/@uppy/dashboard/tsconfig.json
+++ b/packages/@uppy/dashboard/tsconfig.json
@@ -3,25 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/informer": ["../informer/src/index.js"],
- "@uppy/informer/lib/*": ["../informer/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/status-bar": ["../status-bar/src/index.js"],
- "@uppy/status-bar/lib/*": ["../status-bar/src/*"],
- "@uppy/thumbnail-generator": ["../thumbnail-generator/src/index.js"],
- "@uppy/thumbnail-generator/lib/*": ["../thumbnail-generator/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- "@uppy/google-drive": ["../google-drive/src/index.js"],
- "@uppy/google-drive/lib/*": ["../google-drive/src/*"],
- "@uppy/url": ["../url/src/index.js"],
- "@uppy/url/lib/*": ["../url/src/*"],
- "@uppy/webcam": ["../webcam/src/index.js"],
- "@uppy/webcam/lib/*": ["../webcam/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/drag-drop/CHANGELOG.md b/packages/@uppy/drag-drop/CHANGELOG.md
index 30e2bdd531..d9cafc800d 100644
--- a/packages/@uppy/drag-drop/CHANGELOG.md
+++ b/packages/@uppy/drag-drop/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/drag-drop
+## 4.1.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 4.0.5
Released: 2024-12-05
diff --git a/packages/@uppy/drag-drop/package.json b/packages/@uppy/drag-drop/package.json
index 68bb724c40..890b8e25bd 100644
--- a/packages/@uppy/drag-drop/package.json
+++ b/packages/@uppy/drag-drop/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/drag-drop",
"description": "Droppable zone UI for Uppy. Drag and drop files into it to upload.",
- "version": "4.0.5",
+ "version": "4.1.1",
"license": "MIT",
"main": "lib/index.js",
"style": "dist/style.min.css",
diff --git a/packages/@uppy/drag-drop/src/DragDrop.tsx b/packages/@uppy/drag-drop/src/DragDrop.tsx
index cfdc95b7ae..2b2c9ab6b0 100644
--- a/packages/@uppy/drag-drop/src/DragDrop.tsx
+++ b/packages/@uppy/drag-drop/src/DragDrop.tsx
@@ -1,7 +1,11 @@
-import { UIPlugin, type Uppy } from '@uppy/core'
-import type { DefinePluginOpts } from '@uppy/core/lib/BasePlugin.js'
-import type { UIPluginOptions } from '@uppy/core/lib/UIPlugin.js'
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
+import { UIPlugin } from '@uppy/core'
+import type {
+ UIPluginOptions,
+ Uppy,
+ DefinePluginOpts,
+ Body,
+ Meta,
+} from '@uppy/core'
import type { TargetedEvent } from 'preact/compat'
import toArray from '@uppy/utils/lib/toArray'
import isDragDropSupported from '@uppy/utils/lib/isDragDropSupported'
@@ -11,7 +15,7 @@ import { h, type ComponentChild } from 'preact'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
-import locale from './locale.ts'
+import locale from './locale.js'
export interface DragDropOptions extends UIPluginOptions {
inputName?: string
diff --git a/packages/@uppy/drag-drop/src/index.ts b/packages/@uppy/drag-drop/src/index.ts
index ff2edbdd5d..f2e89e2414 100644
--- a/packages/@uppy/drag-drop/src/index.ts
+++ b/packages/@uppy/drag-drop/src/index.ts
@@ -1,2 +1,2 @@
-export { default } from './DragDrop.tsx'
-export type { DragDropOptions } from './DragDrop.tsx'
+export { default } from './DragDrop.jsx'
+export type { DragDropOptions } from './DragDrop.jsx'
diff --git a/packages/@uppy/drag-drop/tsconfig.build.json b/packages/@uppy/drag-drop/tsconfig.build.json
index 8d9ed22fa5..bbf30b5b43 100644
--- a/packages/@uppy/drag-drop/tsconfig.build.json
+++ b/packages/@uppy/drag-drop/tsconfig.build.json
@@ -2,11 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/drag-drop/tsconfig.json b/packages/@uppy/drag-drop/tsconfig.json
index a76c3b714a..47ece599c6 100644
--- a/packages/@uppy/drag-drop/tsconfig.json
+++ b/packages/@uppy/drag-drop/tsconfig.json
@@ -3,11 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/drop-target/CHANGELOG.md b/packages/@uppy/drop-target/CHANGELOG.md
index 5ba83e80fe..dcac4d86b4 100644
--- a/packages/@uppy/drop-target/CHANGELOG.md
+++ b/packages/@uppy/drop-target/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/drop-target
+## 3.1.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 3.0.2
Released: 2024-12-05
diff --git a/packages/@uppy/drop-target/package.json b/packages/@uppy/drop-target/package.json
index b9780cdd1c..d96c149470 100644
--- a/packages/@uppy/drop-target/package.json
+++ b/packages/@uppy/drop-target/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/drop-target",
"description": "Lets your users drag and drop files on a DOM element",
- "version": "3.0.2",
+ "version": "3.1.1",
"license": "MIT",
"main": "lib/index.js",
"type": "module",
diff --git a/packages/@uppy/drop-target/src/index.ts b/packages/@uppy/drop-target/src/index.ts
index 6f3067fb7a..b66e1ac512 100644
--- a/packages/@uppy/drop-target/src/index.ts
+++ b/packages/@uppy/drop-target/src/index.ts
@@ -1,7 +1,5 @@
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
-import type { Uppy } from '@uppy/core/lib/Uppy.js'
-import type { DefinePluginOpts, PluginOpts } from '@uppy/core/lib/BasePlugin.js'
-import BasePlugin from '@uppy/core/lib/BasePlugin.js'
+import type { Uppy, Body, Meta, DefinePluginOpts, PluginOpts } from '@uppy/core'
+import { BasePlugin } from '@uppy/core'
import getDroppedFiles from '@uppy/utils/lib/getDroppedFiles'
import toArray from '@uppy/utils/lib/toArray'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
diff --git a/packages/@uppy/drop-target/tsconfig.build.json b/packages/@uppy/drop-target/tsconfig.build.json
index 8d9ed22fa5..bbf30b5b43 100644
--- a/packages/@uppy/drop-target/tsconfig.build.json
+++ b/packages/@uppy/drop-target/tsconfig.build.json
@@ -2,11 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/drop-target/tsconfig.json b/packages/@uppy/drop-target/tsconfig.json
index a76c3b714a..47ece599c6 100644
--- a/packages/@uppy/drop-target/tsconfig.json
+++ b/packages/@uppy/drop-target/tsconfig.json
@@ -3,11 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/dropbox/CHANGELOG.md b/packages/@uppy/dropbox/CHANGELOG.md
index e74ea33f67..d915eec740 100644
--- a/packages/@uppy/dropbox/CHANGELOG.md
+++ b/packages/@uppy/dropbox/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/dropbox
+## 4.2.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 4.1.2
Released: 2024-12-05
diff --git a/packages/@uppy/dropbox/package.json b/packages/@uppy/dropbox/package.json
index aa9bb34f42..90d01bab27 100644
--- a/packages/@uppy/dropbox/package.json
+++ b/packages/@uppy/dropbox/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/dropbox",
"description": "Import files from Dropbox, into Uppy.",
- "version": "4.1.2",
+ "version": "4.2.1",
"license": "MIT",
"main": "lib/index.js",
"type": "module",
diff --git a/packages/@uppy/dropbox/src/Dropbox.tsx b/packages/@uppy/dropbox/src/Dropbox.tsx
index e94c9000c5..f57a47b931 100644
--- a/packages/@uppy/dropbox/src/Dropbox.tsx
+++ b/packages/@uppy/dropbox/src/Dropbox.tsx
@@ -8,13 +8,15 @@ import { UIPlugin, Uppy } from '@uppy/core'
import { ProviderViews } from '@uppy/provider-views'
import { h, type ComponentChild } from 'preact'
-import type { UppyFile, Body, Meta } from '@uppy/utils/lib/UppyFile'
import type {
+ UppyFile,
+ Body,
+ Meta,
AsyncStore,
UnknownProviderPlugin,
UnknownProviderPluginState,
-} from '@uppy/core/lib/Uppy.js'
-import locale from './locale.ts'
+} from '@uppy/core'
+import locale from './locale.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
diff --git a/packages/@uppy/dropbox/src/index.ts b/packages/@uppy/dropbox/src/index.ts
index cabbf5f31f..563c0047a4 100644
--- a/packages/@uppy/dropbox/src/index.ts
+++ b/packages/@uppy/dropbox/src/index.ts
@@ -1,2 +1,2 @@
-export { default } from './Dropbox.tsx'
-export type { DropboxOptions } from './Dropbox.tsx'
+export { default } from './Dropbox.jsx'
+export type { DropboxOptions } from './Dropbox.jsx'
diff --git a/packages/@uppy/dropbox/tsconfig.build.json b/packages/@uppy/dropbox/tsconfig.build.json
index 0b2f94bc10..82e187bca0 100644
--- a/packages/@uppy/dropbox/tsconfig.build.json
+++ b/packages/@uppy/dropbox/tsconfig.build.json
@@ -2,15 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/dropbox/tsconfig.json b/packages/@uppy/dropbox/tsconfig.json
index e5220fb5ab..b90847da71 100644
--- a/packages/@uppy/dropbox/tsconfig.json
+++ b/packages/@uppy/dropbox/tsconfig.json
@@ -3,15 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/facebook/CHANGELOG.md b/packages/@uppy/facebook/CHANGELOG.md
index 55befd3913..b883156bc3 100644
--- a/packages/@uppy/facebook/CHANGELOG.md
+++ b/packages/@uppy/facebook/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/facebook
+## 4.2.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 4.1.2
Released: 2024-12-05
diff --git a/packages/@uppy/facebook/package.json b/packages/@uppy/facebook/package.json
index 57e323513a..0dabcfc5a1 100644
--- a/packages/@uppy/facebook/package.json
+++ b/packages/@uppy/facebook/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/facebook",
"description": "Import files from Facebook, into Uppy.",
- "version": "4.1.2",
+ "version": "4.2.1",
"license": "MIT",
"main": "lib/index.js",
"type": "module",
diff --git a/packages/@uppy/facebook/src/Facebook.tsx b/packages/@uppy/facebook/src/Facebook.tsx
index 41f388e825..3b47327916 100644
--- a/packages/@uppy/facebook/src/Facebook.tsx
+++ b/packages/@uppy/facebook/src/Facebook.tsx
@@ -8,13 +8,15 @@ import { UIPlugin, Uppy } from '@uppy/core'
import { ProviderViews } from '@uppy/provider-views'
import { h, type ComponentChild } from 'preact'
-import type { UppyFile, Body, Meta } from '@uppy/utils/lib/UppyFile'
import type {
+ UppyFile,
+ Body,
+ Meta,
AsyncStore,
UnknownProviderPlugin,
UnknownProviderPluginState,
-} from '@uppy/core/lib/Uppy.js'
-import locale from './locale.ts'
+} from '@uppy/core'
+import locale from './locale.js'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
diff --git a/packages/@uppy/facebook/src/index.ts b/packages/@uppy/facebook/src/index.ts
index 0d5614e9ab..4984d641d2 100644
--- a/packages/@uppy/facebook/src/index.ts
+++ b/packages/@uppy/facebook/src/index.ts
@@ -1,2 +1,2 @@
-export { default } from './Facebook.tsx'
-export type { FacebookOptions } from './Facebook.tsx'
+export { default } from './Facebook.jsx'
+export type { FacebookOptions } from './Facebook.jsx'
diff --git a/packages/@uppy/facebook/tsconfig.build.json b/packages/@uppy/facebook/tsconfig.build.json
index 0b2f94bc10..82e187bca0 100644
--- a/packages/@uppy/facebook/tsconfig.build.json
+++ b/packages/@uppy/facebook/tsconfig.build.json
@@ -2,15 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/facebook/tsconfig.json b/packages/@uppy/facebook/tsconfig.json
index e5220fb5ab..b90847da71 100644
--- a/packages/@uppy/facebook/tsconfig.json
+++ b/packages/@uppy/facebook/tsconfig.json
@@ -3,15 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/companion-client": ["../companion-client/src/index.js"],
- "@uppy/companion-client/lib/*": ["../companion-client/src/*"],
- "@uppy/provider-views": ["../provider-views/src/index.js"],
- "@uppy/provider-views/lib/*": ["../provider-views/src/*"],
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/file-input/CHANGELOG.md b/packages/@uppy/file-input/CHANGELOG.md
index 8f7086f90d..e5af1ea9ca 100644
--- a/packages/@uppy/file-input/CHANGELOG.md
+++ b/packages/@uppy/file-input/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/file-input
+## 4.1.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 4.0.4
Released: 2024-12-05
diff --git a/packages/@uppy/file-input/package.json b/packages/@uppy/file-input/package.json
index 441f91859e..4357a6d432 100644
--- a/packages/@uppy/file-input/package.json
+++ b/packages/@uppy/file-input/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/file-input",
"description": "Simple UI of a file input button that works with Uppy right out of the box",
- "version": "4.0.4",
+ "version": "4.1.1",
"license": "MIT",
"main": "lib/index.js",
"style": "dist/style.min.css",
diff --git a/packages/@uppy/file-input/src/FileInput.tsx b/packages/@uppy/file-input/src/FileInput.tsx
index e952fd6ba2..e36987da4b 100644
--- a/packages/@uppy/file-input/src/FileInput.tsx
+++ b/packages/@uppy/file-input/src/FileInput.tsx
@@ -1,14 +1,19 @@
import { h, type ComponentChild } from 'preact'
-import { UIPlugin, Uppy, type UIPluginOptions } from '@uppy/core'
+import { UIPlugin } from '@uppy/core'
+import type {
+ Uppy,
+ UIPluginOptions,
+ Body,
+ Meta,
+ DefinePluginOpts,
+} from '@uppy/core'
import toArray from '@uppy/utils/lib/toArray'
-import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
-import type { DefinePluginOpts } from '@uppy/core/lib/BasePlugin.js'
import type { TargetedEvent } from 'preact/compat'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore We don't want TS to generate types for the package.json
import packageJson from '../package.json'
-import locale from './locale.ts'
+import locale from './locale.js'
export interface FileInputOptions extends UIPluginOptions {
pretty?: boolean
diff --git a/packages/@uppy/file-input/src/index.ts b/packages/@uppy/file-input/src/index.ts
index 58b0f100a9..9dea6a7160 100644
--- a/packages/@uppy/file-input/src/index.ts
+++ b/packages/@uppy/file-input/src/index.ts
@@ -1,2 +1,2 @@
-export { default } from './FileInput.tsx'
-export type { FileInputOptions } from './FileInput.tsx'
+export { default } from './FileInput.jsx'
+export type { FileInputOptions } from './FileInput.jsx'
diff --git a/packages/@uppy/file-input/tsconfig.build.json b/packages/@uppy/file-input/tsconfig.build.json
index 8d9ed22fa5..bbf30b5b43 100644
--- a/packages/@uppy/file-input/tsconfig.build.json
+++ b/packages/@uppy/file-input/tsconfig.build.json
@@ -2,11 +2,6 @@
"extends": "../../../tsconfig.shared",
"compilerOptions": {
"outDir": "./lib",
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"]
- },
"resolveJsonModule": false,
"rootDir": "./src"
},
diff --git a/packages/@uppy/file-input/tsconfig.json b/packages/@uppy/file-input/tsconfig.json
index a76c3b714a..47ece599c6 100644
--- a/packages/@uppy/file-input/tsconfig.json
+++ b/packages/@uppy/file-input/tsconfig.json
@@ -3,11 +3,6 @@
"compilerOptions": {
"emitDeclarationOnly": false,
"noEmit": true,
- "paths": {
- "@uppy/utils/lib/*": ["../utils/src/*"],
- "@uppy/core": ["../core/src/index.js"],
- "@uppy/core/lib/*": ["../core/src/*"],
- },
},
"include": ["./package.json", "./src/**/*.*"],
"references": [
diff --git a/packages/@uppy/form/CHANGELOG.md b/packages/@uppy/form/CHANGELOG.md
index 9c73349cc5..2d2c7614a0 100644
--- a/packages/@uppy/form/CHANGELOG.md
+++ b/packages/@uppy/form/CHANGELOG.md
@@ -1,5 +1,12 @@
# @uppy/form
+## 4.1.0
+
+Released: 2025-01-06
+Included in: Uppy v4.11.0
+
+- @uppy/angular,@uppy/audio,@uppy/aws-s3,@uppy/box,@uppy/companion-client,@uppy/compressor,@uppy/core,@uppy/dashboard,@uppy/drag-drop,@uppy/drop-target,@uppy/dropbox,@uppy/facebook,@uppy/file-input,@uppy/form,@uppy/golden-retriever,@uppy/google-drive-picker,@uppy/google-drive,@uppy/google-photos-picker,@uppy/google-photos,@uppy/image-editor,@uppy/informer,@uppy/instagram,@uppy/locales,@uppy/onedrive,@uppy/progress-bar,@uppy/provider-views,@uppy/react,@uppy/remote-sources,@uppy/screen-capture,@uppy/status-bar,@uppy/thumbnail-generator,@uppy/transloadit,@uppy/tus,@uppy/unsplash,@uppy/url,@uppy/vue,@uppy/webcam,@uppy/webdav,@uppy/xhr-upload,@uppy/zoom: Remove "paths" from all tsconfig's (Merlijn Vos / #5572)
+
## 4.0.2
Released: 2024-12-05
diff --git a/packages/@uppy/form/package.json b/packages/@uppy/form/package.json
index 94beedf57a..82ff5e8fcf 100644
--- a/packages/@uppy/form/package.json
+++ b/packages/@uppy/form/package.json
@@ -1,7 +1,7 @@
{
"name": "@uppy/form",
"description": "Connect Uppy to an existing HTML