@taiga-ui/addon-commerce
Version:
Extension package for Taiga UI related to commerce, payment systems, currencies etc.
405 lines (394 loc) • 15.4 kB
JavaScript
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