From 1f6b2bbdc046fa243a8fd3c4097dc24022d44a0f Mon Sep 17 00:00:00 2001 From: lewis-wow Date: Thu, 27 Nov 2025 10:46:40 +0100 Subject: [PATCH 1/2] feat: parse boolean utility function --- packages/utilities/src/index.ts | 1 + packages/utilities/src/parse_boolean.ts | 22 ++++++++++++++++++++++ test/utilities.test.ts | 14 ++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 packages/utilities/src/parse_boolean.ts diff --git a/packages/utilities/src/index.ts b/packages/utilities/src/index.ts index 8f220661b..84a425143 100644 --- a/packages/utilities/src/index.ts +++ b/packages/utilities/src/index.ts @@ -10,3 +10,4 @@ export * from './url_params_utils'; export * from './code_hash_manager'; export * from './hmac'; export * from './storages'; +export * from './parse_boolean'; diff --git a/packages/utilities/src/parse_boolean.ts b/packages/utilities/src/parse_boolean.ts new file mode 100644 index 000000000..01b2786c2 --- /dev/null +++ b/packages/utilities/src/parse_boolean.ts @@ -0,0 +1,22 @@ +/** + * Strictly parses a value to a boolean, returning `null` if the value is invalid. + * - Returns `true` for: `true`, `1`, `'1'`, `'true'` (case-insensitive). + * - Returns `false` for: `false`, `0`, `'0'`, `'false'` (case-insensitive). + * - Returns `null` for any other value. + * + * @param value - The value to parse (unknown type). + * @returns {boolean | null} The parsed boolean or null if the input is invalid. + */ +export const parseBooleanOrNull = (value: unknown): boolean | null => { + if (value === true || value === 1) return true; + if (value === false || value === 0) return false; + + if (typeof value === 'string') { + const lowerValue = value.trim().toLowerCase(); + if (lowerValue === 'true' || lowerValue === '1') return true; + if (lowerValue === 'false' || lowerValue === '0') return false; + } + + // Return null for invalid/ambiguous input + return null; +}; diff --git a/test/utilities.test.ts b/test/utilities.test.ts index 07ad49b3b..42cb35c77 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -416,3 +416,17 @@ describe('createInjectableRegExp()', () => { expect(utils.createInjectableRegExp(/[\w._~]+/)).toStrictEqual(/[\w._~]+/); }); }); + +describe('parseBooleanOrNull', () => { + it.each([true, 'true', 'TRUE', 'TrUe', 1, '1'])('Return true for %s value', (value) => { + expect(utils.parseBooleanOrNull(value)).toBe(true); + }); + + it.each([false, 'false', 'FALSE', 'FaLsE', 0, '0'])('Return false for %s value', (value) => { + expect(utils.parseBooleanOrNull(value)).toBe(false); + }); + + it.each([undefined, null, 'null', {}, [], -1])('Return null for %s value', (value) => { + expect(utils.parseBooleanOrNull(value)).toBe(null); + }); +}); From a48825861cbc8497f865c1c630aae87121aed8bd Mon Sep 17 00:00:00 2001 From: lewis-wow Date: Thu, 27 Nov 2025 10:52:37 +0100 Subject: [PATCH 2/2] chore: add more tests --- test/utilities.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/utilities.test.ts b/test/utilities.test.ts index 42cb35c77..466372403 100644 --- a/test/utilities.test.ts +++ b/test/utilities.test.ts @@ -418,15 +418,15 @@ describe('createInjectableRegExp()', () => { }); describe('parseBooleanOrNull', () => { - it.each([true, 'true', 'TRUE', 'TrUe', 1, '1'])('Return true for %s value', (value) => { + it.each([true, 'true', 'TRUE', 'TrUe', ' true ', 1, '1'])('Return true for %s value', (value) => { expect(utils.parseBooleanOrNull(value)).toBe(true); }); - it.each([false, 'false', 'FALSE', 'FaLsE', 0, '0'])('Return false for %s value', (value) => { + it.each([false, 'false', 'FALSE', 'FaLsE', ' false ', 0, '0'])('Return false for %s value', (value) => { expect(utils.parseBooleanOrNull(value)).toBe(false); }); - it.each([undefined, null, 'null', {}, [], -1])('Return null for %s value', (value) => { + it.each([undefined, null, 'null', {}, [], -1, 'tr ue', 'fa lse'])('Return null for %s value', (value) => { expect(utils.parseBooleanOrNull(value)).toBe(null); }); });