UNPKG

@bitrix24/b24jssdk

Version:

Bitrix24 REST API JavaScript SDK

1 lines 17.6 kB
{"version":3,"file":"iban.mjs","sources":["../../../../src/tools/formatters/iban.ts"],"sourcesContent":["import { Type } from './../type'\n\nexport class IbanSpecification {\n /**\n * the code of the country\n */\n readonly countryCode: string\n\n /**\n * the length of the IBAN\n */\n readonly length: number\n\n /**\n * the structure of the underlying BBAN (for validation and formatting)\n */\n readonly structure: string\n\n /**\n * an example valid IBAN\n */\n readonly example: string\n\n private _cachedRegex: null | RegExp = null\n\n constructor(\n countryCode: string,\n length: number,\n structure: string,\n example: string\n ) {\n this.countryCode = countryCode\n this.length = length\n this.structure = structure\n this.example = example\n }\n\n /**\n * Check if the passed iban is valid, according to this specification.\n *\n * @param {string} iban the iban to validate\n * @returns {boolean} true if valid, false otherwise\n */\n isValid(iban: string): boolean {\n return (\n this.length === iban.length\n && this.countryCode === iban.slice(0, 2)\n && this._regex().test(iban.slice(4))\n && this._iso7064Mod9710(this._iso13616Prepare(iban)) == 1\n )\n }\n\n /**\n * Convert the passed IBAN to a country-specific BBAN.\n *\n * @param iban the IBAN to convert\n * @param separator the separator to use between BBAN blocks\n * @returns {string} the BBAN\n */\n toBBAN(iban: string, separator: string): string {\n return (this._regex().exec(iban.slice(4) || '') || [])\n .slice(1)\n .join(separator)\n }\n\n /**\n * Convert the passed BBAN to an IBAN for this country specification.\n * Please note that <i>\"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account\"</i>.\n * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits\n *\n * @param bban the BBAN to convert to IBAN\n * @returns {string} the IBAN\n */\n fromBBAN(bban: string): string {\n if (!this.isValidBBAN(bban)) {\n throw new Error('Invalid BBAN')\n }\n\n const remainder = this._iso7064Mod9710(\n this._iso13616Prepare(this.countryCode + '00' + bban)\n )\n\n const checkDigit = ('0' + (98 - remainder)).slice(-2)\n\n return this.countryCode + checkDigit + bban\n }\n\n /**\n * Check of the passed BBAN is valid.\n * This function only checks the format of the BBAN (length and compliance with alphanumeric specifications) but does not\n * verify the check digit.\n *\n * @param bban the BBAN to validate\n * @returns {boolean} true if the passed bban is a valid BBAN, according to this specification, false otherwise\n */\n isValidBBAN(bban: string): boolean {\n return this.length - 4 === bban.length && this._regex().test(bban)\n }\n\n /**\n * Lazy-loaded regex (parse the structure and construct the regular expression the first time we need it for validation)\n */\n private _regex(): RegExp {\n if (null === this._cachedRegex) {\n this._cachedRegex = this._parseStructure(this.structure)\n }\n\n return this._cachedRegex\n }\n\n /**\n * Parse the BBAN structure used to configure each IBAN Specification and returns a matching regular expression.\n * A structure is composed of blocks of three characters (one letter and two digits).\n * Each block represents\n * a logical group in the typical representation of the BBAN.\n * For each group, the letter indicates which characters\n * are allowed in this group, and the following 2-digits number tells the length of the group.\n *\n * @param {string} structure the structure to parse\n * @returns {RegExp}\n */\n private _parseStructure(structure: string): RegExp {\n // split in blocks of 3 chars\n const regex = (structure.match(/(.{3})/g) || []).map(\n (block: string): string => {\n // parse each structure block (1-char + 2-digits)\n let format\n const pattern = block.slice(0, 1)\n const repeats = Number.parseInt(block.slice(1), 10)\n\n switch (pattern) {\n case 'A':\n format = '0-9A-Za-z'\n break\n case 'B':\n format = '0-9A-Z'\n break\n case 'C':\n format = 'A-Za-z'\n break\n case 'F':\n format = '0-9'\n break\n case 'L':\n format = 'a-z'\n break\n case 'U':\n format = 'A-Z'\n break\n case 'W':\n format = '0-9a-z'\n break\n }\n\n return '([' + format + ']{' + repeats + '})'\n }\n )\n\n return new RegExp('^' + regex.join('') + '$')\n }\n\n /**\n * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to\n * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.\n *\n * @param {string} iban the IBAN\n * @returns {string} the prepared IBAN\n */\n private _iso13616Prepare(iban: string): string {\n const A = 'A'.charCodeAt(0)\n\n const Z = 'Z'.charCodeAt(0)\n\n iban = iban.toUpperCase()\n\n iban = iban.substring(4) + iban.substring(0, 4)\n return (\n iban\n .split('')\n .map((n: string): string => {\n const code = n.charCodeAt(0)\n if (code >= A && code <= Z) {\n // A = 10, B = 11, ... Z = 35\n return (code - A + 10).toString()\n } else {\n return n\n }\n })\n .join('')\n )\n }\n\n /**\n * Calculates MOD 97 10 of the passed IBAN as specified in ISO7064.\n *\n * @param iban\n * @returns {number} MOD\n */\n private _iso7064Mod9710(iban: string): number {\n let remainder = iban\n let block\n\n while (remainder.length > 2) {\n block = remainder.slice(0, 9)\n remainder\n = (Number.parseInt(block, 10) % 97) + remainder.slice(block.length)\n }\n\n return Number.parseInt(remainder, 10) % 97\n }\n}\n\nexport class FormatterIban {\n private static isInternalConstructing: boolean = false\n private static instance: FormatterIban | null = null\n\n private _countries: Map<string, IbanSpecification>\n\n // region Init ////\n private constructor() {\n if (!FormatterIban.isInternalConstructing) {\n throw new TypeError('FormatterIban is not constructable')\n }\n FormatterIban.isInternalConstructing = false\n\n this._countries = new Map()\n }\n\n /**\n * @return FormatterIban\n */\n static getInstance(): FormatterIban {\n if (!FormatterIban.instance) {\n FormatterIban.isInternalConstructing = true\n FormatterIban.instance = new FormatterIban()\n }\n\n return FormatterIban.instance\n }\n\n addSpecification(IBAN: IbanSpecification): void {\n this._countries.set(IBAN.countryCode, IBAN)\n }\n\n // endregion ////\n\n // region IBAN ////\n /**\n * Check if an IBAN is valid.\n *\n * @param {string} iban the IBAN to validate.\n * @returns {boolean} true if the passed IBAN is valid, false otherwise\n */\n isValid(iban: string): boolean {\n if (!Type.isString(iban)) {\n return false\n }\n\n iban = this.electronicFormat(iban)\n const countryCode = iban.slice(0, 2)\n\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n return !!countryStructure && countryStructure.isValid(iban)\n }\n\n printFormat(iban: string, separator?: string): string {\n if (typeof separator == 'undefined') {\n separator = ' '\n }\n\n const EVERY_FOUR_CHARS = /(.{4})(?!$)/g\n\n return this.electronicFormat(iban).replace(\n EVERY_FOUR_CHARS,\n '$1' + separator\n )\n }\n\n electronicFormat(iban: string): string {\n const NON_ALPHANUM = /[^a-z0-9]/gi\n\n return iban.replace(NON_ALPHANUM, '').toUpperCase()\n }\n\n // endregion ////\n\n // region BBAN ////\n /**\n * Convert an IBAN to a BBAN.\n *\n * @param iban\n * @param {string} [separator] the separator to use between the blocks of the BBAN, defaults to ' '\n * @returns {string|*} Convert an IBAN to a BBAN.\n */\n toBBAN(iban: string, separator?: string): string {\n if (typeof separator == 'undefined') {\n separator = ' '\n }\n\n iban = this.electronicFormat(iban)\n\n const countryCode = iban.slice(0, 2)\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n if (!countryStructure) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n return countryStructure.toBBAN(iban, separator)\n }\n\n /**\n * Convert the passed BBAN to an IBAN for this country specification.\n * Please note that <i>\"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account\"</i>.\n * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits\n *\n * @param countryCode the country of the BBAN\n * @param bban the BBAN to convert to IBAN\n * @returns {string} the IBAN\n */\n fromBBAN(countryCode: string, bban: string): string {\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n if (!countryStructure) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n return countryStructure.fromBBAN(this.electronicFormat(bban))\n }\n\n /**\n * Check the validity of the passed BBAN.\n *\n * @param countryCode the country of the BBAN\n * @param bban the BBAN to check the validity of\n */\n isValidBBAN(countryCode: string, bban: string): boolean {\n if (!Type.isString(bban)) {\n return false\n }\n\n if (!this._countries.has(countryCode)) {\n throw new Error(`No country with code ${countryCode}`)\n }\n\n const countryStructure = this._countries.get(countryCode)\n\n return (\n !!countryStructure\n && countryStructure.isValidBBAN(this.electronicFormat(bban))\n )\n }\n\n // endregion ////\n}\n"],"names":[],"mappings":"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"}