Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@uppy/xhr-upload: refactor to use fetcher #5074

Merged
merged 10 commits into from
Apr 29, 2024
Merged

Conversation

Murderlon
Copy link
Member

@Murderlon Murderlon commented Apr 11, 2024

Blocked on #5073

@Murderlon Murderlon self-assigned this Apr 11, 2024
Copy link
Contributor

github-actions bot commented Apr 11, 2024

Diff output files
diff --git a/packages/@uppy/utils/lib/ProgressTimeout.js b/packages/@uppy/utils/lib/ProgressTimeout.js
index 1aa9ffd..83ba907 100644
--- a/packages/@uppy/utils/lib/ProgressTimeout.js
+++ b/packages/@uppy/utils/lib/ProgressTimeout.js
@@ -31,7 +31,7 @@ class ProgressTimeout {
       value: void 0,
     });
     _classPrivateFieldLooseBase(this, _timeout)[_timeout] = timeout;
-    _classPrivateFieldLooseBase(this, _onTimedOut)[_onTimedOut] = timeoutHandler;
+    _classPrivateFieldLooseBase(this, _onTimedOut)[_onTimedOut] = () => timeoutHandler(timeout);
   }
   progress() {
     if (_classPrivateFieldLooseBase(this, _isDone)[_isDone]) return;
diff --git a/packages/@uppy/xhr-upload/lib/index.js b/packages/@uppy/xhr-upload/lib/index.js
index 609c3ad..99e5482 100644
--- a/packages/@uppy/xhr-upload/lib/index.js
+++ b/packages/@uppy/xhr-upload/lib/index.js
@@ -10,12 +10,11 @@ function _classPrivateFieldLooseKey(name) {
 }
 import BasePlugin from "@uppy/core/lib/BasePlugin.js";
 import EventManager from "@uppy/core/lib/EventManager.js";
+import { fetcher } from "@uppy/utils/lib/fetcher";
 import { filterFilesToEmitUploadStarted, filterNonFailedFiles } from "@uppy/utils/lib/fileFilters";
 import isNetworkError from "@uppy/utils/lib/isNetworkError";
 import NetworkError from "@uppy/utils/lib/NetworkError";
-import ProgressTimeout from "@uppy/utils/lib/ProgressTimeout";
 import { internalRateLimitedQueue, RateLimitedQueue } from "@uppy/utils/lib/RateLimitedQueue";
-import { nanoid } from "nanoid/non-secure";
 const packageJson = {
   "version": "3.6.4",
 };
@@ -70,6 +69,7 @@ const defaultOptions = {
     return status >= 200 && status < 300;
   },
 };
+var _getFetcher = _classPrivateFieldLooseKey("getFetcher");
 var _uploadLocalFile = _classPrivateFieldLooseKey("uploadLocalFile");
 var _uploadBundle = _classPrivateFieldLooseKey("uploadBundle");
 var _getCompanionClientArgs = _classPrivateFieldLooseKey("getCompanionClientArgs");
