zedai-voice
Version:
Siri-like voice banking SDK for React Native - Complete voice-powered fintech solution with wake word detection and beautiful UI
325 lines (315 loc) • 10.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _Constants = require("./Constants");
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // src/utils/Validators.js
var Validators = /*#__PURE__*/function () {
function Validators() {
_classCallCheck(this, Validators);
}
return _createClass(Validators, null, [{
key: "validateAccountNumber",
value: function validateAccountNumber(accountNumber) {
if (!accountNumber || typeof accountNumber !== 'string') {
return {
isValid: false,
error: 'Account number is required and must be a string'
};
}
var cleaned = accountNumber.replace(/\s+/g, '');
if (cleaned.length < _Constants.VALIDATION_RULES.ACCOUNT_NUMBER.MIN_LENGTH) {
return {
isValid: false,
error: "Account number must be at least ".concat(_Constants.VALIDATION_RULES.ACCOUNT_NUMBER.MIN_LENGTH, " digits")
};
}
if (cleaned.length > _Constants.VALIDATION_RULES.ACCOUNT_NUMBER.MAX_LENGTH) {
return {
isValid: false,
error: "Account number must be no more than ".concat(_Constants.VALIDATION_RULES.ACCOUNT_NUMBER.MAX_LENGTH, " digits")
};
}
if (!_Constants.VALIDATION_RULES.ACCOUNT_NUMBER.PATTERN.test(cleaned)) {
return {
isValid: false,
error: 'Account number must contain only digits'
};
}
return {
isValid: true,
value: cleaned
};
}
}, {
key: "validateAmount",
value: function validateAmount(amount) {
if (!amount) {
return {
isValid: false,
error: 'Amount is required'
};
}
// Convert to string if it's a number
var amountStr = typeof amount === 'number' ? amount.toString() : amount;
if (typeof amountStr !== 'string') {
return {
isValid: false,
error: 'Amount must be a number or string'
};
}
// Remove commas and spaces
var cleaned = amountStr.replace(/[,\s]/g, '');
if (!_Constants.VALIDATION_RULES.AMOUNT.PATTERN.test(cleaned)) {
return {
isValid: false,
error: 'Amount must be a valid number'
};
}
var numericAmount = parseFloat(cleaned);
if (numericAmount < _Constants.VALIDATION_RULES.AMOUNT.MIN_VALUE) {
return {
isValid: false,
error: "Amount must be at least ".concat(_Constants.VALIDATION_RULES.AMOUNT.MIN_VALUE)
};
}
if (numericAmount > _Constants.VALIDATION_RULES.AMOUNT.MAX_VALUE) {
return {
isValid: false,
error: "Amount must be no more than ".concat(_Constants.VALIDATION_RULES.AMOUNT.MAX_VALUE)
};
}
return {
isValid: true,
value: numericAmount
};
}
}, {
key: "validateBankName",
value: function validateBankName(bankName) {
if (!bankName || typeof bankName !== 'string') {
return {
isValid: false,
error: 'Bank name is required and must be a string'
};
}
var cleaned = bankName.trim();
if (cleaned.length < _Constants.VALIDATION_RULES.BANK_NAME.MIN_LENGTH) {
return {
isValid: false,
error: "Bank name must be at least ".concat(_Constants.VALIDATION_RULES.BANK_NAME.MIN_LENGTH, " characters")
};
}
if (cleaned.length > _Constants.VALIDATION_RULES.BANK_NAME.MAX_LENGTH) {
return {
isValid: false,
error: "Bank name must be no more than ".concat(_Constants.VALIDATION_RULES.BANK_NAME.MAX_LENGTH, " characters")
};
}
if (!_Constants.VALIDATION_RULES.BANK_NAME.PATTERN.test(cleaned)) {
return {
isValid: false,
error: 'Bank name must contain only letters, numbers, and spaces'
};
}
return {
isValid: true,
value: cleaned
};
}
}, {
key: "validatePIN",
value: function validatePIN(pin) {
if (!pin) {
return {
isValid: false,
error: 'PIN is required'
};
}
var pinStr = typeof pin === 'number' ? pin.toString() : pin;
if (typeof pinStr !== 'string') {
return {
isValid: false,
error: 'PIN must be a number or string'
};
}
if (pinStr.length !== _Constants.VALIDATION_RULES.PIN.LENGTH) {
return {
isValid: false,
error: "PIN must be exactly ".concat(_Constants.VALIDATION_RULES.PIN.LENGTH, " digits")
};
}
if (!_Constants.VALIDATION_RULES.PIN.PATTERN.test(pinStr)) {
return {
isValid: false,
error: 'PIN must contain only digits'
};
}
return {
isValid: true,
value: pinStr
};
}
}, {
key: "validateTransferData",
value: function validateTransferData(data) {
var errors = [];
var validatedData = {};
// Validate account number
var accountValidation = this.validateAccountNumber(data.accountNumber);
if (!accountValidation.isValid) {
errors.push(accountValidation.error);
} else {
validatedData.accountNumber = accountValidation.value;
}
// Validate amount
var amountValidation = this.validateAmount(data.amount);
if (!amountValidation.isValid) {
errors.push(amountValidation.error);
} else {
validatedData.amount = amountValidation.value;
}
// Validate bank name
var bankValidation = this.validateBankName(data.bankName);
if (!bankValidation.isValid) {
errors.push(bankValidation.error);
} else {
validatedData.bankName = bankValidation.value;
}
return {
isValid: errors.length === 0,
errors: errors,
data: validatedData
};
}
}, {
key: "sanitizeInput",
value: function sanitizeInput(input) {
if (typeof input !== 'string') {
return input;
}
return input.trim().replace(/[<>]/g, '') // Remove potential HTML tags
.replace(/['"]/g, '') // Remove quotes
.substring(0, 1000); // Limit length
}
}, {
key: "isValidEmail",
value: function isValidEmail(email) {
var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
}, {
key: "isValidPhoneNumber",
value: function isValidPhoneNumber(phoneNumber) {
var phoneRegex = /^[\+]?[1-9][\d]{0,15}$/;
return phoneRegex.test(phoneNumber.replace(/[\s\-\(\)]/g, ''));
}
}, {
key: "formatAmount",
value: function formatAmount(amount) {
if (typeof amount !== 'number') {
return amount;
}
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'NGN',
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(amount);
}
}, {
key: "formatAccountNumber",
value: function formatAccountNumber(accountNumber) {
if (typeof accountNumber !== 'string') {
return accountNumber;
}
// Format as groups of 4 digits
return accountNumber.replace(/(.{4})/g, '$1 ').trim();
}
}, {
key: "normalizeSpokenNumber",
value: function normalizeSpokenNumber(spokenNumber) {
if (typeof spokenNumber !== 'string') {
return spokenNumber;
}
var numberMap = {
'zero': '0',
'one': '1',
'two': '2',
'three': '3',
'four': '4',
'five': '5',
'six': '6',
'seven': '7',
'eight': '8',
'nine': '9',
'ten': '10',
'eleven': '11',
'twelve': '12',
'thirteen': '13',
'fourteen': '14',
'fifteen': '15',
'sixteen': '16',
'seventeen': '17',
'eighteen': '18',
'nineteen': '19',
'twenty': '20',
'thirty': '30',
'forty': '40',
'fifty': '50',
'sixty': '60',
'seventy': '70',
'eighty': '80',
'ninety': '90',
'hundred': '100',
'thousand': '1000',
'million': '1000000'
};
var normalized = spokenNumber.toLowerCase();
// Replace spoken numbers with digits
Object.keys(numberMap).forEach(function (word) {
var regex = new RegExp("\\b".concat(word, "\\b"), 'gi');
normalized = normalized.replace(regex, numberMap[word]);
});
return normalized;
}
}, {
key: "extractNumbers",
value: function extractNumbers(text) {
if (typeof text !== 'string') {
return [];
}
var numbers = text.match(/\d+/g);
return numbers ? numbers.map(function (num) {
return parseInt(num, 10);
}) : [];
}
}, {
key: "extractAmount",
value: function extractAmount(text) {
if (typeof text !== 'string') {
return null;
}
// Look for currency patterns
var currencyPattern = /(?:₦|naira|NGN|N)?\s*(\d+(?:,\d{3})*(?:\.\d{2})?)/i;
var match = text.match(currencyPattern);
if (match) {
return parseFloat(match[1].replace(/,/g, ''));
}
// Look for standalone numbers
var numberPattern = /\b(\d+(?:,\d{3})*(?:\.\d{2})?)\b/;
var numberMatch = text.match(numberPattern);
if (numberMatch) {
return parseFloat(numberMatch[1].replace(/,/g, ''));
}
return null;
}
}]);
}();
var _default = exports["default"] = Validators;