diff --git a/packages/easy/src/utils/Traverse.ts b/packages/easy/src/utils/Traverse.ts index 19536651..87243364 100644 --- a/packages/easy/src/utils/Traverse.ts +++ b/packages/easy/src/utils/Traverse.ts @@ -1,6 +1,7 @@ import { AnyKey } from '../types/AnyKey'; -export const traverse = (subject: unknown = {}, property = ''): unknown => { +export const traverse = (subject: unknown, property = ''): unknown => { + subject ??= {}; const props = property.split('.'); const p = props.shift() as string; return props.length === 0 ? (subject as any)[p] : traverse((subject as any)[p], props.join('.')); diff --git a/packages/easy/test/utils/Traverse.test.ts b/packages/easy/test/utils/Traverse.test.ts index d74dae14..f581bcb9 100644 --- a/packages/easy/test/utils/Traverse.test.ts +++ b/packages/easy/test/utils/Traverse.test.ts @@ -7,6 +7,22 @@ describe('traverse', () => { expect(traverse(undefined, '')).toBeUndefined(); }); + test('traverse with null subject', () => { + expect(traverse(null, '')).toBeUndefined(); + }); + + test('traverse with false subject', () => { + expect(traverse(false, '')).toBeUndefined(); + }); + + test('traverse with null subject nested', () => { + expect(traverse({ group: null }, 'group.name')).toBeUndefined(); + }); + + test('traverse with undefined subject nested', () => { + expect(traverse({ group: undefined }, 'group.name')).toBeUndefined(); + }); + test('traverse with undefined property', () => { expect(traverse(Dev.Jeroen, undefined as unknown as string)).toBeUndefined(); }); @@ -35,6 +51,10 @@ describe('traverse', () => { test('traverse with existing double-nested property', () => { expect(traverse(Dev.Jeroen, 'created.by.id')).toBe(0); }); + + test('traverse with existing triple-nested property', () => { + expect(traverse({}, 'created.by.id')).toBeUndefined(); + }); }); describe('traverseSet', () => {