@@ -94,6 +94,10 @@ export default class XHRUpload extends BasePlugin {
     Object.defineProperty(this, _uploadLocalFile, {
       value: _uploadLocalFile2,
     });
+    Object.defineProperty(this, _getFetcher, {
+      writable: true,
+      value: void 0,
+    });
     Object.defineProperty(this, _handleUpload, {
       writable: true,
       value: async fileIDs => {
@@ -145,6 +149,63 @@ export default class XHRUpload extends BasePlugin {
       throw new Error("The `metaFields` option has been renamed to `allowedMetaFields`.");
     }
     this.uploaderEvents = Object.create(null);
+    _classPrivateFieldLooseBase(this, _getFetcher)[_getFetcher] = files => {
+      return async (url, options) => {
+        try {
+          const res = await fetcher(url, {
+            ...options,
+            onTimeout: timeout => {
+              const seconds = Math.ceil(timeout / 1000);
+              const error = new Error(this.i18n("uploadStalled", {
+                seconds,
+              }));
+              this.uppy.emit("upload-stalled", error, files);
+            },
+            onUploadProgress: event => {
+              if (event.lengthComputable) {
+                for (const file of files) {
+                  this.uppy.emit("upload-progress", file, {
+                    uploader: this,
+                    bytesUploaded: event.loaded / event.total * file.size,
+                    bytesTotal: file.size,
+                  });
+                }
+              }
+            },
+          });
+          if (!this.opts.validateStatus(res.status, res.responseText, res)) {
+            throw new NetworkError(res.statusText, res);
+          }
+          const body = this.opts.getResponseData(res.responseText, res);
+          const uploadURL = body[this.opts.responseUrlFieldName];
+          if (typeof uploadURL !== "string") {
+            throw new Error(
+              `The received response did not include a valid URL for key ${this.opts.responseUrlFieldName}`,
+            );
+          }
+          for (const file of files) {
+            this.uppy.emit("upload-success", file, {
+              status: res.status,
+              body,
+              uploadURL,
+            });
+          }
+          return res;
+        } catch (error) {
+          if (error.name === "AbortError") {
+            return undefined;
+          }
+          if (error instanceof NetworkError) {
+            const request = error.request;
+            const customError = buildResponseError(request, this.opts.getResponseError(request.responseText, request));
+            for (const file of files) {
+              this.uppy.emit("upload-error", file, customError);
+            }
+          }
+          throw error;
+        }
+      };
+    };
   }
   getOptions(file) {
     const overrides = this.uppy.getState().xhrUpload;
@@ -238,196 +299,67 @@ export default class XHRUpload extends BasePlugin {
     this.uppy.removeUploader(_classPrivateFieldLooseBase(this, _handleUpload)[_handleUpload]);
   }
 }
-async function _uploadLocalFile2(file, current, total) {
-  const opts = this.getOptions(file);
-  const uploadStarted = Date.now();
-  this.uppy.log(`uploading ${current} of ${total}`);
-  return new Promise((resolve, reject) => {
-    const data = opts.formData ? this.createFormDataUpload(file, opts) : file.data;
-    const xhr = new XMLHttpRequest();
-    const eventManager = new EventManager(this.uppy);
-    this.uploaderEvents[file.id] = eventManager;
-    let queuedRequest;
-    const timer = new ProgressTimeout(opts.timeout, () => {
-      const error = new Error(this.i18n("uploadStalled", {
-        seconds: Math.ceil(opts.timeout / 1000),
-      }));
-      this.uppy.emit("upload-stalled", error, [file]);
-    });
-    const id = nanoid();
-    xhr.upload.addEventListener("loadstart", () => {
-      this.uppy.log(`[XHRUpload] ${id} started`);
+async function _uploadLocalFile2(file) {
+  const events = new EventManager(this.uppy);
+  const controller = new AbortController();
+  const uppyFetch = this.requests.wrapPromiseFunction(async () => {
+    const opts = this.getOptions(file);
+    const fetch = _classPrivateFieldLooseBase(this, _getFetcher)[_getFetcher]([file]);
+    const body = opts.formData ? this.createFormDataUpload(file, opts) : file.data;
+    return fetch(opts.endpoint, {
+      ...opts,
+      body,
+      signal: controller.signal,
     });
-    xhr.upload.addEventListener("progress", ev => {
-      this.uppy.log(`[XHRUpload] ${id} progress: ${ev.loaded} / ${ev.total}`);
-      timer.progress();
-      if (ev.lengthComputable) {
-        this.uppy.emit("upload-progress", this.uppy.getFile(file.id), {
-          uploader: this,
-          uploadStarted,
-          bytesUploaded: ev.loaded,
-          bytesTotal: ev.total,
-        });
-      }
-    });
-    xhr.addEventListener("load", () => {
-      this.uppy.log(`[XHRUpload] ${id} finished`);
-      timer.done();
-      queuedRequest.done();
-      if (this.uploaderEvents[file.id]) {
-        this.uploaderEvents[file.id].remove();
-        this.uploaderEvents[file.id] = null;
-      }
-      if (opts.validateStatus(xhr.status, xhr.responseText, xhr)) {
-        const body = opts.getResponseData(xhr.responseText, xhr);
-        const uploadURL = body == null ? void 0 : body[opts.responseUrlFieldName];
-        const uploadResp = {
-          status: xhr.status,
-          body,
-          uploadURL,
-        };
-        this.uppy.emit("upload-success", this.uppy.getFile(file.id), uploadResp);
-        if (uploadURL) {
-          this.uppy.log(`Download ${file.name} from ${uploadURL}`);
-        }
-        return resolve(file);
-      }
-      const body = opts.getResponseData(xhr.responseText, xhr);
-      const error = buildResponseError(xhr, opts.getResponseError(xhr.responseText, xhr));
-      const response = {
-        status: xhr.status,
-        body,
-      };
-      this.uppy.emit("upload-error", file, error, response);
-      return reject(error);
-    });
-    xhr.addEventListener("error", () => {
-      this.uppy.log(`[XHRUpload] ${id} errored`);
-      timer.done();
-      queuedRequest.done();
-      if (this.uploaderEvents[file.id]) {
-        this.uploaderEvents[file.id].remove();
-        this.uploaderEvents[file.id] = null;
-      }
-      const error = buildResponseError(xhr, opts.getResponseError(xhr.responseText, xhr));
-      this.uppy.emit("upload-error", file, error);
-      return reject(error);
-    });
-    xhr.open(opts.method.toUpperCase(), opts.endpoint, true);
-    xhr.withCredentials = opts.withCredentials;
-    if (opts.responseType !== "") {
-      xhr.responseType = opts.responseType;
+  });
+  events.onFileRemove(file.id, () => controller.abort());
+  events.onCancelAll(file.id, _ref => {
+    let {
+      reason,
+    } = _ref;
+    if (reason === "user") {
+      controller.abort();
     }
-    queuedRequest = this.requests.run(() => {
-      const currentOpts = this.getOptions(file);
-      Object.keys(currentOpts.headers).forEach(header => {
-        xhr.setRequestHeader(header, currentOpts.headers[header]);
-      });
-      xhr.send(data);
-      return () => {
-        timer.done();
-        xhr.abort();
-      };
-    });
-    eventManager.onFileRemove(file.id, () => {
-      queuedRequest.abort();
-      reject(new Error("File removed"));
-    });
-    eventManager.onCancelAll(file.id, _ref => {
-      let {
-        reason,
-      } = _ref;
-      if (reason === "user") {
-        queuedRequest.abort();
-      }
-      reject(new Error("Upload cancelled"));
-    });
   });
+  try {
+    await uppyFetch().abortOn(controller.signal);
+  } catch (error) {
+    if (error.message !== "Cancelled") {
+      throw error;
+    }
+  } finally {
+    events.remove();
+  }
 }
-function _uploadBundle2(files) {
-  return new Promise((resolve, reject) => {
-    const {
-      endpoint,
-    } = this.opts;
-    const {
-      method,
-    } = this.opts;
-    const uploadStarted = Date.now();
-    const optsFromState = this.uppy.getState().xhrUpload;
-    const formData = this.createBundledUpload(files, {
+async function _uploadBundle2(files) {
+  const controller = new AbortController();
+  const uppyFetch = this.requests.wrapPromiseFunction(async () => {
+    var _this$uppy$getState$x;
+    const optsFromState = (_this$uppy$getState$x = this.uppy.getState().xhrUpload) != null ? _this$uppy$getState$x : {};
+    const fetch = _classPrivateFieldLooseBase(this, _getFetcher)[_getFetcher](files);
+    const body = this.createBundledUpload(files, {
       ...this.opts,
-      ...(optsFromState || {}),
-    });
-    const xhr = new XMLHttpRequest();
-    const emitError = error => {
-      files.forEach(file => {
-        this.uppy.emit("upload-error", file, error);
-      });
-    };
-    const timer = new ProgressTimeout(this.opts.timeout, () => {
-      const error = new Error(this.i18n("uploadStalled", {
-        seconds: Math.ceil(this.opts.timeout / 1000),
-      }));
-      this.uppy.emit("upload-stalled", error, files);
+      ...optsFromState,
     });
-    xhr.upload.addEventListener("loadstart", () => {
-      this.uppy.log("[XHRUpload] started uploading bundle");
-      timer.progress();
-    });
-    xhr.upload.addEventListener("progress", ev => {
-      timer.progress();
-      if (!ev.lengthComputable) return;
-      files.forEach(file => {
-        this.uppy.emit("upload-progress", this.uppy.getFile(file.id), {
-          uploader: this,
-          uploadStarted,
-          bytesUploaded: ev.loaded / ev.total * file.size,
-          bytesTotal: file.size,
-        });
-      });
-    });
-    xhr.addEventListener("load", () => {
-      timer.done();
-      if (this.opts.validateStatus(xhr.status, xhr.responseText, xhr)) {
-        const body = this.opts.getResponseData(xhr.responseText, xhr);
-        const uploadResp = {
-          status: xhr.status,
-          body,
-        };
-        files.forEach(file => {
-          this.uppy.emit("upload-success", this.uppy.getFile(file.id), uploadResp);
-        });
-        return resolve();
-      }
-      const error = this.opts.getResponseError(xhr.responseText, xhr) || new NetworkError("Upload error", xhr);
-      emitError(error);
-      return reject(error);
-    });
-    xhr.addEventListener("error", () => {
-      timer.done();
-      const error = this.opts.getResponseError(xhr.responseText, xhr) || new Error("Upload error");
-      emitError(error);
-      return reject(error);
-    });
-    this.uppy.on("cancel-all", function(_temp) {
-      let {
-        reason,
-      } = _temp === void 0 ? {} : _temp;
-      if (reason !== "user") return;
-      timer.done();
-      xhr.abort();
-    });
-    xhr.open(method.toUpperCase(), endpoint, true);
-    xhr.withCredentials = this.opts.withCredentials;
-    if (this.opts.responseType !== "") {
-      xhr.responseType = this.opts.responseType;
-    }
-    const headers = this.opts.headers;
-    Object.keys(headers).forEach(header => {
-      xhr.setRequestHeader(header, headers[header]);
+    return fetch(this.opts.endpoint, {
+      ...this.opts,
+      body,
+      signal: controller.signal,
     });
-    xhr.send(formData);
   });
+  function abort() {
+    controller.abort();
+  }
+  this.uppy.once("cancel-all", abort);
+  try {
+    await uppyFetch().abortOn(controller.signal);
+  } catch (error) {
+    if (error.message !== "Cancelled") {
+      throw error;
+    }
+  } finally {
+    this.uppy.off("cancel-all", abort);
+  }
 }
 function _getCompanionClientArgs2(file) {
   var _file$remote;
@@ -446,9 +378,7 @@ function _getCompanionClientArgs2(file) {
   };
 }
 async function _uploadFiles2(files) {
-  await Promise.allSettled(files.map((file, i) => {
-    const current = i + 1;
-    const total = files.length;
+  await Promise.allSettled(files.map(file => {
     if (file.isRemote) {
       const getQueue = () => this.requests;
       const controller = new AbortController();
@@ -471,7 +401,7 @@ async function _uploadFiles2(files) {
       })();
       return uploadPromise;
     }
-    return _classPrivateFieldLooseBase(this, _uploadLocalFile)[_uploadLocalFile](file, current, total);
+    return _classPrivateFieldLooseBase(this, _uploadLocalFile)[_uploadLocalFile](file);
   }));
 }
 XHRUpload.VERSION = packageJson.version;

@Murderlon Murderlon requested a review from aduh95 April 11, 2024 16:55
@Murderlon Murderlon marked this pull request as ready for review April 11, 2024 16:55
Base automatically changed from fetcher-util to main April 16, 2024 10:35
@Murderlon Murderlon force-pushed the xhr-fetcher-refactor branch from 9f911d5 to 037aeca Compare April 16, 2024 10:40
packages/@uppy/xhr-upload/src/index.ts Outdated Show resolved Hide resolved
packages/@uppy/xhr-upload/src/index.ts Outdated Show resolved Hide resolved
@Murderlon Murderlon requested a review from mifi April 23, 2024 08:54

This comment was marked as resolved.

Murderlon and others added 3 commits April 23, 2024 11:12
* main:
  @uppy/form: fix `submitOnSuccess` and `triggerUploadOnSubmit` combination (#5058)
  Bump docker/build-push-action from 3 to 5 (#5105)
  Bump akhileshns/heroku-deploy from 3.12.12 to 3.13.15 (#5102)
  Bump docker/login-action from 2 to 3 (#5101)
  Bump actions/download-artifact from 3 to 4
  Bump actions/upload-artifact from 3 to 4
  Release: uppy@3.24.3 (#5091)
  docs: add back markdown files (#5064)
  meta: fix custom provider example (#5079)
Copy link
Contributor

@aduh95 aduh95 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM if tests are green

@Murderlon Murderlon merged commit daae9aa into main Apr 29, 2024
21 checks passed
@Murderlon Murderlon deleted the xhr-fetcher-refactor branch April 29, 2024 13:39
Murderlon added a commit that referenced this pull request Apr 29, 2024
* main: (22 commits)
  @uppy/xhr-upload: refactor to use `fetcher` (#5074)
  docs: use StackBlitz for all examples/issue template (#5125)
  Update yarn.lock
  Add svelte 5 as peer dep (#5122)
  Bump docker/setup-buildx-action from 2 to 3 (#5124)
  Bump actions/checkout from 3 to 4 (#5123)
  Remove JSX global type everywhere (#5117)
  Revert "@uppy/core: reference updated i18n in Restricter"
  @uppy/core: reference updated i18n in Restricter
  @uppy/utils: improve return type of `dataURItoFile` (#5112)
  @uppy/drop-target: change drop event type to DragEvent (#5107)
  @uppy/image-editor: fix label definitions (#5111)
  meta: bump Prettier version (#5114)
  @uppy/provider-views: bring back "loaded X files..." (#5097)
  @uppy/dashboard: fix type of trigger option (#5106)
  meta: fix linter
  @uppy/form: fix `submitOnSuccess` and `triggerUploadOnSubmit` combination (#5058)
  Bump docker/build-push-action from 3 to 5 (#5105)
  Bump akhileshns/heroku-deploy from 3.12.12 to 3.13.15 (#5102)
  Bump docker/login-action from 2 to 3 (#5101)
  ...
@github-actions github-actions bot mentioned this pull request Apr 29, 2024
github-actions bot added a commit that referenced this pull request Apr 29, 2024
| Package                | Version | Package                | Version |
| ---------------------- | ------- | ---------------------- | ------- |
| @uppy/audio            |   1.1.9 | @uppy/instagram        |   3.3.1 |
| @uppy/aws-s3-multipart |  3.11.1 | @uppy/onedrive         |   3.3.1 |
| @uppy/box              |   2.3.1 | @uppy/provider-views   |  3.12.0 |
| @uppy/companion-client |   3.8.1 | @uppy/react            |   3.3.1 |
| @uppy/compressor       |   1.1.3 | @uppy/status-bar       |   3.3.2 |
| @uppy/core             |  3.11.0 | @uppy/svelte           |   3.1.4 |
| @uppy/dashboard        |   3.8.2 | @uppy/transloadit      |   3.6.1 |
| @uppy/drop-target      |   2.1.0 | @uppy/unsplash         |   3.3.1 |
| @uppy/dropbox          |   3.3.1 | @uppy/url              |   3.6.1 |
| @uppy/facebook         |   3.3.1 | @uppy/utils            |   5.9.0 |
| @uppy/file-input       |   3.1.2 | @uppy/webcam           |   3.4.1 |
| @uppy/form             |   3.2.1 | @uppy/xhr-upload       |   3.6.5 |
| @uppy/google-drive     |   3.5.1 | @uppy/zoom             |   2.3.1 |
| @uppy/image-editor     |   2.4.5 | uppy                   |  3.25.0 |

- meta: enforce use of `.js` extension in `import type` declarations (Antoine du Hamel / #5126)
- @uppy/core: add instance ID to generated IDs (Merlijn Vos / #5080)
- @uppy/core: reference updated i18n in Restricter (Merlijn Vos / #5118)
- @uppy/xhr-upload: refactor to use `fetcher` (Merlijn Vos / #5074)
- meta: docs: use StackBlitz for all examples/issue template (Merlijn Vos / #5125)
- meta: Update yarn.lock (Murderlon)
- @uppy/svelte: Add svelte 5 as peer dep (frederikhors / #5122)
- meta: Bump docker/setup-buildx-action from 2 to 3 (dependabot[bot] / #5124)
- meta: Bump actions/checkout from 3 to 4 (dependabot[bot] / #5123)
- @uppy/dashboard,@uppy/provider-views: Remove JSX global type everywhere (Merlijn Vos / #5117)
- @uppy/utils: improve return type of `dataURItoFile` (Antoine du Hamel / #5112)
- @uppy/drop-target: change drop event type to DragEvent (Alireza Heydari / #5107)
- @uppy/image-editor: fix label definitions (Antoine du Hamel / #5111)
- meta: bump Prettier version (Antoine du Hamel / #5114)
- @uppy/provider-views: bring back "loaded X files..." (Mikael Finstad / #5097)
- @uppy/dashboard: fix type of trigger option (Merlijn Vos / #5106)
- meta: fix linter (Antoine du Hamel)
- @uppy/form: fix `submitOnSuccess` and `triggerUploadOnSubmit` combination (Merlijn Vos / #5058)
- meta: Bump docker/build-push-action from 3 to 5 (dependabot[bot] / #5105)
- meta: Bump akhileshns/heroku-deploy from 3.12.12 to 3.13.15 (dependabot[bot] / #5102)
- meta: Bump docker/login-action from 2 to 3 (dependabot[bot] / #5101)
- meta: Bump actions/download-artifact from 3 to 4 (dependabot[bot])
- meta: Bump actions/upload-artifact from 3 to 4 (dependabot[bot])
This was referenced Apr 29, 2024
github-actions bot added a commit that referenced this pull request Apr 29, 2024
| Package                |      Version | Package                |      Version |
| ---------------------- | ------------ | ---------------------- | ------------ |
| @uppy/angular          | 0.7.0-beta.4 | @uppy/instagram        | 4.0.0-beta.4 |
| @uppy/audio            | 2.0.0-beta.4 | @uppy/onedrive         | 4.0.0-beta.4 |
| @uppy/aws-s3-multipart | 4.0.0-beta.4 | @uppy/provider-views   | 4.0.0-beta.4 |
| @uppy/box              | 3.0.0-beta.4 | @uppy/react            | 4.0.0-beta.4 |
| @uppy/companion        | 5.0.0-beta.4 | @uppy/status-bar       | 4.0.0-beta.4 |
| @uppy/companion-client | 4.0.0-beta.4 | @uppy/store-redux      | 4.0.0-beta.2 |
| @uppy/compressor       | 2.0.0-beta.4 | @uppy/svelte           | 4.0.0-beta.2 |
| @uppy/core             | 4.0.0-beta.4 | @uppy/transloadit      | 4.0.0-beta.4 |
| @uppy/dashboard        | 4.0.0-beta.4 | @uppy/unsplash         | 4.0.0-beta.4 |
| @uppy/drop-target      | 3.0.0-beta.4 | @uppy/url              | 4.0.0-beta.4 |
| @uppy/dropbox          | 4.0.0-beta.4 | @uppy/utils            | 6.0.0-beta.4 |
| @uppy/facebook         | 4.0.0-beta.4 | @uppy/webcam           | 4.0.0-beta.4 |
| @uppy/file-input       | 4.0.0-beta.4 | @uppy/xhr-upload       | 4.0.0-beta.2 |
| @uppy/form             | 4.0.0-beta.2 | @uppy/zoom             | 3.0.0-beta.4 |
| @uppy/google-drive     | 4.0.0-beta.4 | uppy                   | 4.0.0-beta.4 |
| @uppy/image-editor     | 3.0.0-beta.2 |                        |              |

- meta: Upgrade Yarn to 4.x (Merlijn Vos / #4849)
- @uppy/utils: fix fetcher export (Murderlon)
- @uppy/xhr-upload: refactor to use `fetcher` (Merlijn Vos / #5074)
- docs: use StackBlitz for all examples/issue template (Merlijn Vos / #5125)
- meta: Update yarn.lock (Murderlon)
- @uppy/svelte: Add svelte 5 as peer dep (frederikhors / #5122)
- meta: Bump docker/setup-buildx-action from 2 to 3 (dependabot[bot] / #5124)
- meta: Bump actions/checkout from 3 to 4 (dependabot[bot] / #5123)
- @uppy/dashboard,@uppy/provider-views: Remove JSX global type everywhere (Merlijn Vos / #5117)
- @uppy/utils: improve return type of `dataURItoFile` (Antoine du Hamel / #5112)
- @uppy/drop-target: change drop event type to DragEvent (Alireza Heydari / #5107)
- @uppy/image-editor: fix label definitions (Antoine du Hamel / #5111)
- meta: bump Prettier version (Antoine du Hamel / #5114)
- @uppy/provider-views: bring back "loaded X files..." (Mikael Finstad / #5097)
- @uppy/dashboard: fix type of trigger option (Merlijn Vos / #5106)
- meta: fix linter (Antoine du Hamel)
- @uppy/companion: bump Node.js version support matrix (Antoine du Hamel / #5035)
- @uppy/form: fix `submitOnSuccess` and `triggerUploadOnSubmit` combination (Merlijn Vos / #5058)
- meta: Bump docker/build-push-action from 3 to 5 (dependabot[bot] / #5105)
- meta: Bump akhileshns/heroku-deploy from 3.12.12 to 3.13.15 (dependabot[bot] / #5102)
- meta: Bump docker/login-action from 2 to 3 (dependabot[bot] / #5101)
- meta: Bump actions/download-artifact from 3 to 4 (dependabot[bot])
- meta: Bump actions/upload-artifact from 3 to 4 (dependabot[bot])
- @uppy/react: remove `useUppy` & reintroduce `useUppyState` (Merlijn Vos / #5059)
- meta: docs: add back markdown files (Antoine du Hamel / #5064)
- meta: fix custom provider example (Merlijn Vos / #5079)
- @uppy/utils: add fetcher (Merlijn Vos / #5073)
- meta: Fix prettier (Murderlon)
- @uppy/dashboard: add missing `x-zip-compress` archive type (Younes / #5081)
- meta: Bump docker/metadata-action from 4 to 5 (dependabot[bot] / #5086)
- meta: Bump actions/setup-node from 3 to 4 (dependabot[bot] / #5087)
- meta: Bump docker/setup-qemu-action from 2 to 3 (dependabot[bot] / #5089)
- meta: bump supercharge/redis-github-action from 1.4.0 to 1.8.0 (dependabot[bot] / #5090)
- meta: bump actions/cache from 3 to 4 (dependabot[bot] / #5088)
- meta: add `dependabot.yml` to keep GHA up-to-date (Antoine du Hamel / #5083)
- @uppy/core: Release: uppy@3.24.2 (github-actions[bot] / #5084)
- @uppy/core: fix `setOptions` not re-rendereing plugin UI (Antoine du Hamel / #5082)
- meta: bump vite from 5.0.12 to 5.0.13 (dependabot[bot] / #5060)
- meta: bump tar from 6.1.11 to 6.2.1 (dependabot[bot] / #5068)
- @uppy/companion,@uppy/file-input: Release: uppy@3.24.1 (github-actions[bot] / #5069)
- @uppy/companion: upgrade redis (Mikael Finstad / #5065)
- meta: fix `watch:*` scripts (Antoine du Hamel / #5046)
- meta: include more packages in `compare_diff` CI (Antoine du Hamel / #5044)
- @uppy/file-input: add missing export (Antoine du Hamel / #5045)
- meta: Bump express from 4.18.1 to 4.19.2 in /packages/@uppy/companion (dependabot[bot] / #5036)
- @uppy/companion: Bump express from 4.18.1 to 4.19.2 (dependabot[bot] / #5037)





| Package                | Version | Package                | Version |
| ---------------------- | ------- | ---------------------- | ------- |
| @uppy/audio            |   1.1.9 | @uppy/instagram        |   3.3.1 |
| @uppy/aws-s3-multipart |  3.11.1 | @uppy/onedrive         |   3.3.1 |
| @uppy/box              |   2.3.1 | @uppy/provider-views   |  3.12.0 |
| @uppy/companion-client |   3.8.1 | @uppy/react            |   3.3.1 |
| @uppy/compressor       |   1.1.3 | @uppy/status-bar       |   3.3.2 |
| @uppy/core             |  3.11.0 | @uppy/svelte           |   3.1.4 |
| @uppy/dashboard        |   3.8.2 | @uppy/transloadit      |   3.6.1 |
| @uppy/drop-target      |   2.1.0 | @uppy/unsplash         |   3.3.1 |
| @uppy/dropbox          |   3.3.1 | @uppy/url              |   3.6.1 |
| @uppy/facebook         |   3.3.1 | @uppy/utils            |   5.9.0 |
| @uppy/file-input       |   3.1.2 | @uppy/webcam           |   3.4.1 |
| @uppy/form             |   3.2.1 | @uppy/xhr-upload       |   3.6.5 |
| @uppy/google-drive     |   3.5.1 | @uppy/zoom             |   2.3.1 |
| @uppy/image-editor     |   2.4.5 | uppy                   |  3.25.0 |

- meta: enforce use of `.js` extension in `import type` declarations (Antoine du Hamel / #5126)
- @uppy/core: add instance ID to generated IDs (Merlijn Vos / #5080)
- @uppy/core: reference updated i18n in Restricter (Merlijn Vos / #5118)
- @uppy/xhr-upload: refactor to use `fetcher` (Merlijn Vos / #5074)
- meta: docs: use StackBlitz for all examples/issue template (Merlijn Vos / #5125)
- meta: Update yarn.lock (Murderlon)
- @uppy/svelte: Add svelte 5 as peer dep (frederikhors / #5122)
- meta: Bump docker/setup-buildx-action from 2 to 3 (dependabot[bot] / #5124)
- meta: Bump actions/checkout from 3 to 4 (dependabot[bot] / #5123)
- @uppy/dashboard,@uppy/provider-views: Remove JSX global type everywhere (Merlijn Vos / #5117)
- @uppy/utils: improve return type of `dataURItoFile` (Antoine du Hamel / #5112)
- @uppy/drop-target: change drop event type to DragEvent (Alireza Heydari / #5107)
- @uppy/image-editor: fix label definitions (Antoine du Hamel / #5111)
- meta: bump Prettier version (Antoine du Hamel / #5114)
- @uppy/provider-views: bring back "loaded X files..." (Mikael Finstad / #5097)
- @uppy/dashboard: fix type of trigger option (Merlijn Vos / #5106)
- meta: fix linter (Antoine du Hamel)
- @uppy/form: fix `submitOnSuccess` and `triggerUploadOnSubmit` combination (Merlijn Vos / #5058)
- meta: Bump docker/build-push-action from 3 to 5 (dependabot[bot] / #5105)
- meta: Bump akhileshns/heroku-deploy from 3.12.12 to 3.13.15 (dependabot[bot] / #5102)
- meta: Bump docker/login-action from 2 to 3 (dependabot[bot] / #5101)
- meta: Bump actions/download-artifact from 3 to 4 (dependabot[bot])
- meta: Bump actions/upload-artifact from 3 to 4 (dependabot[bot])

xhr.open(opts.method.toUpperCase(), opts.endpoint, true)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We used to call .toUpperCase(), this is a regression

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants