diff --git a/.changeset/rotten-waves-fold.md b/.changeset/rotten-waves-fold.md new file mode 100644 index 0000000000..f2107e9271 --- /dev/null +++ b/.changeset/rotten-waves-fold.md @@ -0,0 +1,5 @@ +--- +"@remix-run/router": patch +--- + +Remove `instanceof` check for `DeferredData` to be resiliant to ESM/CJS boundaries in SSR bundling scenarios diff --git a/package.json b/package.json index de947bd2eb..c930322687 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ }, "filesize": { "packages/router/dist/router.umd.min.js": { - "none": "43.1 kB" + "none": "43.3 kB" }, "packages/react-router/dist/react-router.production.min.js": { "none": "13 kB" diff --git a/packages/router/router.ts b/packages/router/router.ts index 575b8e2a85..e2e55fe1d2 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -3486,7 +3486,7 @@ async function callLoaderOrAction( return { type: resultType, error: result }; } - if (result instanceof DeferredData) { + if (isDeferredData(result)) { return { type: ResultType.deferred, deferredData: result, @@ -3856,6 +3856,18 @@ function isRedirectResult(result?: DataResult): result is RedirectResult { return (result && result.type) === ResultType.redirect; } +export function isDeferredData(value: any): value is DeferredData { + let deferred: DeferredData = value; + return ( + deferred && + typeof deferred === "object" && + typeof deferred.data === "object" && + typeof deferred.subscribe === "function" && + typeof deferred.cancel === "function" && + typeof deferred.resolveData === "function" + ); +} + function isResponse(value: any): value is Response { return ( value != null &&