UNPKG

@taiga-ui/addon-commerce

Version:

Extension package for Taiga UI related to commerce, payment systems, currencies etc.

405 lines (394 loc) 15.4 kB
import { tuiIsString } from '@taiga-ui/cdk/utils/miscellaneous'; import { TuiCurrencyCode, TuiCurrency } from '@taiga-ui/addon-commerce/types'; import { TUI_NON_DIGITS_REGEXP } from '@taiga-ui/cdk/constants'; import { tuiClamp } from '@taiga-ui/cdk/utils/math'; function tuiGetCurrencySymbol(currency) { switch (currency) { case TuiCurrency.ArmenianDram: case TuiCurrencyCode.ArmenianDram: return '֏'; case TuiCurrency.AustralianDollar: case TuiCurrencyCode.AustralianDollar: return 'A$'; case TuiCurrency.AzerbaijaniManat: case TuiCurrencyCode.AzerbaijaniManat: return '₼'; case TuiCurrency.BahrainiDinar: case TuiCurrencyCode.BahrainiDinar: return 'BD'; case TuiCurrency.Baht: case TuiCurrencyCode.Baht: return '฿'; case TuiCurrency.BelarusianRuble: case TuiCurrencyCode.BelarusianRuble: return 'Br'; case TuiCurrency.BrazilianReal: case TuiCurrencyCode.BrazilianReal: return 'R$'; case TuiCurrency.CanadianDollar: case TuiCurrencyCode.CanadianDollar: return 'C$'; case TuiCurrency.CzechKoruna: case TuiCurrencyCode.CzechKoruna: return 'Kč'; case TuiCurrency.Dirham: case TuiCurrencyCode.Dirham: return 'Dh'; case TuiCurrency.Dollar: case TuiCurrency.MexicanPeso: case TuiCurrencyCode.Dollar: case TuiCurrencyCode.MexicanPeso: return '$'; case TuiCurrency.EastCaribbeanDollar: case TuiCurrencyCode.EastCaribbeanDollar: return 'EC$'; case TuiCurrency.Euro: case TuiCurrencyCode.Euro: return '€'; case TuiCurrency.Forint: case TuiCurrencyCode.Forint: return 'Ft'; case TuiCurrency.GeorgianLari: case TuiCurrencyCode.GeorgianLari: return '₾'; case TuiCurrency.HongKongDollar: case TuiCurrencyCode.HongKongDollar: return 'HK$'; case TuiCurrency.Hryvnia: case TuiCurrencyCode.Hryvnia: return '₴'; case TuiCurrency.IndianRupee: case TuiCurrencyCode.IndianRupee: return '₹'; case TuiCurrency.IndonesianRupiah: case TuiCurrencyCode.IndonesianRupiah: return 'Rp'; case TuiCurrency.IranianRial: case TuiCurrencyCode.IranianRial: return 'IR'; case TuiCurrency.IsraeliShekel: case TuiCurrencyCode.IsraeliShekel: return '₪'; case TuiCurrency.KyrgyzstanSom: case TuiCurrencyCode.KyrgyzstanSom: return 'c'; case TuiCurrency.MalaysianRinggit: case TuiCurrencyCode.MalaysianRinggit: return 'RM'; case TuiCurrency.MoldovanLeu: case TuiCurrencyCode.MoldovanLeu: return 'L'; case TuiCurrency.MongolianTugrik: case TuiCurrencyCode.MongolianTugrik: return '₮'; case TuiCurrency.NewTurkmenManat: case TuiCurrencyCode.NewTurkmenManat: return 'TMT'; case TuiCurrency.PolandZloty: case TuiCurrencyCode.PolandZloty: return 'zł'; case TuiCurrency.Pound: case TuiCurrencyCode.Pound: return '£'; case TuiCurrency.Ruble: case TuiCurrencyCode.Ruble: return '₽'; case TuiCurrency.SaudiRiyal: case TuiCurrencyCode.SaudiRiyal: return 'SR'; case TuiCurrency.SerbianDinar: case TuiCurrencyCode.SerbianDinar: return 'DIN'; case TuiCurrency.SingaporeDollar: case TuiCurrencyCode.SingaporeDollar: return 'S$'; case TuiCurrency.SouthAfricanRand: case TuiCurrencyCode.SouthAfricanRand: return 'R'; case TuiCurrency.SriLankanRupee: case TuiCurrencyCode.SriLankanRupee: return 'Rs.'; case TuiCurrency.SwissFranc: case TuiCurrencyCode.SwissFranc: return '₣'; case TuiCurrency.TajikistaniSomoni: case TuiCurrencyCode.TajikistaniSomoni: return 'SM'; case TuiCurrency.Tenge: case TuiCurrencyCode.Tenge: return '₸'; case TuiCurrency.TurkishLira: case TuiCurrencyCode.TurkishLira: return '₺'; case TuiCurrency.UzbekSum: case TuiCurrencyCode.UzbekSum: return "So'm"; case TuiCurrency.VietnameseDong: case TuiCurrencyCode.VietnameseDong: return 'đ'; case TuiCurrency.Won: case TuiCurrencyCode.Won: return '₩'; case TuiCurrency.Yen: case TuiCurrencyCode.Yen: return '¥'; case TuiCurrency.YuanRenminbi: case TuiCurrencyCode.YuanRenminbi: return 'CN¥'; default: return null; } } function stringifyCurrency(currency) { return currency === null || tuiIsString(currency) ? currency || '' : String(currency).padStart(3, '0'); } function tuiFormatCurrency(currency) { const stringifiedCurrency = stringifyCurrency(currency); return tuiGetCurrencySymbol(stringifiedCurrency) || stringifiedCurrency; } // cspell:disable const TUI_CODE_DICTIONARY = { [TuiCurrency.Ruble]: TuiCurrencyCode.Ruble, [TuiCurrency.Dollar]: TuiCurrencyCode.Dollar, [TuiCurrency.MexicanPeso]: TuiCurrencyCode.MexicanPeso, [TuiCurrency.MoldovanLeu]: TuiCurrencyCode.MoldovanLeu, [TuiCurrency.PolandZloty]: TuiCurrencyCode.PolandZloty, [TuiCurrency.SingaporeDollar]: TuiCurrencyCode.SingaporeDollar, [TuiCurrency.AustralianDollar]: TuiCurrencyCode.AustralianDollar, [TuiCurrency.HongKongDollar]: TuiCurrencyCode.HongKongDollar, [TuiCurrency.CanadianDollar]: TuiCurrencyCode.CanadianDollar, [TuiCurrency.CzechKoruna]: TuiCurrencyCode.CzechKoruna, [TuiCurrency.EastCaribbeanDollar]: TuiCurrencyCode.EastCaribbeanDollar, [TuiCurrency.Euro]: TuiCurrencyCode.Euro, [TuiCurrency.Forint]: TuiCurrencyCode.Forint, [TuiCurrency.Pound]: TuiCurrencyCode.Pound, [TuiCurrency.Baht]: TuiCurrencyCode.Baht, [TuiCurrency.BahrainiDinar]: TuiCurrencyCode.BahrainiDinar, [TuiCurrency.TurkishLira]: TuiCurrencyCode.TurkishLira, [TuiCurrency.YuanRenminbi]: TuiCurrencyCode.YuanRenminbi, [TuiCurrency.Yen]: TuiCurrencyCode.Yen, [TuiCurrency.IsraeliShekel]: TuiCurrencyCode.IsraeliShekel, [TuiCurrency.IndianRupee]: TuiCurrencyCode.IndianRupee, [TuiCurrency.SwissFranc]: TuiCurrencyCode.SwissFranc, [TuiCurrency.ArmenianDram]: TuiCurrencyCode.ArmenianDram, [TuiCurrency.Won]: TuiCurrencyCode.Won, [TuiCurrency.Tenge]: TuiCurrencyCode.Tenge, [TuiCurrency.Hryvnia]: TuiCurrencyCode.Hryvnia, [TuiCurrency.UzbekSum]: TuiCurrencyCode.UzbekSum, [TuiCurrency.KyrgyzstanSom]: TuiCurrencyCode.KyrgyzstanSom, [TuiCurrency.Dirham]: TuiCurrencyCode.Dirham, [TuiCurrency.TajikistaniSomoni]: TuiCurrencyCode.TajikistaniSomoni, [TuiCurrency.MalaysianRinggit]: TuiCurrencyCode.MalaysianRinggit, [TuiCurrency.BelarusianRuble]: TuiCurrencyCode.BelarusianRuble, [TuiCurrency.GeorgianLari]: TuiCurrencyCode.GeorgianLari, [TuiCurrency.AzerbaijaniManat]: TuiCurrencyCode.AzerbaijaniManat, [TuiCurrency.SriLankanRupee]: TuiCurrencyCode.SriLankanRupee, [TuiCurrency.SerbianDinar]: TuiCurrencyCode.SerbianDinar, [TuiCurrency.SaudiRiyal]: TuiCurrencyCode.SaudiRiyal, [TuiCurrency.MongolianTugrik]: TuiCurrencyCode.MongolianTugrik, [TuiCurrency.SouthAfricanRand]: TuiCurrencyCode.SouthAfricanRand, [TuiCurrency.IranianRial]: TuiCurrencyCode.IranianRial, [TuiCurrency.IndonesianRupiah]: TuiCurrencyCode.IndonesianRupiah, [TuiCurrency.VietnameseDong]: TuiCurrencyCode.VietnameseDong, [TuiCurrency.NewTurkmenManat]: TuiCurrencyCode.NewTurkmenManat, [TuiCurrency.BrazilianReal]: TuiCurrencyCode.BrazilianReal, }; function tuiGetCodeByCurrency(code) { return TUI_CODE_DICTIONARY[code] ?? null; } // cspell:disable const TUI_CURRENCY_DICTIONARY = { [TuiCurrencyCode.Ruble]: TuiCurrency.Ruble, [TuiCurrencyCode.Dollar]: TuiCurrency.Dollar, [TuiCurrencyCode.MexicanPeso]: TuiCurrency.MexicanPeso, [TuiCurrencyCode.MoldovanLeu]: TuiCurrency.MoldovanLeu, [TuiCurrencyCode.PolandZloty]: TuiCurrency.PolandZloty, [TuiCurrencyCode.SingaporeDollar]: TuiCurrency.SingaporeDollar, [TuiCurrencyCode.AustralianDollar]: TuiCurrency.AustralianDollar, [TuiCurrencyCode.HongKongDollar]: TuiCurrency.HongKongDollar, [TuiCurrencyCode.CanadianDollar]: TuiCurrency.CanadianDollar, [TuiCurrencyCode.CzechKoruna]: TuiCurrency.CzechKoruna, [TuiCurrencyCode.EastCaribbeanDollar]: TuiCurrency.EastCaribbeanDollar, [TuiCurrencyCode.Euro]: TuiCurrency.Euro, [TuiCurrencyCode.Forint]: TuiCurrency.Forint, [TuiCurrencyCode.Pound]: TuiCurrency.Pound, [TuiCurrencyCode.Baht]: TuiCurrency.Baht, [TuiCurrencyCode.BahrainiDinar]: TuiCurrency.BahrainiDinar, [TuiCurrencyCode.TurkishLira]: TuiCurrency.TurkishLira, [TuiCurrencyCode.YuanRenminbi]: TuiCurrency.YuanRenminbi, [TuiCurrencyCode.Yen]: TuiCurrency.Yen, [TuiCurrencyCode.IsraeliShekel]: TuiCurrency.IsraeliShekel, [TuiCurrencyCode.IndianRupee]: TuiCurrency.IndianRupee, [TuiCurrencyCode.SwissFranc]: TuiCurrency.SwissFranc, [TuiCurrencyCode.ArmenianDram]: TuiCurrency.ArmenianDram, [TuiCurrencyCode.Won]: TuiCurrency.Won, [TuiCurrencyCode.Tenge]: TuiCurrency.Tenge, [TuiCurrencyCode.Hryvnia]: TuiCurrency.Hryvnia, [TuiCurrencyCode.UzbekSum]: TuiCurrency.UzbekSum, [TuiCurrencyCode.KyrgyzstanSom]: TuiCurrency.KyrgyzstanSom, [TuiCurrencyCode.Dirham]: TuiCurrency.Dirham, [TuiCurrencyCode.TajikistaniSomoni]: TuiCurrency.TajikistaniSomoni, [TuiCurrencyCode.MalaysianRinggit]: TuiCurrency.MalaysianRinggit, [TuiCurrencyCode.BelarusianRuble]: TuiCurrency.BelarusianRuble, [TuiCurrencyCode.GeorgianLari]: TuiCurrency.GeorgianLari, [TuiCurrencyCode.AzerbaijaniManat]: TuiCurrency.AzerbaijaniManat, [TuiCurrencyCode.SriLankanRupee]: TuiCurrency.SriLankanRupee, [TuiCurrencyCode.SerbianDinar]: TuiCurrency.SerbianDinar, [TuiCurrencyCode.SaudiRiyal]: TuiCurrency.SaudiRiyal, [TuiCurrencyCode.MongolianTugrik]: TuiCurrency.MongolianTugrik, [TuiCurrencyCode.SouthAfricanRand]: TuiCurrency.SouthAfricanRand, [TuiCurrencyCode.IranianRial]: TuiCurrency.IranianRial, [TuiCurrencyCode.IndonesianRupiah]: TuiCurrency.IndonesianRupiah, [TuiCurrencyCode.VietnameseDong]: TuiCurrency.VietnameseDong, [TuiCurrencyCode.NewTurkmenManat]: TuiCurrency.NewTurkmenManat, [TuiCurrencyCode.BrazilianReal]: TuiCurrency.BrazilianReal, }; function tuiGetCurrencyByCode(currency) { return TUI_CURRENCY_DICTIONARY[currency] ?? null; } // https://en.wikipedia.org/wiki/Payment_card_number#Issuer_identification_number_(IIN) const TUI_BIN_TABLE = [ ['mir', 2200, 2204], ['mastercard', 2221, 2720], ['jcb', 3528, 3589], ['amex', 34], ['amex', 37], ['dinersclub', 36], ['electron', 4026], ['electron', 4175], ['electron', 4405], ['electron', 4508], ['electron', 4844], ['electron', 4913], ['electron', 4917], ['visa', 4], ['verve', 506099, 506198], ['verve', 507865, 507964], ['maestro', 5018], ['maestro', 5020], ['maestro', 5038], ['maestro', 5090], ['maestro', 5890], ['maestro', 5893], ['rupay', 508], ['maestro', 50], ['mastercard', 51, 55], ['maestro', 56], ['maestro', 58], ['mastercard', 5], ['maestro', 6000], ['maestro', 6304], ['maestro', 6759, 6763], ['verve', 650002, 650027], ['maestro', 676770], ['maestro', 676774], ['discover', 644, 649], ['discover', 6011], ['rupay', 60], ['unionpay', 62], ['discover', 65], ['maestro', 6], ['rupay', 81, 82], ['uzcard', 8600], ['humo', 9860], ]; function tuiGetPaymentSystem(cardNumber, supported) { if (!cardNumber) { return null; } const row = TUI_BIN_TABLE.find(([paymentSystem, start, end = start]) => { const cardNumberNumeric = Number.parseInt(cardNumber.slice(0, String(start).length), 10); const match = cardNumberNumeric >= start && cardNumberNumeric <= end; return match && (!supported?.length || supported.includes(paymentSystem)); }); return row?.[0] ?? null; } function tuiIsMaestro(three, two, one) { if (one === 6 || two === 50 || (two > 55 && two < 59)) { return true; } return three < 500 ? false : three < 510; } function tuiIsMastercard(four, two, one) { if (one === 5) { return true; } if (two < 10) { return false; } if (two > 50 && two < 56) { return true; } return four < 1000 ? false : four > 2220 && four < 2721; } function tuiIsMir(four) { return four > 2199 && four < 2205; } function tuiIsElectron(four) { switch (four) { case 4026: case 4175: case 4405: case 4508: case 4844: case 4913: case 4917: return true; default: return false; } } function tuiIsVisa(one) { return one === 4; } /** * Validates card number length using payment system dictionary */ function tuiIsCardLengthValid(cardNumber) { const { length } = cardNumber; const paymentSystem = tuiGetPaymentSystem(cardNumber); switch (paymentSystem) { case 'electron': return length === 16; case 'maestro': return length > 11 && length < 20; case 'mastercard': case 'mir': return length > 15 && length < 20; case 'visa': return length > 12 && length < 20; default: return length > 8 && length < 20; } } /** * Validates card number using Luhn algorithm */ function tuiIsCardNumberValid(value) { const cardNumber = String(value).replace(TUI_NON_DIGITS_REGEXP, ''); const { length } = cardNumber; const arr = cardNumber.split('').map((char, index) => { const digit = Number.parseInt(char, 10); if ((index + length) % 2 === 0) { const digitX2 = digit * 2; return digitX2 > 9 ? digitX2 - 9 : digitX2; } return digit; }); return !(arr.reduce((a, b) => a + b, 0) % 10); } function tuiIsExpireValid(expire, today = new Date()) { const currentMonth = today.getMonth() + 1; const currentYear = today.getFullYear() - 2000; const expireMonth = tuiClamp(Number.parseInt(expire.slice(0, 2), 10), 1, 12); const expireYear = tuiClamp(Number.parseInt(expire.slice(-2), 10), 0, 99); return (expireYear > currentYear || (currentYear === expireYear && expireMonth >= currentMonth)); } /** * Generated bundle index. Do not edit. */ export { TUI_BIN_TABLE, TUI_CODE_DICTIONARY, TUI_CURRENCY_DICTIONARY, tuiFormatCurrency, tuiGetCodeByCurrency, tuiGetCurrencyByCode, tuiGetCurrencySymbol, tuiGetPaymentSystem, tuiIsCardLengthValid, tuiIsCardNumberValid, tuiIsElectron, tuiIsExpireValid, tuiIsMaestro, tuiIsMastercard, tuiIsMir, tuiIsVisa }; //# sourceMappingURL=taiga-ui-addon-commerce-utils.mjs.map