From 13fb1477b52329c322dd93ea7f40030ef3be1eaa Mon Sep 17 00:00:00 2001 From: Slava Rudkovskiy Date: Thu, 9 Apr 2026 17:09:04 +0300 Subject: [PATCH] fix: preserve null values in cast --- src/utils/cast.ts | 16 ++++++++++------ test/specs/utils/cast.spec.ts | 12 ++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/utils/cast.ts b/src/utils/cast.ts index cc9da0c..88d4e76 100644 --- a/src/utils/cast.ts +++ b/src/utils/cast.ts @@ -2,8 +2,8 @@ const isBooleanString = (value: string): value is 'true' | 'false' => { return value === 'true' || value === 'false'; }; -const isNullString = (value: string): value is 'null' => { - return value === 'null'; +const isNull = (value: string | null): value is 'null' | null => { + return value === 'null' || value === null; }; const isJsonStructure = (value: string): boolean => { @@ -43,8 +43,8 @@ const parseBoolean = (value: string): boolean | string => { return value; }; -const parseNull = (value: string): null | string => { - return value === 'null' ? null : value; +const parseNull = (value: string | null): null | string => { + return isNull(value) ? null : value; }; const parseJson = (value: string): unknown => { @@ -66,7 +66,7 @@ const parseAuto = (value: string): unknown => { return value === 'true'; } - if (isNullString(value)) { + if (isNull(value)) { return null; } @@ -85,7 +85,11 @@ const parseAuto = (value: string): unknown => { return value; }; -export const cast = (value: string, type: CastType = 'auto'): unknown => { +export const cast = (value: string | null, type: CastType = 'auto'): unknown => { + if (value === null) { + return null; + } + switch (type) { case 'string': return value; diff --git a/test/specs/utils/cast.spec.ts b/test/specs/utils/cast.spec.ts index 4938e32..148fccc 100644 --- a/test/specs/utils/cast.spec.ts +++ b/test/specs/utils/cast.spec.ts @@ -12,6 +12,10 @@ describe('cast', () => { expect(cast('null')).toBeNull(); }); + it('casts null value', () => { + expect(cast(null as unknown as string)).toBeNull(); + }); + it('casts integer strings', () => { expect(cast('0')).toBe(0); expect(cast('1')).toBe(1); @@ -62,6 +66,14 @@ describe('cast', () => { expect(cast('01', 'string')).toBe('01'); }); + it('keeps null value as null for any rule', () => { + expect(cast(null, 'string')).toBeNull(); + expect(cast(null, 'number')).toBeNull(); + expect(cast(null, 'boolean')).toBeNull(); + expect(cast(null, 'null')).toBeNull(); + expect(cast(null, 'json')).toBeNull(); + }); + it('casts value to number for number rule when possible', () => { expect(cast('11', 'number')).toBe(11); expect(cast('1.5', 'number')).toBe(1.5);