diff --git a/.changeset/forty-countries-push.md b/.changeset/forty-countries-push.md new file mode 100644 index 000000000000..8879938507f2 --- /dev/null +++ b/.changeset/forty-countries-push.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: let `deep_set` recreate nullish intermediate containers diff --git a/packages/kit/src/runtime/form-utils.js b/packages/kit/src/runtime/form-utils.js index ad47b49141dc..a839092742bd 100644 --- a/packages/kit/src/runtime/form-utils.js +++ b/packages/kit/src/runtime/form-utils.js @@ -510,11 +510,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 e6201f567e2c..00e150891a3b 100644 --- a/packages/kit/src/runtime/form-utils.spec.js +++ b/packages/kit/src/runtime/form-utils.spec.js @@ -765,4 +765,20 @@ describe('deep_set', () => { // @ts-ignore expect(Object.prototype.toString.property).toBeUndefined(); }); + + test.each([undefined, null])('rehydrates nullish object containers (%s)', (initial) => { + const target = { nested: initial }; + + deep_set(target, ['nested', 'name'], 'hello'); + + expect(target).toEqual({ nested: { name: 'hello' } }); + }); + + test.each([undefined, null])('rehydrates nullish array containers (%s)', (initial) => { + const target = { nested: initial }; + + deep_set(target, ['nested', '0'], 'hello'); + + expect(target).toEqual({ nested: ['hello'] }); + }); });