diff --git a/packages/utilities/src/index.ts b/packages/utilities/src/index.ts index 8f220661..84a42514 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 00000000..01b2786c --- /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 07ad49b3..46637240 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', ' true ', 1, '1'])('Return true for %s value', (value) => { + expect(utils.parseBooleanOrNull(value)).toBe(true); + }); + + 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, 'tr ue', 'fa lse'])('Return null for %s value', (value) => { + expect(utils.parseBooleanOrNull(value)).toBe(null); + }); +});