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..bbf2cf62b777 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,22 @@ 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()); + /** @type {Map} */ + 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)); } /**