fix(forms): handle nullable fields in deepMergeWithDefaults
When default value is null but source has a value (e.g., description field), the merge was discarding the source value because typeof null !== typeof string. Now properly accepts source values for nullable fields. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -111,6 +111,10 @@ export function deepMergeWithDefaults<T extends Record<string, unknown>>(
|
|||||||
if (typeof sourceValue === typeof defaultValue) {
|
if (typeof sourceValue === typeof defaultValue) {
|
||||||
result[key] = sourceValue as T[keyof T];
|
result[key] = sourceValue as T[keyof T];
|
||||||
}
|
}
|
||||||
|
// Special case: default is null but source has a value (nullable fields)
|
||||||
|
else if (defaultValue === null && sourceValue !== null) {
|
||||||
|
result[key] = sourceValue as T[keyof T];
|
||||||
|
}
|
||||||
// Special case: allow null for nullable fields
|
// Special case: allow null for nullable fields
|
||||||
else if (sourceValue === null && defaultValue === null) {
|
else if (sourceValue === null && defaultValue === null) {
|
||||||
result[key] = null as T[keyof T];
|
result[key] = null as T[keyof T];
|
||||||
|
|||||||
@@ -190,6 +190,15 @@ describe('deepMergeWithDefaults', () => {
|
|||||||
const source = { value: null };
|
const source = { value: null };
|
||||||
expect(deepMergeWithDefaults(defaults, source)).toEqual({ value: null });
|
expect(deepMergeWithDefaults(defaults, source)).toEqual({ value: null });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('uses source value when default is null but source has value', () => {
|
||||||
|
const defaults = { description: null as string | null, name: '' };
|
||||||
|
const source = { description: 'A real description', name: 'Test' };
|
||||||
|
expect(deepMergeWithDefaults(defaults, source)).toEqual({
|
||||||
|
description: 'A real description',
|
||||||
|
name: 'Test',
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('createFormInitializer', () => {
|
describe('createFormInitializer', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user