From 1462ae94c3e0d27b2c1f65c4c77edc887adec724 Mon Sep 17 00:00:00 2001 From: Nic Polumeyv <162764842+Nic-Polumeyv@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:42:17 -0400 Subject: [PATCH 1/2] perf: avoid quadratic remote form issue merging --- .changeset/quick-forms-merge.md | 5 +++++ .../client/remote-functions/form.svelte.js | 15 ++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 .changeset/quick-forms-merge.md diff --git a/.changeset/quick-forms-merge.md b/.changeset/quick-forms-merge.md new file mode 100644 index 000000000000..f1c79564bcbf --- /dev/null +++ b/.changeset/quick-forms-merge.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +perf: avoid quadratic remote form issue merging diff --git a/packages/kit/src/runtime/client/remote-functions/form.svelte.js b/packages/kit/src/runtime/client/remote-functions/form.svelte.js index 676d9df9583c..b084ac61532a 100644 --- a/packages/kit/src/runtime/client/remote-functions/form.svelte.js +++ b/packages/kit/src/runtime/client/remote-functions/form.svelte.js @@ -39,16 +39,21 @@ import { * @returns {InternalRemoteFormIssue[]} */ function merge_with_server_issues(form_data, current_issues, client_issues) { + const client_names = new Set(client_issues.map((issue) => issue.name)); + const merged = [ - ...current_issues.filter( - (issue) => issue.server && !client_issues.some((i) => i.name === issue.name) - ), + ...current_issues.filter((issue) => issue.server && !client_names.has(issue.name)), ...client_issues ]; - const keys = Array.from(form_data.keys()); + const positions = new Map(); + let i = 0; + for (const key of form_data.keys()) { + if (!positions.has(key)) positions.set(key, i); + i++; + } - return merged.sort((a, b) => keys.indexOf(a.name) - keys.indexOf(b.name)); + return merged.sort((a, b) => (positions.get(a.name) ?? -1) - (positions.get(b.name) ?? -1)); } /** From 986b3e6b76b8a5660b94d4a1a7ac6424865632cc Mon Sep 17 00:00:00 2001 From: Nic Polumeyv <162764842+Nic-Polumeyv@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:48:42 -0400 Subject: [PATCH 2/2] chore: annotate position map --- packages/kit/src/runtime/client/remote-functions/form.svelte.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/src/runtime/client/remote-functions/form.svelte.js b/packages/kit/src/runtime/client/remote-functions/form.svelte.js index b084ac61532a..bbf2cf62b777 100644 --- a/packages/kit/src/runtime/client/remote-functions/form.svelte.js +++ b/packages/kit/src/runtime/client/remote-functions/form.svelte.js @@ -46,6 +46,7 @@ function merge_with_server_issues(form_data, current_issues, client_issues) { ...client_issues ]; + /** @type {Map} */ const positions = new Map(); let i = 0; for (const key of form_data.keys()) {