UNPKG

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
"use strict"; 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;