From 077564cd794a8526e6c9f48286b54f0acf562d71 Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 10 Oct 2019 14:56:04 +0200 Subject: [PATCH 1/2] Avoid extending Promise. --- packages/react-async/src/reducer.js | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/react-async/src/reducer.js b/packages/react-async/src/reducer.js index 3587bcdf..9ef4457b 100644 --- a/packages/react-async/src/reducer.js +++ b/packages/react-async/src/reducer.js @@ -1,25 +1,23 @@ import { getInitialStatus, getIdleStatus, getStatusProps, statusTypes } from "./status" // This exists to make sure we don't hold any references to user-provided functions -class NeverSettle extends Promise { - constructor() { - super(() => {}, () => {}) - /* istanbul ignore next */ - if (Object.setPrototypeOf) { - // Not available in IE 10, but can be polyfilled - Object.setPrototypeOf(this, NeverSettle.prototype) - } - } +function NeverSettle() {} +/* istanbul ignore next */ +if (Object.setPrototypeOf) { + // Not available in IE 10, but can be polyfilled + Object.setPrototypeOf(NeverSettle, Promise) +} +NeverSettle.prototype = Object.assign(Object.create(Promise.prototype), { finally() { return this - } + }, catch() { return this - } + }, then() { return this - } -} + }, +}) export const neverSettle = new NeverSettle() From 463c4b51f45100520337c1b0bec790565cd661ef Mon Sep 17 00:00:00 2001 From: Gert Hengeveld Date: Thu, 10 Oct 2019 15:09:02 +0200 Subject: [PATCH 2/2] Fallback to setting __proto__. --- packages/react-async/src/reducer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/react-async/src/reducer.js b/packages/react-async/src/reducer.js index 9ef4457b..c377b486 100644 --- a/packages/react-async/src/reducer.js +++ b/packages/react-async/src/reducer.js @@ -1,11 +1,14 @@ import { getInitialStatus, getIdleStatus, getStatusProps, statusTypes } from "./status" // This exists to make sure we don't hold any references to user-provided functions +// The way NeverSettle extends from Promise is complicated, but can't be done differently because Babel doesn't support +// extending built-in classes. See https://babeljs.io/docs/en/caveats/#classes function NeverSettle() {} /* istanbul ignore next */ if (Object.setPrototypeOf) { - // Not available in IE 10, but can be polyfilled Object.setPrototypeOf(NeverSettle, Promise) +} else { + NeverSettle.__proto__ = Promise } NeverSettle.prototype = Object.assign(Object.create(Promise.prototype), { finally() {