Skip to content

Commit 74a5fd7

Browse files
fix: prevent deep_set crash on nullish nested values
1 parent a0fbe2a commit 74a5fd7

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

.changeset/deep-set-nullish.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
fix: prevent `deep_set` crash on nullish nested values

packages/kit/src/runtime/form-utils.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,11 +510,11 @@ export function deep_set(object, keys, value) {
510510
const exists = Object.hasOwn(current, key);
511511
const inner = current[key];
512512

513-
if (exists && is_array !== Array.isArray(inner)) {
513+
if (exists && inner != null && is_array !== Array.isArray(inner)) {
514514
throw new Error(`Invalid array key ${keys[i + 1]}`);
515515
}
516516

517-
if (!exists) {
517+
if (!exists || inner == null) {
518518
current[key] = is_array ? [] : {};
519519
}
520520

packages/kit/src/runtime/form-utils.spec.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,4 +765,20 @@ describe('deep_set', () => {
765765
// @ts-ignore
766766
expect(Object.prototype.toString.property).toBeUndefined();
767767
});
768+
769+
test('creates nested object when intermediate value is undefined', () => {
770+
const target = { nested: undefined };
771+
772+
deep_set(target, ['nested', 'name'], 'hello');
773+
774+
expect(target).toEqual({ nested: { name: 'hello' } });
775+
});
776+
777+
test('creates nested object when intermediate value is null', () => {
778+
const target = { nested: null };
779+
780+
deep_set(target, ['nested', 'name'], 'hello');
781+
782+
expect(target).toEqual({ nested: { name: 'hello' } });
783+
});
768784
});

0 commit comments

Comments
 (0)