ibankit
Version:
Validation, field extraction and creation of IBAN, BBAN, BIC numbers
88 lines • 7.74 kB
JavaScript
import { UnsupportedCountryException, FormatException, FormatViolation } from "./exceptions";
import { countryByCode } from "./country";
const BIC8_LENGTH = 8;
const BIC11_LENGTH = 11;
const BANK_CODE_INDEX = 0;
const BANK_CODE_LENGTH = 4;
const COUNTRY_CODE_INDEX = BANK_CODE_INDEX + BANK_CODE_LENGTH;
const COUNTRY_CODE_LENGTH = 2;
const LOCATION_CODE_INDEX = COUNTRY_CODE_INDEX + COUNTRY_CODE_LENGTH;
const LOCATION_CODE_LENGTH = 2;
const BRANCH_CODE_INDEX = LOCATION_CODE_INDEX + LOCATION_CODE_LENGTH;
const BRANCH_CODE_LENGTH = 3;
const ucRegex = /^[A-Z]+$/;
const ucnumRegex = /^[A-Z0-9]+$/;
export function getBankCode(bic) {
return bic.substring(BANK_CODE_INDEX, BANK_CODE_INDEX + BANK_CODE_LENGTH);
}
export function getCountryCode(bic) {
return bic.substring(COUNTRY_CODE_INDEX, COUNTRY_CODE_INDEX + COUNTRY_CODE_LENGTH);
}
export function getLocationCode(bic) {
return bic.substring(LOCATION_CODE_INDEX, LOCATION_CODE_INDEX + LOCATION_CODE_LENGTH);
}
export function getBranchCode(bic) {
return bic.substring(BRANCH_CODE_INDEX, BRANCH_CODE_INDEX + BRANCH_CODE_LENGTH);
}
export function hasBranchCode(bic) {
return bic.length === BIC11_LENGTH;
}
function validateEmpty(bic) {
if (bic == null) {
throw new FormatException(FormatViolation.NOT_NULL, "Null can't be a valid Bic.");
}
if (bic.length === 0) {
throw new FormatException(FormatViolation.NOT_EMPTY, "Empty string can't be a valid Bic.");
}
}
function validateLength(bic) {
if (bic.length !== BIC8_LENGTH && bic.length !== BIC11_LENGTH) {
throw new FormatException(FormatViolation.BIC_LENGTH_8_OR_11, `Bic length must be ${BIC8_LENGTH} or ${BIC11_LENGTH}`);
}
}
function validateCase(bic) {
if (bic !== bic.toUpperCase()) {
throw new FormatException(FormatViolation.BIC_ONLY_UPPER_CASE_LETTERS, "Bic must contain only upper case letters.");
}
}
function validateBankCode(bic) {
const bankCode = getBankCode(bic);
if (!ucnumRegex.test(bankCode)) {
throw new FormatException(FormatViolation.BANK_CODE_ONLY_LETTERS, "Bank code must contain only letters or digits.", bankCode);
}
}
function validateCountryCode(bic) {
const countryCode = getCountryCode(bic).trim();
if (countryCode.length < COUNTRY_CODE_LENGTH ||
countryCode !== countryCode.toUpperCase() ||
!ucRegex.test(countryCode)) {
throw new FormatException(FormatViolation.COUNTRY_CODE_ONLY_UPPER_CASE_LETTERS, "Bic country code must contain upper case letters", countryCode);
}
if (countryByCode(countryCode) == null) {
throw new UnsupportedCountryException("Country code is not supported.", countryCode);
}
}
function validateLocationCode(bic) {
const locationCode = getLocationCode(bic);
if (!ucnumRegex.test(locationCode)) {
throw new FormatException(FormatViolation.LOCATION_CODE_ONLY_LETTERS_OR_DIGITS, "Location code must contain only letters or digits.", locationCode);
}
}
function validateBranchCode(bic) {
const branchCode = getBranchCode(bic);
if (!ucnumRegex.test(branchCode)) {
throw new FormatException(FormatViolation.BRANCH_CODE_ONLY_LETTERS_OR_DIGITS, "Branch code must contain only letters or digits.", branchCode);
}
}
export function validate(bic) {
validateEmpty(bic);
validateLength(bic);
validateCase(bic);
validateBankCode(bic);
validateCountryCode(bic);
validateLocationCode(bic);
if (hasBranchCode(bic)) {
validateBranchCode(bic);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmljVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaWNVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDMUIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDOUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUNyRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDO0FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBRTdCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQztBQUMzQixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUM7QUFFakMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUFXO0lBQ3JDLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBVztJQUN4QyxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFXO0lBQ3pDLE9BQU8s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