From 50cecc0a9d75db4414634eda1235f7a1f5b3b69c Mon Sep 17 00:00:00 2001 From: razinshafayet Date: Wed, 25 Mar 2026 16:43:02 +0600 Subject: [PATCH 1/2] fix: prevent deep_set crash on nullish nested values --- .changeset/deep-set-nullish.md | 5 +++++ packages/kit/src/runtime/form-utils.js | 4 ++-- packages/kit/src/runtime/form-utils.spec.js | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 .changeset/deep-set-nullish.md diff --git a/.changeset/deep-set-nullish.md b/.changeset/deep-set-nullish.md new file mode 100644 index 000000000000..6f64e549fae6 --- /dev/null +++ b/.changeset/deep-set-nullish.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: prevent `deep_set` crash on nullish nested values diff --git a/packages/kit/src/runtime/form-utils.js b/packages/kit/src/runtime/form-utils.js index 1573d5bfe547..e14ebb1d1cb0 100644 --- a/packages/kit/src/runtime/form-utils.js +++ b/packages/kit/src/runtime/form-utils.js @@ -469,11 +469,11 @@ export function deep_set(object, keys, value) { const exists = Object.hasOwn(current, key); const inner = current[key]; - if (exists && is_array !== Array.isArray(inner)) { + if (exists && inner != null && is_array !== Array.isArray(inner)) { throw new Error(`Invalid array key ${keys[i + 1]}`); } - if (!exists) { + if (!exists || inner == null) { current[key] = is_array ? [] : {}; } diff --git a/packages/kit/src/runtime/form-utils.spec.js b/packages/kit/src/runtime/form-utils.spec.js index b84e97ab1478..3859bf0ee682 100644 --- a/packages/kit/src/runtime/form-utils.spec.js +++ b/packages/kit/src/runtime/form-utils.spec.js @@ -425,4 +425,20 @@ describe('deep_set', () => { // @ts-ignore expect(Object.prototype.toString.property).toBeUndefined(); }); + + test('creates nested object when intermediate value is undefined', () => { + const target = { nested: undefined }; + + deep_set(target, ['nested', 'name'], 'hello'); + + expect(target).toEqual({ nested: { name: 'hello' } }); + }); + + test('creates nested object when intermediate value is null', () => { + const target = { nested: null }; + + deep_set(target, ['nested', 'name'], 'hello'); + + expect(target).toEqual({ nested: { name: 'hello' } }); + }); }); From 7d4b46af7e1e9d585904988f596157c2f3393daa Mon Sep 17 00:00:00 2001 From: razinshafayet Date: Wed, 8 Apr 2026 11:15:15 +0600 Subject: [PATCH 2/2] apply suggestion --- packages/kit/src/runtime/form-utils.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/runtime/form-utils.js b/packages/kit/src/runtime/form-utils.js index e14ebb1d1cb0..34ef0796c642 100644 --- a/packages/kit/src/runtime/form-utils.js +++ b/packages/kit/src/runtime/form-utils.js @@ -466,14 +466,14 @@ export function deep_set(object, keys, value) { check_prototype_pollution(key); const is_array = /^\d+$/.test(keys[i + 1]); - const exists = Object.hasOwn(current, key); - const inner = current[key]; + const inner = Object.hasOwn(current, key) ? current[key] : undefined; + const exists = inner != null; - if (exists && inner != null && is_array !== Array.isArray(inner)) { + if (exists && is_array !== Array.isArray(inner)) { throw new Error(`Invalid array key ${keys[i + 1]}`); } - if (!exists || inner == null) { + if (!exists) { current[key] = is_array ? [] : {}; }