From d677d0a8bf338ecdbb496175765334a822450adf Mon Sep 17 00:00:00 2001 From: Kyle Zengo Date: Sat, 27 Jun 2026 01:13:52 +0000 Subject: [PATCH] fix: guard validateTwilioCredentials against null/non-object input Calling validateTwilioCredentials(null) previously threw a TypeError because the function attempted to read properties before checking the input type. Added an early return for null/non-object inputs. Adds test cases for null, undefined, and string inputs. Fixes #107 --- src/lib/utils/twilio-validator.js | 4 ++++ tests/twilio-validator.test.js | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/lib/utils/twilio-validator.js b/src/lib/utils/twilio-validator.js index 429f04f..306fd2d 100644 --- a/src/lib/utils/twilio-validator.js +++ b/src/lib/utils/twilio-validator.js @@ -12,6 +12,10 @@ * @returns {{valid: boolean, errors: string[]}} */ export function validateTwilioCredentials(credentials) { + if (!credentials || typeof credentials !== 'object') { + return { valid: false, errors: ['Credentials must be a non-null object'] }; + } + const errors = []; // Validate Account SID diff --git a/tests/twilio-validator.test.js b/tests/twilio-validator.test.js index 27dbf92..d6c6af1 100644 --- a/tests/twilio-validator.test.js +++ b/tests/twilio-validator.test.js @@ -67,6 +67,24 @@ describe('Twilio Validator', () => { assert.strictEqual(result.valid, true); assert.strictEqual(result.errors.length, 0); }); + + it('should return validation failure for null input', () => { + const result = validateTwilioCredentials(null); + assert.strictEqual(result.valid, false); + assert.ok(result.errors.length > 0); + }); + + it('should return validation failure for undefined input', () => { + const result = validateTwilioCredentials(undefined); + assert.strictEqual(result.valid, false); + assert.ok(result.errors.length > 0); + }); + + it('should return validation failure for non-object input', () => { + const result = validateTwilioCredentials('not-an-object'); + assert.strictEqual(result.valid, false); + assert.ok(result.errors.length > 0); + }); }); describe('parseTwilioError', () => {