From dd0d206153fd90f1e21424fce6aa135cc7f4a3de Mon Sep 17 00:00:00 2001 From: joseph0926 Date: Thu, 13 Nov 2025 19:17:05 +0900 Subject: [PATCH 1/3] fix: fetcher.submit failing with plain objects containing tagName property --- .../dom/fetcher-submit-tagname-test.tsx | 98 +++++++++++++++++++ packages/react-router/lib/dom/dom.ts | 4 +- 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 packages/react-router/__tests__/dom/fetcher-submit-tagname-test.tsx diff --git a/packages/react-router/__tests__/dom/fetcher-submit-tagname-test.tsx b/packages/react-router/__tests__/dom/fetcher-submit-tagname-test.tsx new file mode 100644 index 0000000000..31139977e3 --- /dev/null +++ b/packages/react-router/__tests__/dom/fetcher-submit-tagname-test.tsx @@ -0,0 +1,98 @@ +import * as React from "react"; +import { render, fireEvent, screen } from "@testing-library/react"; +import "@testing-library/jest-dom"; +import { + RouterProvider, + createBrowserRouter, + useFetcher, +} from "../../index"; +import getWindow from "../utils/getWindow"; + +describe("fetcher.submit with tagName property", () => { + it("should handle plain object with tagName property", async () => { + let actionSpy = jest.fn(); + actionSpy.mockReturnValue({ ok: true }); + + let router = createBrowserRouter( + [ + { + path: "/", + action: actionSpy, + Component() { + let fetcher = useFetcher(); + return ( + + ); + }, + }, + ], + { + window: getWindow("/"), + } + ); + + render(); + fireEvent.click(screen.getByText("Submit")); + + expect(actionSpy).toHaveBeenCalled(); + let formData = await actionSpy.mock.calls[0][0].request.formData(); + expect(formData.get("tagName")).toBe("div"); + expect(formData.get("data")).toBe("test"); + }); + + it("should handle plain object with various HTML element-like properties", async () => { + let actionSpy = jest.fn(); + actionSpy.mockReturnValue({ ok: true }); + + let router = createBrowserRouter( + [ + { + path: "/", + action: actionSpy, + Component() { + let fetcher = useFetcher(); + return ( + + ); + }, + }, + ], + { + window: getWindow("/"), + } + ); + + render(); + fireEvent.click(screen.getByText("Submit")); + + expect(actionSpy).toHaveBeenCalled(); + let formData = await actionSpy.mock.calls[0][0].request.formData(); + expect(formData.get("tagName")).toBe("button"); + expect(formData.get("className")).toBe("test-class"); + expect(formData.get("id")).toBe("test-id"); + expect(formData.get("value")).toBe("test-value"); + }); +}); diff --git a/packages/react-router/lib/dom/dom.ts b/packages/react-router/lib/dom/dom.ts index 82404939fb..73dc875acc 100644 --- a/packages/react-router/lib/dom/dom.ts +++ b/packages/react-router/lib/dom/dom.ts @@ -7,7 +7,9 @@ export const defaultMethod: HTMLFormMethod = "get"; const defaultEncType: FormEncType = "application/x-www-form-urlencoded"; export function isHtmlElement(object: any): object is HTMLElement { - return object != null && typeof object.tagName === "string"; + return ( + typeof HTMLElement !== "undefined" && object instanceof HTMLElement + ); } export function isButtonElement(object: any): object is HTMLButtonElement { From 58f17cc1e83b14a139febd9cf86b8565ae1e770c Mon Sep 17 00:00:00 2001 From: joseph0926 Date: Fri, 14 Nov 2025 01:38:12 +0900 Subject: [PATCH 2/3] Add changeset for fetcher.submit tagName fix --- .changeset/fluffy-walls-add.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fluffy-walls-add.md diff --git a/.changeset/fluffy-walls-add.md b/.changeset/fluffy-walls-add.md new file mode 100644 index 0000000000..11f118659a --- /dev/null +++ b/.changeset/fluffy-walls-add.md @@ -0,0 +1,5 @@ +--- +"react-router": patch +--- + +Fix fetcher.submit failing with plain objects containing tagName property From 5b60a1cfc678080dff03755f7447dfbb3b897018 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Fri, 14 Nov 2025 11:20:48 -0500 Subject: [PATCH 3/3] Apply suggestions from code review --- .changeset/fluffy-walls-add.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fluffy-walls-add.md b/.changeset/fluffy-walls-add.md index 11f118659a..bf46e1a47a 100644 --- a/.changeset/fluffy-walls-add.md +++ b/.changeset/fluffy-walls-add.md @@ -2,4 +2,4 @@ "react-router": patch --- -Fix fetcher.submit failing with plain objects containing tagName property +Fix `fetcher.submit` failing with plain objects containing a `tagName` property