From c3ea4104ecbfc2e608b027c6c469b3dbc82cb820 Mon Sep 17 00:00:00 2001 From: freddie Date: Tue, 8 Sep 2026 13:25:29 +0100 Subject: [PATCH 1/2] Fix unhandled errors from superseded cart mutations --- .changeset/quiet-cart-aborts.md | 5 +++++ .../src/core/cart/cart-transactions.test.ts | 19 +++++++++++++++++++ packages/hydrogen/src/core/cart/cart.ts | 3 +++ 3 files changed, 27 insertions(+) create mode 100644 .changeset/quiet-cart-aborts.md diff --git a/.changeset/quiet-cart-aborts.md b/.changeset/quiet-cart-aborts.md new file mode 100644 index 0000000000..9042bcd2f5 --- /dev/null +++ b/.changeset/quiet-cart-aborts.md @@ -0,0 +1,5 @@ +--- +"@shopify/hydrogen": patch +--- + +Prevent superseded cart mutations from producing unhandled `AbortError` console errors. diff --git a/packages/hydrogen/src/core/cart/cart-transactions.test.ts b/packages/hydrogen/src/core/cart/cart-transactions.test.ts index d71eb9ac24..81156a57bf 100644 --- a/packages/hydrogen/src/core/cart/cart-transactions.test.ts +++ b/packages/hydrogen/src/core/cart/cart-transactions.test.ts @@ -407,6 +407,25 @@ describe("transaction cart store", () => { expect(store.getState().pending.lines).toEqual(new Set()); }); + it("handles an aborted correlated Standard Event promise", async () => { + dispatchEventsSynchronously = false; + store.hydrate(makeCart([makeLine("line-a", 1)])); + getCart.mockResolvedValueOnce({ cart: makeCart([makeLine("line-a", 3)]) }); + + const first = store.handleFormSubmit(submitLine("line-a")); + await Promise.resolve(); + await Promise.resolve(); + const second = store.handleFormSubmit(submitLine("line-a")); + await Promise.resolve(); + await Promise.resolve(); + + expect(transportSignals[0].aborted).toBe(true); + transportDeferreds[1].resolve(serverResult([makeLine("line-a", 3)])); + await Promise.all([first, second]); + + expect(store.getState().data.lines.nodes[0].quantity).toBe(3); + }); + it("retains references outside a transaction's scope", () => { const lineA = makeLine("line-a", 1); const lineB = makeLine("line-b", 1); diff --git a/packages/hydrogen/src/core/cart/cart.ts b/packages/hydrogen/src/core/cart/cart.ts index b528025933..11cc0716c5 100644 --- a/packages/hydrogen/src/core/cart/cart.ts +++ b/packages/hydrogen/src/core/cart/cart.ts @@ -1533,6 +1533,9 @@ function enqueueTransaction( ); if (expectedEventIndex !== -1) { store.expectedEvents.splice(expectedEventIndex, 1); + // The action's return promise is authoritative; this correlated event promise can reject + // separately when the request is cancelled and must still have an observer. + promise.then(NOOP, NOOP); return; } if (store.observedPromises.has(promise)) return; From 97cf35fd233b1c540cb169964ff429089db31856 Mon Sep 17 00:00:00 2001 From: freddie Date: Tue, 8 Sep 2026 13:47:34 +0100 Subject: [PATCH 2/2] Clarify cart cancellation comment --- packages/hydrogen/src/core/cart/cart.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/hydrogen/src/core/cart/cart.ts b/packages/hydrogen/src/core/cart/cart.ts index 11cc0716c5..1c570249bd 100644 --- a/packages/hydrogen/src/core/cart/cart.ts +++ b/packages/hydrogen/src/core/cart/cart.ts @@ -1533,8 +1533,7 @@ function enqueueTransaction( ); if (expectedEventIndex !== -1) { store.expectedEvents.splice(expectedEventIndex, 1); - // The action's return promise is authoritative; this correlated event promise can reject - // separately when the request is cancelled and must still have an observer. + // Prevent request cancellation from becoming an unhandled rejection. promise.then(NOOP, NOOP); return; }