nusantara-valid
Advanced tools
Comparing version 0.1.0 to 0.2.0
@@ -0,1 +1,7 @@ | ||
/*! | ||
* Nusantara Valid v0.2.0 | ||
* Copyright 2020 - Fajar Setya Budi (https://magicjar.github.io) | ||
* Contributors (https://github.com/magicjar/nusantara-valid/graphs/contributors) | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
*/ | ||
'use strict'; | ||
@@ -5,2 +11,8 @@ | ||
/** | ||
* Strip all non number characters | ||
* | ||
* @param {string | number} input - Input parameter. Can be string or number | ||
* @return {string} Clean number. Free from any non number characters. | ||
**/ | ||
function numbersOnly(input) { | ||
@@ -10,78 +22,81 @@ return String(input).replace(/[^\d]/g, ''); | ||
var range = function (start, stop) { return Array.from({ length: (stop - start) / 1 + 1 }, function (_, i) { return start + (i * 1); }); }; | ||
/** | ||
* CELLULAR_NUMBER | ||
* Clean up phone number from leading zero, formating, and country code. | ||
* | ||
* List cellular provider in Indonesia | ||
* @param {string} number - The dirty number. | ||
* @param {object} type - The number type, landline number or cellular number and the country code. | ||
* @return {string} Clean number. Free from leading zero, formating, and country code for mobile number. | ||
**/ | ||
var CELLULAR_NUMBER = { | ||
TELKOMSEL: { | ||
name: 'Telkomsel', | ||
prefix: range(811, 813).concat(range(821, 823)).concat(range(851, 853)), | ||
}, | ||
INDOSAT: { | ||
name: 'Indosat Ooredoo', | ||
prefix: range(814, 816).concat(range(855, 858)), | ||
}, | ||
XL: { | ||
name: 'XL Axiata', | ||
prefix: range(817, 819).concat([859, 877, 878]), | ||
}, | ||
TRI: { | ||
name: 'Hutchinson Tri', | ||
prefix: range(895, 899), | ||
}, | ||
SMARTFREN: { | ||
name: 'Smartfren', | ||
prefix: range(881, 889), | ||
}, | ||
AXIS: { | ||
name: 'AXIS', | ||
prefix: range(831, 833).concat([838]) | ||
} | ||
}; | ||
function cleanPhoneNumbers(number, type) { | ||
if (type === void 0) { type = {}; } | ||
var _a = type.cellular, cellular = _a === void 0 ? false : _a, _b = type.countryCode, countryCode = _b === void 0 ? 0 : _b; | ||
var num = String(number).replace(/[^\d]/g, '').replace(/^0+/, ''); | ||
if (cellular && (Number(num.substr(0, 2)) === countryCode)) | ||
num = num.substring(2); | ||
return num; | ||
} | ||
/** | ||
* CELLULAR_MIN_LENGTH | ||
* Check the length | ||
* | ||
* Minimum length of cellular number including country code | ||
* @param {number} mode - 0 = exact, 1 = between, 2 = includes | ||
* @param {number} length - The length | ||
* @param {object} options - The options to be checking with { collection: Array of numbers, minLength: The minimum length, maxLength: The maximum length } | ||
* @return {boolean} Correct or not | ||
**/ | ||
var CELLULAR_MIN_LENGTH = 11; | ||
function correctLength(mode, length, options) { | ||
var _a = options.collection, collection = _a === void 0 ? [] : _a, _b = options.minLength, minLength = _b === void 0 ? 0 : _b, _c = options.maxLength, maxLength = _c === void 0 ? 0 : _c; | ||
switch (mode) { | ||
case 0: | ||
return length == minLength; | ||
case 1: | ||
return length >= minLength && length <= maxLength; | ||
case 2: | ||
return collection.includes(length); | ||
default: | ||
return false; | ||
} | ||
} | ||
/** | ||
* CELLULAR_MAX_LENGTH | ||
* Format date from string | ||
* | ||
* Maximum length of cellular number including country code | ||
* @param {string} date - The string date in YYYYMMDD format | ||
* @return {Date} Formated date. | ||
**/ | ||
var CELLULAR_MAX_LENGTH = 13; | ||
function formatDate(date) { | ||
return new Date(numbersOnly(date).replace(/(\d{4})(?:(\d{2})?)(?:(\d{2})?)/, "$1-$2-$3")); | ||
} | ||
/** | ||
* CELLULAR_COUNTRY_CODE | ||
* Determines whether an array includes a certain element, returning true or false as appropriate. | ||
* | ||
* The country code | ||
* @param {any[]} searchElement The element to search for. | ||
* @param {any} theElement The element we search. | ||
* @return {boolean} True or false | ||
**/ | ||
var CELLULAR_COUNTRY_CODE = 62; | ||
function parseCellularPrefix(input) { | ||
// +62xxx => 62xxx | ||
var number = String(input).replace(/[^\d]/g, ''); | ||
var newNumber = ""; | ||
// 0xxx => 62xxx | ||
if (number.charAt(0) == '0') | ||
newNumber = number.replace('0', CELLULAR_COUNTRY_CODE.toString()); | ||
return newNumber; | ||
function includes(searchElement, theElement) { | ||
return searchElement.indexOf(theElement) > -1; | ||
} | ||
function parseTelephoneAreaCode(input) { | ||
var number = String(input).replace(/[^\d]/g, ''); | ||
var newNumber = number; | ||
if (number.charAt(0) != '0') | ||
newNumber = '0' + number; | ||
return newNumber; | ||
} | ||
/** | ||
* Generate an array of number from start to stop. | ||
* | ||
* @param {number} start - First number of a range | ||
* @param {number} stop - Last number of a range | ||
* @return {number[]} Range array | ||
**/ | ||
var range = function (start, stop) { | ||
var numbers = []; | ||
for (var i = start; i <= stop; i++) | ||
numbers = numbers.concat(i); | ||
return numbers; | ||
}; | ||
function formatDate(date) { | ||
var newDate = date.replace(/(\d{4})(\d{2})(?:(\d{2})?)/, "$1-$2-$3"); | ||
var formatedDate = new Date(newDate); | ||
return formatedDate; | ||
} | ||
/** | ||
* Nusantara Valid: bank.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* BANK_DATA | ||
@@ -219,185 +234,174 @@ * | ||
}; | ||
var BANKS = Object.keys(BANK_DATA); | ||
var BANK_KEYS = Object.keys(BANK_DATA); | ||
/** | ||
* Nusantara Valid: _atmNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The ATMNumber class | ||
**/ | ||
var ATMNumber = /** @class */ (function () { | ||
function ATMNumber() { | ||
this.VALID_ATMNUMBER_LENGTH = Object.keys(BANK_DATA).reduce(function (pref, curr) { return pref.includes(BANK_DATA[curr].digits) ? pref : pref.concat(BANK_DATA[curr].digits); }, []); | ||
this.VALID_ATMNUMBER_LENGTH = BANK_KEYS.reduce(function (pref, curr) { return includes(pref, BANK_DATA[curr].digits) ? pref : pref.concat(BANK_DATA[curr].digits); }, []); | ||
} | ||
ATMNumber.prototype.isValid = function (atm, bank) { | ||
if (bank === void 0) { bank = ''; } | ||
if (!atm || typeof atm !== 'string') | ||
return false; | ||
if (bank === undefined) | ||
bank = ''; | ||
var numOnly = numbersOnly(atm); | ||
var matchLength = correctLength(2, numOnly.length, { collection: this.VALID_ATMNUMBER_LENGTH }); | ||
if (bank) | ||
return BANK_DATA[bank].digits == numOnly.length; | ||
return this.isValidLength(numOnly.length); | ||
matchLength = correctLength(0, numOnly.length, { minLength: BANK_DATA[bank].digits }); | ||
return matchLength; | ||
}; | ||
ATMNumber.prototype.isValidLength = function (length) { | ||
return this.VALID_ATMNUMBER_LENGTH.includes(length); | ||
}; | ||
return ATMNumber; | ||
}()); | ||
var atm = new ATMNumber(); | ||
function isValid(param, index) { | ||
return atm.isValid(param, index); | ||
} | ||
var theATM = new ATMNumber(); | ||
/** | ||
* CC_LENGTH | ||
* ATM number validation without comparison with bank | ||
* | ||
* Total length of Credit Card number without any special characters | ||
* It will validate ATM number based on it's length | ||
* | ||
* @param {string} atm - The atm number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
var CC_LENGTH = 16; | ||
function isValidATMNumber(atm) { | ||
return theATM.isValid(atm); | ||
} | ||
/** | ||
* CC_VALID_MII | ||
* ATM number validation with comparison with bank | ||
* | ||
* Lists of Credit Card valid MII number | ||
* It will validate ATM number based on it's length and specific Bank's length | ||
* | ||
* @param {string} atm - The atm number to be validated | ||
* @param {string} key - The bank key | ||
* @return {boolean} Is valid or not | ||
**/ | ||
var CC_VALID_MII = [ | ||
'4', '5', | ||
]; | ||
function isValidATMNumberWithComparison(atm, key) { | ||
if (key === void 0) { key = ''; } | ||
return theATM.isValid(atm, key); | ||
} | ||
/** | ||
* CC_SPACE_INDEXES | ||
* Nusantara Valid: _bank.ts | ||
* | ||
* Indexes of where are the space separator to be placed | ||
* Eg: 4000 0000 0000 0000 | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Bank class | ||
**/ | ||
var CC_SPACE_INDEXES = [3, 7, 11, 11]; | ||
var CreditCard = /** @class */ (function () { | ||
function CreditCard() { | ||
var Bank = /** @class */ (function () { | ||
function Bank() { | ||
} | ||
CreditCard.prototype.isValid = function (cc) { | ||
if (!cc || typeof cc !== 'string') | ||
return false; | ||
var numOnly = numbersOnly(cc); | ||
return this.isValidMII(cc.charAt(0)) && this.isValidLength(numOnly.length); | ||
Bank.prototype.getData = function (index) { | ||
if (index === void 0) { index = ''; } | ||
var bank; | ||
if (index) { | ||
bank = { | ||
key: index, | ||
name: BANK_DATA[index].name | ||
}; | ||
} | ||
else { | ||
bank = BANK_KEYS.map(function (key) { return ({ | ||
key: key, | ||
name: BANK_DATA[key].name, | ||
}); }); | ||
} | ||
return bank; | ||
}; | ||
CreditCard.prototype.isValidLength = function (length) { | ||
return length == CC_LENGTH; | ||
}; | ||
CreditCard.prototype.isValidMII = function (mii) { | ||
return CC_VALID_MII.includes(mii); | ||
}; | ||
CreditCard.prototype.format = function (cc) { | ||
var newCC = numbersOnly(cc); | ||
return newCC | ||
.slice(0, CC_LENGTH) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === newCC.length - 1)) { | ||
if (CC_SPACE_INDEXES.includes(index)) | ||
return result + " "; | ||
} | ||
return result; | ||
}, ''); | ||
}; | ||
return CreditCard; | ||
return Bank; | ||
}()); | ||
var cc = new CreditCard(); | ||
function isValid$1(param) { | ||
return cc.isValid(param); | ||
var bank = new Bank(); | ||
/** | ||
* Specific Bank data retreiver. | ||
* | ||
* Return a specific set of bank object data from user provided bank key | ||
* | ||
* @param {string} key - The Bank key | ||
* @return {IDataBank} The Bank data | ||
**/ | ||
function getDataBank(key) { | ||
return bank.getData(key); | ||
} | ||
function format(param) { | ||
return cc.format(param); | ||
/** | ||
* All Bank data retreiver. | ||
* | ||
* Return all bank object data as an array | ||
* | ||
* @return {IDataBank[]} Array of Bank data | ||
**/ | ||
function getDataBanks() { | ||
return bank.getData(); | ||
} | ||
var MobileNumber = /** @class */ (function () { | ||
function MobileNumber() { | ||
this.VALID_CELLULAR_PREFIX = Object.keys(CELLULAR_NUMBER).reduce(function (a, b) { return a.concat(CELLULAR_NUMBER[b].prefix); }, []); | ||
} | ||
MobileNumber.prototype.isValid = function (mobile) { | ||
if (!mobile || typeof mobile !== 'string') | ||
return false; | ||
var parsedCellularNumber = parseCellularPrefix(mobile); | ||
// Return true if isValidLength and isValidCellularPrefix all true | ||
return this.isValidLength(parsedCellularNumber) && this.isValidCellularPrefix(parsedCellularNumber); | ||
}; | ||
MobileNumber.prototype.isValidCellularPrefix = function (parsedCellularNumber) { | ||
return this.VALID_CELLULAR_PREFIX.includes(Number(parsedCellularNumber.substr(2, 3))); | ||
}; | ||
MobileNumber.prototype.isValidLength = function (phone) { | ||
return phone.length >= CELLULAR_MIN_LENGTH && phone.length <= CELLULAR_MAX_LENGTH; | ||
}; | ||
return MobileNumber; | ||
}()); | ||
var mobileNumber = new MobileNumber(); | ||
function isValid$2(param) { | ||
return mobileNumber.isValid(param); | ||
} | ||
/** | ||
* EMAIL_REGEX | ||
* by Brent Thomas | ||
* Nusantara Valid: cellular.ts | ||
* | ||
* EMAIL_REGEX[0] = The email | ||
* EMAIL_REGEX[1] = Local part of email | ||
* EMAIL_REGEX[2] = @ | ||
* EMAIL_REGEX[3] = Domain name | ||
* EMAIL_REGEX[4] = TLD | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
var EMAIL_REGEX = /^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/; | ||
/** | ||
* MAX_LOCALPART_LENGTH | ||
* CELLULAR_PROVIDER_DATA | ||
* | ||
* Maximum length of email's local part | ||
* List cellular provider in Indonesia | ||
**/ | ||
var MAX_LOCALPART_LENGTH = 64; | ||
var CELLULAR_PROVIDER_DATA = { | ||
TELKOMSEL: { | ||
name: 'Telkomsel', | ||
prefix: range(811, 813).concat(range(821, 823)).concat(range(851, 853)), | ||
}, | ||
INDOSAT: { | ||
name: 'Indosat Ooredoo', | ||
prefix: range(814, 816).concat(range(855, 858)), | ||
}, | ||
XL: { | ||
name: 'XL Axiata', | ||
prefix: range(817, 819).concat([859, 877, 878]), | ||
}, | ||
TRI: { | ||
name: 'Hutchinson Tri', | ||
prefix: range(895, 899), | ||
}, | ||
SMARTFREN: { | ||
name: 'Smartfren', | ||
prefix: range(881, 889), | ||
}, | ||
AXIS: { | ||
name: 'AXIS', | ||
prefix: range(831, 833).concat([838]) | ||
} | ||
}; | ||
/** | ||
* MAX_EMAIL_LENGTH | ||
* CELLULAR_MIN_LENGTH | ||
* | ||
* Maximum length of email | ||
* Minimum length of cellular number without leading zero or country code | ||
* 8961234123 | ||
**/ | ||
var MAX_EMAIL_LENGTH = 254; | ||
var Email = /** @class */ (function () { | ||
function Email() { | ||
} | ||
Email.prototype.isValid = function (email) { | ||
if (!email || typeof email !== 'string') | ||
return false; | ||
var validEmail = EMAIL_REGEX.exec(email); | ||
if (!validEmail) | ||
return false; | ||
// Return true if validEmail, validEmail length and email local part length is true | ||
return validEmail && this.isValidLength(validEmail); | ||
}; | ||
Email.prototype.isValidLength = function (email) { | ||
return email.length <= MAX_EMAIL_LENGTH && email[0].length <= MAX_LOCALPART_LENGTH; | ||
}; | ||
return Email; | ||
}()); | ||
var email = new Email(); | ||
function isValid$3(param) { | ||
return email.isValid(param); | ||
} | ||
var CELLULAR_MIN_LENGTH = 10; | ||
/** | ||
* NIK_REGEX | ||
* CELLULAR_MAX_LENGTH | ||
* | ||
* NIK_REGEX[0] = NIK Number has 16 digits | ||
* NIK_REGEX[1] = 2 digits of Province Code (BPS Code) | ||
* NIK_REGEX[2] = 2 digits of City or Distric Code | ||
* NIK_REGEX[3] = 2 digits of Sub Distric Code | ||
* NIK_REGEX[4] = 6 digits of Birthday with DDMMYY format, for woman DD + 40 | ||
* NIK_REGEX[5] = 4 digits of Index | ||
* Maximum length of cellular number without leading zero or country code | ||
**/ | ||
var NIK_REGEX = /^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/; | ||
var CELLULAR_MAX_LENGTH = 12; | ||
/** | ||
* NIK_LENGTH | ||
* CELLULAR_HYPEN_INDEXES | ||
* | ||
* Total length of NIK without any special characters | ||
* Indexes of where are the hypen separator to be placed on formating | ||
**/ | ||
var NIK_LENGTH = 16; | ||
var CELLULAR_HYPEN_INDEXES = [2, 6]; | ||
var CELLULAR_PROVIDER_KEYS = Object.keys(CELLULAR_PROVIDER_DATA); | ||
var range$1 = function (start, stop) { return Array.from({ length: (stop - start) / 1 + 1 }, function (_, i) { return start + (i * 1); }); }; | ||
/** | ||
* PROVINCES_DATA | ||
* Nusantara Valid: province.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* PROVINCE_DATA | ||
* | ||
* List of province data in Indonesia including BPS code, vehicle plate, | ||
* telephone numbers, and zip code. | ||
**/ | ||
var PROVINCES_DATA = { | ||
var PROVINCE_DATA = { | ||
AC: { | ||
@@ -407,3 +411,3 @@ name: 'Aceh', | ||
vehiclePlate: ['BL'], | ||
tel: range$1(641, 659).concat([627, 629]), | ||
tel: range(641, 659).concat([627, 629]), | ||
zipCode: [ | ||
@@ -420,3 +424,3 @@ { | ||
vehiclePlate: ['DK'], | ||
tel: range$1(361, 368), | ||
tel: range(361, 368), | ||
zipCode: [ | ||
@@ -433,3 +437,3 @@ { | ||
vehiclePlate: ['BN'], | ||
tel: range$1(715, 719), | ||
tel: range(715, 719), | ||
zipCode: [ | ||
@@ -446,3 +450,3 @@ { | ||
vehiclePlate: ['BD'], | ||
tel: range$1(736, 739).concat([732]), | ||
tel: range(736, 739).concat([732]), | ||
zipCode: [ | ||
@@ -459,3 +463,3 @@ { | ||
vehiclePlate: ['A'], | ||
tel: range$1(252, 257), | ||
tel: range(252, 257), | ||
zipCode: [ | ||
@@ -487,3 +491,3 @@ { | ||
vehiclePlate: ['BH'], | ||
tel: range$1(740, 748), | ||
tel: range(740, 748), | ||
zipCode: [ | ||
@@ -500,3 +504,3 @@ { | ||
vehiclePlate: ['D', 'E', 'F', 'T', 'Z'], | ||
tel: range$1(231, 234).concat(range$1(260, 267)).concat([22, 251]), | ||
tel: range(231, 234).concat(range(260, 267)).concat([22, 251]), | ||
zipCode: [ | ||
@@ -516,3 +520,3 @@ { | ||
vehiclePlate: ['L', 'M', 'N', 'P', 'S', 'W', 'AE', 'AG'], | ||
tel: range$1(321, 358).concat([31]), | ||
tel: range(321, 358).concat([31]), | ||
zipCode: [ | ||
@@ -541,3 +545,3 @@ { | ||
vehiclePlate: ['G', 'H', 'K', 'R', 'AA', 'AD'], | ||
tel: range$1(271, 299).concat([24, 356]), | ||
tel: range(275, 299).concat(range(271, 273)).concat([24, 356]), | ||
zipCode: [ | ||
@@ -557,3 +561,3 @@ { | ||
vehiclePlate: ['KB'], | ||
tel: range$1(564, 568).concat([534]), | ||
tel: range(564, 568).concat([534]), | ||
zipCode: [ | ||
@@ -570,3 +574,3 @@ { | ||
vehiclePlate: ['KT'], | ||
tel: range$1(541, 556), | ||
tel: range(541, 556), | ||
zipCode: [ | ||
@@ -583,3 +587,3 @@ { | ||
vehiclePlate: ['BP'], | ||
tel: range$1(771, 779), | ||
tel: range(771, 779), | ||
zipCode: [ | ||
@@ -596,3 +600,3 @@ { | ||
vehiclePlate: ['DA'], | ||
tel: range$1(511, 527), | ||
tel: range(511, 527), | ||
zipCode: [ | ||
@@ -609,3 +613,3 @@ { | ||
vehiclePlate: ['KH'], | ||
tel: range$1(513, 539), | ||
tel: range(513, 539), | ||
zipCode: [ | ||
@@ -622,3 +626,3 @@ { | ||
vehiclePlate: ['KU'], | ||
tel: range$1(551, 556), | ||
tel: range(551, 556), | ||
zipCode: [ | ||
@@ -635,3 +639,3 @@ { | ||
vehiclePlate: ['BE'], | ||
tel: range$1(721, 729), | ||
tel: range(721, 729), | ||
zipCode: [ | ||
@@ -648,3 +652,3 @@ { | ||
vehiclePlate: ['DE'], | ||
tel: range$1(910, 931), | ||
tel: range(910, 931), | ||
zipCode: [ | ||
@@ -661,3 +665,3 @@ { | ||
vehiclePlate: ['DG'], | ||
tel: range$1(910, 931), | ||
tel: range(910, 931), | ||
zipCode: [ | ||
@@ -674,3 +678,3 @@ { | ||
vehiclePlate: ['DR', 'EA'], | ||
tel: range$1(370, 376).concat([364]), | ||
tel: range(370, 376).concat([364]), | ||
zipCode: [ | ||
@@ -687,3 +691,3 @@ { | ||
vehiclePlate: ['DH', 'EB', 'ED'], | ||
tel: range$1(380, 389), | ||
tel: range(380, 389), | ||
zipCode: [ | ||
@@ -700,3 +704,3 @@ { | ||
vehiclePlate: ['PA'], | ||
tel: range$1(951, 986).concat([901, 902]), | ||
tel: range(951, 986).concat([901, 902]), | ||
zipCode: [ | ||
@@ -713,3 +717,3 @@ { | ||
vehiclePlate: ['PB'], | ||
tel: range$1(951, 986).concat([901, 902]), | ||
tel: range(951, 986).concat([901, 902]), | ||
zipCode: [ | ||
@@ -726,3 +730,3 @@ { | ||
vehiclePlate: ['BM'], | ||
tel: range$1(760, 769).concat([624]), | ||
tel: range(760, 769).concat([624]), | ||
zipCode: [ | ||
@@ -739,3 +743,3 @@ { | ||
vehiclePlate: ['DB', 'DL'], | ||
tel: range$1(430, 438), | ||
tel: range(430, 438), | ||
zipCode: [ | ||
@@ -752,3 +756,3 @@ { | ||
vehiclePlate: ['BA'], | ||
tel: range$1(751, 759), | ||
tel: range(751, 759), | ||
zipCode: [ | ||
@@ -765,3 +769,3 @@ { | ||
vehiclePlate: ['DT'], | ||
tel: range$1(401, 408), | ||
tel: range(401, 408), | ||
zipCode: [ | ||
@@ -778,3 +782,3 @@ { | ||
vehiclePlate: ['DD', 'DP', 'DW'], | ||
tel: range$1(410, 421).concat(range$1(471, 485)).concat([423, 427]), | ||
tel: range(410, 421).concat(range(471, 485)).concat([423, 427]), | ||
zipCode: [ | ||
@@ -806,3 +810,3 @@ { | ||
vehiclePlate: ['BG'], | ||
tel: range$1(711, 714).concat(range$1(730, 735)).concat([702]), | ||
tel: range(711, 714).concat(range(730, 735)).concat([702]), | ||
zipCode: [ | ||
@@ -819,3 +823,3 @@ { | ||
vehiclePlate: ['DN'], | ||
tel: range$1(445, 465), | ||
tel: range(445, 465), | ||
zipCode: [ | ||
@@ -832,3 +836,3 @@ { | ||
vehiclePlate: ['BB', 'BK'], | ||
tel: range$1(620, 639).concat([601]), | ||
tel: range(620, 639).concat([601]), | ||
zipCode: [ | ||
@@ -854,10 +858,358 @@ { | ||
}; | ||
var PROVINCES = Object.keys(PROVINCES_DATA); | ||
/** | ||
* COUNTRY_CODE | ||
* | ||
* ISD code (https://en.wikipedia.org/wiki/List_of_country_calling_codes) | ||
**/ | ||
var COUNTRY_CODE = 62; | ||
var PROVINCE_KEYS = Object.keys(PROVINCE_DATA); | ||
/** | ||
* Nusantara Valid: _cellularNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CellularNumber class | ||
**/ | ||
var CellularNumber = /** @class */ (function () { | ||
function CellularNumber() { | ||
this.CELLULAR_PROVIDER_PREFIXES = CELLULAR_PROVIDER_KEYS.reduce(function (a, b) { return a.concat(CELLULAR_PROVIDER_DATA[b].prefix); }, []); | ||
} | ||
CellularNumber.prototype.isValid = function (mobile, providerKey) { | ||
if (providerKey === void 0) { providerKey = ''; } | ||
if (!mobile || typeof mobile !== 'string') | ||
return false; | ||
var prefixCollection; | ||
var cleanCellularNumber = cleanPhoneNumbers(mobile, { cellular: true, countryCode: COUNTRY_CODE }); | ||
var validLength = correctLength(1, cleanCellularNumber.length, { minLength: CELLULAR_MIN_LENGTH, maxLength: CELLULAR_MAX_LENGTH }); | ||
if (providerKey) | ||
prefixCollection = CELLULAR_PROVIDER_DATA[providerKey].prefix; | ||
else | ||
prefixCollection = this.CELLULAR_PROVIDER_PREFIXES; | ||
return validLength | ||
&& this.isValidCellularProviderPrefix(Number(cleanCellularNumber.substr(0, 3)), prefixCollection); | ||
}; | ||
CellularNumber.prototype.isValidCellularProviderPrefix = function (prefix, prefixCollection) { | ||
return includes(prefixCollection, prefix); | ||
}; | ||
CellularNumber.prototype.getData = function (mobile) { | ||
var data = {}; | ||
data.number = this.format(mobile); | ||
var pfx = Number(cleanPhoneNumbers(mobile, { cellular: true, countryCode: COUNTRY_CODE }).substr(0, 3)); | ||
for (var _i = 0, CELLULAR_PROVIDER_KEYS_1 = CELLULAR_PROVIDER_KEYS; _i < CELLULAR_PROVIDER_KEYS_1.length; _i++) { | ||
var key = CELLULAR_PROVIDER_KEYS_1[_i]; | ||
var cellProvider = CELLULAR_PROVIDER_DATA[key]; | ||
if (includes(cellProvider.prefix, pfx)) { | ||
data.provider = { | ||
key: key, | ||
name: cellProvider.name | ||
}; | ||
break; | ||
} | ||
} | ||
return data; | ||
}; | ||
CellularNumber.prototype.format = function (input, int) { | ||
if (int === void 0) { int = false; } | ||
var cleanCelNumber = cleanPhoneNumbers(input, { cellular: true, countryCode: COUNTRY_CODE }); | ||
var formatedNumber = cleanCelNumber | ||
.slice(0, cleanCelNumber.length) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === cleanCelNumber.length - 1)) { | ||
if (includes(CELLULAR_HYPEN_INDEXES, index)) | ||
return result + "-"; | ||
} | ||
return result; | ||
}, ''); | ||
return int ? '+' + COUNTRY_CODE.toString() + formatedNumber : '0' + formatedNumber; | ||
}; | ||
return CellularNumber; | ||
}()); | ||
var cellularNumber = new CellularNumber(); | ||
/** | ||
* Cellular number validation | ||
* | ||
* It will validate cellular number based on it's prefix and length | ||
* | ||
* @param {string} number - The cellular number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidCellularNumber(number) { | ||
return cellularNumber.isValid(number); | ||
} | ||
/** | ||
* Cellular number validation with comparison | ||
* | ||
* It will validate cellular number based on user provided data | ||
* | ||
* @param {string} number - The cellular number to be validated | ||
* @param {string} providerKey - The cellular provider key | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidCellularNumberWithComparison(number, providerKey) { | ||
return cellularNumber.isValid(number, providerKey); | ||
} | ||
/** | ||
* Cellular number data getter | ||
* | ||
* Return object data based on provided cellular number | ||
* | ||
* @param {string} number - The cellular number | ||
* @return {object} IDataCellularNumber object | ||
**/ | ||
function getDataCellularNumber(number) { | ||
return cellularNumber.getData(number); | ||
} | ||
/** | ||
* Cellular number formating | ||
* | ||
* Format cellular number to local calling format (0) and international calling format (+XX) | ||
* | ||
* @param {string} number - The cellular number to be formated | ||
* @param {boolean} int - Local calling format (leading zero) or international calling format (leading country code) | ||
* @return {string} Formated number | ||
**/ | ||
function formatCellularNumber(number, int) { | ||
if (int === void 0) { int = false; } | ||
return cellularNumber.format(number, int); | ||
} | ||
/** | ||
* Nusantara Valid: _cellularProvider.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CellularProvider class | ||
**/ | ||
var CellularProvider = /** @class */ (function () { | ||
function CellularProvider() { | ||
} | ||
CellularProvider.prototype.getData = function (index) { | ||
if (index === void 0) { index = ''; } | ||
var providers; | ||
if (index) { | ||
providers = { | ||
key: index, | ||
name: CELLULAR_PROVIDER_DATA[index].name | ||
}; | ||
} | ||
else { | ||
providers = CELLULAR_PROVIDER_KEYS.map(function (key) { return ({ | ||
key: key, | ||
name: CELLULAR_PROVIDER_DATA[key].name, | ||
}); }); | ||
} | ||
return providers; | ||
}; | ||
return CellularProvider; | ||
}()); | ||
var isp = new CellularProvider(); | ||
/** | ||
* Get specific cellular provider data with IDataCellularProvider object structure | ||
* | ||
* Return object data based on provided cellular provider key | ||
* | ||
* @param {string} providerKey - The provider key | ||
* @return {IDataCellularProvider} IDataCellularProvider object | ||
**/ | ||
function getDataCellularProvider(providerKey) { | ||
return isp.getData(providerKey); | ||
} | ||
/** | ||
* Get all cellular provider data with IDataCellularProvider object structure | ||
* | ||
* Return all IDataCellularProvider object in Array<IDataCellularProvider> | ||
* | ||
* @return {IDataCellularProvider[]} Array of IDataCellularProvider object | ||
**/ | ||
function getDataCellularProviders() { | ||
return isp.getData(); | ||
} | ||
/** | ||
* Nusantara Valid: creditCard.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* CC_LENGTH | ||
* | ||
* Total length of Credit Card number without any special characters | ||
**/ | ||
var CC_LENGTH = 16; | ||
/** | ||
* CC_VALID_MII | ||
* | ||
* Lists of Credit Card valid MII number | ||
**/ | ||
var CC_VALID_MII = [ | ||
'4', '5', | ||
]; | ||
/** | ||
* CC_SPACE_INDEXES | ||
* | ||
* Indexes of where are the space separator to be placed | ||
* Eg: 4000 0000 0000 0000 | ||
**/ | ||
var CC_SPACE_INDEXES = [3, 7, 11, 11]; | ||
/** | ||
* Nusantara Valid: _creditCard.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CreditCard class | ||
**/ | ||
var CreditCard = /** @class */ (function () { | ||
function CreditCard() { | ||
} | ||
CreditCard.prototype.isValid = function (cc) { | ||
if (!cc || typeof cc !== 'string') | ||
return false; | ||
var numOnly = numbersOnly(cc); | ||
return this.isValidMII(cc.charAt(0)) | ||
&& correctLength(0, numOnly.length, { minLength: CC_LENGTH }); | ||
}; | ||
CreditCard.prototype.isValidMII = function (mii) { | ||
return includes(CC_VALID_MII, mii); | ||
}; | ||
CreditCard.prototype.format = function (cc) { | ||
var newCC = numbersOnly(cc); | ||
return newCC | ||
.slice(0, CC_LENGTH) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === newCC.length - 1)) { | ||
if (includes(CC_SPACE_INDEXES, index)) | ||
return result + " "; | ||
} | ||
return result; | ||
}, ''); | ||
}; | ||
return CreditCard; | ||
}()); | ||
var cc = new CreditCard(); | ||
/** | ||
* Credit card number validation. | ||
* | ||
* It check if cc number has correct leading MII code and correct CC number's length | ||
* | ||
* @param {string} number - The cc number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidCCNumber(number) { | ||
return cc.isValid(number); | ||
} | ||
/** | ||
* Credit card number formating | ||
* | ||
* Format credit card with the correct format | ||
* | ||
* @param {string} number - CC number to be formated | ||
* @return {string} Formated cc number | ||
**/ | ||
function formatCCNumber(number) { | ||
return cc.format(number); | ||
} | ||
/** | ||
* Nusantara Valid: email.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* EMAIL_REGEX | ||
* by Brent Thomas | ||
* | ||
* EMAIL_REGEX[0] = The email | ||
* EMAIL_REGEX[1] = Local part of email | ||
**/ | ||
var EMAIL_REGEX = /^([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/; | ||
/** | ||
* MAX_LOCALPART_LENGTH | ||
* | ||
* Maximum length of email's local part | ||
**/ | ||
var MAX_LOCALPART_LENGTH = 64; | ||
/** | ||
* MAX_EMAIL_LENGTH | ||
* | ||
* Maximum length of email | ||
**/ | ||
var MAX_EMAIL_LENGTH = 254; | ||
/** | ||
* Nusantara Valid: _email.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Email class | ||
**/ | ||
var Email = /** @class */ (function () { | ||
function Email() { | ||
} | ||
Email.prototype.isValid = function (email) { | ||
if (!email || typeof email !== 'string') | ||
return false; | ||
var validEmail = EMAIL_REGEX.exec(email); | ||
return validEmail !== null | ||
&& correctLength(1, validEmail[0].length, { minLength: 1, maxLength: MAX_EMAIL_LENGTH }) | ||
&& correctLength(1, validEmail[1].length, { minLength: 1, maxLength: MAX_LOCALPART_LENGTH }); | ||
}; | ||
return Email; | ||
}()); | ||
var theEmail = new Email(); | ||
/** | ||
* E-mail validation. | ||
* | ||
* It check if email has the correct requirements such as local part (username), @ [at] symbol, domain name part, and TLD | ||
* | ||
* @param {string} email - The email, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidEmail(email) { | ||
return theEmail.isValid(email); | ||
} | ||
/** | ||
* Nusantara Valid: nik.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NIK_REGEX | ||
* | ||
* NIK_REGEX[0] = NIK Number has 16 digits | ||
* NIK_REGEX[1] = 2 digits of Province Code (BPS Code) | ||
* NIK_REGEX[2] = 2 digits of City or Distric Code | ||
* NIK_REGEX[3] = 2 digits of Sub Distric Code | ||
* NIK_REGEX[4] = 6 digits of Birthday with DDMMYY format, for woman DD + 40 | ||
* NIK_REGEX[5] = 4 digits of Index | ||
**/ | ||
var NIK_REGEX = /^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/; | ||
/** | ||
* NIK_LENGTH | ||
* | ||
* Total length of NIK without any special characters | ||
**/ | ||
var NIK_LENGTH = 16; | ||
/** | ||
* Nusantara Valid: _nomorIndukKependudukan.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukKepemdudukan class | ||
**/ | ||
var NomorIndukKependudukan = /** @class */ (function () { | ||
function NomorIndukKependudukan() { | ||
this.VALID_BPSCODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].bpsCode); }, []); | ||
this.VALID_BPSCODE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].bpsCode); }, []); | ||
} | ||
NomorIndukKependudukan.prototype.isValid = function (nik) { | ||
if (!nik) | ||
NomorIndukKependudukan.prototype.isValid = function (nik, provinceKey, birthday) { | ||
if (provinceKey === void 0) { provinceKey = ''; } | ||
if (birthday === void 0) { birthday = ''; } | ||
if (!nik || typeof nik !== 'string') | ||
return false; | ||
@@ -867,30 +1219,116 @@ var validNIK = NIK_REGEX.exec(numbersOnly(nik)); | ||
return false; | ||
return this.isValidLength(validNIK[0].length) && this.isValidProvince(parseInt(validNIK[1])) && this.isValidBirthday(validNIK[4]); | ||
var validLength = correctLength(0, validNIK[0].length, { minLength: NIK_LENGTH }); | ||
var cBirthday = this.reformatBirthday(validNIK[4]); | ||
var validProvince = includes(this.VALID_BPSCODE, parseInt(validNIK[1])); | ||
var validBirthday = !isNaN(formatDate('19' + cBirthday).getTime()); | ||
// Comparison | ||
if (provinceKey) { | ||
if (PROVINCE_DATA[provinceKey].bpsCode != validNIK[1]) { | ||
validProvince = false; | ||
} | ||
} | ||
if (birthday) { | ||
var vBirthday = numbersOnly(birthday).substring(2, 8); // Strip the first 2 digits of year | ||
if (cBirthday != vBirthday) { | ||
validBirthday = false; | ||
} | ||
} | ||
return validLength | ||
&& validProvince | ||
&& validBirthday; | ||
}; | ||
NomorIndukKependudukan.prototype.isValidLength = function (nip) { | ||
return nip == NIK_LENGTH; | ||
// Reformat DDMMYY into YYMMDD | ||
NomorIndukKependudukan.prototype.reformatBirthday = function (birthday) { | ||
var newBirthday = /(\d{2})(\d{2})(\d{2})/.exec(birthday); | ||
if (newBirthday) { | ||
var cDD = newBirthday[1]; | ||
var cMM = newBirthday[2]; | ||
var cYY = newBirthday[3]; | ||
if (Number(cDD) > 40) // Check if it is a man of woman | ||
cDD = (Number(cDD) - 40).toString(); | ||
return cYY + '' + cMM + '' + cDD; | ||
} | ||
return ''; | ||
}; | ||
NomorIndukKependudukan.prototype.isValidProvince = function (bpsCode) { | ||
return this.VALID_BPSCODE.includes(bpsCode); | ||
NomorIndukKependudukan.prototype.getData = function (nik) { | ||
var validNIK = NIK_REGEX.exec(numbersOnly(nik)); | ||
var data = {}; | ||
if (!validNIK) | ||
return data; | ||
data.nik = validNIK[0]; | ||
data.sex = Number(validNIK[4].substr(0, 2)) > 40 ? 'Female' : 'Male'; | ||
var reformatedBirthday = this.reformatBirthday(validNIK[4]); | ||
var validProvince = includes(this.VALID_BPSCODE, parseInt(validNIK[1])); | ||
var validBirthday = !isNaN(formatDate('19' + reformatedBirthday).getTime()); | ||
if (validProvince) { | ||
var province = {}; | ||
for (var _i = 0, PROVINCE_KEYS_1 = PROVINCE_KEYS; _i < PROVINCE_KEYS_1.length; _i++) { | ||
var key = PROVINCE_KEYS_1[_i]; | ||
var element = PROVINCE_DATA[key]; | ||
if (element.bpsCode == validNIK[1]) { | ||
province.key = key, | ||
province.name = element.name; | ||
break; | ||
} | ||
} | ||
data.province = province; | ||
} | ||
if (validBirthday) { | ||
var currentYear = new Date().getFullYear(); | ||
var bYYYY = Number(reformatedBirthday.substr(0, 2)) + 2000; | ||
var bMMYY = reformatedBirthday.substring(2, 6); | ||
if (bYYYY > currentYear) { | ||
bYYYY = bYYYY - 100; | ||
} | ||
data.birthday = new Date(formatDate(bYYYY + '' + bMMYY)); | ||
} | ||
return data; | ||
}; | ||
NomorIndukKependudukan.prototype.isValidBirthday = function (birthday) { | ||
var newBirthday = /(\d{2})(\d{2})(\d{2})/.exec(birthday); // DDMMYY | ||
if (!newBirthday) | ||
return false; | ||
var dd = parseInt(newBirthday[1]); | ||
var mm = parseInt(newBirthday[2]); | ||
var yy = parseInt(newBirthday[3]); | ||
if (dd > 40) // Check if it is a man of woman | ||
dd = dd - 40; | ||
var formatedBirthday = new Date('19' + yy + '-' + mm + '-' + dd); // '19YY-MM-DD' | ||
return !isNaN(formatedBirthday.getTime()); | ||
}; | ||
return NomorIndukKependudukan; | ||
}()); | ||
var nik = new NomorIndukKependudukan(); | ||
function isValid$4(param) { | ||
return nik.isValid(param); | ||
var theNIK = new NomorIndukKependudukan(); | ||
/** | ||
* NIK validation without any comparison with user provided data. | ||
* | ||
* It check if the NIK's bps code is included / exist in VALID_BPSCODE, check if the NIK's has valid birthday | ||
* and if the NIK has the correct length. | ||
* | ||
* @param {string} nik - The NIK, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNIK(nik) { | ||
return theNIK.isValid(nik); | ||
} | ||
/** | ||
* NIK validation with comparison with user provided provinceKey and birthday data. | ||
* | ||
* It will compare NIK's bps code (see: NIK_REGEX[1]) with bps code from PROVINCE_DATA[provinceKey].bpsCode | ||
* and will compare NIK's birthday (see: NIK_REGEX[4] with user provided birthday) | ||
* | ||
* @param {string} nik - The NIK, the one to be validated | ||
* @param {object} comparison - The data to compare with, provinceKey (key from PROVINCE_DATA) and birthday (in YYYYMMDD format) | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNIKWithComparison(nik, comparison) { | ||
var _a = comparison.provinceKey, provinceKey = _a === void 0 ? '' : _a, _b = comparison.birthday, birthday = _b === void 0 ? '' : _b; | ||
return theNIK.isValid(nik, provinceKey, birthday); | ||
} | ||
/** | ||
* NIK data retreiver. | ||
* | ||
* Return a set of NIK object data from user provided nik | ||
* | ||
* @param {string} nik - The NIK | ||
* @return {object} The NIK data | ||
**/ | ||
function getDataNIK(nik) { | ||
return theNIK.getData(nik); | ||
} | ||
/** | ||
* Nusantara Valid: nip.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NIP_REGEX | ||
@@ -904,3 +1342,3 @@ * | ||
**/ | ||
var NIP_REGEX = /^([0-9]{8})([0-9]{6})([1,2]{1})([0-9]{3})$/; | ||
var NIP_REGEX = /^(\d{8})(\d{6})([1,2]{1})(\d{3})$/; | ||
/** | ||
@@ -913,2 +1351,9 @@ * NIP_LENGTH | ||
/** | ||
* Nusantara Valid: _nomorIndukPegawaiNegeriSipil.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukPegawaiNegeriSipil class | ||
**/ | ||
var NomorIndukPegawaiNegeriSipil = /** @class */ (function () { | ||
@@ -921,22 +1366,50 @@ function NomorIndukPegawaiNegeriSipil() { | ||
var validNIP = NIP_REGEX.exec(numbersOnly(nip)); | ||
return validNIP !== null | ||
&& !isNaN(formatDate(validNIP[1]).getTime()) | ||
&& !isNaN(formatDate(validNIP[2]).getTime()) | ||
&& correctLength(0, validNIP[0].length, { minLength: NIP_LENGTH }); | ||
}; | ||
NomorIndukPegawaiNegeriSipil.prototype.getData = function (nip) { | ||
var data = {}; | ||
var validNIP = NIP_REGEX.exec(numbersOnly(nip)); | ||
if (!validNIP) | ||
return false; | ||
return this.isValidLength(validNIP[0].length) && this.isValidDate(validNIP[1]) && this.isValidDate(validNIP[2]); | ||
return data; | ||
data.nip = validNIP[0]; | ||
data.birthday = formatDate(validNIP[1]); | ||
data.recruit_date = validNIP[2].substr(0, 4) + '-' + validNIP[2].substr(4, 2); | ||
data.sex = Number(validNIP[3]) == 1 ? 'Male' : 'Female'; | ||
return data; | ||
}; | ||
NomorIndukPegawaiNegeriSipil.prototype.isValidLength = function (nip) { | ||
return nip == NIP_LENGTH; | ||
}; | ||
NomorIndukPegawaiNegeriSipil.prototype.isValidDate = function (date) { | ||
var newDate = date.replace(/(\d{4})(\d{2})(?:(\d{2})?)/, "$1-$2-$3"); | ||
var formatedDate = new Date(newDate); | ||
return !isNaN(formatedDate.getTime()); | ||
}; | ||
return NomorIndukPegawaiNegeriSipil; | ||
}()); | ||
var nip = new NomorIndukPegawaiNegeriSipil(); | ||
function isValid$5(param) { | ||
return nip.isValid(param); | ||
var theNIP = new NomorIndukPegawaiNegeriSipil(); | ||
/** | ||
* NIP validation. | ||
* | ||
* Validate NIP by validating NIP's birthday, NIP's recruitment date, and NIP's length | ||
* | ||
* @param {string} nip - The NIP to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNIP(nip) { | ||
return theNIP.isValid(nip); | ||
} | ||
/** | ||
* NIP data retreiver. | ||
* | ||
* Return a set of NIP object data from user provided nip | ||
* | ||
* @param {string} nip - The NIP | ||
* @return {IDataNIP} The NIP data | ||
**/ | ||
function getDataNIP(nip) { | ||
return theNIP.getData(nip); | ||
} | ||
/** | ||
* Nusantara Valid: nisn.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NISN_REGEX | ||
@@ -965,2 +1438,9 @@ * | ||
/** | ||
* Nusantara Valid: _nomorIndukSiswaNasional.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukSiswaNasional class | ||
**/ | ||
var NomorIndukSiswaNasional = /** @class */ (function () { | ||
@@ -972,12 +1452,7 @@ function NomorIndukSiswaNasional() { | ||
return false; | ||
if (!this.isValidLength(nisn.length)) | ||
return false; | ||
var validNISN = NISN_REGEX.exec(numbersOnly(nisn)); | ||
if (!validNISN) | ||
return false; | ||
return this.isValidPeriod(validNISN[1]); | ||
return validNISN !== null | ||
&& this.isValidPeriod(validNISN[1]) | ||
&& correctLength(0, validNISN[0].length, { minLength: NISN_LENGTH }); | ||
}; | ||
NomorIndukSiswaNasional.prototype.isValidLength = function (nisn) { | ||
return nisn == NISN_LENGTH; | ||
}; | ||
NomorIndukSiswaNasional.prototype.isValidPeriod = function (year) { | ||
@@ -987,17 +1462,27 @@ var thisYear = new Date().getFullYear(); | ||
var birthYear = parseInt(year) + 2000; | ||
if (birthYear > thisYear) { | ||
if (birthYear > thisYear) | ||
birthYear = birthYear - 1000; | ||
} | ||
if (birthYear < endYear) | ||
return false; | ||
return true; | ||
return birthYear < endYear ? false : true; | ||
}; | ||
return NomorIndukSiswaNasional; | ||
}()); | ||
var nisn = new NomorIndukSiswaNasional(); | ||
function isValid$6(param) { | ||
return nisn.isValid(param); | ||
var theNISN = new NomorIndukSiswaNasional(); | ||
/** | ||
* NISN validation. | ||
* | ||
* Validate NISN by validating NISN's birth year (student age) with NISN_AGE_VALIDITY and NISN's length | ||
* | ||
* @param {string} nisn - The NISN to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNISN(nisn) { | ||
return theNISN.isValid(nisn); | ||
} | ||
/** | ||
* Nusantara Valid: npwp.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NPWP_REGEX | ||
@@ -1045,2 +1530,9 @@ * | ||
/** | ||
* Nusantara Valid: _nomorPokokWajibPajak.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorPokokWajibPajak class | ||
**/ | ||
var NomorPokokWajibPajak = /** @class */ (function () { | ||
@@ -1053,21 +1545,12 @@ function NomorPokokWajibPajak() { | ||
var numOnly = numbersOnly(npwp); | ||
if (!this.isValidLength(numOnly.length)) | ||
return false; | ||
var regexNPWP = NPWP_REGEX.exec(numOnly); | ||
if (!regexNPWP) | ||
return false; | ||
return this.isValidTaxIdentity(regexNPWP[1]); | ||
return regexNPWP !== null | ||
&& this.isValidTaxIdentity(regexNPWP[1]) | ||
&& correctLength(0, regexNPWP[0].length, { minLength: NPWP_LENGTH }); | ||
}; | ||
NomorPokokWajibPajak.prototype.isValidLength = function (npwp) { | ||
return npwp == NPWP_LENGTH; | ||
}; | ||
NomorPokokWajibPajak.prototype.isValidTaxIdentity = function (taxIdentity) { | ||
return NPWP_TAX_IDENTITIES.includes(taxIdentity); | ||
return includes(NPWP_TAX_IDENTITIES, taxIdentity); | ||
}; | ||
NomorPokokWajibPajak.prototype.format = function (npwp, pad) { | ||
if (pad === void 0) { pad = true; } | ||
NomorPokokWajibPajak.prototype.format = function (npwp) { | ||
var newNPWP = numbersOnly(npwp); | ||
if (pad) { | ||
newNPWP = newNPWP.padStart(NPWP_LENGTH, '0'); | ||
} | ||
return newNPWP | ||
@@ -1079,5 +1562,5 @@ .slice(0, NPWP_LENGTH) | ||
if (!(index === newNPWP.length - 1)) { | ||
if (NPWP_DOT_INDEXES.includes(index)) | ||
if (includes(NPWP_DOT_INDEXES, index)) | ||
return result + "."; | ||
if (NPWP_HYPHEN_INDEXES.includes(index)) | ||
if (includes(NPWP_HYPHEN_INDEXES, index)) | ||
return result + "-"; | ||
@@ -1090,14 +1573,88 @@ } | ||
}()); | ||
var npwp = new NomorPokokWajibPajak(); | ||
function isValid$7(param) { | ||
return npwp.isValid(param); | ||
var theNPWP = new NomorPokokWajibPajak(); | ||
/** | ||
* NPWP validation. | ||
* | ||
* Validate NPWP by validating NPWP's tax identity and NPWP's length | ||
* | ||
* @param {string} npwp - The NPWP to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNPWP(npwp) { | ||
return theNPWP.isValid(npwp); | ||
} | ||
function format$1(param, pad) { | ||
if (pad === void 0) { pad = true; } | ||
return npwp.format(param, pad); | ||
/** | ||
* NPWP formating | ||
* | ||
* Format NPWP to the correct requirement | ||
* | ||
* @param {string} npwp - TheNPWP to be formated | ||
* @return {string} Formated NPWP | ||
**/ | ||
function formatNPWP(npwp) { | ||
return theNPWP.format(npwp); | ||
} | ||
/** | ||
* Nusantara Valid: _province.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Province class | ||
**/ | ||
var Province = /** @class */ (function () { | ||
function Province() { | ||
} | ||
Province.prototype.getData = function (index) { | ||
if (index === void 0) { index = ''; } | ||
var province; | ||
if (index) { | ||
province = { | ||
key: index, | ||
name: PROVINCE_DATA[index].name | ||
}; | ||
} | ||
else { | ||
province = PROVINCE_KEYS.map(function (key) { return ({ | ||
key: key, | ||
name: PROVINCE_DATA[key].name, | ||
}); }); | ||
} | ||
return province; | ||
}; | ||
return Province; | ||
}()); | ||
var prov = new Province(); | ||
/** | ||
* Get specific province data with IDataProvince object structure | ||
* | ||
* Return object data based on provided province key | ||
* | ||
* @param {string} provinceKey - Array key of the province | ||
* @return {IDataProvince} IDataProvince object | ||
**/ | ||
function getDataProvince(provinceKey) { | ||
return prov.getData(provinceKey); | ||
} | ||
/** | ||
* Get all province data with IDataProvince object structure | ||
* | ||
* Return all IDataProvince object in Array<IDataProvince> | ||
* | ||
* @return {IDataProvince[]} Array of IDataProvince object | ||
**/ | ||
function getDataProvinces() { | ||
return prov.getData(); | ||
} | ||
/** | ||
* Nusantara Valid: _telephoneNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The TelephoneNumber class | ||
**/ | ||
var TelephoneNumber = /** @class */ (function () { | ||
function TelephoneNumber() { | ||
this.VALID_TELEPHONE_AREACODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].tel); }, []); | ||
this.VALID_TELEPHONE_AREACODE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].tel); }, []); | ||
} | ||
@@ -1107,16 +1664,99 @@ TelephoneNumber.prototype.isValid = function (tel) { | ||
return false; | ||
var parsedTelephoneNumber = parseTelephoneAreaCode(tel); | ||
return this.isValidCellularPrefix(parsedTelephoneNumber); | ||
var cleanTelNumber = cleanPhoneNumbers(tel); | ||
return !isNaN(this.isValidCellularPrefix(cleanTelNumber)); | ||
}; | ||
TelephoneNumber.prototype.isValidCellularPrefix = function (parsedTel) { | ||
return this.VALID_TELEPHONE_AREACODE.includes(Number(parsedTel.substr(1, 2))) || this.VALID_TELEPHONE_AREACODE.includes(Number(parsedTel.substr(1, 3))); | ||
var thePrefix = Number(parsedTel.substr(0, 2)); | ||
if (includes(this.VALID_TELEPHONE_AREACODE, thePrefix)) | ||
return thePrefix; | ||
thePrefix = Number(parsedTel.substr(0, 3)); | ||
if (includes(this.VALID_TELEPHONE_AREACODE, thePrefix)) | ||
return thePrefix; | ||
return NaN; | ||
}; | ||
TelephoneNumber.prototype.getData = function (tel) { | ||
var data = {}; | ||
var cleanTelNumber = cleanPhoneNumbers(tel); | ||
data.number = this.format(cleanTelNumber); | ||
var pfx = this.isValidCellularPrefix(cleanTelNumber); | ||
for (var _i = 0, PROVINCE_KEYS_1 = PROVINCE_KEYS; _i < PROVINCE_KEYS_1.length; _i++) { | ||
var key = PROVINCE_KEYS_1[_i]; | ||
var element = PROVINCE_DATA[key]; | ||
if (includes(element.tel, pfx)) { | ||
data.origin = { | ||
key: key, | ||
name: element.name | ||
}; | ||
break; | ||
} | ||
} | ||
return data; | ||
}; | ||
TelephoneNumber.prototype.format = function (tel, int) { | ||
if (int === void 0) { int = false; } | ||
var cleanTelNumber = cleanPhoneNumbers(tel); | ||
var pfx = this.isValidCellularPrefix(cleanTelNumber).toString(); | ||
var TEL_HYPEN_INDEX = []; | ||
if (pfx.length === 2) | ||
TEL_HYPEN_INDEX = [1]; | ||
else | ||
TEL_HYPEN_INDEX = [2]; | ||
var formatedNumber = cleanTelNumber | ||
.slice(0, cleanTelNumber.length) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === cleanTelNumber.length - 1)) { | ||
if (includes(TEL_HYPEN_INDEX, index)) | ||
return result + "-"; | ||
} | ||
return result; | ||
}, ''); | ||
return int ? '+' + COUNTRY_CODE + formatedNumber : '0' + formatedNumber; | ||
}; | ||
return TelephoneNumber; | ||
}()); | ||
var telNumber = new TelephoneNumber(); | ||
function isValid$8(param) { | ||
return telNumber.isValid(param); | ||
/** | ||
* Telephone number validation | ||
* | ||
* It will validate telephone number based on it's prefix | ||
* | ||
* @param {string} number - The telephone number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidTelephoneNumber(number) { | ||
return telNumber.isValid(number); | ||
} | ||
/** | ||
* Telephone number data getter | ||
* | ||
* Return object data based on provided telephone number | ||
* | ||
* @param {string} number - The telephone number | ||
* @return {object} IDataTelephoneNumber object | ||
**/ | ||
function getDataTelephoneNumber(number) { | ||
return telNumber.getData(number); | ||
} | ||
/** | ||
* Telephone number formating | ||
* | ||
* Format telephone number to local calling format (0) and international calling format (+XX) | ||
* | ||
* @param {string} number - The telephone number to be formated | ||
* @param {boolean} int - Local calling format (leading zero) or international calling format (leading country code) | ||
* @return {string} Formated number | ||
**/ | ||
function formatTelephoneNumber(number, int) { | ||
if (int === void 0) { int = false; } | ||
return telNumber.format(number, int); | ||
} | ||
/** | ||
* Nusantara Valid: tnkb.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* TNKB_REGEX | ||
@@ -1131,6 +1771,12 @@ * | ||
// Vehicle Registration Number (TNKB) / Tanda Nomor Kendaraan Bermotor (TNKB) | ||
/** | ||
* Nusantara Valid: _tandaNomorKendaraanBermotor.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The TandaNomorKendaraanBermotor class | ||
**/ | ||
var TandaNomorKendaraanBermotor = /** @class */ (function () { | ||
function TandaNomorKendaraanBermotor() { | ||
this.VALID_TNKB_AREACODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].vehiclePlate); }, []); | ||
this.VALID_TNKB_AREACODE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].vehiclePlate); }, []); | ||
} | ||
@@ -1142,33 +1788,85 @@ TandaNomorKendaraanBermotor.prototype.isValid = function (tnkb) { | ||
var validTNKB = TNKB_REGEX.exec(TNKB); | ||
if (!validTNKB) | ||
return false; | ||
return this.isValidTNKBArea(validTNKB); | ||
return validTNKB !== null | ||
&& this.isValidTNKBArea(validTNKB[1]); | ||
}; | ||
TandaNomorKendaraanBermotor.prototype.isValidTNKBArea = function (tnkb) { | ||
return this.VALID_TNKB_AREACODE.includes(tnkb[1]); | ||
return includes(this.VALID_TNKB_AREACODE, tnkb); | ||
}; | ||
TandaNomorKendaraanBermotor.prototype.getData = function (tnkb) { | ||
var data = {}; | ||
var TNKB = tnkb.toUpperCase(); | ||
var validTNKB = TNKB_REGEX.exec(TNKB); | ||
if (!validTNKB) | ||
return data; | ||
for (var _i = 0, PROVINCE_KEYS_1 = PROVINCE_KEYS; _i < PROVINCE_KEYS_1.length; _i++) { | ||
var key = PROVINCE_KEYS_1[_i]; | ||
var element = PROVINCE_DATA[key]; | ||
if (includes(element.vehiclePlate, validTNKB[1])) { | ||
data = { | ||
areaCode: validTNKB[1], | ||
index: Number(validTNKB[2]), | ||
detailedAreaCode: validTNKB[3], | ||
province: { | ||
key: key, | ||
name: element.name | ||
} | ||
}; | ||
break; | ||
} | ||
} | ||
return data; | ||
}; | ||
return TandaNomorKendaraanBermotor; | ||
}()); | ||
var tnkb = new TandaNomorKendaraanBermotor(); | ||
function isValid$9(param) { | ||
return tnkb.isValid(param); | ||
var theTNKB = new TandaNomorKendaraanBermotor(); | ||
/** | ||
* TNKB validation. | ||
* | ||
* It check if the TNKB's area code is exist in VALID_TNKB_AREACODE | ||
* | ||
* @param {string} tnkb - The TNKB, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidTNKB(tnkb) { | ||
return theTNKB.isValid(tnkb); | ||
} | ||
/** | ||
* TNKB data retreiver. | ||
* | ||
* Return a set of TNKB object data from user provided tnkb | ||
* | ||
* @param {string} tnkb - The TNKB | ||
* @return {IDataTNKB} The TNKB data | ||
**/ | ||
function getDataTNKB(tnkb) { | ||
return theTNKB.getData(tnkb); | ||
} | ||
/** | ||
* Nusantara Valid: _zipCode.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The ZIPCode class | ||
**/ | ||
var ZIPCode = /** @class */ (function () { | ||
function ZIPCode() { | ||
this.VALID_ZIPCODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].zipCode); }, []); | ||
this.ZIP_RANGE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].zipCode); }, []); | ||
} | ||
ZIPCode.prototype.isValid = function (zip) { | ||
ZIPCode.prototype.isValid = function (zip, provinceKey) { | ||
if (provinceKey === void 0) { provinceKey = ''; } | ||
if (!zip) | ||
return false; | ||
var sZIP = zip.toString(); | ||
return this.isValidLength(sZIP) && this.isValidZIPCode(sZIP); | ||
var zipArray = this.ZIP_RANGE; | ||
zip = zip.toString(); | ||
var validLength = correctLength(0, zip.length, { minLength: 5 }); | ||
if (provinceKey) | ||
zipArray = PROVINCE_DATA[provinceKey].zipCode; | ||
return validLength | ||
&& this.isValidZIPCode(zip, zipArray); | ||
}; | ||
ZIPCode.prototype.isValidLength = function (zip) { | ||
return zip.length == 5; | ||
}; | ||
ZIPCode.prototype.isValidZIPCode = function (zip) { | ||
for (var _i = 0, _a = this.VALID_ZIPCODE; _i < _a.length; _i++) { | ||
var val = _a[_i]; | ||
if (val.from <= zip && val.to <= zip) { | ||
ZIPCode.prototype.isValidZIPCode = function (zip, zipRange) { | ||
for (var _i = 0, zipRange_1 = zipRange; _i < zipRange_1.length; _i++) { | ||
var val = zipRange_1[_i]; | ||
if (val.from <= zip && val.to >= zip) { | ||
return true; | ||
@@ -1181,60 +1879,64 @@ } | ||
}()); | ||
var zip = new ZIPCode(); | ||
function isValid$a(param) { | ||
return zip.isValid(param); | ||
var theZIP = new ZIPCode(); | ||
/** | ||
* ZIP validation without any comparison with user provided data. | ||
* | ||
* It will check if the ZIP is included / exist in VALID_ZIPCODE array and if the ZIP has the correct length of 6. | ||
* | ||
* @param {string} zip - The ZIP, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidZIP(zip) { | ||
return theZIP.isValid(zip); | ||
} | ||
var Bank = /** @class */ (function () { | ||
function Bank() { | ||
} | ||
Bank.prototype.getData = function () { | ||
var banks = BANKS.map(function (key) { return ({ | ||
key: key, | ||
name: BANK_DATA[key].name, | ||
}); }); | ||
return banks; | ||
}; | ||
return Bank; | ||
}()); | ||
var atm$1 = new Bank(); | ||
function getData() { | ||
return atm$1.getData(); | ||
/** | ||
* ZIP validation with comparison with user provided provinceKey. | ||
* | ||
* It will check if the ZIP is included / exist in ZIP range from PROVINCE_DATA[provinceKey].zipCode[] | ||
* | ||
* @param {string | number} zip - The ZIP, the one to be validated | ||
* @param {object} comparison - The data to compare with, provinceKey (key from PROVINCE_DATA) | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidZIPWithComparison(zip, comparison) { | ||
var _a = comparison.provinceKey, provinceKey = _a === void 0 ? '' : _a; | ||
return theZIP.isValid(zip, provinceKey); | ||
} | ||
var Province = /** @class */ (function () { | ||
function Province() { | ||
} | ||
Province.prototype.getData = function () { | ||
var provinces = PROVINCES.map(function (key) { return ({ | ||
key: key, | ||
name: PROVINCES_DATA[key].name, | ||
}); }); | ||
return provinces; | ||
}; | ||
return Province; | ||
}()); | ||
var atm$2 = new Province(); | ||
function getData$1() { | ||
return atm$2.getData(); | ||
} | ||
exports.formatCCNumber = format; | ||
exports.cleanPhoneNumbers = cleanPhoneNumbers; | ||
exports.correctLength = correctLength; | ||
exports.formatCCNumber = formatCCNumber; | ||
exports.formatCellularNumber = formatCellularNumber; | ||
exports.formatDate = formatDate; | ||
exports.formatNPWP = format$1; | ||
exports.getBankData = getData; | ||
exports.getProvinceData = getData$1; | ||
exports.isValidATMNumber = isValid; | ||
exports.isValidCCNumber = isValid$1; | ||
exports.isValidCellularNumber = isValid$2; | ||
exports.isValidEmail = isValid$3; | ||
exports.isValidNIK = isValid$4; | ||
exports.isValidNIP = isValid$5; | ||
exports.isValidNISN = isValid$6; | ||
exports.isValidNPWP = isValid$7; | ||
exports.isValidTNKB = isValid$9; | ||
exports.isValidTelephoneNumber = isValid$8; | ||
exports.isValidZIP = isValid$a; | ||
exports.formatNPWP = formatNPWP; | ||
exports.formatTelephoneNumber = formatTelephoneNumber; | ||
exports.getDataBank = getDataBank; | ||
exports.getDataBanks = getDataBanks; | ||
exports.getDataCellularNumber = getDataCellularNumber; | ||
exports.getDataCellularProvider = getDataCellularProvider; | ||
exports.getDataCellularProviders = getDataCellularProviders; | ||
exports.getDataNIK = getDataNIK; | ||
exports.getDataNIP = getDataNIP; | ||
exports.getDataProvince = getDataProvince; | ||
exports.getDataProvinces = getDataProvinces; | ||
exports.getDataTNKB = getDataTNKB; | ||
exports.getDataTelephoneNumber = getDataTelephoneNumber; | ||
exports.includes = includes; | ||
exports.isValidATMNumber = isValidATMNumber; | ||
exports.isValidATMNumberWithComparison = isValidATMNumberWithComparison; | ||
exports.isValidCCNumber = isValidCCNumber; | ||
exports.isValidCellularNumber = isValidCellularNumber; | ||
exports.isValidCellularNumberWithComparison = isValidCellularNumberWithComparison; | ||
exports.isValidEmail = isValidEmail; | ||
exports.isValidNIK = isValidNIK; | ||
exports.isValidNIKWithComparison = isValidNIKWithComparison; | ||
exports.isValidNIP = isValidNIP; | ||
exports.isValidNISN = isValidNISN; | ||
exports.isValidNPWP = isValidNPWP; | ||
exports.isValidTNKB = isValidTNKB; | ||
exports.isValidTelephoneNumber = isValidTelephoneNumber; | ||
exports.isValidZIP = isValidZIP; | ||
exports.isValidZIPWithComparison = isValidZIPWithComparison; | ||
exports.numbersOnly = numbersOnly; | ||
exports.parseCellularPrefix = parseCellularPrefix; | ||
exports.parseTelephoneAreaCode = parseTelephoneAreaCode; | ||
exports.range = range; | ||
//# sourceMappingURL=nusantara-valid.js.map |
@@ -1,2 +0,8 @@ | ||
"use strict";function e(e){return String(e).replace(/[^\d]/g,"")}Object.defineProperty(exports,"__esModule",{value:!0});var t=function(e,t){return Array.from({length:(t-e)/1+1},(function(t,n){return e+1*n}))},n={TELKOMSEL:{name:"Telkomsel",prefix:t(811,813).concat(t(821,823)).concat(t(851,853))},INDOSAT:{name:"Indosat Ooredoo",prefix:t(814,816).concat(t(855,858))},XL:{name:"XL Axiata",prefix:t(817,819).concat([859,877,878])},TRI:{name:"Hutchinson Tri",prefix:t(895,899)},SMARTFREN:{name:"Smartfren",prefix:t(881,889)},AXIS:{name:"AXIS",prefix:t(831,833).concat([838])}};function i(e){var t=String(e).replace(/[^\d]/g,""),n="";return"0"==t.charAt(0)&&(n=t.replace("0",62..toString())),n}function a(e){var t=String(e).replace(/[^\d]/g,""),n=t;return"0"!=t.charAt(0)&&(n="0"+t),n}var r={BCAK:{name:"Bank Central Asia",digits:10,dotIndex:[]},BCAS:{name:"Bank Central Asia Syariah",digits:10,dotIndex:[]},BNIK:{name:"Bank Negara Indonesia",digits:10,dotIndex:[]},BNIS:{name:"Bank Negara Indonesia Syariah",digits:10,dotIndex:[]},BRIK:{name:"Bank Rakyat Indonesia",digits:15,dotIndex:[]},BRIS:{name:"Bank Rakyat Indonesia Syariah",digits:10,dotIndex:[]},BTNK:{name:"Bank Tabungan Negara",digits:16,dotIndex:[]},BTNS:{name:"Bank Tabungan Negara Syariah",digits:10,dotIndex:[]},BTPK:{name:"Bank Tabungan Pensiunan Nasional",digits:11,dotIndex:[]},BTPS:{name:"Bank Tabungan Pensiunan Nasional Syariah",digits:10,dotIndex:[]},BUKK:{name:"Bank Bukopin",digits:10,dotIndex:[]},BUKS:{name:"Bank Bukopin Syariah",digits:10,dotIndex:[]},CMBK:{name:"Bank CIMB Niaga",digits:13,dotIndex:[]},CMBS:{name:"Bank CIMB Niaga Syariah",digits:13,dotIndex:[]},DNMK:{name:"Bank Danamon",digits:10,dotIndex:[]},DNMS:{name:"Bank Danamon Syariah",digits:10,dotIndex:[]},MDRK:{name:"Bank Mandiri",digits:13,dotIndex:[]},MDRS:{name:"Bank Mandiri Syariah",digits:10,dotIndex:[]},MGAK:{name:"Bank Mega",digits:15,dotIndex:[]},MGAS:{name:"Bank Mega Syariah",digits:10,dotIndex:[]},MUAM:{name:"Bank Muamalat",digits:10,dotIndex:[]},PMTK:{name:"Bank Permata",digits:10,dotIndex:[]},PMTS:{name:"Bank Permata Syariah",digits:10,dotIndex:[]},PNBK:{name:"Panin Bank",digits:10,dotIndex:[]},PNBS:{name:"Panin Bank Syariah",digits:10,dotIndex:[]}},o=Object.keys(r),d=new(function(){function t(){this.VALID_ATMNUMBER_LENGTH=Object.keys(r).reduce((function(e,t){return e.includes(r[t].digits)?e:e.concat(r[t].digits)}),[])}return t.prototype.isValid=function(t,n){if(!t||"string"!=typeof t)return!1;void 0===n&&(n="");var i=e(t);return n?r[n].digits==i.length:this.isValidLength(i.length)},t.prototype.isValidLength=function(e){return this.VALID_ATMNUMBER_LENGTH.includes(e)},t}());var u=["4","5"],l=[3,7,11,11],s=new(function(){function t(){}return t.prototype.isValid=function(t){if(!t||"string"!=typeof t)return!1;var n=e(t);return this.isValidMII(t.charAt(0))&&this.isValidLength(n.length)},t.prototype.isValidLength=function(e){return 16==e},t.prototype.isValidMII=function(e){return u.includes(e)},t.prototype.format=function(t){var n=e(t);return n.slice(0,16).split("").reduce((function(e,t,i){var a=""+e+t;return i!==n.length-1&&l.includes(i)?a+" ":a}),"")},t}());var c=new(function(){function e(){this.VALID_CELLULAR_PREFIX=Object.keys(n).reduce((function(e,t){return e.concat(n[t].prefix)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=i(e);return this.isValidLength(t)&&this.isValidCellularPrefix(t)},e.prototype.isValidCellularPrefix=function(e){return this.VALID_CELLULAR_PREFIX.includes(Number(e.substr(2,3)))},e.prototype.isValidLength=function(e){return e.length>=11&&e.length<=13},e}());var p=/^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/,f=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=p.exec(e);return!!t&&(t&&this.isValidLength(t))},e.prototype.isValidLength=function(e){return e.length<=254&&e[0].length<=64},e}());var m=/^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/,h=function(e,t){return Array.from({length:(t-e)/1+1},(function(t,n){return e+1*n}))},g={AC:{name:"Aceh",bpsCode:11,vehiclePlate:["BL"],tel:h(641,659).concat([627,629]),zipCode:[{from:23111,to:24794}]},BA:{name:"Bali",bpsCode:51,vehiclePlate:["DK"],tel:h(361,368),zipCode:[{from:80111,to:82262}]},BB:{name:"Kepulauan Bangka Belitung",bpsCode:19,vehiclePlate:["BN"],tel:h(715,719),zipCode:[{from:33111,to:33792}]},BE:{name:"Bengkulu",bpsCode:17,vehiclePlate:["BD"],tel:h(736,739).concat([732]),zipCode:[{from:38113,to:39377}]},BT:{name:"Banten",bpsCode:36,vehiclePlate:["A"],tel:h(252,257),zipCode:[{from:15111,to:15820},{from:42111,to:42455}]},GO:{name:"Gorontalo",bpsCode:75,vehiclePlate:["DM"],tel:[435,443],zipCode:[{from:96111,to:96574}]},JA:{name:"Jambi",bpsCode:15,vehiclePlate:["BH"],tel:h(740,748),zipCode:[{from:36111,to:37574}]},JB:{name:"Jawa Barat",bpsCode:32,vehiclePlate:["D","E","F","T","Z"],tel:h(231,234).concat(h(260,267)).concat([22,251]),zipCode:[{from:16110,to:17730},{from:40111,to:46476}]},JI:{name:"Jawa Timur",bpsCode:35,vehiclePlate:["L","M","N","P","S","W","AE","AG"],tel:h(321,358).concat([31]),zipCode:[{from:60111,to:69493}]},JK:{name:"Jakarta",bpsCode:31,vehiclePlate:["B"],tel:[21],zipCode:[{from:10110,to:14540}]},JT:{name:"Jawa Tengah",bpsCode:33,vehiclePlate:["G","H","K","R","AA","AD"],tel:h(271,299).concat([24,356]),zipCode:[{from:50111,to:54474},{from:56111,to:59584}]},KB:{name:"Kalimantan Barat",bpsCode:61,vehiclePlate:["KB"],tel:h(564,568).concat([534]),zipCode:[{from:78111,to:79682}]},KI:{name:"Kalimantan Timur",bpsCode:64,vehiclePlate:["KT"],tel:h(541,556),zipCode:[{from:75111,to:77381}]},KR:{name:"Kepulauan Riau",bpsCode:21,vehiclePlate:["BP"],tel:h(771,779),zipCode:[{from:29111,to:29878}]},KS:{name:"Kalimantan Selatan",bpsCode:63,vehiclePlate:["DA"],tel:h(511,527),zipCode:[{from:70111,to:72276}]},KT:{name:"Kalimantan Tengah",bpsCode:62,vehiclePlate:["KH"],tel:h(513,539),zipCode:[{from:73111,to:74874}]},KU:{name:"Kalimantan Utara",bpsCode:65,vehiclePlate:["KU"],tel:h(551,556),zipCode:[{from:77111,to:77574}]},LA:{name:"Lampung",bpsCode:18,vehiclePlate:["BE"],tel:h(721,729),zipCode:[{from:34111,to:35686}]},MA:{name:"Maluku",bpsCode:81,vehiclePlate:["DE"],tel:h(910,931),zipCode:[{from:97114,to:97669}]},MU:{name:"Maluku Utara",bpsCode:82,vehiclePlate:["DG"],tel:h(910,931),zipCode:[{from:97711,to:97869}]},NB:{name:"Nusa Tenggara Barat",bpsCode:52,vehiclePlate:["DR","EA"],tel:h(370,376).concat([364]),zipCode:[{from:83115,to:84459}]},NT:{name:"Nusa Tenggara Timur",bpsCode:53,vehiclePlate:["DH","EB","ED"],tel:h(380,389),zipCode:[{from:85111,to:87284}]},PA:{name:"Papua",bpsCode:94,vehiclePlate:["PA"],tel:h(951,986).concat([901,902]),zipCode:[{from:98511,to:99976}]},PB:{name:"Papua Barat",bpsCode:91,vehiclePlate:["PB"],tel:h(951,986).concat([901,902]),zipCode:[{from:98011,to:98495}]},RI:{name:"Riau",bpsCode:14,vehiclePlate:["BM"],tel:h(760,769).concat([624]),zipCode:[{from:28111,to:29569}]},SA:{name:"Sulawesi Utara",bpsCode:71,vehiclePlate:["DB","DL"],tel:h(430,438),zipCode:[{from:95111,to:95999}]},SB:{name:"Sumatra Barat",bpsCode:13,vehiclePlate:["BA"],tel:h(751,759),zipCode:[{from:25111,to:27779}]},SG:{name:"Sulawesi Tenggara",bpsCode:74,vehiclePlate:["DT"],tel:h(401,408),zipCode:[{from:93111,to:93963}]},SN:{name:"Sulawesi Selatan",bpsCode:73,vehiclePlate:["DD","DP","DW"],tel:h(410,421).concat(h(471,485)).concat([423,427]),zipCode:[{from:90111,to:91273},{from:91611,to:92985}]},SR:{name:"Sulawesi Barat",bpsCode:76,vehiclePlate:["DC"],tel:[422,426,428],zipCode:[{from:91311,to:91591}]},SS:{name:"Sumatra Selatan",bpsCode:16,vehiclePlate:["BG"],tel:h(711,714).concat(h(730,735)).concat([702]),zipCode:[{from:30111,to:32388}]},ST:{name:"Sulawesi Tengah",bpsCode:72,vehiclePlate:["DN"],tel:h(445,465),zipCode:[{from:94111,to:94981}]},SU:{name:"Sumatra Utara",bpsCode:12,vehiclePlate:["BB","BK"],tel:h(620,639).concat([601]),zipCode:[{from:20111,to:22999}]},YO:{name:"Yogyakarta",bpsCode:34,vehiclePlate:["AB"],tel:[274],zipCode:[{from:55111,to:55893}]}},C=Object.keys(g),B=new(function(){function t(){this.VALID_BPSCODE=Object.keys(g).reduce((function(e,t){return e.concat(g[t].bpsCode)}),[])}return t.prototype.isValid=function(t){if(!t)return!1;var n=m.exec(e(t));return!!n&&(this.isValidLength(n[0].length)&&this.isValidProvince(parseInt(n[1]))&&this.isValidBirthday(n[4]))},t.prototype.isValidLength=function(e){return 16==e},t.prototype.isValidProvince=function(e){return this.VALID_BPSCODE.includes(e)},t.prototype.isValidBirthday=function(e){var t=/(\d{2})(\d{2})(\d{2})/.exec(e);if(!t)return!1;var n=parseInt(t[1]),i=parseInt(t[2]),a=parseInt(t[3]);n>40&&(n-=40);var r=new Date("19"+a+"-"+i+"-"+n);return!isNaN(r.getTime())},t}());var V=/^([0-9]{8})([0-9]{6})([1,2]{1})([0-9]{3})$/,P=new(function(){function t(){}return t.prototype.isValid=function(t){if(!t||"string"!=typeof t)return!1;var n=V.exec(e(t));return!!n&&(this.isValidLength(n[0].length)&&this.isValidDate(n[1])&&this.isValidDate(n[2]))},t.prototype.isValidLength=function(e){return 18==e},t.prototype.isValidDate=function(e){var t=e.replace(/(\d{4})(\d{2})(?:(\d{2})?)/,"$1-$2-$3"),n=new Date(t);return!isNaN(n.getTime())},t}());var v=/^(\d{3})(\d{3})(\d{4})$/,I=new(function(){function t(){}return t.prototype.isValid=function(t){if(!t||"string"!=typeof t)return!1;if(!this.isValidLength(t.length))return!1;var n=v.exec(e(t));return!!n&&this.isValidPeriod(n[1])},t.prototype.isValidLength=function(e){return 10==e},t.prototype.isValidPeriod=function(e){var t=(new Date).getFullYear(),n=t-22,i=parseInt(e)+2e3;return i>t&&(i-=1e3),!(i<n)},t}());var y=/^(\d{2})(\d{3})(\d{3})(\d{1})(\d{3})(\d{3})$/,A=["01","02","21","31","00","20","04","05","06","07","08","09","24","25","26","31","34","35","36","47","48","49","57","58","67","77","78","79","87","88","89","97"],x=[1,4,7,11],D=[8],b=new(function(){function t(){}return t.prototype.isValid=function(t){if(!t||"string"!=typeof t)return!1;var n=e(t);if(!this.isValidLength(n.length))return!1;var i=y.exec(n);return!!i&&this.isValidTaxIdentity(i[1])},t.prototype.isValidLength=function(e){return 15==e},t.prototype.isValidTaxIdentity=function(e){return A.includes(e)},t.prototype.format=function(t,n){void 0===n&&(n=!0);var i=e(t);return n&&(i=i.padStart(15,"0")),i.slice(0,15).split("").reduce((function(e,t,n){var a=""+e+t;if(n!==i.length-1){if(x.includes(n))return a+".";if(D.includes(n))return a+"-"}return a}),"")},t}());var S=new(function(){function e(){this.VALID_TELEPHONE_AREACODE=Object.keys(g).reduce((function(e,t){return e.concat(g[t].tel)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=a(e);return this.isValidCellularPrefix(t)},e.prototype.isValidCellularPrefix=function(e){return this.VALID_TELEPHONE_AREACODE.includes(Number(e.substr(1,2)))||this.VALID_TELEPHONE_AREACODE.includes(Number(e.substr(1,3)))},e}());var N=/^([A-Z]{1,2})(\d{1,4})([A-Z]{1,3})$/,T=new(function(){function e(){this.VALID_TNKB_AREACODE=Object.keys(g).reduce((function(e,t){return e.concat(g[t].vehiclePlate)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=e.toUpperCase(),n=N.exec(t);return!!n&&this.isValidTNKBArea(n)},e.prototype.isValidTNKBArea=function(e){return this.VALID_TNKB_AREACODE.includes(e[1])},e}());var L=new(function(){function e(){this.VALID_ZIPCODE=Object.keys(g).reduce((function(e,t){return e.concat(g[t].zipCode)}),[])}return e.prototype.isValid=function(e){if(!e)return!1;var t=e.toString();return this.isValidLength(t)&&this.isValidZIPCode(t)},e.prototype.isValidLength=function(e){return 5==e.length},e.prototype.isValidZIPCode=function(e){for(var t=0,n=this.VALID_ZIPCODE;t<n.length;t++){var i=n[t];if(i.from<=e&&i.to<=e)return!0}return!1},e}());var k=new(function(){function e(){}return e.prototype.getData=function(){return o.map((function(e){return{key:e,name:r[e].name}}))},e}());var E=new(function(){function e(){}return e.prototype.getData=function(){return C.map((function(e){return{key:e,name:g[e].name}}))},e}());exports.formatCCNumber=function(e){return s.format(e)},exports.formatDate=function(e){var t=e.replace(/(\d{4})(\d{2})(?:(\d{2})?)/,"$1-$2-$3");return new Date(t)},exports.formatNPWP=function(e,t){return void 0===t&&(t=!0),b.format(e,t)},exports.getBankData=function(){return k.getData()},exports.getProvinceData=function(){return E.getData()},exports.isValidATMNumber=function(e,t){return d.isValid(e,t)},exports.isValidCCNumber=function(e){return s.isValid(e)},exports.isValidCellularNumber=function(e){return c.isValid(e)},exports.isValidEmail=function(e){return f.isValid(e)},exports.isValidNIK=function(e){return B.isValid(e)},exports.isValidNIP=function(e){return P.isValid(e)},exports.isValidNISN=function(e){return I.isValid(e)},exports.isValidNPWP=function(e){return b.isValid(e)},exports.isValidTNKB=function(e){return T.isValid(e)},exports.isValidTelephoneNumber=function(e){return S.isValid(e)},exports.isValidZIP=function(e){return L.isValid(e)},exports.numbersOnly=e,exports.parseCellularPrefix=i,exports.parseTelephoneAreaCode=a; | ||
//# sourceMappingURL=nusantara-valid.min.js.map | ||
/*! | ||
* Nusantara Valid v0.2.0 | ||
* Copyright 2020 - Fajar Setya Budi (https://magicjar.github.io) | ||
* Contributors (https://github.com/magicjar/nusantara-valid/graphs/contributors) | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
*/ | ||
"use strict";function numbersOnly(e){return String(e).replace(/[^\d]/g,"")}function cleanPhoneNumbers(e,t){void 0===t&&(t={});var n=t.cellular,a=void 0!==n&&n,r=t.countryCode,i=void 0===r?0:r,o=String(e).replace(/[^\d]/g,"").replace(/^0+/,"");return a&&Number(o.substr(0,2))===i&&(o=o.substring(2)),o}function correctLength(e,t,n){var a=n.collection,r=void 0===a?[]:a,i=n.minLength,o=void 0===i?0:i,l=n.maxLength,u=void 0===l?0:l;switch(e){case 0:return t==o;case 1:return t>=o&&t<=u;case 2:return r.includes(t);default:return!1}}function formatDate(e){return new Date(numbersOnly(e).replace(/(\d{4})(?:(\d{2})?)(?:(\d{2})?)/,"$1-$2-$3"))}function includes(e,t){return e.indexOf(t)>-1}Object.defineProperty(exports,"__esModule",{value:!0});var range=function(e,t){for(var n=[],a=e;a<=t;a++)n=n.concat(a);return n},BANK_DATA={BCAK:{name:"Bank Central Asia",digits:10,dotIndex:[]},BCAS:{name:"Bank Central Asia Syariah",digits:10,dotIndex:[]},BNIK:{name:"Bank Negara Indonesia",digits:10,dotIndex:[]},BNIS:{name:"Bank Negara Indonesia Syariah",digits:10,dotIndex:[]},BRIK:{name:"Bank Rakyat Indonesia",digits:15,dotIndex:[]},BRIS:{name:"Bank Rakyat Indonesia Syariah",digits:10,dotIndex:[]},BTNK:{name:"Bank Tabungan Negara",digits:16,dotIndex:[]},BTNS:{name:"Bank Tabungan Negara Syariah",digits:10,dotIndex:[]},BTPK:{name:"Bank Tabungan Pensiunan Nasional",digits:11,dotIndex:[]},BTPS:{name:"Bank Tabungan Pensiunan Nasional Syariah",digits:10,dotIndex:[]},BUKK:{name:"Bank Bukopin",digits:10,dotIndex:[]},BUKS:{name:"Bank Bukopin Syariah",digits:10,dotIndex:[]},CMBK:{name:"Bank CIMB Niaga",digits:13,dotIndex:[]},CMBS:{name:"Bank CIMB Niaga Syariah",digits:13,dotIndex:[]},DNMK:{name:"Bank Danamon",digits:10,dotIndex:[]},DNMS:{name:"Bank Danamon Syariah",digits:10,dotIndex:[]},MDRK:{name:"Bank Mandiri",digits:13,dotIndex:[]},MDRS:{name:"Bank Mandiri Syariah",digits:10,dotIndex:[]},MGAK:{name:"Bank Mega",digits:15,dotIndex:[]},MGAS:{name:"Bank Mega Syariah",digits:10,dotIndex:[]},MUAM:{name:"Bank Muamalat",digits:10,dotIndex:[]},PMTK:{name:"Bank Permata",digits:10,dotIndex:[]},PMTS:{name:"Bank Permata Syariah",digits:10,dotIndex:[]},PNBK:{name:"Panin Bank",digits:10,dotIndex:[]},PNBS:{name:"Panin Bank Syariah",digits:10,dotIndex:[]}},BANK_KEYS=Object.keys(BANK_DATA),ATMNumber=function(){function e(){this.VALID_ATMNUMBER_LENGTH=BANK_KEYS.reduce((function(e,t){return includes(e,BANK_DATA[t].digits)?e:e.concat(BANK_DATA[t].digits)}),[])}return e.prototype.isValid=function(e,t){if(void 0===t&&(t=""),!e||"string"!=typeof e)return!1;var n=numbersOnly(e),a=correctLength(2,n.length,{collection:this.VALID_ATMNUMBER_LENGTH});return t&&(a=correctLength(0,n.length,{minLength:BANK_DATA[t].digits})),a},e}(),theATM=new ATMNumber;function isValidATMNumber(e){return theATM.isValid(e)}function isValidATMNumberWithComparison(e,t){return void 0===t&&(t=""),theATM.isValid(e,t)}var Bank=function(){function e(){}return e.prototype.getData=function(e){return void 0===e&&(e=""),e?{key:e,name:BANK_DATA[e].name}:BANK_KEYS.map((function(e){return{key:e,name:BANK_DATA[e].name}}))},e}(),bank=new Bank;function getDataBank(e){return bank.getData(e)}function getDataBanks(){return bank.getData()}var CELLULAR_PROVIDER_DATA={TELKOMSEL:{name:"Telkomsel",prefix:range(811,813).concat(range(821,823)).concat(range(851,853))},INDOSAT:{name:"Indosat Ooredoo",prefix:range(814,816).concat(range(855,858))},XL:{name:"XL Axiata",prefix:range(817,819).concat([859,877,878])},TRI:{name:"Hutchinson Tri",prefix:range(895,899)},SMARTFREN:{name:"Smartfren",prefix:range(881,889)},AXIS:{name:"AXIS",prefix:range(831,833).concat([838])}},CELLULAR_MIN_LENGTH=10,CELLULAR_MAX_LENGTH=12,CELLULAR_HYPEN_INDEXES=[2,6],CELLULAR_PROVIDER_KEYS=Object.keys(CELLULAR_PROVIDER_DATA),PROVINCE_DATA={AC:{name:"Aceh",bpsCode:11,vehiclePlate:["BL"],tel:range(641,659).concat([627,629]),zipCode:[{from:23111,to:24794}]},BA:{name:"Bali",bpsCode:51,vehiclePlate:["DK"],tel:range(361,368),zipCode:[{from:80111,to:82262}]},BB:{name:"Kepulauan Bangka Belitung",bpsCode:19,vehiclePlate:["BN"],tel:range(715,719),zipCode:[{from:33111,to:33792}]},BE:{name:"Bengkulu",bpsCode:17,vehiclePlate:["BD"],tel:range(736,739).concat([732]),zipCode:[{from:38113,to:39377}]},BT:{name:"Banten",bpsCode:36,vehiclePlate:["A"],tel:range(252,257),zipCode:[{from:15111,to:15820},{from:42111,to:42455}]},GO:{name:"Gorontalo",bpsCode:75,vehiclePlate:["DM"],tel:[435,443],zipCode:[{from:96111,to:96574}]},JA:{name:"Jambi",bpsCode:15,vehiclePlate:["BH"],tel:range(740,748),zipCode:[{from:36111,to:37574}]},JB:{name:"Jawa Barat",bpsCode:32,vehiclePlate:["D","E","F","T","Z"],tel:range(231,234).concat(range(260,267)).concat([22,251]),zipCode:[{from:16110,to:17730},{from:40111,to:46476}]},JI:{name:"Jawa Timur",bpsCode:35,vehiclePlate:["L","M","N","P","S","W","AE","AG"],tel:range(321,358).concat([31]),zipCode:[{from:60111,to:69493}]},JK:{name:"Jakarta",bpsCode:31,vehiclePlate:["B"],tel:[21],zipCode:[{from:10110,to:14540}]},JT:{name:"Jawa Tengah",bpsCode:33,vehiclePlate:["G","H","K","R","AA","AD"],tel:range(275,299).concat(range(271,273)).concat([24,356]),zipCode:[{from:50111,to:54474},{from:56111,to:59584}]},KB:{name:"Kalimantan Barat",bpsCode:61,vehiclePlate:["KB"],tel:range(564,568).concat([534]),zipCode:[{from:78111,to:79682}]},KI:{name:"Kalimantan Timur",bpsCode:64,vehiclePlate:["KT"],tel:range(541,556),zipCode:[{from:75111,to:77381}]},KR:{name:"Kepulauan Riau",bpsCode:21,vehiclePlate:["BP"],tel:range(771,779),zipCode:[{from:29111,to:29878}]},KS:{name:"Kalimantan Selatan",bpsCode:63,vehiclePlate:["DA"],tel:range(511,527),zipCode:[{from:70111,to:72276}]},KT:{name:"Kalimantan Tengah",bpsCode:62,vehiclePlate:["KH"],tel:range(513,539),zipCode:[{from:73111,to:74874}]},KU:{name:"Kalimantan Utara",bpsCode:65,vehiclePlate:["KU"],tel:range(551,556),zipCode:[{from:77111,to:77574}]},LA:{name:"Lampung",bpsCode:18,vehiclePlate:["BE"],tel:range(721,729),zipCode:[{from:34111,to:35686}]},MA:{name:"Maluku",bpsCode:81,vehiclePlate:["DE"],tel:range(910,931),zipCode:[{from:97114,to:97669}]},MU:{name:"Maluku Utara",bpsCode:82,vehiclePlate:["DG"],tel:range(910,931),zipCode:[{from:97711,to:97869}]},NB:{name:"Nusa Tenggara Barat",bpsCode:52,vehiclePlate:["DR","EA"],tel:range(370,376).concat([364]),zipCode:[{from:83115,to:84459}]},NT:{name:"Nusa Tenggara Timur",bpsCode:53,vehiclePlate:["DH","EB","ED"],tel:range(380,389),zipCode:[{from:85111,to:87284}]},PA:{name:"Papua",bpsCode:94,vehiclePlate:["PA"],tel:range(951,986).concat([901,902]),zipCode:[{from:98511,to:99976}]},PB:{name:"Papua Barat",bpsCode:91,vehiclePlate:["PB"],tel:range(951,986).concat([901,902]),zipCode:[{from:98011,to:98495}]},RI:{name:"Riau",bpsCode:14,vehiclePlate:["BM"],tel:range(760,769).concat([624]),zipCode:[{from:28111,to:29569}]},SA:{name:"Sulawesi Utara",bpsCode:71,vehiclePlate:["DB","DL"],tel:range(430,438),zipCode:[{from:95111,to:95999}]},SB:{name:"Sumatra Barat",bpsCode:13,vehiclePlate:["BA"],tel:range(751,759),zipCode:[{from:25111,to:27779}]},SG:{name:"Sulawesi Tenggara",bpsCode:74,vehiclePlate:["DT"],tel:range(401,408),zipCode:[{from:93111,to:93963}]},SN:{name:"Sulawesi Selatan",bpsCode:73,vehiclePlate:["DD","DP","DW"],tel:range(410,421).concat(range(471,485)).concat([423,427]),zipCode:[{from:90111,to:91273},{from:91611,to:92985}]},SR:{name:"Sulawesi Barat",bpsCode:76,vehiclePlate:["DC"],tel:[422,426,428],zipCode:[{from:91311,to:91591}]},SS:{name:"Sumatra Selatan",bpsCode:16,vehiclePlate:["BG"],tel:range(711,714).concat(range(730,735)).concat([702]),zipCode:[{from:30111,to:32388}]},ST:{name:"Sulawesi Tengah",bpsCode:72,vehiclePlate:["DN"],tel:range(445,465),zipCode:[{from:94111,to:94981}]},SU:{name:"Sumatra Utara",bpsCode:12,vehiclePlate:["BB","BK"],tel:range(620,639).concat([601]),zipCode:[{from:20111,to:22999}]},YO:{name:"Yogyakarta",bpsCode:34,vehiclePlate:["AB"],tel:[274],zipCode:[{from:55111,to:55893}]}},COUNTRY_CODE=62,PROVINCE_KEYS=Object.keys(PROVINCE_DATA),CellularNumber=function(){function e(){this.CELLULAR_PROVIDER_PREFIXES=CELLULAR_PROVIDER_KEYS.reduce((function(e,t){return e.concat(CELLULAR_PROVIDER_DATA[t].prefix)}),[])}return e.prototype.isValid=function(e,t){if(void 0===t&&(t=""),!e||"string"!=typeof e)return!1;var n,a=cleanPhoneNumbers(e,{cellular:!0,countryCode:COUNTRY_CODE}),r=correctLength(1,a.length,{minLength:CELLULAR_MIN_LENGTH,maxLength:CELLULAR_MAX_LENGTH});return n=t?CELLULAR_PROVIDER_DATA[t].prefix:this.CELLULAR_PROVIDER_PREFIXES,r&&this.isValidCellularProviderPrefix(Number(a.substr(0,3)),n)},e.prototype.isValidCellularProviderPrefix=function(e,t){return includes(t,e)},e.prototype.getData=function(e){var t={};t.number=this.format(e);for(var n=Number(cleanPhoneNumbers(e,{cellular:!0,countryCode:COUNTRY_CODE}).substr(0,3)),a=0,r=CELLULAR_PROVIDER_KEYS;a<r.length;a++){var i=r[a],o=CELLULAR_PROVIDER_DATA[i];if(includes(o.prefix,n)){t.provider={key:i,name:o.name};break}}return t},e.prototype.format=function(e,t){void 0===t&&(t=!1);var n=cleanPhoneNumbers(e,{cellular:!0,countryCode:COUNTRY_CODE}),a=n.slice(0,n.length).split("").reduce((function(e,t,a){var r=""+e+t;return a!==n.length-1&&includes(CELLULAR_HYPEN_INDEXES,a)?r+"-":r}),"");return t?"+"+COUNTRY_CODE.toString()+a:"0"+a},e}(),cellularNumber=new CellularNumber;function isValidCellularNumber(e){return cellularNumber.isValid(e)}function isValidCellularNumberWithComparison(e,t){return cellularNumber.isValid(e,t)}function getDataCellularNumber(e){return cellularNumber.getData(e)}function formatCellularNumber(e,t){return void 0===t&&(t=!1),cellularNumber.format(e,t)}var CellularProvider=function(){function e(){}return e.prototype.getData=function(e){return void 0===e&&(e=""),e?{key:e,name:CELLULAR_PROVIDER_DATA[e].name}:CELLULAR_PROVIDER_KEYS.map((function(e){return{key:e,name:CELLULAR_PROVIDER_DATA[e].name}}))},e}(),isp=new CellularProvider;function getDataCellularProvider(e){return isp.getData(e)}function getDataCellularProviders(){return isp.getData()}var CC_LENGTH=16,CC_VALID_MII=["4","5"],CC_SPACE_INDEXES=[3,7,11,11],CreditCard=function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=numbersOnly(e);return this.isValidMII(e.charAt(0))&&correctLength(0,t.length,{minLength:CC_LENGTH})},e.prototype.isValidMII=function(e){return includes(CC_VALID_MII,e)},e.prototype.format=function(e){var t=numbersOnly(e);return t.slice(0,CC_LENGTH).split("").reduce((function(e,n,a){var r=""+e+n;return a!==t.length-1&&includes(CC_SPACE_INDEXES,a)?r+" ":r}),"")},e}(),cc=new CreditCard;function isValidCCNumber(e){return cc.isValid(e)}function formatCCNumber(e){return cc.format(e)}var EMAIL_REGEX=/^([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/,MAX_LOCALPART_LENGTH=64,MAX_EMAIL_LENGTH=254,Email=function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=EMAIL_REGEX.exec(e);return null!==t&&correctLength(1,t[0].length,{minLength:1,maxLength:MAX_EMAIL_LENGTH})&&correctLength(1,t[1].length,{minLength:1,maxLength:MAX_LOCALPART_LENGTH})},e}(),theEmail=new Email;function isValidEmail(e){return theEmail.isValid(e)}var NIK_REGEX=/^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/,NIK_LENGTH=16,NomorIndukKependudukan=function(){function e(){this.VALID_BPSCODE=PROVINCE_KEYS.reduce((function(e,t){return e.concat(PROVINCE_DATA[t].bpsCode)}),[])}return e.prototype.isValid=function(e,t,n){if(void 0===t&&(t=""),void 0===n&&(n=""),!e||"string"!=typeof e)return!1;var a=NIK_REGEX.exec(numbersOnly(e));if(!a)return!1;var r=correctLength(0,a[0].length,{minLength:NIK_LENGTH}),i=this.reformatBirthday(a[4]),o=includes(this.VALID_BPSCODE,parseInt(a[1])),l=!isNaN(formatDate("19"+i).getTime());(t&&PROVINCE_DATA[t].bpsCode!=a[1]&&(o=!1),n)&&(i!=numbersOnly(n).substring(2,8)&&(l=!1));return r&&o&&l},e.prototype.reformatBirthday=function(e){var t=/(\d{2})(\d{2})(\d{2})/.exec(e);if(t){var n=t[1],a=t[2],r=t[3];return Number(n)>40&&(n=(Number(n)-40).toString()),r+""+a+n}return""},e.prototype.getData=function(e){var t=NIK_REGEX.exec(numbersOnly(e)),n={};if(!t)return n;n.nik=t[0],n.sex=Number(t[4].substr(0,2))>40?"Female":"Male";var a=this.reformatBirthday(t[4]),r=includes(this.VALID_BPSCODE,parseInt(t[1])),i=!isNaN(formatDate("19"+a).getTime());if(r){for(var o={},l=0,u=PROVINCE_KEYS;l<u.length;l++){var d=u[l],s=PROVINCE_DATA[d];if(s.bpsCode==t[1]){o.key=d,o.name=s.name;break}}n.province=o}if(i){var c=(new Date).getFullYear(),m=Number(a.substr(0,2))+2e3,N=a.substring(2,6);m>c&&(m-=100),n.birthday=new Date(formatDate(m+""+N))}return n},e}(),theNIK=new NomorIndukKependudukan;function isValidNIK(e){return theNIK.isValid(e)}function isValidNIKWithComparison(e,t){var n=t.provinceKey,a=void 0===n?"":n,r=t.birthday,i=void 0===r?"":r;return theNIK.isValid(e,a,i)}function getDataNIK(e){return theNIK.getData(e)}var NIP_REGEX=/^(\d{8})(\d{6})([1,2]{1})(\d{3})$/,NIP_LENGTH=18,NomorIndukPegawaiNegeriSipil=function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=NIP_REGEX.exec(numbersOnly(e));return null!==t&&!isNaN(formatDate(t[1]).getTime())&&!isNaN(formatDate(t[2]).getTime())&&correctLength(0,t[0].length,{minLength:NIP_LENGTH})},e.prototype.getData=function(e){var t={},n=NIP_REGEX.exec(numbersOnly(e));return n?(t.nip=n[0],t.birthday=formatDate(n[1]),t.recruit_date=n[2].substr(0,4)+"-"+n[2].substr(4,2),t.sex=1==Number(n[3])?"Male":"Female",t):t},e}(),theNIP=new NomorIndukPegawaiNegeriSipil;function isValidNIP(e){return theNIP.isValid(e)}function getDataNIP(e){return theNIP.getData(e)}var NISN_REGEX=/^(\d{3})(\d{3})(\d{4})$/,NISN_LENGTH=10,NISN_AGE_VALIDITY=22,NomorIndukSiswaNasional=function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=NISN_REGEX.exec(numbersOnly(e));return null!==t&&this.isValidPeriod(t[1])&&correctLength(0,t[0].length,{minLength:NISN_LENGTH})},e.prototype.isValidPeriod=function(e){var t=(new Date).getFullYear(),n=t-NISN_AGE_VALIDITY,a=parseInt(e)+2e3;return a>t&&(a-=1e3),!(a<n)},e}(),theNISN=new NomorIndukSiswaNasional;function isValidNISN(e){return theNISN.isValid(e)}var NPWP_REGEX=/^(\d{2})(\d{3})(\d{3})(\d{1})(\d{3})(\d{3})$/,NPWP_LENGTH=15,NPWP_TAX_IDENTITIES=["01","02","21","31","00","20","04","05","06","07","08","09","24","25","26","31","34","35","36","47","48","49","57","58","67","77","78","79","87","88","89","97"],NPWP_DOT_INDEXES=[1,4,7,11],NPWP_HYPHEN_INDEXES=[8],NomorPokokWajibPajak=function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=numbersOnly(e),n=NPWP_REGEX.exec(t);return null!==n&&this.isValidTaxIdentity(n[1])&&correctLength(0,n[0].length,{minLength:NPWP_LENGTH})},e.prototype.isValidTaxIdentity=function(e){return includes(NPWP_TAX_IDENTITIES,e)},e.prototype.format=function(e){var t=numbersOnly(e);return t.slice(0,NPWP_LENGTH).split("").reduce((function(e,n,a){var r=""+e+n;if(a!==t.length-1){if(includes(NPWP_DOT_INDEXES,a))return r+".";if(includes(NPWP_HYPHEN_INDEXES,a))return r+"-"}return r}),"")},e}(),theNPWP=new NomorPokokWajibPajak;function isValidNPWP(e){return theNPWP.isValid(e)}function formatNPWP(e){return theNPWP.format(e)}var Province=function(){function e(){}return e.prototype.getData=function(e){return void 0===e&&(e=""),e?{key:e,name:PROVINCE_DATA[e].name}:PROVINCE_KEYS.map((function(e){return{key:e,name:PROVINCE_DATA[e].name}}))},e}(),prov=new Province;function getDataProvince(e){return prov.getData(e)}function getDataProvinces(){return prov.getData()}var TelephoneNumber=function(){function e(){this.VALID_TELEPHONE_AREACODE=PROVINCE_KEYS.reduce((function(e,t){return e.concat(PROVINCE_DATA[t].tel)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=cleanPhoneNumbers(e);return!isNaN(this.isValidCellularPrefix(t))},e.prototype.isValidCellularPrefix=function(e){var t=Number(e.substr(0,2));return includes(this.VALID_TELEPHONE_AREACODE,t)?t:(t=Number(e.substr(0,3)),includes(this.VALID_TELEPHONE_AREACODE,t)?t:NaN)},e.prototype.getData=function(e){var t={},n=cleanPhoneNumbers(e);t.number=this.format(n);for(var a=this.isValidCellularPrefix(n),r=0,i=PROVINCE_KEYS;r<i.length;r++){var o=i[r],l=PROVINCE_DATA[o];if(includes(l.tel,a)){t.origin={key:o,name:l.name};break}}return t},e.prototype.format=function(e,t){void 0===t&&(t=!1);var n=cleanPhoneNumbers(e),a=this.isValidCellularPrefix(n).toString(),r=[];r=2===a.length?[1]:[2];var i=n.slice(0,n.length).split("").reduce((function(e,t,a){var i=""+e+t;return a!==n.length-1&&includes(r,a)?i+"-":i}),"");return t?"+"+COUNTRY_CODE+i:"0"+i},e}(),telNumber=new TelephoneNumber;function isValidTelephoneNumber(e){return telNumber.isValid(e)}function getDataTelephoneNumber(e){return telNumber.getData(e)}function formatTelephoneNumber(e,t){return void 0===t&&(t=!1),telNumber.format(e,t)}var TNKB_REGEX=/^([A-Z]{1,2})(\d{1,4})([A-Z]{1,3})$/,TandaNomorKendaraanBermotor=function(){function e(){this.VALID_TNKB_AREACODE=PROVINCE_KEYS.reduce((function(e,t){return e.concat(PROVINCE_DATA[t].vehiclePlate)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=e.toUpperCase(),n=TNKB_REGEX.exec(t);return null!==n&&this.isValidTNKBArea(n[1])},e.prototype.isValidTNKBArea=function(e){return includes(this.VALID_TNKB_AREACODE,e)},e.prototype.getData=function(e){var t={},n=e.toUpperCase(),a=TNKB_REGEX.exec(n);if(!a)return t;for(var r=0,i=PROVINCE_KEYS;r<i.length;r++){var o=i[r],l=PROVINCE_DATA[o];if(includes(l.vehiclePlate,a[1])){t={areaCode:a[1],index:Number(a[2]),detailedAreaCode:a[3],province:{key:o,name:l.name}};break}}return t},e}(),theTNKB=new TandaNomorKendaraanBermotor;function isValidTNKB(e){return theTNKB.isValid(e)}function getDataTNKB(e){return theTNKB.getData(e)}var ZIPCode=function(){function e(){this.ZIP_RANGE=PROVINCE_KEYS.reduce((function(e,t){return e.concat(PROVINCE_DATA[t].zipCode)}),[])}return e.prototype.isValid=function(e,t){if(void 0===t&&(t=""),!e)return!1;var n=this.ZIP_RANGE,a=correctLength(0,(e=e.toString()).length,{minLength:5});return t&&(n=PROVINCE_DATA[t].zipCode),a&&this.isValidZIPCode(e,n)},e.prototype.isValidZIPCode=function(e,t){for(var n=0,a=t;n<a.length;n++){var r=a[n];if(r.from<=e&&r.to>=e)return!0}return!1},e}(),theZIP=new ZIPCode;function isValidZIP(e){return theZIP.isValid(e)}function isValidZIPWithComparison(e,t){var n=t.provinceKey,a=void 0===n?"":n;return theZIP.isValid(e,a)}exports.cleanPhoneNumbers=cleanPhoneNumbers,exports.correctLength=correctLength,exports.formatCCNumber=formatCCNumber,exports.formatCellularNumber=formatCellularNumber,exports.formatDate=formatDate,exports.formatNPWP=formatNPWP,exports.formatTelephoneNumber=formatTelephoneNumber,exports.getDataBank=getDataBank,exports.getDataBanks=getDataBanks,exports.getDataCellularNumber=getDataCellularNumber,exports.getDataCellularProvider=getDataCellularProvider,exports.getDataCellularProviders=getDataCellularProviders,exports.getDataNIK=getDataNIK,exports.getDataNIP=getDataNIP,exports.getDataProvince=getDataProvince,exports.getDataProvinces=getDataProvinces,exports.getDataTNKB=getDataTNKB,exports.getDataTelephoneNumber=getDataTelephoneNumber,exports.includes=includes,exports.isValidATMNumber=isValidATMNumber,exports.isValidATMNumberWithComparison=isValidATMNumberWithComparison,exports.isValidCCNumber=isValidCCNumber,exports.isValidCellularNumber=isValidCellularNumber,exports.isValidCellularNumberWithComparison=isValidCellularNumberWithComparison,exports.isValidEmail=isValidEmail,exports.isValidNIK=isValidNIK,exports.isValidNIKWithComparison=isValidNIKWithComparison,exports.isValidNIP=isValidNIP,exports.isValidNISN=isValidNISN,exports.isValidNPWP=isValidNPWP,exports.isValidTNKB=isValidTNKB,exports.isValidTelephoneNumber=isValidTelephoneNumber,exports.isValidZIP=isValidZIP,exports.isValidZIPWithComparison=isValidZIPWithComparison,exports.numbersOnly=numbersOnly,exports.range=range; | ||
//# sourceMappingURL=nusantara-valid.min.js.map |
@@ -0,1 +1,7 @@ | ||
/*! | ||
* Nusantara Valid v0.2.0 | ||
* Copyright 2020 - Fajar Setya Budi (https://magicjar.github.io) | ||
* Contributors (https://github.com/magicjar/nusantara-valid/graphs/contributors) | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
*/ | ||
(function (global, factory) { | ||
@@ -7,2 +13,8 @@ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | ||
/** | ||
* Strip all non number characters | ||
* | ||
* @param {string | number} input - Input parameter. Can be string or number | ||
* @return {string} Clean number. Free from any non number characters. | ||
**/ | ||
function numbersOnly(input) { | ||
@@ -12,78 +24,81 @@ return String(input).replace(/[^\d]/g, ''); | ||
var range = function (start, stop) { return Array.from({ length: (stop - start) / 1 + 1 }, function (_, i) { return start + (i * 1); }); }; | ||
/** | ||
* CELLULAR_NUMBER | ||
* Clean up phone number from leading zero, formating, and country code. | ||
* | ||
* List cellular provider in Indonesia | ||
* @param {string} number - The dirty number. | ||
* @param {object} type - The number type, landline number or cellular number and the country code. | ||
* @return {string} Clean number. Free from leading zero, formating, and country code for mobile number. | ||
**/ | ||
var CELLULAR_NUMBER = { | ||
TELKOMSEL: { | ||
name: 'Telkomsel', | ||
prefix: range(811, 813).concat(range(821, 823)).concat(range(851, 853)), | ||
}, | ||
INDOSAT: { | ||
name: 'Indosat Ooredoo', | ||
prefix: range(814, 816).concat(range(855, 858)), | ||
}, | ||
XL: { | ||
name: 'XL Axiata', | ||
prefix: range(817, 819).concat([859, 877, 878]), | ||
}, | ||
TRI: { | ||
name: 'Hutchinson Tri', | ||
prefix: range(895, 899), | ||
}, | ||
SMARTFREN: { | ||
name: 'Smartfren', | ||
prefix: range(881, 889), | ||
}, | ||
AXIS: { | ||
name: 'AXIS', | ||
prefix: range(831, 833).concat([838]) | ||
} | ||
}; | ||
function cleanPhoneNumbers(number, type) { | ||
if (type === void 0) { type = {}; } | ||
var _a = type.cellular, cellular = _a === void 0 ? false : _a, _b = type.countryCode, countryCode = _b === void 0 ? 0 : _b; | ||
var num = String(number).replace(/[^\d]/g, '').replace(/^0+/, ''); | ||
if (cellular && (Number(num.substr(0, 2)) === countryCode)) | ||
num = num.substring(2); | ||
return num; | ||
} | ||
/** | ||
* CELLULAR_MIN_LENGTH | ||
* Check the length | ||
* | ||
* Minimum length of cellular number including country code | ||
* @param {number} mode - 0 = exact, 1 = between, 2 = includes | ||
* @param {number} length - The length | ||
* @param {object} options - The options to be checking with { collection: Array of numbers, minLength: The minimum length, maxLength: The maximum length } | ||
* @return {boolean} Correct or not | ||
**/ | ||
var CELLULAR_MIN_LENGTH = 11; | ||
function correctLength(mode, length, options) { | ||
var _a = options.collection, collection = _a === void 0 ? [] : _a, _b = options.minLength, minLength = _b === void 0 ? 0 : _b, _c = options.maxLength, maxLength = _c === void 0 ? 0 : _c; | ||
switch (mode) { | ||
case 0: | ||
return length == minLength; | ||
case 1: | ||
return length >= minLength && length <= maxLength; | ||
case 2: | ||
return collection.includes(length); | ||
default: | ||
return false; | ||
} | ||
} | ||
/** | ||
* CELLULAR_MAX_LENGTH | ||
* Format date from string | ||
* | ||
* Maximum length of cellular number including country code | ||
* @param {string} date - The string date in YYYYMMDD format | ||
* @return {Date} Formated date. | ||
**/ | ||
var CELLULAR_MAX_LENGTH = 13; | ||
function formatDate(date) { | ||
return new Date(numbersOnly(date).replace(/(\d{4})(?:(\d{2})?)(?:(\d{2})?)/, "$1-$2-$3")); | ||
} | ||
/** | ||
* CELLULAR_COUNTRY_CODE | ||
* Determines whether an array includes a certain element, returning true or false as appropriate. | ||
* | ||
* The country code | ||
* @param {any[]} searchElement The element to search for. | ||
* @param {any} theElement The element we search. | ||
* @return {boolean} True or false | ||
**/ | ||
var CELLULAR_COUNTRY_CODE = 62; | ||
function parseCellularPrefix(input) { | ||
// +62xxx => 62xxx | ||
var number = String(input).replace(/[^\d]/g, ''); | ||
var newNumber = ""; | ||
// 0xxx => 62xxx | ||
if (number.charAt(0) == '0') | ||
newNumber = number.replace('0', CELLULAR_COUNTRY_CODE.toString()); | ||
return newNumber; | ||
function includes(searchElement, theElement) { | ||
return searchElement.indexOf(theElement) > -1; | ||
} | ||
function parseTelephoneAreaCode(input) { | ||
var number = String(input).replace(/[^\d]/g, ''); | ||
var newNumber = number; | ||
if (number.charAt(0) != '0') | ||
newNumber = '0' + number; | ||
return newNumber; | ||
} | ||
/** | ||
* Generate an array of number from start to stop. | ||
* | ||
* @param {number} start - First number of a range | ||
* @param {number} stop - Last number of a range | ||
* @return {number[]} Range array | ||
**/ | ||
var range = function (start, stop) { | ||
var numbers = []; | ||
for (var i = start; i <= stop; i++) | ||
numbers = numbers.concat(i); | ||
return numbers; | ||
}; | ||
function formatDate(date) { | ||
var newDate = date.replace(/(\d{4})(\d{2})(?:(\d{2})?)/, "$1-$2-$3"); | ||
var formatedDate = new Date(newDate); | ||
return formatedDate; | ||
} | ||
/** | ||
* Nusantara Valid: bank.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* BANK_DATA | ||
@@ -221,185 +236,174 @@ * | ||
}; | ||
var BANKS = Object.keys(BANK_DATA); | ||
var BANK_KEYS = Object.keys(BANK_DATA); | ||
/** | ||
* Nusantara Valid: _atmNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The ATMNumber class | ||
**/ | ||
var ATMNumber = /** @class */ (function () { | ||
function ATMNumber() { | ||
this.VALID_ATMNUMBER_LENGTH = Object.keys(BANK_DATA).reduce(function (pref, curr) { return pref.includes(BANK_DATA[curr].digits) ? pref : pref.concat(BANK_DATA[curr].digits); }, []); | ||
this.VALID_ATMNUMBER_LENGTH = BANK_KEYS.reduce(function (pref, curr) { return includes(pref, BANK_DATA[curr].digits) ? pref : pref.concat(BANK_DATA[curr].digits); }, []); | ||
} | ||
ATMNumber.prototype.isValid = function (atm, bank) { | ||
if (bank === void 0) { bank = ''; } | ||
if (!atm || typeof atm !== 'string') | ||
return false; | ||
if (bank === undefined) | ||
bank = ''; | ||
var numOnly = numbersOnly(atm); | ||
var matchLength = correctLength(2, numOnly.length, { collection: this.VALID_ATMNUMBER_LENGTH }); | ||
if (bank) | ||
return BANK_DATA[bank].digits == numOnly.length; | ||
return this.isValidLength(numOnly.length); | ||
matchLength = correctLength(0, numOnly.length, { minLength: BANK_DATA[bank].digits }); | ||
return matchLength; | ||
}; | ||
ATMNumber.prototype.isValidLength = function (length) { | ||
return this.VALID_ATMNUMBER_LENGTH.includes(length); | ||
}; | ||
return ATMNumber; | ||
}()); | ||
var atm = new ATMNumber(); | ||
function isValid(param, index) { | ||
return atm.isValid(param, index); | ||
} | ||
var theATM = new ATMNumber(); | ||
/** | ||
* CC_LENGTH | ||
* ATM number validation without comparison with bank | ||
* | ||
* Total length of Credit Card number without any special characters | ||
* It will validate ATM number based on it's length | ||
* | ||
* @param {string} atm - The atm number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
var CC_LENGTH = 16; | ||
function isValidATMNumber(atm) { | ||
return theATM.isValid(atm); | ||
} | ||
/** | ||
* CC_VALID_MII | ||
* ATM number validation with comparison with bank | ||
* | ||
* Lists of Credit Card valid MII number | ||
* It will validate ATM number based on it's length and specific Bank's length | ||
* | ||
* @param {string} atm - The atm number to be validated | ||
* @param {string} key - The bank key | ||
* @return {boolean} Is valid or not | ||
**/ | ||
var CC_VALID_MII = [ | ||
'4', '5', | ||
]; | ||
function isValidATMNumberWithComparison(atm, key) { | ||
if (key === void 0) { key = ''; } | ||
return theATM.isValid(atm, key); | ||
} | ||
/** | ||
* CC_SPACE_INDEXES | ||
* Nusantara Valid: _bank.ts | ||
* | ||
* Indexes of where are the space separator to be placed | ||
* Eg: 4000 0000 0000 0000 | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Bank class | ||
**/ | ||
var CC_SPACE_INDEXES = [3, 7, 11, 11]; | ||
var CreditCard = /** @class */ (function () { | ||
function CreditCard() { | ||
var Bank = /** @class */ (function () { | ||
function Bank() { | ||
} | ||
CreditCard.prototype.isValid = function (cc) { | ||
if (!cc || typeof cc !== 'string') | ||
return false; | ||
var numOnly = numbersOnly(cc); | ||
return this.isValidMII(cc.charAt(0)) && this.isValidLength(numOnly.length); | ||
Bank.prototype.getData = function (index) { | ||
if (index === void 0) { index = ''; } | ||
var bank; | ||
if (index) { | ||
bank = { | ||
key: index, | ||
name: BANK_DATA[index].name | ||
}; | ||
} | ||
else { | ||
bank = BANK_KEYS.map(function (key) { return ({ | ||
key: key, | ||
name: BANK_DATA[key].name, | ||
}); }); | ||
} | ||
return bank; | ||
}; | ||
CreditCard.prototype.isValidLength = function (length) { | ||
return length == CC_LENGTH; | ||
}; | ||
CreditCard.prototype.isValidMII = function (mii) { | ||
return CC_VALID_MII.includes(mii); | ||
}; | ||
CreditCard.prototype.format = function (cc) { | ||
var newCC = numbersOnly(cc); | ||
return newCC | ||
.slice(0, CC_LENGTH) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === newCC.length - 1)) { | ||
if (CC_SPACE_INDEXES.includes(index)) | ||
return result + " "; | ||
} | ||
return result; | ||
}, ''); | ||
}; | ||
return CreditCard; | ||
return Bank; | ||
}()); | ||
var cc = new CreditCard(); | ||
function isValid$1(param) { | ||
return cc.isValid(param); | ||
var bank = new Bank(); | ||
/** | ||
* Specific Bank data retreiver. | ||
* | ||
* Return a specific set of bank object data from user provided bank key | ||
* | ||
* @param {string} key - The Bank key | ||
* @return {IDataBank} The Bank data | ||
**/ | ||
function getDataBank(key) { | ||
return bank.getData(key); | ||
} | ||
function format(param) { | ||
return cc.format(param); | ||
/** | ||
* All Bank data retreiver. | ||
* | ||
* Return all bank object data as an array | ||
* | ||
* @return {IDataBank[]} Array of Bank data | ||
**/ | ||
function getDataBanks() { | ||
return bank.getData(); | ||
} | ||
var MobileNumber = /** @class */ (function () { | ||
function MobileNumber() { | ||
this.VALID_CELLULAR_PREFIX = Object.keys(CELLULAR_NUMBER).reduce(function (a, b) { return a.concat(CELLULAR_NUMBER[b].prefix); }, []); | ||
} | ||
MobileNumber.prototype.isValid = function (mobile) { | ||
if (!mobile || typeof mobile !== 'string') | ||
return false; | ||
var parsedCellularNumber = parseCellularPrefix(mobile); | ||
// Return true if isValidLength and isValidCellularPrefix all true | ||
return this.isValidLength(parsedCellularNumber) && this.isValidCellularPrefix(parsedCellularNumber); | ||
}; | ||
MobileNumber.prototype.isValidCellularPrefix = function (parsedCellularNumber) { | ||
return this.VALID_CELLULAR_PREFIX.includes(Number(parsedCellularNumber.substr(2, 3))); | ||
}; | ||
MobileNumber.prototype.isValidLength = function (phone) { | ||
return phone.length >= CELLULAR_MIN_LENGTH && phone.length <= CELLULAR_MAX_LENGTH; | ||
}; | ||
return MobileNumber; | ||
}()); | ||
var mobileNumber = new MobileNumber(); | ||
function isValid$2(param) { | ||
return mobileNumber.isValid(param); | ||
} | ||
/** | ||
* EMAIL_REGEX | ||
* by Brent Thomas | ||
* Nusantara Valid: cellular.ts | ||
* | ||
* EMAIL_REGEX[0] = The email | ||
* EMAIL_REGEX[1] = Local part of email | ||
* EMAIL_REGEX[2] = @ | ||
* EMAIL_REGEX[3] = Domain name | ||
* EMAIL_REGEX[4] = TLD | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
var EMAIL_REGEX = /^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/; | ||
/** | ||
* MAX_LOCALPART_LENGTH | ||
* CELLULAR_PROVIDER_DATA | ||
* | ||
* Maximum length of email's local part | ||
* List cellular provider in Indonesia | ||
**/ | ||
var MAX_LOCALPART_LENGTH = 64; | ||
var CELLULAR_PROVIDER_DATA = { | ||
TELKOMSEL: { | ||
name: 'Telkomsel', | ||
prefix: range(811, 813).concat(range(821, 823)).concat(range(851, 853)), | ||
}, | ||
INDOSAT: { | ||
name: 'Indosat Ooredoo', | ||
prefix: range(814, 816).concat(range(855, 858)), | ||
}, | ||
XL: { | ||
name: 'XL Axiata', | ||
prefix: range(817, 819).concat([859, 877, 878]), | ||
}, | ||
TRI: { | ||
name: 'Hutchinson Tri', | ||
prefix: range(895, 899), | ||
}, | ||
SMARTFREN: { | ||
name: 'Smartfren', | ||
prefix: range(881, 889), | ||
}, | ||
AXIS: { | ||
name: 'AXIS', | ||
prefix: range(831, 833).concat([838]) | ||
} | ||
}; | ||
/** | ||
* MAX_EMAIL_LENGTH | ||
* CELLULAR_MIN_LENGTH | ||
* | ||
* Maximum length of email | ||
* Minimum length of cellular number without leading zero or country code | ||
* 8961234123 | ||
**/ | ||
var MAX_EMAIL_LENGTH = 254; | ||
var Email = /** @class */ (function () { | ||
function Email() { | ||
} | ||
Email.prototype.isValid = function (email) { | ||
if (!email || typeof email !== 'string') | ||
return false; | ||
var validEmail = EMAIL_REGEX.exec(email); | ||
if (!validEmail) | ||
return false; | ||
// Return true if validEmail, validEmail length and email local part length is true | ||
return validEmail && this.isValidLength(validEmail); | ||
}; | ||
Email.prototype.isValidLength = function (email) { | ||
return email.length <= MAX_EMAIL_LENGTH && email[0].length <= MAX_LOCALPART_LENGTH; | ||
}; | ||
return Email; | ||
}()); | ||
var email = new Email(); | ||
function isValid$3(param) { | ||
return email.isValid(param); | ||
} | ||
var CELLULAR_MIN_LENGTH = 10; | ||
/** | ||
* NIK_REGEX | ||
* CELLULAR_MAX_LENGTH | ||
* | ||
* NIK_REGEX[0] = NIK Number has 16 digits | ||
* NIK_REGEX[1] = 2 digits of Province Code (BPS Code) | ||
* NIK_REGEX[2] = 2 digits of City or Distric Code | ||
* NIK_REGEX[3] = 2 digits of Sub Distric Code | ||
* NIK_REGEX[4] = 6 digits of Birthday with DDMMYY format, for woman DD + 40 | ||
* NIK_REGEX[5] = 4 digits of Index | ||
* Maximum length of cellular number without leading zero or country code | ||
**/ | ||
var NIK_REGEX = /^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/; | ||
var CELLULAR_MAX_LENGTH = 12; | ||
/** | ||
* NIK_LENGTH | ||
* CELLULAR_HYPEN_INDEXES | ||
* | ||
* Total length of NIK without any special characters | ||
* Indexes of where are the hypen separator to be placed on formating | ||
**/ | ||
var NIK_LENGTH = 16; | ||
var CELLULAR_HYPEN_INDEXES = [2, 6]; | ||
var CELLULAR_PROVIDER_KEYS = Object.keys(CELLULAR_PROVIDER_DATA); | ||
var range$1 = function (start, stop) { return Array.from({ length: (stop - start) / 1 + 1 }, function (_, i) { return start + (i * 1); }); }; | ||
/** | ||
* PROVINCES_DATA | ||
* Nusantara Valid: province.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* PROVINCE_DATA | ||
* | ||
* List of province data in Indonesia including BPS code, vehicle plate, | ||
* telephone numbers, and zip code. | ||
**/ | ||
var PROVINCES_DATA = { | ||
var PROVINCE_DATA = { | ||
AC: { | ||
@@ -409,3 +413,3 @@ name: 'Aceh', | ||
vehiclePlate: ['BL'], | ||
tel: range$1(641, 659).concat([627, 629]), | ||
tel: range(641, 659).concat([627, 629]), | ||
zipCode: [ | ||
@@ -422,3 +426,3 @@ { | ||
vehiclePlate: ['DK'], | ||
tel: range$1(361, 368), | ||
tel: range(361, 368), | ||
zipCode: [ | ||
@@ -435,3 +439,3 @@ { | ||
vehiclePlate: ['BN'], | ||
tel: range$1(715, 719), | ||
tel: range(715, 719), | ||
zipCode: [ | ||
@@ -448,3 +452,3 @@ { | ||
vehiclePlate: ['BD'], | ||
tel: range$1(736, 739).concat([732]), | ||
tel: range(736, 739).concat([732]), | ||
zipCode: [ | ||
@@ -461,3 +465,3 @@ { | ||
vehiclePlate: ['A'], | ||
tel: range$1(252, 257), | ||
tel: range(252, 257), | ||
zipCode: [ | ||
@@ -489,3 +493,3 @@ { | ||
vehiclePlate: ['BH'], | ||
tel: range$1(740, 748), | ||
tel: range(740, 748), | ||
zipCode: [ | ||
@@ -502,3 +506,3 @@ { | ||
vehiclePlate: ['D', 'E', 'F', 'T', 'Z'], | ||
tel: range$1(231, 234).concat(range$1(260, 267)).concat([22, 251]), | ||
tel: range(231, 234).concat(range(260, 267)).concat([22, 251]), | ||
zipCode: [ | ||
@@ -518,3 +522,3 @@ { | ||
vehiclePlate: ['L', 'M', 'N', 'P', 'S', 'W', 'AE', 'AG'], | ||
tel: range$1(321, 358).concat([31]), | ||
tel: range(321, 358).concat([31]), | ||
zipCode: [ | ||
@@ -543,3 +547,3 @@ { | ||
vehiclePlate: ['G', 'H', 'K', 'R', 'AA', 'AD'], | ||
tel: range$1(271, 299).concat([24, 356]), | ||
tel: range(275, 299).concat(range(271, 273)).concat([24, 356]), | ||
zipCode: [ | ||
@@ -559,3 +563,3 @@ { | ||
vehiclePlate: ['KB'], | ||
tel: range$1(564, 568).concat([534]), | ||
tel: range(564, 568).concat([534]), | ||
zipCode: [ | ||
@@ -572,3 +576,3 @@ { | ||
vehiclePlate: ['KT'], | ||
tel: range$1(541, 556), | ||
tel: range(541, 556), | ||
zipCode: [ | ||
@@ -585,3 +589,3 @@ { | ||
vehiclePlate: ['BP'], | ||
tel: range$1(771, 779), | ||
tel: range(771, 779), | ||
zipCode: [ | ||
@@ -598,3 +602,3 @@ { | ||
vehiclePlate: ['DA'], | ||
tel: range$1(511, 527), | ||
tel: range(511, 527), | ||
zipCode: [ | ||
@@ -611,3 +615,3 @@ { | ||
vehiclePlate: ['KH'], | ||
tel: range$1(513, 539), | ||
tel: range(513, 539), | ||
zipCode: [ | ||
@@ -624,3 +628,3 @@ { | ||
vehiclePlate: ['KU'], | ||
tel: range$1(551, 556), | ||
tel: range(551, 556), | ||
zipCode: [ | ||
@@ -637,3 +641,3 @@ { | ||
vehiclePlate: ['BE'], | ||
tel: range$1(721, 729), | ||
tel: range(721, 729), | ||
zipCode: [ | ||
@@ -650,3 +654,3 @@ { | ||
vehiclePlate: ['DE'], | ||
tel: range$1(910, 931), | ||
tel: range(910, 931), | ||
zipCode: [ | ||
@@ -663,3 +667,3 @@ { | ||
vehiclePlate: ['DG'], | ||
tel: range$1(910, 931), | ||
tel: range(910, 931), | ||
zipCode: [ | ||
@@ -676,3 +680,3 @@ { | ||
vehiclePlate: ['DR', 'EA'], | ||
tel: range$1(370, 376).concat([364]), | ||
tel: range(370, 376).concat([364]), | ||
zipCode: [ | ||
@@ -689,3 +693,3 @@ { | ||
vehiclePlate: ['DH', 'EB', 'ED'], | ||
tel: range$1(380, 389), | ||
tel: range(380, 389), | ||
zipCode: [ | ||
@@ -702,3 +706,3 @@ { | ||
vehiclePlate: ['PA'], | ||
tel: range$1(951, 986).concat([901, 902]), | ||
tel: range(951, 986).concat([901, 902]), | ||
zipCode: [ | ||
@@ -715,3 +719,3 @@ { | ||
vehiclePlate: ['PB'], | ||
tel: range$1(951, 986).concat([901, 902]), | ||
tel: range(951, 986).concat([901, 902]), | ||
zipCode: [ | ||
@@ -728,3 +732,3 @@ { | ||
vehiclePlate: ['BM'], | ||
tel: range$1(760, 769).concat([624]), | ||
tel: range(760, 769).concat([624]), | ||
zipCode: [ | ||
@@ -741,3 +745,3 @@ { | ||
vehiclePlate: ['DB', 'DL'], | ||
tel: range$1(430, 438), | ||
tel: range(430, 438), | ||
zipCode: [ | ||
@@ -754,3 +758,3 @@ { | ||
vehiclePlate: ['BA'], | ||
tel: range$1(751, 759), | ||
tel: range(751, 759), | ||
zipCode: [ | ||
@@ -767,3 +771,3 @@ { | ||
vehiclePlate: ['DT'], | ||
tel: range$1(401, 408), | ||
tel: range(401, 408), | ||
zipCode: [ | ||
@@ -780,3 +784,3 @@ { | ||
vehiclePlate: ['DD', 'DP', 'DW'], | ||
tel: range$1(410, 421).concat(range$1(471, 485)).concat([423, 427]), | ||
tel: range(410, 421).concat(range(471, 485)).concat([423, 427]), | ||
zipCode: [ | ||
@@ -808,3 +812,3 @@ { | ||
vehiclePlate: ['BG'], | ||
tel: range$1(711, 714).concat(range$1(730, 735)).concat([702]), | ||
tel: range(711, 714).concat(range(730, 735)).concat([702]), | ||
zipCode: [ | ||
@@ -821,3 +825,3 @@ { | ||
vehiclePlate: ['DN'], | ||
tel: range$1(445, 465), | ||
tel: range(445, 465), | ||
zipCode: [ | ||
@@ -834,3 +838,3 @@ { | ||
vehiclePlate: ['BB', 'BK'], | ||
tel: range$1(620, 639).concat([601]), | ||
tel: range(620, 639).concat([601]), | ||
zipCode: [ | ||
@@ -856,10 +860,358 @@ { | ||
}; | ||
var PROVINCES = Object.keys(PROVINCES_DATA); | ||
/** | ||
* COUNTRY_CODE | ||
* | ||
* ISD code (https://en.wikipedia.org/wiki/List_of_country_calling_codes) | ||
**/ | ||
var COUNTRY_CODE = 62; | ||
var PROVINCE_KEYS = Object.keys(PROVINCE_DATA); | ||
/** | ||
* Nusantara Valid: _cellularNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CellularNumber class | ||
**/ | ||
var CellularNumber = /** @class */ (function () { | ||
function CellularNumber() { | ||
this.CELLULAR_PROVIDER_PREFIXES = CELLULAR_PROVIDER_KEYS.reduce(function (a, b) { return a.concat(CELLULAR_PROVIDER_DATA[b].prefix); }, []); | ||
} | ||
CellularNumber.prototype.isValid = function (mobile, providerKey) { | ||
if (providerKey === void 0) { providerKey = ''; } | ||
if (!mobile || typeof mobile !== 'string') | ||
return false; | ||
var prefixCollection; | ||
var cleanCellularNumber = cleanPhoneNumbers(mobile, { cellular: true, countryCode: COUNTRY_CODE }); | ||
var validLength = correctLength(1, cleanCellularNumber.length, { minLength: CELLULAR_MIN_LENGTH, maxLength: CELLULAR_MAX_LENGTH }); | ||
if (providerKey) | ||
prefixCollection = CELLULAR_PROVIDER_DATA[providerKey].prefix; | ||
else | ||
prefixCollection = this.CELLULAR_PROVIDER_PREFIXES; | ||
return validLength | ||
&& this.isValidCellularProviderPrefix(Number(cleanCellularNumber.substr(0, 3)), prefixCollection); | ||
}; | ||
CellularNumber.prototype.isValidCellularProviderPrefix = function (prefix, prefixCollection) { | ||
return includes(prefixCollection, prefix); | ||
}; | ||
CellularNumber.prototype.getData = function (mobile) { | ||
var data = {}; | ||
data.number = this.format(mobile); | ||
var pfx = Number(cleanPhoneNumbers(mobile, { cellular: true, countryCode: COUNTRY_CODE }).substr(0, 3)); | ||
for (var _i = 0, CELLULAR_PROVIDER_KEYS_1 = CELLULAR_PROVIDER_KEYS; _i < CELLULAR_PROVIDER_KEYS_1.length; _i++) { | ||
var key = CELLULAR_PROVIDER_KEYS_1[_i]; | ||
var cellProvider = CELLULAR_PROVIDER_DATA[key]; | ||
if (includes(cellProvider.prefix, pfx)) { | ||
data.provider = { | ||
key: key, | ||
name: cellProvider.name | ||
}; | ||
break; | ||
} | ||
} | ||
return data; | ||
}; | ||
CellularNumber.prototype.format = function (input, int) { | ||
if (int === void 0) { int = false; } | ||
var cleanCelNumber = cleanPhoneNumbers(input, { cellular: true, countryCode: COUNTRY_CODE }); | ||
var formatedNumber = cleanCelNumber | ||
.slice(0, cleanCelNumber.length) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === cleanCelNumber.length - 1)) { | ||
if (includes(CELLULAR_HYPEN_INDEXES, index)) | ||
return result + "-"; | ||
} | ||
return result; | ||
}, ''); | ||
return int ? '+' + COUNTRY_CODE.toString() + formatedNumber : '0' + formatedNumber; | ||
}; | ||
return CellularNumber; | ||
}()); | ||
var cellularNumber = new CellularNumber(); | ||
/** | ||
* Cellular number validation | ||
* | ||
* It will validate cellular number based on it's prefix and length | ||
* | ||
* @param {string} number - The cellular number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidCellularNumber(number) { | ||
return cellularNumber.isValid(number); | ||
} | ||
/** | ||
* Cellular number validation with comparison | ||
* | ||
* It will validate cellular number based on user provided data | ||
* | ||
* @param {string} number - The cellular number to be validated | ||
* @param {string} providerKey - The cellular provider key | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidCellularNumberWithComparison(number, providerKey) { | ||
return cellularNumber.isValid(number, providerKey); | ||
} | ||
/** | ||
* Cellular number data getter | ||
* | ||
* Return object data based on provided cellular number | ||
* | ||
* @param {string} number - The cellular number | ||
* @return {object} IDataCellularNumber object | ||
**/ | ||
function getDataCellularNumber(number) { | ||
return cellularNumber.getData(number); | ||
} | ||
/** | ||
* Cellular number formating | ||
* | ||
* Format cellular number to local calling format (0) and international calling format (+XX) | ||
* | ||
* @param {string} number - The cellular number to be formated | ||
* @param {boolean} int - Local calling format (leading zero) or international calling format (leading country code) | ||
* @return {string} Formated number | ||
**/ | ||
function formatCellularNumber(number, int) { | ||
if (int === void 0) { int = false; } | ||
return cellularNumber.format(number, int); | ||
} | ||
/** | ||
* Nusantara Valid: _cellularProvider.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CellularProvider class | ||
**/ | ||
var CellularProvider = /** @class */ (function () { | ||
function CellularProvider() { | ||
} | ||
CellularProvider.prototype.getData = function (index) { | ||
if (index === void 0) { index = ''; } | ||
var providers; | ||
if (index) { | ||
providers = { | ||
key: index, | ||
name: CELLULAR_PROVIDER_DATA[index].name | ||
}; | ||
} | ||
else { | ||
providers = CELLULAR_PROVIDER_KEYS.map(function (key) { return ({ | ||
key: key, | ||
name: CELLULAR_PROVIDER_DATA[key].name, | ||
}); }); | ||
} | ||
return providers; | ||
}; | ||
return CellularProvider; | ||
}()); | ||
var isp = new CellularProvider(); | ||
/** | ||
* Get specific cellular provider data with IDataCellularProvider object structure | ||
* | ||
* Return object data based on provided cellular provider key | ||
* | ||
* @param {string} providerKey - The provider key | ||
* @return {IDataCellularProvider} IDataCellularProvider object | ||
**/ | ||
function getDataCellularProvider(providerKey) { | ||
return isp.getData(providerKey); | ||
} | ||
/** | ||
* Get all cellular provider data with IDataCellularProvider object structure | ||
* | ||
* Return all IDataCellularProvider object in Array<IDataCellularProvider> | ||
* | ||
* @return {IDataCellularProvider[]} Array of IDataCellularProvider object | ||
**/ | ||
function getDataCellularProviders() { | ||
return isp.getData(); | ||
} | ||
/** | ||
* Nusantara Valid: creditCard.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* CC_LENGTH | ||
* | ||
* Total length of Credit Card number without any special characters | ||
**/ | ||
var CC_LENGTH = 16; | ||
/** | ||
* CC_VALID_MII | ||
* | ||
* Lists of Credit Card valid MII number | ||
**/ | ||
var CC_VALID_MII = [ | ||
'4', '5', | ||
]; | ||
/** | ||
* CC_SPACE_INDEXES | ||
* | ||
* Indexes of where are the space separator to be placed | ||
* Eg: 4000 0000 0000 0000 | ||
**/ | ||
var CC_SPACE_INDEXES = [3, 7, 11, 11]; | ||
/** | ||
* Nusantara Valid: _creditCard.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CreditCard class | ||
**/ | ||
var CreditCard = /** @class */ (function () { | ||
function CreditCard() { | ||
} | ||
CreditCard.prototype.isValid = function (cc) { | ||
if (!cc || typeof cc !== 'string') | ||
return false; | ||
var numOnly = numbersOnly(cc); | ||
return this.isValidMII(cc.charAt(0)) | ||
&& correctLength(0, numOnly.length, { minLength: CC_LENGTH }); | ||
}; | ||
CreditCard.prototype.isValidMII = function (mii) { | ||
return includes(CC_VALID_MII, mii); | ||
}; | ||
CreditCard.prototype.format = function (cc) { | ||
var newCC = numbersOnly(cc); | ||
return newCC | ||
.slice(0, CC_LENGTH) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === newCC.length - 1)) { | ||
if (includes(CC_SPACE_INDEXES, index)) | ||
return result + " "; | ||
} | ||
return result; | ||
}, ''); | ||
}; | ||
return CreditCard; | ||
}()); | ||
var cc = new CreditCard(); | ||
/** | ||
* Credit card number validation. | ||
* | ||
* It check if cc number has correct leading MII code and correct CC number's length | ||
* | ||
* @param {string} number - The cc number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidCCNumber(number) { | ||
return cc.isValid(number); | ||
} | ||
/** | ||
* Credit card number formating | ||
* | ||
* Format credit card with the correct format | ||
* | ||
* @param {string} number - CC number to be formated | ||
* @return {string} Formated cc number | ||
**/ | ||
function formatCCNumber(number) { | ||
return cc.format(number); | ||
} | ||
/** | ||
* Nusantara Valid: email.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* EMAIL_REGEX | ||
* by Brent Thomas | ||
* | ||
* EMAIL_REGEX[0] = The email | ||
* EMAIL_REGEX[1] = Local part of email | ||
**/ | ||
var EMAIL_REGEX = /^([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/; | ||
/** | ||
* MAX_LOCALPART_LENGTH | ||
* | ||
* Maximum length of email's local part | ||
**/ | ||
var MAX_LOCALPART_LENGTH = 64; | ||
/** | ||
* MAX_EMAIL_LENGTH | ||
* | ||
* Maximum length of email | ||
**/ | ||
var MAX_EMAIL_LENGTH = 254; | ||
/** | ||
* Nusantara Valid: _email.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Email class | ||
**/ | ||
var Email = /** @class */ (function () { | ||
function Email() { | ||
} | ||
Email.prototype.isValid = function (email) { | ||
if (!email || typeof email !== 'string') | ||
return false; | ||
var validEmail = EMAIL_REGEX.exec(email); | ||
return validEmail !== null | ||
&& correctLength(1, validEmail[0].length, { minLength: 1, maxLength: MAX_EMAIL_LENGTH }) | ||
&& correctLength(1, validEmail[1].length, { minLength: 1, maxLength: MAX_LOCALPART_LENGTH }); | ||
}; | ||
return Email; | ||
}()); | ||
var theEmail = new Email(); | ||
/** | ||
* E-mail validation. | ||
* | ||
* It check if email has the correct requirements such as local part (username), @ [at] symbol, domain name part, and TLD | ||
* | ||
* @param {string} email - The email, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidEmail(email) { | ||
return theEmail.isValid(email); | ||
} | ||
/** | ||
* Nusantara Valid: nik.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NIK_REGEX | ||
* | ||
* NIK_REGEX[0] = NIK Number has 16 digits | ||
* NIK_REGEX[1] = 2 digits of Province Code (BPS Code) | ||
* NIK_REGEX[2] = 2 digits of City or Distric Code | ||
* NIK_REGEX[3] = 2 digits of Sub Distric Code | ||
* NIK_REGEX[4] = 6 digits of Birthday with DDMMYY format, for woman DD + 40 | ||
* NIK_REGEX[5] = 4 digits of Index | ||
**/ | ||
var NIK_REGEX = /^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/; | ||
/** | ||
* NIK_LENGTH | ||
* | ||
* Total length of NIK without any special characters | ||
**/ | ||
var NIK_LENGTH = 16; | ||
/** | ||
* Nusantara Valid: _nomorIndukKependudukan.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukKepemdudukan class | ||
**/ | ||
var NomorIndukKependudukan = /** @class */ (function () { | ||
function NomorIndukKependudukan() { | ||
this.VALID_BPSCODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].bpsCode); }, []); | ||
this.VALID_BPSCODE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].bpsCode); }, []); | ||
} | ||
NomorIndukKependudukan.prototype.isValid = function (nik) { | ||
if (!nik) | ||
NomorIndukKependudukan.prototype.isValid = function (nik, provinceKey, birthday) { | ||
if (provinceKey === void 0) { provinceKey = ''; } | ||
if (birthday === void 0) { birthday = ''; } | ||
if (!nik || typeof nik !== 'string') | ||
return false; | ||
@@ -869,30 +1221,116 @@ var validNIK = NIK_REGEX.exec(numbersOnly(nik)); | ||
return false; | ||
return this.isValidLength(validNIK[0].length) && this.isValidProvince(parseInt(validNIK[1])) && this.isValidBirthday(validNIK[4]); | ||
var validLength = correctLength(0, validNIK[0].length, { minLength: NIK_LENGTH }); | ||
var cBirthday = this.reformatBirthday(validNIK[4]); | ||
var validProvince = includes(this.VALID_BPSCODE, parseInt(validNIK[1])); | ||
var validBirthday = !isNaN(formatDate('19' + cBirthday).getTime()); | ||
// Comparison | ||
if (provinceKey) { | ||
if (PROVINCE_DATA[provinceKey].bpsCode != validNIK[1]) { | ||
validProvince = false; | ||
} | ||
} | ||
if (birthday) { | ||
var vBirthday = numbersOnly(birthday).substring(2, 8); // Strip the first 2 digits of year | ||
if (cBirthday != vBirthday) { | ||
validBirthday = false; | ||
} | ||
} | ||
return validLength | ||
&& validProvince | ||
&& validBirthday; | ||
}; | ||
NomorIndukKependudukan.prototype.isValidLength = function (nip) { | ||
return nip == NIK_LENGTH; | ||
// Reformat DDMMYY into YYMMDD | ||
NomorIndukKependudukan.prototype.reformatBirthday = function (birthday) { | ||
var newBirthday = /(\d{2})(\d{2})(\d{2})/.exec(birthday); | ||
if (newBirthday) { | ||
var cDD = newBirthday[1]; | ||
var cMM = newBirthday[2]; | ||
var cYY = newBirthday[3]; | ||
if (Number(cDD) > 40) // Check if it is a man of woman | ||
cDD = (Number(cDD) - 40).toString(); | ||
return cYY + '' + cMM + '' + cDD; | ||
} | ||
return ''; | ||
}; | ||
NomorIndukKependudukan.prototype.isValidProvince = function (bpsCode) { | ||
return this.VALID_BPSCODE.includes(bpsCode); | ||
NomorIndukKependudukan.prototype.getData = function (nik) { | ||
var validNIK = NIK_REGEX.exec(numbersOnly(nik)); | ||
var data = {}; | ||
if (!validNIK) | ||
return data; | ||
data.nik = validNIK[0]; | ||
data.sex = Number(validNIK[4].substr(0, 2)) > 40 ? 'Female' : 'Male'; | ||
var reformatedBirthday = this.reformatBirthday(validNIK[4]); | ||
var validProvince = includes(this.VALID_BPSCODE, parseInt(validNIK[1])); | ||
var validBirthday = !isNaN(formatDate('19' + reformatedBirthday).getTime()); | ||
if (validProvince) { | ||
var province = {}; | ||
for (var _i = 0, PROVINCE_KEYS_1 = PROVINCE_KEYS; _i < PROVINCE_KEYS_1.length; _i++) { | ||
var key = PROVINCE_KEYS_1[_i]; | ||
var element = PROVINCE_DATA[key]; | ||
if (element.bpsCode == validNIK[1]) { | ||
province.key = key, | ||
province.name = element.name; | ||
break; | ||
} | ||
} | ||
data.province = province; | ||
} | ||
if (validBirthday) { | ||
var currentYear = new Date().getFullYear(); | ||
var bYYYY = Number(reformatedBirthday.substr(0, 2)) + 2000; | ||
var bMMYY = reformatedBirthday.substring(2, 6); | ||
if (bYYYY > currentYear) { | ||
bYYYY = bYYYY - 100; | ||
} | ||
data.birthday = new Date(formatDate(bYYYY + '' + bMMYY)); | ||
} | ||
return data; | ||
}; | ||
NomorIndukKependudukan.prototype.isValidBirthday = function (birthday) { | ||
var newBirthday = /(\d{2})(\d{2})(\d{2})/.exec(birthday); // DDMMYY | ||
if (!newBirthday) | ||
return false; | ||
var dd = parseInt(newBirthday[1]); | ||
var mm = parseInt(newBirthday[2]); | ||
var yy = parseInt(newBirthday[3]); | ||
if (dd > 40) // Check if it is a man of woman | ||
dd = dd - 40; | ||
var formatedBirthday = new Date('19' + yy + '-' + mm + '-' + dd); // '19YY-MM-DD' | ||
return !isNaN(formatedBirthday.getTime()); | ||
}; | ||
return NomorIndukKependudukan; | ||
}()); | ||
var nik = new NomorIndukKependudukan(); | ||
function isValid$4(param) { | ||
return nik.isValid(param); | ||
var theNIK = new NomorIndukKependudukan(); | ||
/** | ||
* NIK validation without any comparison with user provided data. | ||
* | ||
* It check if the NIK's bps code is included / exist in VALID_BPSCODE, check if the NIK's has valid birthday | ||
* and if the NIK has the correct length. | ||
* | ||
* @param {string} nik - The NIK, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNIK(nik) { | ||
return theNIK.isValid(nik); | ||
} | ||
/** | ||
* NIK validation with comparison with user provided provinceKey and birthday data. | ||
* | ||
* It will compare NIK's bps code (see: NIK_REGEX[1]) with bps code from PROVINCE_DATA[provinceKey].bpsCode | ||
* and will compare NIK's birthday (see: NIK_REGEX[4] with user provided birthday) | ||
* | ||
* @param {string} nik - The NIK, the one to be validated | ||
* @param {object} comparison - The data to compare with, provinceKey (key from PROVINCE_DATA) and birthday (in YYYYMMDD format) | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNIKWithComparison(nik, comparison) { | ||
var _a = comparison.provinceKey, provinceKey = _a === void 0 ? '' : _a, _b = comparison.birthday, birthday = _b === void 0 ? '' : _b; | ||
return theNIK.isValid(nik, provinceKey, birthday); | ||
} | ||
/** | ||
* NIK data retreiver. | ||
* | ||
* Return a set of NIK object data from user provided nik | ||
* | ||
* @param {string} nik - The NIK | ||
* @return {object} The NIK data | ||
**/ | ||
function getDataNIK(nik) { | ||
return theNIK.getData(nik); | ||
} | ||
/** | ||
* Nusantara Valid: nip.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NIP_REGEX | ||
@@ -906,3 +1344,3 @@ * | ||
**/ | ||
var NIP_REGEX = /^([0-9]{8})([0-9]{6})([1,2]{1})([0-9]{3})$/; | ||
var NIP_REGEX = /^(\d{8})(\d{6})([1,2]{1})(\d{3})$/; | ||
/** | ||
@@ -915,2 +1353,9 @@ * NIP_LENGTH | ||
/** | ||
* Nusantara Valid: _nomorIndukPegawaiNegeriSipil.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukPegawaiNegeriSipil class | ||
**/ | ||
var NomorIndukPegawaiNegeriSipil = /** @class */ (function () { | ||
@@ -923,22 +1368,50 @@ function NomorIndukPegawaiNegeriSipil() { | ||
var validNIP = NIP_REGEX.exec(numbersOnly(nip)); | ||
return validNIP !== null | ||
&& !isNaN(formatDate(validNIP[1]).getTime()) | ||
&& !isNaN(formatDate(validNIP[2]).getTime()) | ||
&& correctLength(0, validNIP[0].length, { minLength: NIP_LENGTH }); | ||
}; | ||
NomorIndukPegawaiNegeriSipil.prototype.getData = function (nip) { | ||
var data = {}; | ||
var validNIP = NIP_REGEX.exec(numbersOnly(nip)); | ||
if (!validNIP) | ||
return false; | ||
return this.isValidLength(validNIP[0].length) && this.isValidDate(validNIP[1]) && this.isValidDate(validNIP[2]); | ||
return data; | ||
data.nip = validNIP[0]; | ||
data.birthday = formatDate(validNIP[1]); | ||
data.recruit_date = validNIP[2].substr(0, 4) + '-' + validNIP[2].substr(4, 2); | ||
data.sex = Number(validNIP[3]) == 1 ? 'Male' : 'Female'; | ||
return data; | ||
}; | ||
NomorIndukPegawaiNegeriSipil.prototype.isValidLength = function (nip) { | ||
return nip == NIP_LENGTH; | ||
}; | ||
NomorIndukPegawaiNegeriSipil.prototype.isValidDate = function (date) { | ||
var newDate = date.replace(/(\d{4})(\d{2})(?:(\d{2})?)/, "$1-$2-$3"); | ||
var formatedDate = new Date(newDate); | ||
return !isNaN(formatedDate.getTime()); | ||
}; | ||
return NomorIndukPegawaiNegeriSipil; | ||
}()); | ||
var nip = new NomorIndukPegawaiNegeriSipil(); | ||
function isValid$5(param) { | ||
return nip.isValid(param); | ||
var theNIP = new NomorIndukPegawaiNegeriSipil(); | ||
/** | ||
* NIP validation. | ||
* | ||
* Validate NIP by validating NIP's birthday, NIP's recruitment date, and NIP's length | ||
* | ||
* @param {string} nip - The NIP to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNIP(nip) { | ||
return theNIP.isValid(nip); | ||
} | ||
/** | ||
* NIP data retreiver. | ||
* | ||
* Return a set of NIP object data from user provided nip | ||
* | ||
* @param {string} nip - The NIP | ||
* @return {IDataNIP} The NIP data | ||
**/ | ||
function getDataNIP(nip) { | ||
return theNIP.getData(nip); | ||
} | ||
/** | ||
* Nusantara Valid: nisn.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NISN_REGEX | ||
@@ -967,2 +1440,9 @@ * | ||
/** | ||
* Nusantara Valid: _nomorIndukSiswaNasional.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukSiswaNasional class | ||
**/ | ||
var NomorIndukSiswaNasional = /** @class */ (function () { | ||
@@ -974,12 +1454,7 @@ function NomorIndukSiswaNasional() { | ||
return false; | ||
if (!this.isValidLength(nisn.length)) | ||
return false; | ||
var validNISN = NISN_REGEX.exec(numbersOnly(nisn)); | ||
if (!validNISN) | ||
return false; | ||
return this.isValidPeriod(validNISN[1]); | ||
return validNISN !== null | ||
&& this.isValidPeriod(validNISN[1]) | ||
&& correctLength(0, validNISN[0].length, { minLength: NISN_LENGTH }); | ||
}; | ||
NomorIndukSiswaNasional.prototype.isValidLength = function (nisn) { | ||
return nisn == NISN_LENGTH; | ||
}; | ||
NomorIndukSiswaNasional.prototype.isValidPeriod = function (year) { | ||
@@ -989,17 +1464,27 @@ var thisYear = new Date().getFullYear(); | ||
var birthYear = parseInt(year) + 2000; | ||
if (birthYear > thisYear) { | ||
if (birthYear > thisYear) | ||
birthYear = birthYear - 1000; | ||
} | ||
if (birthYear < endYear) | ||
return false; | ||
return true; | ||
return birthYear < endYear ? false : true; | ||
}; | ||
return NomorIndukSiswaNasional; | ||
}()); | ||
var nisn = new NomorIndukSiswaNasional(); | ||
function isValid$6(param) { | ||
return nisn.isValid(param); | ||
var theNISN = new NomorIndukSiswaNasional(); | ||
/** | ||
* NISN validation. | ||
* | ||
* Validate NISN by validating NISN's birth year (student age) with NISN_AGE_VALIDITY and NISN's length | ||
* | ||
* @param {string} nisn - The NISN to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNISN(nisn) { | ||
return theNISN.isValid(nisn); | ||
} | ||
/** | ||
* Nusantara Valid: npwp.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NPWP_REGEX | ||
@@ -1047,2 +1532,9 @@ * | ||
/** | ||
* Nusantara Valid: _nomorPokokWajibPajak.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorPokokWajibPajak class | ||
**/ | ||
var NomorPokokWajibPajak = /** @class */ (function () { | ||
@@ -1055,21 +1547,12 @@ function NomorPokokWajibPajak() { | ||
var numOnly = numbersOnly(npwp); | ||
if (!this.isValidLength(numOnly.length)) | ||
return false; | ||
var regexNPWP = NPWP_REGEX.exec(numOnly); | ||
if (!regexNPWP) | ||
return false; | ||
return this.isValidTaxIdentity(regexNPWP[1]); | ||
return regexNPWP !== null | ||
&& this.isValidTaxIdentity(regexNPWP[1]) | ||
&& correctLength(0, regexNPWP[0].length, { minLength: NPWP_LENGTH }); | ||
}; | ||
NomorPokokWajibPajak.prototype.isValidLength = function (npwp) { | ||
return npwp == NPWP_LENGTH; | ||
}; | ||
NomorPokokWajibPajak.prototype.isValidTaxIdentity = function (taxIdentity) { | ||
return NPWP_TAX_IDENTITIES.includes(taxIdentity); | ||
return includes(NPWP_TAX_IDENTITIES, taxIdentity); | ||
}; | ||
NomorPokokWajibPajak.prototype.format = function (npwp, pad) { | ||
if (pad === void 0) { pad = true; } | ||
NomorPokokWajibPajak.prototype.format = function (npwp) { | ||
var newNPWP = numbersOnly(npwp); | ||
if (pad) { | ||
newNPWP = newNPWP.padStart(NPWP_LENGTH, '0'); | ||
} | ||
return newNPWP | ||
@@ -1081,5 +1564,5 @@ .slice(0, NPWP_LENGTH) | ||
if (!(index === newNPWP.length - 1)) { | ||
if (NPWP_DOT_INDEXES.includes(index)) | ||
if (includes(NPWP_DOT_INDEXES, index)) | ||
return result + "."; | ||
if (NPWP_HYPHEN_INDEXES.includes(index)) | ||
if (includes(NPWP_HYPHEN_INDEXES, index)) | ||
return result + "-"; | ||
@@ -1092,14 +1575,88 @@ } | ||
}()); | ||
var npwp = new NomorPokokWajibPajak(); | ||
function isValid$7(param) { | ||
return npwp.isValid(param); | ||
var theNPWP = new NomorPokokWajibPajak(); | ||
/** | ||
* NPWP validation. | ||
* | ||
* Validate NPWP by validating NPWP's tax identity and NPWP's length | ||
* | ||
* @param {string} npwp - The NPWP to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidNPWP(npwp) { | ||
return theNPWP.isValid(npwp); | ||
} | ||
function format$1(param, pad) { | ||
if (pad === void 0) { pad = true; } | ||
return npwp.format(param, pad); | ||
/** | ||
* NPWP formating | ||
* | ||
* Format NPWP to the correct requirement | ||
* | ||
* @param {string} npwp - TheNPWP to be formated | ||
* @return {string} Formated NPWP | ||
**/ | ||
function formatNPWP(npwp) { | ||
return theNPWP.format(npwp); | ||
} | ||
/** | ||
* Nusantara Valid: _province.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Province class | ||
**/ | ||
var Province = /** @class */ (function () { | ||
function Province() { | ||
} | ||
Province.prototype.getData = function (index) { | ||
if (index === void 0) { index = ''; } | ||
var province; | ||
if (index) { | ||
province = { | ||
key: index, | ||
name: PROVINCE_DATA[index].name | ||
}; | ||
} | ||
else { | ||
province = PROVINCE_KEYS.map(function (key) { return ({ | ||
key: key, | ||
name: PROVINCE_DATA[key].name, | ||
}); }); | ||
} | ||
return province; | ||
}; | ||
return Province; | ||
}()); | ||
var prov = new Province(); | ||
/** | ||
* Get specific province data with IDataProvince object structure | ||
* | ||
* Return object data based on provided province key | ||
* | ||
* @param {string} provinceKey - Array key of the province | ||
* @return {IDataProvince} IDataProvince object | ||
**/ | ||
function getDataProvince(provinceKey) { | ||
return prov.getData(provinceKey); | ||
} | ||
/** | ||
* Get all province data with IDataProvince object structure | ||
* | ||
* Return all IDataProvince object in Array<IDataProvince> | ||
* | ||
* @return {IDataProvince[]} Array of IDataProvince object | ||
**/ | ||
function getDataProvinces() { | ||
return prov.getData(); | ||
} | ||
/** | ||
* Nusantara Valid: _telephoneNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The TelephoneNumber class | ||
**/ | ||
var TelephoneNumber = /** @class */ (function () { | ||
function TelephoneNumber() { | ||
this.VALID_TELEPHONE_AREACODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].tel); }, []); | ||
this.VALID_TELEPHONE_AREACODE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].tel); }, []); | ||
} | ||
@@ -1109,16 +1666,99 @@ TelephoneNumber.prototype.isValid = function (tel) { | ||
return false; | ||
var parsedTelephoneNumber = parseTelephoneAreaCode(tel); | ||
return this.isValidCellularPrefix(parsedTelephoneNumber); | ||
var cleanTelNumber = cleanPhoneNumbers(tel); | ||
return !isNaN(this.isValidCellularPrefix(cleanTelNumber)); | ||
}; | ||
TelephoneNumber.prototype.isValidCellularPrefix = function (parsedTel) { | ||
return this.VALID_TELEPHONE_AREACODE.includes(Number(parsedTel.substr(1, 2))) || this.VALID_TELEPHONE_AREACODE.includes(Number(parsedTel.substr(1, 3))); | ||
var thePrefix = Number(parsedTel.substr(0, 2)); | ||
if (includes(this.VALID_TELEPHONE_AREACODE, thePrefix)) | ||
return thePrefix; | ||
thePrefix = Number(parsedTel.substr(0, 3)); | ||
if (includes(this.VALID_TELEPHONE_AREACODE, thePrefix)) | ||
return thePrefix; | ||
return NaN; | ||
}; | ||
TelephoneNumber.prototype.getData = function (tel) { | ||
var data = {}; | ||
var cleanTelNumber = cleanPhoneNumbers(tel); | ||
data.number = this.format(cleanTelNumber); | ||
var pfx = this.isValidCellularPrefix(cleanTelNumber); | ||
for (var _i = 0, PROVINCE_KEYS_1 = PROVINCE_KEYS; _i < PROVINCE_KEYS_1.length; _i++) { | ||
var key = PROVINCE_KEYS_1[_i]; | ||
var element = PROVINCE_DATA[key]; | ||
if (includes(element.tel, pfx)) { | ||
data.origin = { | ||
key: key, | ||
name: element.name | ||
}; | ||
break; | ||
} | ||
} | ||
return data; | ||
}; | ||
TelephoneNumber.prototype.format = function (tel, int) { | ||
if (int === void 0) { int = false; } | ||
var cleanTelNumber = cleanPhoneNumbers(tel); | ||
var pfx = this.isValidCellularPrefix(cleanTelNumber).toString(); | ||
var TEL_HYPEN_INDEX = []; | ||
if (pfx.length === 2) | ||
TEL_HYPEN_INDEX = [1]; | ||
else | ||
TEL_HYPEN_INDEX = [2]; | ||
var formatedNumber = cleanTelNumber | ||
.slice(0, cleanTelNumber.length) | ||
.split('') | ||
.reduce(function (a, b, index) { | ||
var result = "" + a + b; | ||
if (!(index === cleanTelNumber.length - 1)) { | ||
if (includes(TEL_HYPEN_INDEX, index)) | ||
return result + "-"; | ||
} | ||
return result; | ||
}, ''); | ||
return int ? '+' + COUNTRY_CODE + formatedNumber : '0' + formatedNumber; | ||
}; | ||
return TelephoneNumber; | ||
}()); | ||
var telNumber = new TelephoneNumber(); | ||
function isValid$8(param) { | ||
return telNumber.isValid(param); | ||
/** | ||
* Telephone number validation | ||
* | ||
* It will validate telephone number based on it's prefix | ||
* | ||
* @param {string} number - The telephone number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidTelephoneNumber(number) { | ||
return telNumber.isValid(number); | ||
} | ||
/** | ||
* Telephone number data getter | ||
* | ||
* Return object data based on provided telephone number | ||
* | ||
* @param {string} number - The telephone number | ||
* @return {object} IDataTelephoneNumber object | ||
**/ | ||
function getDataTelephoneNumber(number) { | ||
return telNumber.getData(number); | ||
} | ||
/** | ||
* Telephone number formating | ||
* | ||
* Format telephone number to local calling format (0) and international calling format (+XX) | ||
* | ||
* @param {string} number - The telephone number to be formated | ||
* @param {boolean} int - Local calling format (leading zero) or international calling format (leading country code) | ||
* @return {string} Formated number | ||
**/ | ||
function formatTelephoneNumber(number, int) { | ||
if (int === void 0) { int = false; } | ||
return telNumber.format(number, int); | ||
} | ||
/** | ||
* Nusantara Valid: tnkb.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* TNKB_REGEX | ||
@@ -1133,6 +1773,12 @@ * | ||
// Vehicle Registration Number (TNKB) / Tanda Nomor Kendaraan Bermotor (TNKB) | ||
/** | ||
* Nusantara Valid: _tandaNomorKendaraanBermotor.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The TandaNomorKendaraanBermotor class | ||
**/ | ||
var TandaNomorKendaraanBermotor = /** @class */ (function () { | ||
function TandaNomorKendaraanBermotor() { | ||
this.VALID_TNKB_AREACODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].vehiclePlate); }, []); | ||
this.VALID_TNKB_AREACODE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].vehiclePlate); }, []); | ||
} | ||
@@ -1144,33 +1790,85 @@ TandaNomorKendaraanBermotor.prototype.isValid = function (tnkb) { | ||
var validTNKB = TNKB_REGEX.exec(TNKB); | ||
if (!validTNKB) | ||
return false; | ||
return this.isValidTNKBArea(validTNKB); | ||
return validTNKB !== null | ||
&& this.isValidTNKBArea(validTNKB[1]); | ||
}; | ||
TandaNomorKendaraanBermotor.prototype.isValidTNKBArea = function (tnkb) { | ||
return this.VALID_TNKB_AREACODE.includes(tnkb[1]); | ||
return includes(this.VALID_TNKB_AREACODE, tnkb); | ||
}; | ||
TandaNomorKendaraanBermotor.prototype.getData = function (tnkb) { | ||
var data = {}; | ||
var TNKB = tnkb.toUpperCase(); | ||
var validTNKB = TNKB_REGEX.exec(TNKB); | ||
if (!validTNKB) | ||
return data; | ||
for (var _i = 0, PROVINCE_KEYS_1 = PROVINCE_KEYS; _i < PROVINCE_KEYS_1.length; _i++) { | ||
var key = PROVINCE_KEYS_1[_i]; | ||
var element = PROVINCE_DATA[key]; | ||
if (includes(element.vehiclePlate, validTNKB[1])) { | ||
data = { | ||
areaCode: validTNKB[1], | ||
index: Number(validTNKB[2]), | ||
detailedAreaCode: validTNKB[3], | ||
province: { | ||
key: key, | ||
name: element.name | ||
} | ||
}; | ||
break; | ||
} | ||
} | ||
return data; | ||
}; | ||
return TandaNomorKendaraanBermotor; | ||
}()); | ||
var tnkb = new TandaNomorKendaraanBermotor(); | ||
function isValid$9(param) { | ||
return tnkb.isValid(param); | ||
var theTNKB = new TandaNomorKendaraanBermotor(); | ||
/** | ||
* TNKB validation. | ||
* | ||
* It check if the TNKB's area code is exist in VALID_TNKB_AREACODE | ||
* | ||
* @param {string} tnkb - The TNKB, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidTNKB(tnkb) { | ||
return theTNKB.isValid(tnkb); | ||
} | ||
/** | ||
* TNKB data retreiver. | ||
* | ||
* Return a set of TNKB object data from user provided tnkb | ||
* | ||
* @param {string} tnkb - The TNKB | ||
* @return {IDataTNKB} The TNKB data | ||
**/ | ||
function getDataTNKB(tnkb) { | ||
return theTNKB.getData(tnkb); | ||
} | ||
/** | ||
* Nusantara Valid: _zipCode.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The ZIPCode class | ||
**/ | ||
var ZIPCode = /** @class */ (function () { | ||
function ZIPCode() { | ||
this.VALID_ZIPCODE = Object.keys(PROVINCES_DATA).reduce(function (a, b) { return a.concat(PROVINCES_DATA[b].zipCode); }, []); | ||
this.ZIP_RANGE = PROVINCE_KEYS.reduce(function (a, b) { return a.concat(PROVINCE_DATA[b].zipCode); }, []); | ||
} | ||
ZIPCode.prototype.isValid = function (zip) { | ||
ZIPCode.prototype.isValid = function (zip, provinceKey) { | ||
if (provinceKey === void 0) { provinceKey = ''; } | ||
if (!zip) | ||
return false; | ||
var sZIP = zip.toString(); | ||
return this.isValidLength(sZIP) && this.isValidZIPCode(sZIP); | ||
var zipArray = this.ZIP_RANGE; | ||
zip = zip.toString(); | ||
var validLength = correctLength(0, zip.length, { minLength: 5 }); | ||
if (provinceKey) | ||
zipArray = PROVINCE_DATA[provinceKey].zipCode; | ||
return validLength | ||
&& this.isValidZIPCode(zip, zipArray); | ||
}; | ||
ZIPCode.prototype.isValidLength = function (zip) { | ||
return zip.length == 5; | ||
}; | ||
ZIPCode.prototype.isValidZIPCode = function (zip) { | ||
for (var _i = 0, _a = this.VALID_ZIPCODE; _i < _a.length; _i++) { | ||
var val = _a[_i]; | ||
if (val.from <= zip && val.to <= zip) { | ||
ZIPCode.prototype.isValidZIPCode = function (zip, zipRange) { | ||
for (var _i = 0, zipRange_1 = zipRange; _i < zipRange_1.length; _i++) { | ||
var val = zipRange_1[_i]; | ||
if (val.from <= zip && val.to >= zip) { | ||
return true; | ||
@@ -1183,60 +1881,64 @@ } | ||
}()); | ||
var zip = new ZIPCode(); | ||
function isValid$a(param) { | ||
return zip.isValid(param); | ||
var theZIP = new ZIPCode(); | ||
/** | ||
* ZIP validation without any comparison with user provided data. | ||
* | ||
* It will check if the ZIP is included / exist in VALID_ZIPCODE array and if the ZIP has the correct length of 6. | ||
* | ||
* @param {string} zip - The ZIP, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidZIP(zip) { | ||
return theZIP.isValid(zip); | ||
} | ||
var Bank = /** @class */ (function () { | ||
function Bank() { | ||
} | ||
Bank.prototype.getData = function () { | ||
var banks = BANKS.map(function (key) { return ({ | ||
key: key, | ||
name: BANK_DATA[key].name, | ||
}); }); | ||
return banks; | ||
}; | ||
return Bank; | ||
}()); | ||
var atm$1 = new Bank(); | ||
function getData() { | ||
return atm$1.getData(); | ||
/** | ||
* ZIP validation with comparison with user provided provinceKey. | ||
* | ||
* It will check if the ZIP is included / exist in ZIP range from PROVINCE_DATA[provinceKey].zipCode[] | ||
* | ||
* @param {string | number} zip - The ZIP, the one to be validated | ||
* @param {object} comparison - The data to compare with, provinceKey (key from PROVINCE_DATA) | ||
* @return {boolean} Is valid or not | ||
**/ | ||
function isValidZIPWithComparison(zip, comparison) { | ||
var _a = comparison.provinceKey, provinceKey = _a === void 0 ? '' : _a; | ||
return theZIP.isValid(zip, provinceKey); | ||
} | ||
var Province = /** @class */ (function () { | ||
function Province() { | ||
} | ||
Province.prototype.getData = function () { | ||
var provinces = PROVINCES.map(function (key) { return ({ | ||
key: key, | ||
name: PROVINCES_DATA[key].name, | ||
}); }); | ||
return provinces; | ||
}; | ||
return Province; | ||
}()); | ||
var atm$2 = new Province(); | ||
function getData$1() { | ||
return atm$2.getData(); | ||
} | ||
exports.formatCCNumber = format; | ||
exports.cleanPhoneNumbers = cleanPhoneNumbers; | ||
exports.correctLength = correctLength; | ||
exports.formatCCNumber = formatCCNumber; | ||
exports.formatCellularNumber = formatCellularNumber; | ||
exports.formatDate = formatDate; | ||
exports.formatNPWP = format$1; | ||
exports.getBankData = getData; | ||
exports.getProvinceData = getData$1; | ||
exports.isValidATMNumber = isValid; | ||
exports.isValidCCNumber = isValid$1; | ||
exports.isValidCellularNumber = isValid$2; | ||
exports.isValidEmail = isValid$3; | ||
exports.isValidNIK = isValid$4; | ||
exports.isValidNIP = isValid$5; | ||
exports.isValidNISN = isValid$6; | ||
exports.isValidNPWP = isValid$7; | ||
exports.isValidTNKB = isValid$9; | ||
exports.isValidTelephoneNumber = isValid$8; | ||
exports.isValidZIP = isValid$a; | ||
exports.formatNPWP = formatNPWP; | ||
exports.formatTelephoneNumber = formatTelephoneNumber; | ||
exports.getDataBank = getDataBank; | ||
exports.getDataBanks = getDataBanks; | ||
exports.getDataCellularNumber = getDataCellularNumber; | ||
exports.getDataCellularProvider = getDataCellularProvider; | ||
exports.getDataCellularProviders = getDataCellularProviders; | ||
exports.getDataNIK = getDataNIK; | ||
exports.getDataNIP = getDataNIP; | ||
exports.getDataProvince = getDataProvince; | ||
exports.getDataProvinces = getDataProvinces; | ||
exports.getDataTNKB = getDataTNKB; | ||
exports.getDataTelephoneNumber = getDataTelephoneNumber; | ||
exports.includes = includes; | ||
exports.isValidATMNumber = isValidATMNumber; | ||
exports.isValidATMNumberWithComparison = isValidATMNumberWithComparison; | ||
exports.isValidCCNumber = isValidCCNumber; | ||
exports.isValidCellularNumber = isValidCellularNumber; | ||
exports.isValidCellularNumberWithComparison = isValidCellularNumberWithComparison; | ||
exports.isValidEmail = isValidEmail; | ||
exports.isValidNIK = isValidNIK; | ||
exports.isValidNIKWithComparison = isValidNIKWithComparison; | ||
exports.isValidNIP = isValidNIP; | ||
exports.isValidNISN = isValidNISN; | ||
exports.isValidNPWP = isValidNPWP; | ||
exports.isValidTNKB = isValidTNKB; | ||
exports.isValidTelephoneNumber = isValidTelephoneNumber; | ||
exports.isValidZIP = isValidZIP; | ||
exports.isValidZIPWithComparison = isValidZIPWithComparison; | ||
exports.numbersOnly = numbersOnly; | ||
exports.parseCellularPrefix = parseCellularPrefix; | ||
exports.parseTelephoneAreaCode = parseTelephoneAreaCode; | ||
exports.range = range; | ||
@@ -1243,0 +1945,0 @@ Object.defineProperty(exports, '__esModule', { value: true }); |
@@ -1,2 +0,8 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).NusantaraValid={})}(this,(function(e){"use strict";function t(e){return String(e).replace(/[^\d]/g,"")}var n=function(e,t){return Array.from({length:(t-e)/1+1},(function(t,n){return e+1*n}))},i={TELKOMSEL:{name:"Telkomsel",prefix:n(811,813).concat(n(821,823)).concat(n(851,853))},INDOSAT:{name:"Indosat Ooredoo",prefix:n(814,816).concat(n(855,858))},XL:{name:"XL Axiata",prefix:n(817,819).concat([859,877,878])},TRI:{name:"Hutchinson Tri",prefix:n(895,899)},SMARTFREN:{name:"Smartfren",prefix:n(881,889)},AXIS:{name:"AXIS",prefix:n(831,833).concat([838])}};function a(e){var t=String(e).replace(/[^\d]/g,""),n="";return"0"==t.charAt(0)&&(n=t.replace("0",62..toString())),n}function r(e){var t=String(e).replace(/[^\d]/g,""),n=t;return"0"!=t.charAt(0)&&(n="0"+t),n}var o={BCAK:{name:"Bank Central Asia",digits:10,dotIndex:[]},BCAS:{name:"Bank Central Asia Syariah",digits:10,dotIndex:[]},BNIK:{name:"Bank Negara Indonesia",digits:10,dotIndex:[]},BNIS:{name:"Bank Negara Indonesia Syariah",digits:10,dotIndex:[]},BRIK:{name:"Bank Rakyat Indonesia",digits:15,dotIndex:[]},BRIS:{name:"Bank Rakyat Indonesia Syariah",digits:10,dotIndex:[]},BTNK:{name:"Bank Tabungan Negara",digits:16,dotIndex:[]},BTNS:{name:"Bank Tabungan Negara Syariah",digits:10,dotIndex:[]},BTPK:{name:"Bank Tabungan Pensiunan Nasional",digits:11,dotIndex:[]},BTPS:{name:"Bank Tabungan Pensiunan Nasional Syariah",digits:10,dotIndex:[]},BUKK:{name:"Bank Bukopin",digits:10,dotIndex:[]},BUKS:{name:"Bank Bukopin Syariah",digits:10,dotIndex:[]},CMBK:{name:"Bank CIMB Niaga",digits:13,dotIndex:[]},CMBS:{name:"Bank CIMB Niaga Syariah",digits:13,dotIndex:[]},DNMK:{name:"Bank Danamon",digits:10,dotIndex:[]},DNMS:{name:"Bank Danamon Syariah",digits:10,dotIndex:[]},MDRK:{name:"Bank Mandiri",digits:13,dotIndex:[]},MDRS:{name:"Bank Mandiri Syariah",digits:10,dotIndex:[]},MGAK:{name:"Bank Mega",digits:15,dotIndex:[]},MGAS:{name:"Bank Mega Syariah",digits:10,dotIndex:[]},MUAM:{name:"Bank Muamalat",digits:10,dotIndex:[]},PMTK:{name:"Bank Permata",digits:10,dotIndex:[]},PMTS:{name:"Bank Permata Syariah",digits:10,dotIndex:[]},PNBK:{name:"Panin Bank",digits:10,dotIndex:[]},PNBS:{name:"Panin Bank Syariah",digits:10,dotIndex:[]}},d=Object.keys(o),u=new(function(){function e(){this.VALID_ATMNUMBER_LENGTH=Object.keys(o).reduce((function(e,t){return e.includes(o[t].digits)?e:e.concat(o[t].digits)}),[])}return e.prototype.isValid=function(e,n){if(!e||"string"!=typeof e)return!1;void 0===n&&(n="");var i=t(e);return n?o[n].digits==i.length:this.isValidLength(i.length)},e.prototype.isValidLength=function(e){return this.VALID_ATMNUMBER_LENGTH.includes(e)},e}());var l=["4","5"],s=[3,7,11,11],c=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var n=t(e);return this.isValidMII(e.charAt(0))&&this.isValidLength(n.length)},e.prototype.isValidLength=function(e){return 16==e},e.prototype.isValidMII=function(e){return l.includes(e)},e.prototype.format=function(e){var n=t(e);return n.slice(0,16).split("").reduce((function(e,t,i){var a=""+e+t;return i!==n.length-1&&s.includes(i)?a+" ":a}),"")},e}());var f=new(function(){function e(){this.VALID_CELLULAR_PREFIX=Object.keys(i).reduce((function(e,t){return e.concat(i[t].prefix)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=a(e);return this.isValidLength(t)&&this.isValidCellularPrefix(t)},e.prototype.isValidCellularPrefix=function(e){return this.VALID_CELLULAR_PREFIX.includes(Number(e.substr(2,3)))},e.prototype.isValidLength=function(e){return e.length>=11&&e.length<=13},e}());var p=/^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/,m=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=p.exec(e);return!!t&&(t&&this.isValidLength(t))},e.prototype.isValidLength=function(e){return e.length<=254&&e[0].length<=64},e}());var h=/^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/,g=function(e,t){return Array.from({length:(t-e)/1+1},(function(t,n){return e+1*n}))},C={AC:{name:"Aceh",bpsCode:11,vehiclePlate:["BL"],tel:g(641,659).concat([627,629]),zipCode:[{from:23111,to:24794}]},BA:{name:"Bali",bpsCode:51,vehiclePlate:["DK"],tel:g(361,368),zipCode:[{from:80111,to:82262}]},BB:{name:"Kepulauan Bangka Belitung",bpsCode:19,vehiclePlate:["BN"],tel:g(715,719),zipCode:[{from:33111,to:33792}]},BE:{name:"Bengkulu",bpsCode:17,vehiclePlate:["BD"],tel:g(736,739).concat([732]),zipCode:[{from:38113,to:39377}]},BT:{name:"Banten",bpsCode:36,vehiclePlate:["A"],tel:g(252,257),zipCode:[{from:15111,to:15820},{from:42111,to:42455}]},GO:{name:"Gorontalo",bpsCode:75,vehiclePlate:["DM"],tel:[435,443],zipCode:[{from:96111,to:96574}]},JA:{name:"Jambi",bpsCode:15,vehiclePlate:["BH"],tel:g(740,748),zipCode:[{from:36111,to:37574}]},JB:{name:"Jawa Barat",bpsCode:32,vehiclePlate:["D","E","F","T","Z"],tel:g(231,234).concat(g(260,267)).concat([22,251]),zipCode:[{from:16110,to:17730},{from:40111,to:46476}]},JI:{name:"Jawa Timur",bpsCode:35,vehiclePlate:["L","M","N","P","S","W","AE","AG"],tel:g(321,358).concat([31]),zipCode:[{from:60111,to:69493}]},JK:{name:"Jakarta",bpsCode:31,vehiclePlate:["B"],tel:[21],zipCode:[{from:10110,to:14540}]},JT:{name:"Jawa Tengah",bpsCode:33,vehiclePlate:["G","H","K","R","AA","AD"],tel:g(271,299).concat([24,356]),zipCode:[{from:50111,to:54474},{from:56111,to:59584}]},KB:{name:"Kalimantan Barat",bpsCode:61,vehiclePlate:["KB"],tel:g(564,568).concat([534]),zipCode:[{from:78111,to:79682}]},KI:{name:"Kalimantan Timur",bpsCode:64,vehiclePlate:["KT"],tel:g(541,556),zipCode:[{from:75111,to:77381}]},KR:{name:"Kepulauan Riau",bpsCode:21,vehiclePlate:["BP"],tel:g(771,779),zipCode:[{from:29111,to:29878}]},KS:{name:"Kalimantan Selatan",bpsCode:63,vehiclePlate:["DA"],tel:g(511,527),zipCode:[{from:70111,to:72276}]},KT:{name:"Kalimantan Tengah",bpsCode:62,vehiclePlate:["KH"],tel:g(513,539),zipCode:[{from:73111,to:74874}]},KU:{name:"Kalimantan Utara",bpsCode:65,vehiclePlate:["KU"],tel:g(551,556),zipCode:[{from:77111,to:77574}]},LA:{name:"Lampung",bpsCode:18,vehiclePlate:["BE"],tel:g(721,729),zipCode:[{from:34111,to:35686}]},MA:{name:"Maluku",bpsCode:81,vehiclePlate:["DE"],tel:g(910,931),zipCode:[{from:97114,to:97669}]},MU:{name:"Maluku Utara",bpsCode:82,vehiclePlate:["DG"],tel:g(910,931),zipCode:[{from:97711,to:97869}]},NB:{name:"Nusa Tenggara Barat",bpsCode:52,vehiclePlate:["DR","EA"],tel:g(370,376).concat([364]),zipCode:[{from:83115,to:84459}]},NT:{name:"Nusa Tenggara Timur",bpsCode:53,vehiclePlate:["DH","EB","ED"],tel:g(380,389),zipCode:[{from:85111,to:87284}]},PA:{name:"Papua",bpsCode:94,vehiclePlate:["PA"],tel:g(951,986).concat([901,902]),zipCode:[{from:98511,to:99976}]},PB:{name:"Papua Barat",bpsCode:91,vehiclePlate:["PB"],tel:g(951,986).concat([901,902]),zipCode:[{from:98011,to:98495}]},RI:{name:"Riau",bpsCode:14,vehiclePlate:["BM"],tel:g(760,769).concat([624]),zipCode:[{from:28111,to:29569}]},SA:{name:"Sulawesi Utara",bpsCode:71,vehiclePlate:["DB","DL"],tel:g(430,438),zipCode:[{from:95111,to:95999}]},SB:{name:"Sumatra Barat",bpsCode:13,vehiclePlate:["BA"],tel:g(751,759),zipCode:[{from:25111,to:27779}]},SG:{name:"Sulawesi Tenggara",bpsCode:74,vehiclePlate:["DT"],tel:g(401,408),zipCode:[{from:93111,to:93963}]},SN:{name:"Sulawesi Selatan",bpsCode:73,vehiclePlate:["DD","DP","DW"],tel:g(410,421).concat(g(471,485)).concat([423,427]),zipCode:[{from:90111,to:91273},{from:91611,to:92985}]},SR:{name:"Sulawesi Barat",bpsCode:76,vehiclePlate:["DC"],tel:[422,426,428],zipCode:[{from:91311,to:91591}]},SS:{name:"Sumatra Selatan",bpsCode:16,vehiclePlate:["BG"],tel:g(711,714).concat(g(730,735)).concat([702]),zipCode:[{from:30111,to:32388}]},ST:{name:"Sulawesi Tengah",bpsCode:72,vehiclePlate:["DN"],tel:g(445,465),zipCode:[{from:94111,to:94981}]},SU:{name:"Sumatra Utara",bpsCode:12,vehiclePlate:["BB","BK"],tel:g(620,639).concat([601]),zipCode:[{from:20111,to:22999}]},YO:{name:"Yogyakarta",bpsCode:34,vehiclePlate:["AB"],tel:[274],zipCode:[{from:55111,to:55893}]}},B=Object.keys(C),V=new(function(){function e(){this.VALID_BPSCODE=Object.keys(C).reduce((function(e,t){return e.concat(C[t].bpsCode)}),[])}return e.prototype.isValid=function(e){if(!e)return!1;var n=h.exec(t(e));return!!n&&(this.isValidLength(n[0].length)&&this.isValidProvince(parseInt(n[1]))&&this.isValidBirthday(n[4]))},e.prototype.isValidLength=function(e){return 16==e},e.prototype.isValidProvince=function(e){return this.VALID_BPSCODE.includes(e)},e.prototype.isValidBirthday=function(e){var t=/(\d{2})(\d{2})(\d{2})/.exec(e);if(!t)return!1;var n=parseInt(t[1]),i=parseInt(t[2]),a=parseInt(t[3]);n>40&&(n-=40);var r=new Date("19"+a+"-"+i+"-"+n);return!isNaN(r.getTime())},e}());var P=/^([0-9]{8})([0-9]{6})([1,2]{1})([0-9]{3})$/,v=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var n=P.exec(t(e));return!!n&&(this.isValidLength(n[0].length)&&this.isValidDate(n[1])&&this.isValidDate(n[2]))},e.prototype.isValidLength=function(e){return 18==e},e.prototype.isValidDate=function(e){var t=e.replace(/(\d{4})(\d{2})(?:(\d{2})?)/,"$1-$2-$3"),n=new Date(t);return!isNaN(n.getTime())},e}());var y=/^(\d{3})(\d{3})(\d{4})$/,I=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;if(!this.isValidLength(e.length))return!1;var n=y.exec(t(e));return!!n&&this.isValidPeriod(n[1])},e.prototype.isValidLength=function(e){return 10==e},e.prototype.isValidPeriod=function(e){var t=(new Date).getFullYear(),n=t-22,i=parseInt(e)+2e3;return i>t&&(i-=1e3),!(i<n)},e}());var A=/^(\d{2})(\d{3})(\d{3})(\d{1})(\d{3})(\d{3})$/,D=["01","02","21","31","00","20","04","05","06","07","08","09","24","25","26","31","34","35","36","47","48","49","57","58","67","77","78","79","87","88","89","97"],b=[1,4,7,11],S=[8],N=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var n=t(e);if(!this.isValidLength(n.length))return!1;var i=A.exec(n);return!!i&&this.isValidTaxIdentity(i[1])},e.prototype.isValidLength=function(e){return 15==e},e.prototype.isValidTaxIdentity=function(e){return D.includes(e)},e.prototype.format=function(e,n){void 0===n&&(n=!0);var i=t(e);return n&&(i=i.padStart(15,"0")),i.slice(0,15).split("").reduce((function(e,t,n){var a=""+e+t;if(n!==i.length-1){if(b.includes(n))return a+".";if(S.includes(n))return a+"-"}return a}),"")},e}());var T=new(function(){function e(){this.VALID_TELEPHONE_AREACODE=Object.keys(C).reduce((function(e,t){return e.concat(C[t].tel)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=r(e);return this.isValidCellularPrefix(t)},e.prototype.isValidCellularPrefix=function(e){return this.VALID_TELEPHONE_AREACODE.includes(Number(e.substr(1,2)))||this.VALID_TELEPHONE_AREACODE.includes(Number(e.substr(1,3)))},e}());var L=/^([A-Z]{1,2})(\d{1,4})([A-Z]{1,3})$/,x=new(function(){function e(){this.VALID_TNKB_AREACODE=Object.keys(C).reduce((function(e,t){return e.concat(C[t].vehiclePlate)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=e.toUpperCase(),n=L.exec(t);return!!n&&this.isValidTNKBArea(n)},e.prototype.isValidTNKBArea=function(e){return this.VALID_TNKB_AREACODE.includes(e[1])},e}());var k=new(function(){function e(){this.VALID_ZIPCODE=Object.keys(C).reduce((function(e,t){return e.concat(C[t].zipCode)}),[])}return e.prototype.isValid=function(e){if(!e)return!1;var t=e.toString();return this.isValidLength(t)&&this.isValidZIPCode(t)},e.prototype.isValidLength=function(e){return 5==e.length},e.prototype.isValidZIPCode=function(e){for(var t=0,n=this.VALID_ZIPCODE;t<n.length;t++){var i=n[t];if(i.from<=e&&i.to<=e)return!0}return!1},e}());var E=new(function(){function e(){}return e.prototype.getData=function(){return d.map((function(e){return{key:e,name:o[e].name}}))},e}());var K=new(function(){function e(){}return e.prototype.getData=function(){return B.map((function(e){return{key:e,name:C[e].name}}))},e}());e.formatCCNumber=function(e){return c.format(e)},e.formatDate=function(e){var t=e.replace(/(\d{4})(\d{2})(?:(\d{2})?)/,"$1-$2-$3");return new Date(t)},e.formatNPWP=function(e,t){return void 0===t&&(t=!0),N.format(e,t)},e.getBankData=function(){return E.getData()},e.getProvinceData=function(){return K.getData()},e.isValidATMNumber=function(e,t){return u.isValid(e,t)},e.isValidCCNumber=function(e){return c.isValid(e)},e.isValidCellularNumber=function(e){return f.isValid(e)},e.isValidEmail=function(e){return m.isValid(e)},e.isValidNIK=function(e){return V.isValid(e)},e.isValidNIP=function(e){return v.isValid(e)},e.isValidNISN=function(e){return I.isValid(e)},e.isValidNPWP=function(e){return N.isValid(e)},e.isValidTNKB=function(e){return x.isValid(e)},e.isValidTelephoneNumber=function(e){return T.isValid(e)},e.isValidZIP=function(e){return k.isValid(e)},e.numbersOnly=t,e.parseCellularPrefix=a,e.parseTelephoneAreaCode=r,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=nusantara-valid.min.js.map | ||
/*! | ||
* Nusantara Valid v0.2.0 | ||
* Copyright 2020 - Fajar Setya Budi (https://magicjar.github.io) | ||
* Contributors (https://github.com/magicjar/nusantara-valid/graphs/contributors) | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
*/ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).NusantaraValid={})}(this,(function(e){"use strict";function t(e){return String(e).replace(/[^\d]/g,"")}function n(e,t){void 0===t&&(t={});var n=t.cellular,a=void 0!==n&&n,r=t.countryCode,i=void 0===r?0:r,o=String(e).replace(/[^\d]/g,"").replace(/^0+/,"");return a&&Number(o.substr(0,2))===i&&(o=o.substring(2)),o}function a(e,t,n){var a=n.collection,r=void 0===a?[]:a,i=n.minLength,o=void 0===i?0:i,u=n.maxLength,d=void 0===u?0:u;switch(e){case 0:return t==o;case 1:return t>=o&&t<=d;case 2:return r.includes(t);default:return!1}}function r(e){return new Date(t(e).replace(/(\d{4})(?:(\d{2})?)(?:(\d{2})?)/,"$1-$2-$3"))}function i(e,t){return e.indexOf(t)>-1}var o=function(e,t){for(var n=[],a=e;a<=t;a++)n=n.concat(a);return n},u={BCAK:{name:"Bank Central Asia",digits:10,dotIndex:[]},BCAS:{name:"Bank Central Asia Syariah",digits:10,dotIndex:[]},BNIK:{name:"Bank Negara Indonesia",digits:10,dotIndex:[]},BNIS:{name:"Bank Negara Indonesia Syariah",digits:10,dotIndex:[]},BRIK:{name:"Bank Rakyat Indonesia",digits:15,dotIndex:[]},BRIS:{name:"Bank Rakyat Indonesia Syariah",digits:10,dotIndex:[]},BTNK:{name:"Bank Tabungan Negara",digits:16,dotIndex:[]},BTNS:{name:"Bank Tabungan Negara Syariah",digits:10,dotIndex:[]},BTPK:{name:"Bank Tabungan Pensiunan Nasional",digits:11,dotIndex:[]},BTPS:{name:"Bank Tabungan Pensiunan Nasional Syariah",digits:10,dotIndex:[]},BUKK:{name:"Bank Bukopin",digits:10,dotIndex:[]},BUKS:{name:"Bank Bukopin Syariah",digits:10,dotIndex:[]},CMBK:{name:"Bank CIMB Niaga",digits:13,dotIndex:[]},CMBS:{name:"Bank CIMB Niaga Syariah",digits:13,dotIndex:[]},DNMK:{name:"Bank Danamon",digits:10,dotIndex:[]},DNMS:{name:"Bank Danamon Syariah",digits:10,dotIndex:[]},MDRK:{name:"Bank Mandiri",digits:13,dotIndex:[]},MDRS:{name:"Bank Mandiri Syariah",digits:10,dotIndex:[]},MGAK:{name:"Bank Mega",digits:15,dotIndex:[]},MGAS:{name:"Bank Mega Syariah",digits:10,dotIndex:[]},MUAM:{name:"Bank Muamalat",digits:10,dotIndex:[]},PMTK:{name:"Bank Permata",digits:10,dotIndex:[]},PMTS:{name:"Bank Permata Syariah",digits:10,dotIndex:[]},PNBK:{name:"Panin Bank",digits:10,dotIndex:[]},PNBS:{name:"Panin Bank Syariah",digits:10,dotIndex:[]}},d=Object.keys(u),l=new(function(){function e(){this.VALID_ATMNUMBER_LENGTH=d.reduce((function(e,t){return i(e,u[t].digits)?e:e.concat(u[t].digits)}),[])}return e.prototype.isValid=function(e,n){if(void 0===n&&(n=""),!e||"string"!=typeof e)return!1;var r=t(e),i=a(2,r.length,{collection:this.VALID_ATMNUMBER_LENGTH});return n&&(i=a(0,r.length,{minLength:u[n].digits})),i},e}());var c=new(function(){function e(){}return e.prototype.getData=function(e){return void 0===e&&(e=""),e?{key:e,name:u[e].name}:d.map((function(e){return{key:e,name:u[e].name}}))},e}());var s={TELKOMSEL:{name:"Telkomsel",prefix:o(811,813).concat(o(821,823)).concat(o(851,853))},INDOSAT:{name:"Indosat Ooredoo",prefix:o(814,816).concat(o(855,858))},XL:{name:"XL Axiata",prefix:o(817,819).concat([859,877,878])},TRI:{name:"Hutchinson Tri",prefix:o(895,899)},SMARTFREN:{name:"Smartfren",prefix:o(881,889)},AXIS:{name:"AXIS",prefix:o(831,833).concat([838])}},f=[2,6],m=Object.keys(s),p={AC:{name:"Aceh",bpsCode:11,vehiclePlate:["BL"],tel:o(641,659).concat([627,629]),zipCode:[{from:23111,to:24794}]},BA:{name:"Bali",bpsCode:51,vehiclePlate:["DK"],tel:o(361,368),zipCode:[{from:80111,to:82262}]},BB:{name:"Kepulauan Bangka Belitung",bpsCode:19,vehiclePlate:["BN"],tel:o(715,719),zipCode:[{from:33111,to:33792}]},BE:{name:"Bengkulu",bpsCode:17,vehiclePlate:["BD"],tel:o(736,739).concat([732]),zipCode:[{from:38113,to:39377}]},BT:{name:"Banten",bpsCode:36,vehiclePlate:["A"],tel:o(252,257),zipCode:[{from:15111,to:15820},{from:42111,to:42455}]},GO:{name:"Gorontalo",bpsCode:75,vehiclePlate:["DM"],tel:[435,443],zipCode:[{from:96111,to:96574}]},JA:{name:"Jambi",bpsCode:15,vehiclePlate:["BH"],tel:o(740,748),zipCode:[{from:36111,to:37574}]},JB:{name:"Jawa Barat",bpsCode:32,vehiclePlate:["D","E","F","T","Z"],tel:o(231,234).concat(o(260,267)).concat([22,251]),zipCode:[{from:16110,to:17730},{from:40111,to:46476}]},JI:{name:"Jawa Timur",bpsCode:35,vehiclePlate:["L","M","N","P","S","W","AE","AG"],tel:o(321,358).concat([31]),zipCode:[{from:60111,to:69493}]},JK:{name:"Jakarta",bpsCode:31,vehiclePlate:["B"],tel:[21],zipCode:[{from:10110,to:14540}]},JT:{name:"Jawa Tengah",bpsCode:33,vehiclePlate:["G","H","K","R","AA","AD"],tel:o(275,299).concat(o(271,273)).concat([24,356]),zipCode:[{from:50111,to:54474},{from:56111,to:59584}]},KB:{name:"Kalimantan Barat",bpsCode:61,vehiclePlate:["KB"],tel:o(564,568).concat([534]),zipCode:[{from:78111,to:79682}]},KI:{name:"Kalimantan Timur",bpsCode:64,vehiclePlate:["KT"],tel:o(541,556),zipCode:[{from:75111,to:77381}]},KR:{name:"Kepulauan Riau",bpsCode:21,vehiclePlate:["BP"],tel:o(771,779),zipCode:[{from:29111,to:29878}]},KS:{name:"Kalimantan Selatan",bpsCode:63,vehiclePlate:["DA"],tel:o(511,527),zipCode:[{from:70111,to:72276}]},KT:{name:"Kalimantan Tengah",bpsCode:62,vehiclePlate:["KH"],tel:o(513,539),zipCode:[{from:73111,to:74874}]},KU:{name:"Kalimantan Utara",bpsCode:65,vehiclePlate:["KU"],tel:o(551,556),zipCode:[{from:77111,to:77574}]},LA:{name:"Lampung",bpsCode:18,vehiclePlate:["BE"],tel:o(721,729),zipCode:[{from:34111,to:35686}]},MA:{name:"Maluku",bpsCode:81,vehiclePlate:["DE"],tel:o(910,931),zipCode:[{from:97114,to:97669}]},MU:{name:"Maluku Utara",bpsCode:82,vehiclePlate:["DG"],tel:o(910,931),zipCode:[{from:97711,to:97869}]},NB:{name:"Nusa Tenggara Barat",bpsCode:52,vehiclePlate:["DR","EA"],tel:o(370,376).concat([364]),zipCode:[{from:83115,to:84459}]},NT:{name:"Nusa Tenggara Timur",bpsCode:53,vehiclePlate:["DH","EB","ED"],tel:o(380,389),zipCode:[{from:85111,to:87284}]},PA:{name:"Papua",bpsCode:94,vehiclePlate:["PA"],tel:o(951,986).concat([901,902]),zipCode:[{from:98511,to:99976}]},PB:{name:"Papua Barat",bpsCode:91,vehiclePlate:["PB"],tel:o(951,986).concat([901,902]),zipCode:[{from:98011,to:98495}]},RI:{name:"Riau",bpsCode:14,vehiclePlate:["BM"],tel:o(760,769).concat([624]),zipCode:[{from:28111,to:29569}]},SA:{name:"Sulawesi Utara",bpsCode:71,vehiclePlate:["DB","DL"],tel:o(430,438),zipCode:[{from:95111,to:95999}]},SB:{name:"Sumatra Barat",bpsCode:13,vehiclePlate:["BA"],tel:o(751,759),zipCode:[{from:25111,to:27779}]},SG:{name:"Sulawesi Tenggara",bpsCode:74,vehiclePlate:["DT"],tel:o(401,408),zipCode:[{from:93111,to:93963}]},SN:{name:"Sulawesi Selatan",bpsCode:73,vehiclePlate:["DD","DP","DW"],tel:o(410,421).concat(o(471,485)).concat([423,427]),zipCode:[{from:90111,to:91273},{from:91611,to:92985}]},SR:{name:"Sulawesi Barat",bpsCode:76,vehiclePlate:["DC"],tel:[422,426,428],zipCode:[{from:91311,to:91591}]},SS:{name:"Sumatra Selatan",bpsCode:16,vehiclePlate:["BG"],tel:o(711,714).concat(o(730,735)).concat([702]),zipCode:[{from:30111,to:32388}]},ST:{name:"Sulawesi Tengah",bpsCode:72,vehiclePlate:["DN"],tel:o(445,465),zipCode:[{from:94111,to:94981}]},SU:{name:"Sumatra Utara",bpsCode:12,vehiclePlate:["BB","BK"],tel:o(620,639).concat([601]),zipCode:[{from:20111,to:22999}]},YO:{name:"Yogyakarta",bpsCode:34,vehiclePlate:["AB"],tel:[274],zipCode:[{from:55111,to:55893}]}},g=Object.keys(p),h=new(function(){function e(){this.CELLULAR_PROVIDER_PREFIXES=m.reduce((function(e,t){return e.concat(s[t].prefix)}),[])}return e.prototype.isValid=function(e,t){if(void 0===t&&(t=""),!e||"string"!=typeof e)return!1;var r,i=n(e,{cellular:!0,countryCode:62}),o=a(1,i.length,{minLength:10,maxLength:12});return r=t?s[t].prefix:this.CELLULAR_PROVIDER_PREFIXES,o&&this.isValidCellularProviderPrefix(Number(i.substr(0,3)),r)},e.prototype.isValidCellularProviderPrefix=function(e,t){return i(t,e)},e.prototype.getData=function(e){var t={};t.number=this.format(e);for(var a=Number(n(e,{cellular:!0,countryCode:62}).substr(0,3)),r=0,o=m;r<o.length;r++){var u=o[r],d=s[u];if(i(d.prefix,a)){t.provider={key:u,name:d.name};break}}return t},e.prototype.format=function(e,t){void 0===t&&(t=!1);var a=n(e,{cellular:!0,countryCode:62}),r=a.slice(0,a.length).split("").reduce((function(e,t,n){var r=""+e+t;return n!==a.length-1&&i(f,n)?r+"-":r}),"");return t?"+"+62..toString()+r:"0"+r},e}());var v=new(function(){function e(){}return e.prototype.getData=function(e){return void 0===e&&(e=""),e?{key:e,name:s[e].name}:m.map((function(e){return{key:e,name:s[e].name}}))},e}());var C=["4","5"],B=[3,7,11,11],P=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var n=t(e);return this.isValidMII(e.charAt(0))&&a(0,n.length,{minLength:16})},e.prototype.isValidMII=function(e){return i(C,e)},e.prototype.format=function(e){var n=t(e);return n.slice(0,16).split("").reduce((function(e,t,a){var r=""+e+t;return a!==n.length-1&&i(B,a)?r+" ":r}),"")},e}());var b=/^([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/,y=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=b.exec(e);return null!==t&&a(1,t[0].length,{minLength:1,maxLength:254})&&a(1,t[1].length,{minLength:1,maxLength:64})},e}());var N=/^(\d{2})(\d{2})(\d{2})(\d{6})(\d{4})$/,D=new(function(){function e(){this.VALID_BPSCODE=g.reduce((function(e,t){return e.concat(p[t].bpsCode)}),[])}return e.prototype.isValid=function(e,n,o){if(void 0===n&&(n=""),void 0===o&&(o=""),!e||"string"!=typeof e)return!1;var u=N.exec(t(e));if(!u)return!1;var d=a(0,u[0].length,{minLength:16}),l=this.reformatBirthday(u[4]),c=i(this.VALID_BPSCODE,parseInt(u[1])),s=!isNaN(r("19"+l).getTime());(n&&p[n].bpsCode!=u[1]&&(c=!1),o)&&(l!=t(o).substring(2,8)&&(s=!1));return d&&c&&s},e.prototype.reformatBirthday=function(e){var t=/(\d{2})(\d{2})(\d{2})/.exec(e);if(t){var n=t[1],a=t[2],r=t[3];return Number(n)>40&&(n=(Number(n)-40).toString()),r+""+a+n}return""},e.prototype.getData=function(e){var n=N.exec(t(e)),a={};if(!n)return a;a.nik=n[0],a.sex=Number(n[4].substr(0,2))>40?"Female":"Male";var o=this.reformatBirthday(n[4]),u=i(this.VALID_BPSCODE,parseInt(n[1])),d=!isNaN(r("19"+o).getTime());if(u){for(var l={},c=0,s=g;c<s.length;c++){var f=s[c],m=p[f];if(m.bpsCode==n[1]){l.key=f,l.name=m.name;break}}a.province=l}if(d){var h=(new Date).getFullYear(),v=Number(o.substr(0,2))+2e3,C=o.substring(2,6);v>h&&(v-=100),a.birthday=new Date(r(v+""+C))}return a},e}());var I=/^(\d{8})(\d{6})([1,2]{1})(\d{3})$/,A=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var n=I.exec(t(e));return null!==n&&!isNaN(r(n[1]).getTime())&&!isNaN(r(n[2]).getTime())&&a(0,n[0].length,{minLength:18})},e.prototype.getData=function(e){var n={},a=I.exec(t(e));return a?(n.nip=a[0],n.birthday=r(a[1]),n.recruit_date=a[2].substr(0,4)+"-"+a[2].substr(4,2),n.sex=1==Number(a[3])?"Male":"Female",n):n},e}());var V=/^(\d{3})(\d{3})(\d{4})$/,x=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var n=V.exec(t(e));return null!==n&&this.isValidPeriod(n[1])&&a(0,n[0].length,{minLength:10})},e.prototype.isValidPeriod=function(e){var t=(new Date).getFullYear(),n=t-22,a=parseInt(e)+2e3;return a>t&&(a-=1e3),!(a<n)},e}());var S=/^(\d{2})(\d{3})(\d{3})(\d{1})(\d{3})(\d{3})$/,T=["01","02","21","31","00","20","04","05","06","07","08","09","24","25","26","31","34","35","36","47","48","49","57","58","67","77","78","79","87","88","89","97"],k=[1,4,7,11],E=[8],K=new(function(){function e(){}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var n=t(e),r=S.exec(n);return null!==r&&this.isValidTaxIdentity(r[1])&&a(0,r[0].length,{minLength:15})},e.prototype.isValidTaxIdentity=function(e){return i(T,e)},e.prototype.format=function(e){var n=t(e);return n.slice(0,15).split("").reduce((function(e,t,a){var r=""+e+t;if(a!==n.length-1){if(i(k,a))return r+".";if(i(E,a))return r+"-"}return r}),"")},e}());var L=new(function(){function e(){}return e.prototype.getData=function(e){return void 0===e&&(e=""),e?{key:e,name:p[e].name}:g.map((function(e){return{key:e,name:p[e].name}}))},e}());var z=new(function(){function e(){this.VALID_TELEPHONE_AREACODE=g.reduce((function(e,t){return e.concat(p[t].tel)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=n(e);return!isNaN(this.isValidCellularPrefix(t))},e.prototype.isValidCellularPrefix=function(e){var t=Number(e.substr(0,2));return i(this.VALID_TELEPHONE_AREACODE,t)?t:(t=Number(e.substr(0,3)),i(this.VALID_TELEPHONE_AREACODE,t)?t:NaN)},e.prototype.getData=function(e){var t={},a=n(e);t.number=this.format(a);for(var r=this.isValidCellularPrefix(a),o=0,u=g;o<u.length;o++){var d=u[o],l=p[d];if(i(l.tel,r)){t.origin={key:d,name:l.name};break}}return t},e.prototype.format=function(e,t){void 0===t&&(t=!1);var a=n(e),r=this.isValidCellularPrefix(a).toString(),o=[];o=2===r.length?[1]:[2];var u=a.slice(0,a.length).split("").reduce((function(e,t,n){var r=""+e+t;return n!==a.length-1&&i(o,n)?r+"-":r}),"");return t?"+62"+u:"0"+u},e}());var M=/^([A-Z]{1,2})(\d{1,4})([A-Z]{1,3})$/,R=new(function(){function e(){this.VALID_TNKB_AREACODE=g.reduce((function(e,t){return e.concat(p[t].vehiclePlate)}),[])}return e.prototype.isValid=function(e){if(!e||"string"!=typeof e)return!1;var t=e.toUpperCase(),n=M.exec(t);return null!==n&&this.isValidTNKBArea(n[1])},e.prototype.isValidTNKBArea=function(e){return i(this.VALID_TNKB_AREACODE,e)},e.prototype.getData=function(e){var t={},n=e.toUpperCase(),a=M.exec(n);if(!a)return t;for(var r=0,o=g;r<o.length;r++){var u=o[r],d=p[u];if(i(d.vehiclePlate,a[1])){t={areaCode:a[1],index:Number(a[2]),detailedAreaCode:a[3],province:{key:u,name:d.name}};break}}return t},e}());var _=new(function(){function e(){this.ZIP_RANGE=g.reduce((function(e,t){return e.concat(p[t].zipCode)}),[])}return e.prototype.isValid=function(e,t){if(void 0===t&&(t=""),!e)return!1;var n=this.ZIP_RANGE,r=a(0,(e=e.toString()).length,{minLength:5});return t&&(n=p[t].zipCode),r&&this.isValidZIPCode(e,n)},e.prototype.isValidZIPCode=function(e,t){for(var n=0,a=t;n<a.length;n++){var r=a[n];if(r.from<=e&&r.to>=e)return!0}return!1},e}());e.cleanPhoneNumbers=n,e.correctLength=a,e.formatCCNumber=function(e){return P.format(e)},e.formatCellularNumber=function(e,t){return void 0===t&&(t=!1),h.format(e,t)},e.formatDate=r,e.formatNPWP=function(e){return K.format(e)},e.formatTelephoneNumber=function(e,t){return void 0===t&&(t=!1),z.format(e,t)},e.getDataBank=function(e){return c.getData(e)},e.getDataBanks=function(){return c.getData()},e.getDataCellularNumber=function(e){return h.getData(e)},e.getDataCellularProvider=function(e){return v.getData(e)},e.getDataCellularProviders=function(){return v.getData()},e.getDataNIK=function(e){return D.getData(e)},e.getDataNIP=function(e){return A.getData(e)},e.getDataProvince=function(e){return L.getData(e)},e.getDataProvinces=function(){return L.getData()},e.getDataTNKB=function(e){return R.getData(e)},e.getDataTelephoneNumber=function(e){return z.getData(e)},e.includes=i,e.isValidATMNumber=function(e){return l.isValid(e)},e.isValidATMNumberWithComparison=function(e,t){return void 0===t&&(t=""),l.isValid(e,t)},e.isValidCCNumber=function(e){return P.isValid(e)},e.isValidCellularNumber=function(e){return h.isValid(e)},e.isValidCellularNumberWithComparison=function(e,t){return h.isValid(e,t)},e.isValidEmail=function(e){return y.isValid(e)},e.isValidNIK=function(e){return D.isValid(e)},e.isValidNIKWithComparison=function(e,t){var n=t.provinceKey,a=void 0===n?"":n,r=t.birthday,i=void 0===r?"":r;return D.isValid(e,a,i)},e.isValidNIP=function(e){return A.isValid(e)},e.isValidNISN=function(e){return x.isValid(e)},e.isValidNPWP=function(e){return K.isValid(e)},e.isValidTNKB=function(e){return R.isValid(e)},e.isValidTelephoneNumber=function(e){return z.isValid(e)},e.isValidZIP=function(e){return _.isValid(e)},e.isValidZIPWithComparison=function(e,t){var n=t.provinceKey,a=void 0===n?"":n;return _.isValid(e,a)},e.numbersOnly=t,e.range=o,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=nusantara-valid.min.js.map |
{ | ||
"name": "nusantara-valid", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"description": "Nusantara Valid is a data validator to validate any Indonesian specific civil data such as nik, nip, and many more.", | ||
@@ -40,5 +40,13 @@ "author": { | ||
"clean": "shx rm -rf dist", | ||
"compile": "npm-run-all --sequential clean compile:js", | ||
"compile:js": "rollup --config rollup.config.js --sourcemap", | ||
"test": "mocha --require ts-node/register **/*.test.ts" | ||
"compile": "npm-run-all clean --parallel compile:*", | ||
"compile:cjs": "rollup --environment FORMAT:cjs --config rollup.config.js --sourcemap", | ||
"compile:es": "rollup --environment FORMAT:esm --config rollup.config.js --sourcemap", | ||
"compile:umd": "rollup --environment FORMAT:umd --config rollup.config.js --sourcemap", | ||
"minify": "npm-run-all --parallel minify:*", | ||
"minify:cjs": "terser --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content=dist/cjs/nusantara-valid.js.map, includeSources, url=nusantara-valid.min.js.map\" --output dist/cjs/nusantara-valid.min.js dist/cjs/nusantara-valid.js", | ||
"minify:es": "terser --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content=dist/esm/nusantara-valid.js.map, includeSources, url=nusantara-valid.min.js.map\" --output dist/esm/nusantara-valid.min.js dist/esm/nusantara-valid.js", | ||
"minify:umd": "terser --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content=dist/umd/nusantara-valid.js.map, includeSources, url=nusantara-valid.min.js.map\" --output dist/umd/nusantara-valid.min.js dist/umd/nusantara-valid.js", | ||
"pre-release": "npm-run-all compile minify", | ||
"serve": "http-server --silent -p 3000", | ||
"test": "mocha --require ts-node/register src/test/*" | ||
}, | ||
@@ -53,7 +61,8 @@ "devDependencies": { | ||
"chai": "^4.2.0", | ||
"http-server": "^0.12.3", | ||
"mocha": "^7.2.0", | ||
"npm-run-all": "^4.1.5", | ||
"rollup": "^2.18.1", | ||
"rollup-plugin-terser": "^6.1.0", | ||
"shx": "^0.3.2", | ||
"terser": "^4.8.0", | ||
"ts-node": "^8.10.2", | ||
@@ -60,0 +69,0 @@ "tslib": "^2.0.0", |
167
README.md
@@ -1,6 +0,10 @@ | ||
# Nusantara Valid | ||
<p align="center"> | ||
<img src="https://magicjar.github.io/assets/images/portfolios/nusantara-valid-logo.svg" alt="Nusantara Valid logo" width=72 height=72> | ||
<h1 align="center" style="font-weight: bold">Nusantara Valid</h1> | ||
</p> | ||
Nusantara Valid is a data validator to validate any Indonesian specific civil data such as nik, nip, and many more. | ||
## Table of contents | ||
## **Table of contents** | ||
@@ -11,6 +15,5 @@ - [What it can do?](#what-it-can-do) | ||
- [API](#api) | ||
- [Creators](#creators) | ||
- [License](#license) | ||
## What it can do? | ||
## **What it can do?** | ||
@@ -29,8 +32,10 @@ - ATM Number (Nomor Rekening) | ||
## Getting started | ||
## **Getting started** | ||
- [Download the latest release.](https://github.com/magicjar/nusantara-valid/) | ||
There are some ways to import the package | ||
- [Download the latest release.](https://github.com/magicjar/nusantara-valid/releases) | ||
- Clone the repo: | ||
`git clone https://github.com/magicjar/nusantara-valid.git` | ||
- Install with [npm](https://www.npmjs.com/): | ||
@@ -40,10 +45,15 @@ | ||
The package includes multiple formats to support different process. | ||
- **nusantara-valid.cjs.js** - CommonJS module. | ||
- **nusantara-valid.es.mjs** - ES module. | ||
- **nusantara-valid.umd.js** - UMD module. Can be used with good-usual-way `script` tag | ||
- or CDN from [jsDelivr](https://www.jsdelivr.com) | ||
## Usage | ||
[https://cdn.jsdelivr.net/npm/nusantara-valid@0.2.0/dist/umd/nusantara-valid.min.js](https://cdn.jsdelivr.net/npm/nusantara-valid@0.2.0/dist/umd/nusantara-valid.min.js) | ||
The package includes multiple formats to support different build process. | ||
- **/cjs/nusantara-valid.js** - CommonJS module. | ||
- **/esm/nusantara-valid.mjs** - ES module. | ||
- **/umd/nusantara-valid.js** - UMD module. Can be used in browser with `script` tag | ||
## **Usage** | ||
### CommonJS module way (`require()`) | ||
``` javascript | ||
@@ -54,45 +64,87 @@ const NusantaraValid = require('nusantara-valid') | ||
### ES module way (`import`) | ||
``` javascript | ||
import NusantaraValid from './node_modules/nusantara-valid/dist/nusantara-valid.es.mjs' | ||
import NusantaraValid from './node_modules/nusantara-valid/dist/esm/nusantara-valid.mjs' | ||
``` | ||
### Good-usual-way (`<script></script>`) | ||
### Good-old-browser-way (`<script></script>`) | ||
**Local** | ||
``` html | ||
<script src="../dist/nusantara-valid.umd.js"></script> | ||
<script src="../dist/umd/nusantara-valid.min.js"></script> | ||
``` | ||
## API | ||
**CDN** | ||
``` html | ||
<script src="https://cdn.jsdelivr.net/npm/nusantara-valid@0.2.0/dist/umd/nusantara-valid.min.js"></script> | ||
``` | ||
## **API** | ||
### ATM Number (Nomor Rekening) | ||
``` javascript | ||
isValidATMNumber(rek: string, bank?: string); | ||
isValidATMNumber(atm: string); // boolean | ||
isValidATMNumber('87.800.000.00'); | ||
isValidATMNumber('1230005123000', 'MDRK'); | ||
isValidATMNumberWithComparison(atm: string, bankKey: string); // boolean | ||
isValidATMNumberWithComparison('1230005123000', 'MDRK'); | ||
``` | ||
### Bank | ||
``` javascript | ||
getBankData(); | ||
getDataBank(bankKey: string); // object | ||
getDataBank('BCAK'); | ||
getDataBanks(); // array of object | ||
``` | ||
### Cellular Number (Nomor HP) | ||
``` javascript | ||
isValidCellularNumber(cel: string); | ||
isValidCellularNumber(cel: string); // boolean | ||
isValidCellularNumber('081212341234'); | ||
isValidCellularNumberWithComparison(cel: string, providerKey: string); // boolean | ||
isValidCellularNumberWithComparison('081212341234', 'TELKOMSEL'); | ||
// You should validate the cellular number before retriving the data | ||
getDataCellularNumber(cel: string); // object | ||
getDataCellularNumber('085612341234'); | ||
// You should validate the cellular number before formating | ||
formatCellularNumber(cel: string, int:boolean = false) // string | ||
formatCellularNumber('+6281812341234'); // 0818-1234-1234 | ||
formatCellularNumber('085612341234', true); // +62856-1234-1234 | ||
``` | ||
### Cellular Provider | ||
``` javascript | ||
getDataCellularProvider(key: string); // object | ||
getDataCellularProvider('TELKOMSEL'); | ||
getDataCellularProviders(); // array of object | ||
``` | ||
### Credit Card Number | ||
``` javascript | ||
isValidCCNumber(cc: string); | ||
isValidCCNumber(cc: string); // boolean | ||
isValidCCNumber('4000123456789010'); | ||
isValidCCNumber('5000 1234 5678 9010'); | ||
formatCCNumber(cc: string); | ||
formatCCNumber('4000123456789010'); | ||
formatCCNumber('5000 1234 5678 9010'); | ||
// You should validate the CC number before formating | ||
formatCCNumber(cc: string); // string | ||
formatCCNumber('4000123456789010'); // 4000 1234 5678 9010 | ||
formatCCNumber('5000 1234 5678 9010'); // 5000 1234 5678 9010 | ||
``` | ||
``` javascript | ||
isValidEmail(email: string); | ||
isValidEmail(email: string); // boolean | ||
isValidEmail('myawesom-email@domain.tld'); | ||
@@ -102,11 +154,20 @@ ``` | ||
### Nomor Induk Kependudukan (NIK) | ||
``` javascript | ||
isValidNIK(nik: string | number); | ||
isValidNIK(nik: string); // boolean | ||
isValidNIK('3101011212930001'); | ||
isValidNIK(3101011212930001); | ||
isValidNIKWithComparison(nik: string, comparison: { provinceKy?: string, birthday?: string }); // boolean | ||
isValidNIKWithComparison('3101011212930001', { provinceKey: 'JK', birthday: '1993-12-12' }); | ||
isValidNIKWithComparison('3401012012930001', { provinceKey: 'YO' }); | ||
// You should validate the NIK before retriving the data | ||
getDataNIK(nik: string); // object | ||
getDataNIK('3101011212930001'); | ||
``` | ||
### Nomor Induk Pegawai Negeri Sipil (NIP) | ||
``` javascript | ||
isValidNIP(nip: string); | ||
isValidNIP(nip: string); // boolean | ||
isValidNIP('198512262000051001'); | ||
@@ -116,4 +177,5 @@ ``` | ||
### Nomor Induk Siswa Nasional (NISN) | ||
``` javascript | ||
isValidNISN(nisn: string); | ||
isValidNISN(nisn: string); // boolean | ||
isValidNISN('0061230001'); | ||
@@ -123,44 +185,65 @@ ``` | ||
### Nomor Pokok Wajib Pajak (NPWP) | ||
``` javascript | ||
isValidNPWP(npwp: string); | ||
isValidNPWP(npwp: string); // boolean | ||
isValidNPWP('09.123.123.1-123.123'); | ||
isValidNPWP('091231231123123'); | ||
formatNPWP(npwp: string | number, pad?: true); // xx.xxx.xxx.x-xxx.xxx | ||
// You should validate the NPWP number before formating | ||
formatNPWP(npwp: string); // string | ||
formatNPWP('091231231123123'); | ||
formatNPWP(671231231123123, false); | ||
``` | ||
### Province | ||
``` javascript | ||
getProvinceData(); | ||
getDataProvince(key: string); // object | ||
getDataProvince('YO'); | ||
getDataProvinces(); // array of object | ||
``` | ||
### Tanda Nomor Kendaraan Bermotor (TNKB) | ||
``` javascript | ||
isValidTNKB(tnkb: string); | ||
isValidTNKB(tnkb: string); // boolean | ||
isValidTNKB('AB1234XYZ'); | ||
// You should validate the TNKB number before retriving the data | ||
getDataTNKB(tnkb: string); // object | ||
getDataTNKB('AB1234XYZ'); | ||
``` | ||
### Telephone Number (Nomor Telefon) | ||
``` javascript | ||
isValidTelephoneNumber(tel: string); | ||
isValidTelephoneNumber(tel: string); // boolean | ||
isValidTelephoneNumber('0274123123'); | ||
// You should validate the telephone number before retriving the data | ||
getDataTelephoneNumber(cel: string); // object | ||
getDataTelephoneNumber('0274123123'); | ||
// You should validate the telephone number before formating | ||
formatTelephoneNumber(tel: string, int:boolean = false) // string | ||
formatTelephoneNumber('0274123123'); // 0274-123123 | ||
formatTelephoneNumber('0274123123', true); // +62274-123123 | ||
``` | ||
### ZIP Code (Kode POS) | ||
``` javascript | ||
isValidZIP(zip: string | number); | ||
isValidZIP(zip: string | number); // boolean | ||
isValidZIP('55524'); | ||
isValidZIP(55524); | ||
isValidZIPWithComparison(zip: string | number, comparison: { provinceKy?: string }); // boolean | ||
isValidZIPWithComparison('55524', { provinceKey: 'YO' }); | ||
isValidZIPWithComparison(55524, { provinceKey: 'YO' }); | ||
``` | ||
## Creators | ||
## **License** | ||
**Fajar Setya Budi** | ||
Copyright (c) 2020 - Fajar Setya Budi | ||
- <https://github.com/magicjar> | ||
## License | ||
Nusantara Valid released under the [MIT License](https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
Nusantara Valid released under the [MIT License](https://github.com/magicjar/nusantara-valid/blob/master/LICENSE). |
/** | ||
* Nusantara Valid: bank.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* BANK_DATA | ||
@@ -137,2 +143,3 @@ * | ||
export const BANKS = Object.keys(BANK_DATA); | ||
export type Bank = keyof typeof BANK_DATA; | ||
export const BANK_KEYS = Object.keys(BANK_DATA) as Bank[]; |
@@ -1,9 +0,15 @@ | ||
const range = (start: number, stop: number) => Array.from({ length: (stop - start) / 1 + 1 }, (_, i) => start + (i * 1)) | ||
/** | ||
* Nusantara Valid: cellular.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
import { range } from '../helpers'; | ||
/** | ||
* CELLULAR_NUMBER | ||
* CELLULAR_PROVIDER_DATA | ||
* | ||
* List cellular provider in Indonesia | ||
**/ | ||
export const CELLULAR_NUMBER = | ||
export const CELLULAR_PROVIDER_DATA = | ||
{ | ||
@@ -39,5 +45,6 @@ TELKOMSEL: { | ||
* | ||
* Minimum length of cellular number including country code | ||
* Minimum length of cellular number without leading zero or country code | ||
* 8961234123 | ||
**/ | ||
export const CELLULAR_MIN_LENGTH = 11; | ||
export const CELLULAR_MIN_LENGTH = 10; | ||
@@ -47,14 +54,14 @@ /** | ||
* | ||
* Maximum length of cellular number including country code | ||
* Maximum length of cellular number without leading zero or country code | ||
**/ | ||
export const CELLULAR_MAX_LENGTH = 13; | ||
export const CELLULAR_MAX_LENGTH = 12; | ||
/** | ||
* CELLULAR_COUNTRY_CODE | ||
* CELLULAR_HYPEN_INDEXES | ||
* | ||
* The country code | ||
* Indexes of where are the hypen separator to be placed on formating | ||
**/ | ||
export const CELLULAR_COUNTRY_CODE = 62; | ||
export const CELLULAR_HYPEN_INDEXES = [2, 6] | ||
export type Cellular = keyof typeof CELLULAR_NUMBER; | ||
export const CELLULAR = Object.keys(CELLULAR_NUMBER) as Cellular[]; | ||
export type CellularProvider = keyof typeof CELLULAR_PROVIDER_DATA; | ||
export const CELLULAR_PROVIDER_KEYS = Object.keys(CELLULAR_PROVIDER_DATA) as CellularProvider[]; |
/** | ||
* Nusantara Valid: creditCard.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* CC_LENGTH | ||
@@ -3,0 +9,0 @@ * |
/** | ||
* Nusantara Valid: email.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* EMAIL_REGEX | ||
@@ -7,7 +13,4 @@ * by Brent Thomas | ||
* EMAIL_REGEX[1] = Local part of email | ||
* EMAIL_REGEX[2] = @ | ||
* EMAIL_REGEX[3] = Domain name | ||
* EMAIL_REGEX[4] = TLD | ||
**/ | ||
export const EMAIL_REGEX = /^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/ | ||
export const EMAIL_REGEX = /^([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]+)$/ | ||
@@ -14,0 +17,0 @@ /** |
/** | ||
* Nusantara Valid: nik.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NIK_REGEX | ||
@@ -3,0 +9,0 @@ * |
/** | ||
* Nusantara Valid: nip.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NIP_REGEX | ||
@@ -10,3 +16,3 @@ * | ||
**/ | ||
export const NIP_REGEX = /^([0-9]{8})([0-9]{6})([1,2]{1})([0-9]{3})$/ | ||
export const NIP_REGEX = /^(\d{8})(\d{6})([1,2]{1})(\d{3})$/ | ||
@@ -13,0 +19,0 @@ /** |
/** | ||
* Nusantara Valid: nisn.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NISN_REGEX | ||
@@ -3,0 +9,0 @@ * |
/** | ||
* Nusantara Valid: npwp.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* NPWP_REGEX | ||
@@ -3,0 +9,0 @@ * |
@@ -1,5 +0,11 @@ | ||
const range = (start: number, stop: number) => Array.from({ length: (stop - start) / 1 + 1 }, (_, i) => start + (i * 1)) | ||
/** | ||
* Nusantara Valid: province.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
import { range } from '../helpers'; | ||
/** | ||
* PROVINCES_DATA | ||
* PROVINCE_DATA | ||
* | ||
@@ -9,3 +15,3 @@ * List of province data in Indonesia including BPS code, vehicle plate, | ||
**/ | ||
export const PROVINCES_DATA = | ||
export const PROVINCE_DATA = | ||
{ | ||
@@ -142,3 +148,3 @@ AC: { | ||
vehiclePlate: ['G', 'H', 'K', 'R', 'AA', 'AD'], | ||
tel: range(271, 299).concat([24, 356]), | ||
tel: range(275, 299).concat(range(271, 273)).concat([24, 356]), | ||
zipCode: [ | ||
@@ -435,2 +441,10 @@ { | ||
export const PROVINCES = Object.keys(PROVINCES_DATA); | ||
/** | ||
* COUNTRY_CODE | ||
* | ||
* ISD code (https://en.wikipedia.org/wiki/List_of_country_calling_codes) | ||
**/ | ||
export const COUNTRY_CODE = 62 | ||
export type Province = keyof typeof PROVINCE_DATA; | ||
export const PROVINCE_KEYS = Object.keys(PROVINCE_DATA) as Province[]; |
/** | ||
* Nusantara Valid: tnkb.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
/** | ||
* TNKB_REGEX | ||
@@ -3,0 +9,0 @@ * |
@@ -1,36 +0,57 @@ | ||
import { IValid, IValidLength } from "../interface/index" | ||
import { numbersOnly } from "../helpers/index" | ||
import { BANK_DATA } from "../datas/bank" | ||
import { IValid } from "../interface" | ||
import { numbersOnly, correctLength, includes } from "../helpers" | ||
import { BANK_DATA, BANK_KEYS } from "../datas/bank" | ||
export class ATMNumber implements IValid, IValidLength { | ||
VALID_ATMNUMBER_LENGTH = Object.keys(BANK_DATA).reduce( | ||
(pref, curr) => pref.includes((BANK_DATA as any)[curr].digits as never) ? pref : pref.concat((BANK_DATA as any)[curr].digits), [] | ||
/** | ||
* Nusantara Valid: _atmNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The ATMNumber class | ||
**/ | ||
class ATMNumber implements IValid { | ||
VALID_ATMNUMBER_LENGTH = BANK_KEYS.reduce( | ||
(pref, curr) => includes(pref, (BANK_DATA as any)[curr].digits) ? pref : pref.concat((BANK_DATA as any)[curr].digits), [] | ||
) as number[] | ||
isValid(atm: string, bank?: string): boolean { | ||
isValid(atm: string, bank: string = ''): boolean { | ||
if (!atm || typeof atm !== 'string') return false | ||
if (bank === undefined) bank = '' | ||
const numOnly = numbersOnly(atm) | ||
if (bank) return (BANK_DATA as any)[bank].digits == numOnly.length | ||
let matchLength = correctLength(2, numOnly.length, { collection: this.VALID_ATMNUMBER_LENGTH }) | ||
return this.isValidLength(numOnly.length) | ||
} | ||
if (bank) | ||
matchLength = correctLength(0, numOnly.length, { minLength: (BANK_DATA as any)[bank].digits } ) | ||
isValidLength(length: number): boolean { | ||
return this.VALID_ATMNUMBER_LENGTH.includes(length) | ||
return matchLength | ||
} | ||
} | ||
export interface Bank { | ||
key: string; | ||
name: string; | ||
const theATM = new ATMNumber() | ||
/** | ||
* ATM number validation without comparison with bank | ||
* | ||
* It will validate ATM number based on it's length | ||
* | ||
* @param {string} atm - The atm number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidATMNumber(atm: string): boolean { | ||
return theATM.isValid(atm) | ||
} | ||
const atm = new ATMNumber() | ||
export function isValid(param: string, index?: string) { | ||
return atm.isValid(param, index) | ||
/** | ||
* ATM number validation with comparison with bank | ||
* | ||
* It will validate ATM number based on it's length and specific Bank's length | ||
* | ||
* @param {string} atm - The atm number to be validated | ||
* @param {string} key - The bank key | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidATMNumberWithComparison(atm: string, key: string = ''): boolean { | ||
return theATM.isValid(atm, key) | ||
} |
@@ -1,24 +0,54 @@ | ||
import { IGetData } from "../interface/index" | ||
import { BANK_DATA, BANKS } from "../datas/bank" | ||
import { IGetData, IDataBank } from "../interface" | ||
import { BANK_DATA, BANK_KEYS } from "../datas/bank" | ||
export class Bank implements IGetData { | ||
getData(): BankData[] { | ||
const banks = BANKS.map((key) => ({ | ||
key, | ||
name: (BANK_DATA as any)[key].name, | ||
})); | ||
/** | ||
* Nusantara Valid: _bank.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Bank class | ||
**/ | ||
class Bank implements IGetData { | ||
getData(index: string = ''): IDataBank | IDataBank[] { | ||
let bank | ||
return banks | ||
if (index) { | ||
bank = { | ||
key: index, | ||
name: (BANK_DATA as any)[index].name | ||
} | ||
} else { | ||
bank = BANK_KEYS.map((key) => ({ | ||
key, | ||
name: (BANK_DATA as any)[key].name, | ||
})) | ||
} | ||
return bank | ||
} | ||
} | ||
export interface BankData { | ||
key: string; | ||
name: string; | ||
const bank = new Bank() | ||
/** | ||
* Specific Bank data retreiver. | ||
* | ||
* Return a specific set of bank object data from user provided bank key | ||
* | ||
* @param {string} key - The Bank key | ||
* @return {IDataBank} The Bank data | ||
**/ | ||
export function getDataBank(key: string): IDataBank { | ||
return bank.getData(key) as IDataBank | ||
} | ||
const atm = new Bank() | ||
export function getData() { | ||
return atm.getData() | ||
/** | ||
* All Bank data retreiver. | ||
* | ||
* Return all bank object data as an array | ||
* | ||
* @return {IDataBank[]} Array of Bank data | ||
**/ | ||
export function getDataBanks(): IDataBank[] { | ||
return bank.getData() as IDataBank[] | ||
} |
@@ -1,33 +0,131 @@ | ||
import { IValid, IValidLength } from '../interface/index' | ||
import { parseCellularPrefix } from '../helpers/index' | ||
import { CELLULAR_NUMBER, CELLULAR_MIN_LENGTH, CELLULAR_MAX_LENGTH } from '../datas/cellular' | ||
import { IValid, IGetData, IFormat, IDataCellularNumber } from '../interface' | ||
import { cleanPhoneNumbers, correctLength, includes } from '../helpers' | ||
import { CELLULAR_MIN_LENGTH, CELLULAR_MAX_LENGTH, CELLULAR_HYPEN_INDEXES, CELLULAR_PROVIDER_DATA, CELLULAR_PROVIDER_KEYS } from '../datas/cellular' | ||
import { COUNTRY_CODE } from '../datas/province' | ||
export class MobileNumber implements IValid, IValidLength { | ||
/** | ||
* Nusantara Valid: _cellularNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CellularNumber class | ||
**/ | ||
class CellularNumber implements IValid, IGetData, IFormat { | ||
VALID_CELLULAR_PREFIX = Object.keys(CELLULAR_NUMBER).reduce( | ||
(a, b) => a.concat((CELLULAR_NUMBER as any)[b].prefix), [] | ||
CELLULAR_PROVIDER_PREFIXES = CELLULAR_PROVIDER_KEYS.reduce( | ||
(a, b) => a.concat((CELLULAR_PROVIDER_DATA as any)[b].prefix), [] | ||
) as number[] | ||
isValid(mobile: string): boolean { | ||
isValid(mobile: string, providerKey: string = ''): boolean { | ||
if (!mobile || typeof mobile !== 'string') return false | ||
const parsedCellularNumber = parseCellularPrefix(mobile) | ||
let prefixCollection | ||
// Return true if isValidLength and isValidCellularPrefix all true | ||
return this.isValidLength(parsedCellularNumber) && this.isValidCellularPrefix(parsedCellularNumber) | ||
const cleanCellularNumber = cleanPhoneNumbers(mobile, { cellular: true, countryCode: COUNTRY_CODE}) | ||
const validLength = correctLength(1, cleanCellularNumber.length, { minLength: CELLULAR_MIN_LENGTH, maxLength: CELLULAR_MAX_LENGTH }) | ||
if (providerKey) | ||
prefixCollection = (CELLULAR_PROVIDER_DATA as any)[providerKey].prefix | ||
else | ||
prefixCollection = this.CELLULAR_PROVIDER_PREFIXES | ||
return validLength | ||
&& this.isValidCellularProviderPrefix(Number(cleanCellularNumber.substr(0, 3)), prefixCollection) | ||
} | ||
isValidCellularPrefix(parsedCellularNumber: string): boolean { | ||
return this.VALID_CELLULAR_PREFIX.includes(Number(parsedCellularNumber.substr(2, 3))) | ||
isValidCellularProviderPrefix(prefix: number, prefixCollection: number[]): boolean { | ||
return includes(prefixCollection, prefix) | ||
} | ||
isValidLength(phone: string): boolean { | ||
return phone.length >= CELLULAR_MIN_LENGTH && phone.length <= CELLULAR_MAX_LENGTH | ||
getData(mobile: string): IDataCellularNumber { | ||
let data = {} as IDataCellularNumber | ||
data.number = this.format(mobile) | ||
const pfx = Number(cleanPhoneNumbers(mobile, { cellular: true, countryCode: COUNTRY_CODE }).substr(0, 3)) | ||
for (const key of CELLULAR_PROVIDER_KEYS) { | ||
const cellProvider = (CELLULAR_PROVIDER_DATA as any)[key] | ||
if (includes(cellProvider.prefix, pfx)) { | ||
data.provider = { | ||
key: key, | ||
name: cellProvider.name | ||
} | ||
break | ||
} | ||
} | ||
return data | ||
} | ||
format(input: string, int: boolean = false): string { | ||
const cleanCelNumber = cleanPhoneNumbers(input, { cellular: true, countryCode: COUNTRY_CODE }) | ||
let formatedNumber = cleanCelNumber | ||
.slice(0, cleanCelNumber.length) | ||
.split('') | ||
.reduce((a, b, index) => { | ||
const result = `${a}${b}`; | ||
if (!(index === cleanCelNumber.length - 1)) { | ||
if (includes(CELLULAR_HYPEN_INDEXES, index)) return `${result}-`; | ||
} | ||
return result; | ||
}, ''); | ||
return int ? '+' + COUNTRY_CODE.toString() + formatedNumber : '0' + formatedNumber | ||
} | ||
} | ||
const mobileNumber = new MobileNumber() | ||
const cellularNumber = new CellularNumber() | ||
export function isValid(param: string) { | ||
return mobileNumber.isValid(param) | ||
/** | ||
* Cellular number validation | ||
* | ||
* It will validate cellular number based on it's prefix and length | ||
* | ||
* @param {string} number - The cellular number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidCellularNumber(number: string): boolean { | ||
return cellularNumber.isValid(number) | ||
} | ||
/** | ||
* Cellular number validation with comparison | ||
* | ||
* It will validate cellular number based on user provided data | ||
* | ||
* @param {string} number - The cellular number to be validated | ||
* @param {string} providerKey - The cellular provider key | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidCellularNumberWithComparison(number: string, providerKey: string): boolean { | ||
return cellularNumber.isValid(number, providerKey) | ||
} | ||
/** | ||
* Cellular number data getter | ||
* | ||
* Return object data based on provided cellular number | ||
* | ||
* @param {string} number - The cellular number | ||
* @return {object} IDataCellularNumber object | ||
**/ | ||
export function getDataCellularNumber(number: string): IDataCellularNumber { | ||
return cellularNumber.getData(number) | ||
} | ||
/** | ||
* Cellular number formating | ||
* | ||
* Format cellular number to local calling format (0) and international calling format (+XX) | ||
* | ||
* @param {string} number - The cellular number to be formated | ||
* @param {boolean} int - Local calling format (leading zero) or international calling format (leading country code) | ||
* @return {string} Formated number | ||
**/ | ||
export function formatCellularNumber(number: string, int: boolean = false): string { | ||
return cellularNumber.format(number, int) | ||
} |
@@ -1,7 +0,13 @@ | ||
import { IValid, IValidLength, IFormat } from "../interface/index" | ||
import { numbersOnly } from "../helpers/index" | ||
import { IValid, IFormat } from "../interface" | ||
import { numbersOnly, correctLength, includes } from "../helpers" | ||
import { CC_LENGTH, CC_VALID_MII, CC_SPACE_INDEXES } from "../datas/creditCard" | ||
export class CreditCard implements IValid, IValidLength, IFormat { | ||
/** | ||
* Nusantara Valid: _creditCard.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The CreditCard class | ||
**/ | ||
class CreditCard implements IValid, IFormat { | ||
isValid(cc: string): boolean { | ||
@@ -12,11 +18,8 @@ if (!cc || typeof cc !== 'string') return false | ||
return this.isValidMII(cc.charAt(0)) && this.isValidLength(numOnly.length) | ||
return this.isValidMII(cc.charAt(0)) | ||
&& correctLength(0, numOnly.length, { minLength: CC_LENGTH }) | ||
} | ||
isValidLength(length: number): boolean { | ||
return length == CC_LENGTH | ||
} | ||
isValidMII(mii: string): boolean { | ||
return CC_VALID_MII.includes(mii) | ||
return includes(CC_VALID_MII, mii) | ||
} | ||
@@ -34,3 +37,3 @@ | ||
if (!(index === newCC.length - 1)) { | ||
if (CC_SPACE_INDEXES.includes(index)) return `${result} `; | ||
if (includes(CC_SPACE_INDEXES, index)) return `${result} `; | ||
} | ||
@@ -45,8 +48,24 @@ | ||
export function isValid(param: string) { | ||
return cc.isValid(param) | ||
/** | ||
* Credit card number validation. | ||
* | ||
* It check if cc number has correct leading MII code and correct CC number's length | ||
* | ||
* @param {string} number - The cc number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidCCNumber(number: string): boolean { | ||
return cc.isValid(number) | ||
} | ||
export function format(param: string) { | ||
return cc.format(param) | ||
/** | ||
* Credit card number formating | ||
* | ||
* Format credit card with the correct format | ||
* | ||
* @param {string} number - CC number to be formated | ||
* @return {string} Formated cc number | ||
**/ | ||
export function formatCCNumber(number: string): string { | ||
return cc.format(number) | ||
} |
@@ -1,5 +0,13 @@ | ||
import { IValid, IValidLength } from "../interface/index" | ||
import { IValid } from "../interface" | ||
import { MAX_EMAIL_LENGTH, EMAIL_REGEX, MAX_LOCALPART_LENGTH } from "../datas/email" | ||
import { correctLength } from '../helpers' | ||
export class Email implements IValid, IValidLength { | ||
/** | ||
* Nusantara Valid: _email.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Email class | ||
**/ | ||
class Email implements IValid { | ||
isValid (email: string): boolean { | ||
@@ -10,17 +18,20 @@ if (!email || typeof email !== 'string') return false | ||
if (!validEmail) return false | ||
// Return true if validEmail, validEmail length and email local part length is true | ||
return validEmail && this.isValidLength(validEmail) | ||
return validEmail !== null | ||
&& correctLength(1, validEmail[0].length, { minLength: 1, maxLength: MAX_EMAIL_LENGTH }) | ||
&& correctLength(1, validEmail[1].length, { minLength: 1, maxLength: MAX_LOCALPART_LENGTH }) | ||
} | ||
isValidLength(email: RegExpExecArray): boolean { | ||
return email.length <= MAX_EMAIL_LENGTH && email[0].length <= MAX_LOCALPART_LENGTH | ||
} | ||
} | ||
const email = new Email() | ||
const theEmail = new Email() | ||
export function isValid (param: string) { | ||
return email.isValid(param) | ||
/** | ||
* E-mail validation. | ||
* | ||
* It check if email has the correct requirements such as local part (username), @ [at] symbol, domain name part, and TLD | ||
* | ||
* @param {string} email - The email, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidEmail(email: string): boolean { | ||
return theEmail.isValid(email) | ||
} |
@@ -1,14 +0,21 @@ | ||
import { IValid, IValidLength } from "../interface/index" | ||
import { IValid, IGetData, IDataNIK, IDataProvince } from "../interface" | ||
import { NIK_REGEX, NIK_LENGTH } from "../datas/nik" | ||
import { numbersOnly } from "../helpers/index" | ||
import { PROVINCES_DATA } from "../datas/province" | ||
import { numbersOnly, correctLength, formatDate, includes } from "../helpers" | ||
import { PROVINCE_DATA, PROVINCE_KEYS } from "../datas/province" | ||
export class NomorIndukKependudukan implements IValid, IValidLength { | ||
/** | ||
* Nusantara Valid: _nomorIndukKependudukan.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukKepemdudukan class | ||
**/ | ||
class NomorIndukKependudukan implements IValid, IGetData { | ||
VALID_BPSCODE = Object.keys(PROVINCES_DATA).reduce( | ||
(a, b) => a.concat((PROVINCES_DATA as any)[b].bpsCode), [] | ||
VALID_BPSCODE = PROVINCE_KEYS.reduce( | ||
(a, b) => a.concat((PROVINCE_DATA as any)[b].bpsCode), [] | ||
) as number[] | ||
isValid(nik: string | number): boolean { | ||
if (!nik) return false | ||
isValid(nik: string, provinceKey: string = '', birthday: string = ''): boolean { | ||
if (!nik || typeof nik !== 'string') return false | ||
@@ -19,35 +26,131 @@ const validNIK = NIK_REGEX.exec(numbersOnly(nik)) | ||
return this.isValidLength(validNIK[0].length) && this.isValidProvince(parseInt(validNIK[1])) && this.isValidBirthday(validNIK[4]) | ||
} | ||
const validLength = correctLength(0, validNIK[0].length, { minLength: NIK_LENGTH }) | ||
const cBirthday = this.reformatBirthday(validNIK[4]) | ||
isValidLength(nip: number): boolean { | ||
return nip == NIK_LENGTH | ||
let validProvince = includes(this.VALID_BPSCODE, parseInt(validNIK[1])) | ||
let validBirthday = !isNaN(formatDate('19' + cBirthday).getTime()) | ||
// Comparison | ||
if (provinceKey) { | ||
if ((PROVINCE_DATA as any)[provinceKey].bpsCode != validNIK[1]) { | ||
validProvince = false | ||
} | ||
} | ||
if (birthday) { | ||
const vBirthday = numbersOnly(birthday).substring(2, 8) // Strip the first 2 digits of year | ||
if (cBirthday != vBirthday) { | ||
validBirthday = false | ||
} | ||
} | ||
return validLength | ||
&& validProvince | ||
&& validBirthday | ||
} | ||
isValidProvince(bpsCode: number): boolean { | ||
return this.VALID_BPSCODE.includes(bpsCode) | ||
// Reformat DDMMYY into YYMMDD | ||
reformatBirthday(birthday: string): string { | ||
const newBirthday = /(\d{2})(\d{2})(\d{2})/.exec(birthday) | ||
if (newBirthday) { | ||
let cDD = newBirthday[1] | ||
const cMM = newBirthday[2] | ||
const cYY = newBirthday[3] | ||
if (Number(cDD) > 40) // Check if it is a man of woman | ||
cDD = (Number(cDD) - 40).toString() | ||
return cYY + '' + cMM + '' + cDD | ||
} | ||
return '' | ||
} | ||
isValidBirthday(birthday: string): boolean { | ||
const newBirthday = /(\d{2})(\d{2})(\d{2})/.exec(birthday) // DDMMYY | ||
getData(nik: string): IDataNIK { | ||
const validNIK = NIK_REGEX.exec(numbersOnly(nik)) | ||
if (!newBirthday) return false | ||
let data = {} as IDataNIK | ||
let dd = parseInt(newBirthday[1]) | ||
let mm = parseInt(newBirthday[2]) | ||
let yy = parseInt(newBirthday[3]) | ||
if (!validNIK) return data | ||
if (dd > 40) // Check if it is a man of woman | ||
dd = dd - 40 | ||
data.nik = validNIK[0] | ||
data.sex = Number(validNIK[4].substr(0, 2)) > 40 ? 'Female' : 'Male' | ||
const formatedBirthday = new Date('19' + yy + '-' + mm + '-' + dd) // '19YY-MM-DD' | ||
return !isNaN(formatedBirthday.getTime()) | ||
const reformatedBirthday = this.reformatBirthday(validNIK[4]) | ||
const validProvince = includes(this.VALID_BPSCODE, parseInt(validNIK[1])) | ||
const validBirthday = !isNaN(formatDate('19' + reformatedBirthday).getTime()) | ||
if (validProvince) { | ||
let province = {} as IDataProvince | ||
for (const key of PROVINCE_KEYS) { | ||
const element = (PROVINCE_DATA as any)[key]; | ||
if (element.bpsCode == validNIK[1]) { | ||
province.key = key, | ||
province.name = element.name | ||
break | ||
} | ||
} | ||
data.province = province | ||
} | ||
if (validBirthday) { | ||
const currentYear = new Date().getFullYear() | ||
let bYYYY = Number(reformatedBirthday.substr(0, 2)) + 2000 | ||
const bMMYY = reformatedBirthday.substring(2, 6) | ||
if (bYYYY > currentYear) { | ||
bYYYY = bYYYY - 100 | ||
} | ||
data.birthday = new Date(formatDate(bYYYY + '' + bMMYY)) | ||
} | ||
return data | ||
} | ||
} | ||
const nik = new NomorIndukKependudukan() | ||
const theNIK = new NomorIndukKependudukan() | ||
export function isValid(param: string | number) { | ||
return nik.isValid(param) | ||
/** | ||
* NIK validation without any comparison with user provided data. | ||
* | ||
* It check if the NIK's bps code is included / exist in VALID_BPSCODE, check if the NIK's has valid birthday | ||
* and if the NIK has the correct length. | ||
* | ||
* @param {string} nik - The NIK, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidNIK(nik: string): boolean { | ||
return theNIK.isValid(nik) | ||
} | ||
/** | ||
* NIK validation with comparison with user provided provinceKey and birthday data. | ||
* | ||
* It will compare NIK's bps code (see: NIK_REGEX[1]) with bps code from PROVINCE_DATA[provinceKey].bpsCode | ||
* and will compare NIK's birthday (see: NIK_REGEX[4] with user provided birthday) | ||
* | ||
* @param {string} nik - The NIK, the one to be validated | ||
* @param {object} comparison - The data to compare with, provinceKey (key from PROVINCE_DATA) and birthday (in YYYYMMDD format) | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidNIKWithComparison(nik: string, comparison: { provinceKey?: string, birthday?: string }): boolean { | ||
let { provinceKey = '', birthday = '' } = comparison | ||
return theNIK.isValid(nik, provinceKey, birthday) | ||
} | ||
/** | ||
* NIK data retreiver. | ||
* | ||
* Return a set of NIK object data from user provided nik | ||
* | ||
* @param {string} nik - The NIK | ||
* @return {object} The NIK data | ||
**/ | ||
export function getDataNIK(nik: string): IDataNIK { | ||
return theNIK.getData(nik) | ||
} |
@@ -1,7 +0,13 @@ | ||
import { IValid, IValidLength } from "../interface/index" | ||
import { IValid, IGetData, IDataNIP } from "../interface" | ||
import { NIP_LENGTH, NIP_REGEX } from "../datas/nip" | ||
import { numbersOnly } from "../helpers/index" | ||
import { numbersOnly, correctLength, formatDate } from "../helpers" | ||
export class NomorIndukPegawaiNegeriSipil implements IValid, IValidLength { | ||
/** | ||
* Nusantara Valid: _nomorIndukPegawaiNegeriSipil.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukPegawaiNegeriSipil class | ||
**/ | ||
class NomorIndukPegawaiNegeriSipil implements IValid, IGetData { | ||
isValid(nip: string): boolean { | ||
@@ -11,25 +17,49 @@ if (!nip || typeof nip !== 'string') return false | ||
const validNIP = NIP_REGEX.exec(numbersOnly(nip)) | ||
if(!validNIP) return false | ||
return this.isValidLength(validNIP[0].length) && this.isValidDate(validNIP[1]) && this.isValidDate(validNIP[2]) | ||
return validNIP !== null | ||
&& !isNaN(formatDate(validNIP[1]).getTime()) | ||
&& !isNaN(formatDate(validNIP[2]).getTime()) | ||
&& correctLength(0, validNIP[0].length, { minLength: NIP_LENGTH }) | ||
} | ||
isValidLength(nip: number): boolean { | ||
return nip == NIP_LENGTH | ||
} | ||
getData(nip: string): IDataNIP { | ||
let data = {} as IDataNIP | ||
isValidDate(date: string): boolean { | ||
const newDate = date.replace(/(\d{4})(\d{2})(?:(\d{2})?)/, "$1-$2-$3") | ||
const validNIP = NIP_REGEX.exec(numbersOnly(nip)) | ||
const formatedDate = new Date(newDate) | ||
if (!validNIP) return data | ||
return !isNaN(formatedDate.getTime()) | ||
data.nip = validNIP[0] | ||
data.birthday = formatDate(validNIP[1]) | ||
data.recruit_date = validNIP[2].substr(0, 4) + '-' + validNIP[2].substr(4, 2) | ||
data.sex = Number(validNIP[3]) == 1 ? 'Male' : 'Female' | ||
return data | ||
} | ||
} | ||
const nip = new NomorIndukPegawaiNegeriSipil() | ||
const theNIP = new NomorIndukPegawaiNegeriSipil() | ||
export function isValid(param: string) { | ||
return nip.isValid(param) | ||
/** | ||
* NIP validation. | ||
* | ||
* Validate NIP by validating NIP's birthday, NIP's recruitment date, and NIP's length | ||
* | ||
* @param {string} nip - The NIP to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidNIP(nip: string): boolean { | ||
return theNIP.isValid(nip) | ||
} | ||
/** | ||
* NIP data retreiver. | ||
* | ||
* Return a set of NIP object data from user provided nip | ||
* | ||
* @param {string} nip - The NIP | ||
* @return {IDataNIP} The NIP data | ||
**/ | ||
export function getDataNIP(nip: string): IDataNIP { | ||
return theNIP.getData(nip) | ||
} |
@@ -1,23 +0,23 @@ | ||
import { IValid, IValidLength } from "../interface/index" | ||
import { IValid } from "../interface" | ||
import { NISN_REGEX, NISN_LENGTH, NISN_AGE_VALIDITY } from "../datas/nisn" | ||
import { numbersOnly } from "../helpers/index" | ||
import { numbersOnly, correctLength } from "../helpers" | ||
export class NomorIndukSiswaNasional implements IValid, IValidLength { | ||
/** | ||
* Nusantara Valid: _nomorIndukSiswaNasional.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorIndukSiswaNasional class | ||
**/ | ||
class NomorIndukSiswaNasional implements IValid { | ||
isValid(nisn: string): boolean { | ||
if (!nisn || typeof nisn !== 'string') return false | ||
if (!this.isValidLength(nisn.length)) return false | ||
const validNISN = NISN_REGEX.exec(numbersOnly(nisn)) | ||
if (!validNISN) return false | ||
return this.isValidPeriod(validNISN[1]) | ||
return validNISN !== null | ||
&& this.isValidPeriod(validNISN[1]) | ||
&& correctLength(0, validNISN[0].length, { minLength: NISN_LENGTH }) | ||
} | ||
isValidLength(nisn: number): boolean { | ||
return nisn == NISN_LENGTH | ||
} | ||
isValidPeriod(year: string): boolean { | ||
@@ -28,16 +28,21 @@ const thisYear = new Date().getFullYear() | ||
if (birthYear > thisYear) { | ||
if (birthYear > thisYear) | ||
birthYear = birthYear - 1000 | ||
} | ||
if (birthYear < endYear) return false | ||
return true | ||
return birthYear < endYear ? false : true | ||
} | ||
} | ||
const nisn = new NomorIndukSiswaNasional() | ||
const theNISN = new NomorIndukSiswaNasional() | ||
export function isValid(param: string) { | ||
return nisn.isValid(param) | ||
/** | ||
* NISN validation. | ||
* | ||
* Validate NISN by validating NISN's birth year (student age) with NISN_AGE_VALIDITY and NISN's length | ||
* | ||
* @param {string} nisn - The NISN to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidNISN(nisn: string): boolean { | ||
return theNISN.isValid(nisn) | ||
} |
@@ -1,7 +0,13 @@ | ||
import { IValid, IValidLength, IFormat } from "../interface/index" | ||
import { IValid, IFormat } from "../interface" | ||
import { NPWP_REGEX, NPWP_LENGTH, NPWP_TAX_IDENTITIES, NPWP_DOT_INDEXES, NPWP_HYPHEN_INDEXES } from "../datas/npwp" | ||
import { numbersOnly } from "../helpers/index" | ||
import { numbersOnly, correctLength, includes } from "../helpers" | ||
export class NomorPokokWajibPajak implements IValid, IValidLength, IFormat { | ||
/** | ||
* Nusantara Valid: _nomorPokokWajibPajak.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The NomorPokokWajibPajak class | ||
**/ | ||
class NomorPokokWajibPajak implements IValid, IFormat { | ||
isValid(npwp: string): boolean { | ||
@@ -12,26 +18,16 @@ if (!npwp || typeof npwp !== 'string') return false | ||
if (!this.isValidLength(numOnly.length)) return false | ||
const regexNPWP = NPWP_REGEX.exec(numOnly) | ||
if (!regexNPWP) return false | ||
return this.isValidTaxIdentity(regexNPWP[1]) | ||
return regexNPWP !== null | ||
&& this.isValidTaxIdentity(regexNPWP[1]) | ||
&& correctLength(0, regexNPWP[0].length, { minLength: NPWP_LENGTH }) | ||
} | ||
isValidLength(npwp: number): boolean { | ||
return npwp == NPWP_LENGTH | ||
} | ||
isValidTaxIdentity(taxIdentity: string): boolean { | ||
return NPWP_TAX_IDENTITIES.includes(taxIdentity) | ||
return includes(NPWP_TAX_IDENTITIES, taxIdentity) | ||
} | ||
format(npwp: string | number, pad = true): string { | ||
format(npwp: string): string { | ||
let newNPWP = numbersOnly(npwp) | ||
if (pad) { | ||
newNPWP = newNPWP.padStart(NPWP_LENGTH, '0'); | ||
} | ||
return newNPWP | ||
@@ -44,4 +40,4 @@ .slice(0, NPWP_LENGTH) | ||
if (!(index === newNPWP.length - 1)) { | ||
if (NPWP_DOT_INDEXES.includes(index)) return `${result}.`; | ||
if (NPWP_HYPHEN_INDEXES.includes(index)) return `${result}-`; | ||
if (includes(NPWP_DOT_INDEXES, index)) return `${result}.`; | ||
if (includes(NPWP_HYPHEN_INDEXES, index)) return `${result}-`; | ||
} | ||
@@ -54,10 +50,26 @@ | ||
const npwp = new NomorPokokWajibPajak() | ||
const theNPWP = new NomorPokokWajibPajak() | ||
export function isValid(param: string) { | ||
return npwp.isValid(param) | ||
/** | ||
* NPWP validation. | ||
* | ||
* Validate NPWP by validating NPWP's tax identity and NPWP's length | ||
* | ||
* @param {string} npwp - The NPWP to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidNPWP(npwp: string): boolean { | ||
return theNPWP.isValid(npwp) | ||
} | ||
export function format(param: string | number, pad = true) { | ||
return npwp.format(param, pad) | ||
/** | ||
* NPWP formating | ||
* | ||
* Format NPWP to the correct requirement | ||
* | ||
* @param {string} npwp - TheNPWP to be formated | ||
* @return {string} Formated NPWP | ||
**/ | ||
export function formatNPWP(npwp: string): string { | ||
return theNPWP.format(npwp) | ||
} |
@@ -1,24 +0,54 @@ | ||
import { IGetData } from "../interface/index" | ||
import { PROVINCES, PROVINCES_DATA } from "../datas/province"; | ||
import { IGetData, IDataProvince } from "../interface" | ||
import { PROVINCE_DATA, PROVINCE_KEYS } from "../datas/province"; | ||
export class Province implements IGetData { | ||
getData(): Prov[] { | ||
const provinces = PROVINCES.map((key) => ({ | ||
key, | ||
name: (PROVINCES_DATA as any)[key].name, | ||
})) | ||
/** | ||
* Nusantara Valid: _province.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The Province class | ||
**/ | ||
class Province implements IGetData { | ||
getData(index: string = ''): IDataProvince | IDataProvince[] { | ||
let province | ||
return provinces | ||
if (index) { | ||
province = { | ||
key: index, | ||
name: (PROVINCE_DATA as any)[index].name | ||
} | ||
} else { | ||
province = PROVINCE_KEYS.map((key) => ({ | ||
key, | ||
name: (PROVINCE_DATA as any)[key].name, | ||
})) | ||
} | ||
return province | ||
} | ||
} | ||
export interface Prov { | ||
key: string; | ||
name: string; | ||
const prov = new Province() | ||
/** | ||
* Get specific province data with IDataProvince object structure | ||
* | ||
* Return object data based on provided province key | ||
* | ||
* @param {string} provinceKey - Array key of the province | ||
* @return {IDataProvince} IDataProvince object | ||
**/ | ||
export function getDataProvince(provinceKey: string): IDataProvince { | ||
return prov.getData(provinceKey) as IDataProvince | ||
} | ||
const atm = new Province() | ||
export function getData() { | ||
return atm.getData() | ||
/** | ||
* Get all province data with IDataProvince object structure | ||
* | ||
* Return all IDataProvince object in Array<IDataProvince> | ||
* | ||
* @return {IDataProvince[]} Array of IDataProvince object | ||
**/ | ||
export function getDataProvinces(): IDataProvince[]{ | ||
return prov.getData() as IDataProvince[] | ||
} |
@@ -1,10 +0,17 @@ | ||
// Vehicle Registration Number (TNKB) / Tanda Nomor Kendaraan Bermotor (TNKB) | ||
import { IValid } from "../interface/index" | ||
import { IValid, IGetData, IDataTNKB } from "../interface" | ||
import { TNKB_REGEX } from "../datas/tnkb" | ||
import { PROVINCES_DATA } from "../datas/province" | ||
import { PROVINCE_DATA, PROVINCE_KEYS } from "../datas/province" | ||
import { includes } from '../helpers' | ||
export class TandaNomorKendaraanBermotor implements IValid { | ||
VALID_TNKB_AREACODE = Object.keys(PROVINCES_DATA).reduce( | ||
(a, b) => a.concat((PROVINCES_DATA as any)[b].vehiclePlate), [] | ||
/** | ||
* Nusantara Valid: _tandaNomorKendaraanBermotor.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The TandaNomorKendaraanBermotor class | ||
**/ | ||
class TandaNomorKendaraanBermotor implements IValid, IGetData { | ||
VALID_TNKB_AREACODE = PROVINCE_KEYS.reduce( | ||
(a, b) => a.concat((PROVINCE_DATA as any)[b].vehiclePlate), [] | ||
) as string[] | ||
@@ -19,16 +26,63 @@ | ||
if (!validTNKB) return false | ||
return validTNKB !== null | ||
&& this.isValidTNKBArea(validTNKB[1]) | ||
} | ||
return this.isValidTNKBArea(validTNKB) | ||
isValidTNKBArea(tnkb: string): boolean { | ||
return includes(this.VALID_TNKB_AREACODE, tnkb) | ||
} | ||
isValidTNKBArea(tnkb: RegExpExecArray): boolean { | ||
return this.VALID_TNKB_AREACODE.includes(tnkb[1]) | ||
getData(tnkb: string): IDataTNKB { | ||
let data = {} as IDataTNKB | ||
const TNKB = tnkb.toUpperCase() | ||
const validTNKB = TNKB_REGEX.exec(TNKB) | ||
if (!validTNKB) return data | ||
for (const key of PROVINCE_KEYS) { | ||
const element = (PROVINCE_DATA as any)[key] | ||
if (includes(element.vehiclePlate, validTNKB[1])) { | ||
data = { | ||
areaCode: validTNKB[1], | ||
index: Number(validTNKB[2]), | ||
detailedAreaCode: validTNKB[3], | ||
province: { | ||
key: key, | ||
name: element.name | ||
} | ||
} | ||
break | ||
} | ||
} | ||
return data | ||
} | ||
} | ||
const tnkb = new TandaNomorKendaraanBermotor() | ||
const theTNKB = new TandaNomorKendaraanBermotor() | ||
export function isValid(param: string) { | ||
return tnkb.isValid(param) | ||
/** | ||
* TNKB validation. | ||
* | ||
* It check if the TNKB's area code is exist in VALID_TNKB_AREACODE | ||
* | ||
* @param {string} tnkb - The TNKB, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidTNKB(tnkb: string): boolean { | ||
return theTNKB.isValid(tnkb) | ||
} | ||
/** | ||
* TNKB data retreiver. | ||
* | ||
* Return a set of TNKB object data from user provided tnkb | ||
* | ||
* @param {string} tnkb - The TNKB | ||
* @return {IDataTNKB} The TNKB data | ||
**/ | ||
export function getDataTNKB(tnkb: string): IDataTNKB { | ||
return theTNKB.getData(tnkb) | ||
} |
@@ -1,9 +0,16 @@ | ||
import { IValid } from "../interface/index"; | ||
import { PROVINCES_DATA } from "../datas/province" | ||
import { parseTelephoneAreaCode } from "../helpers/index"; | ||
import { IValid, IFormat, IGetData, IDataTelephoneNumber } from "../interface"; | ||
import { PROVINCE_DATA, COUNTRY_CODE, PROVINCE_KEYS } from "../datas/province" | ||
import { cleanPhoneNumbers, includes } from "../helpers"; | ||
export class TelephoneNumber implements IValid { | ||
/** | ||
* Nusantara Valid: _telephoneNumber.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The TelephoneNumber class | ||
**/ | ||
class TelephoneNumber implements IValid, IFormat, IGetData { | ||
VALID_TELEPHONE_AREACODE = Object.keys(PROVINCES_DATA).reduce( | ||
(a, b) => a.concat((PROVINCES_DATA as any)[b].tel), [] | ||
VALID_TELEPHONE_AREACODE = PROVINCE_KEYS.reduce( | ||
(a, b) => a.concat((PROVINCE_DATA as any)[b].tel), [] | ||
) as number[] | ||
@@ -14,10 +21,70 @@ | ||
const parsedTelephoneNumber = parseTelephoneAreaCode(tel) | ||
const cleanTelNumber = cleanPhoneNumbers(tel) | ||
return this.isValidCellularPrefix(parsedTelephoneNumber) | ||
return !isNaN(this.isValidCellularPrefix(cleanTelNumber)) | ||
} | ||
isValidCellularPrefix(parsedTel: string): boolean { | ||
return this.VALID_TELEPHONE_AREACODE.includes(Number(parsedTel.substr(1, 2))) || this.VALID_TELEPHONE_AREACODE.includes(Number(parsedTel.substr(1, 3))) | ||
isValidCellularPrefix(parsedTel: string): number { | ||
let thePrefix = Number(parsedTel.substr(0, 2)) | ||
if (includes(this.VALID_TELEPHONE_AREACODE, thePrefix)) | ||
return thePrefix | ||
thePrefix = Number(parsedTel.substr(0, 3)) | ||
if (includes(this.VALID_TELEPHONE_AREACODE, thePrefix)) | ||
return thePrefix | ||
return NaN | ||
} | ||
getData(tel: string): IDataTelephoneNumber { | ||
let data = {} as IDataTelephoneNumber | ||
const cleanTelNumber = cleanPhoneNumbers(tel) | ||
data.number = this.format(cleanTelNumber) | ||
const pfx = this.isValidCellularPrefix(cleanTelNumber) | ||
for (const key of PROVINCE_KEYS) { | ||
const element = (PROVINCE_DATA as any)[key] | ||
if (includes(element.tel, pfx)) { | ||
data.origin = { | ||
key: key, | ||
name: element.name | ||
} | ||
break | ||
} | ||
} | ||
return data | ||
} | ||
format(tel: string, int:boolean = false): string { | ||
const cleanTelNumber = cleanPhoneNumbers(tel) | ||
const pfx = this.isValidCellularPrefix(cleanTelNumber).toString() | ||
let TEL_HYPEN_INDEX = [] as any | ||
if (pfx.length === 2) | ||
TEL_HYPEN_INDEX = [1] | ||
else | ||
TEL_HYPEN_INDEX = [2] | ||
let formatedNumber = cleanTelNumber | ||
.slice(0, cleanTelNumber.length) | ||
.split('') | ||
.reduce((a, b, index) => { | ||
const result = `${a}${b}`; | ||
if (!(index === cleanTelNumber.length - 1)) { | ||
if (includes(TEL_HYPEN_INDEX, index)) return `${result}-`; | ||
} | ||
return result; | ||
}, ''); | ||
return int ? '+' + COUNTRY_CODE + formatedNumber : '0' + formatedNumber | ||
} | ||
} | ||
@@ -27,4 +94,37 @@ | ||
export function isValid(param: string) { | ||
return telNumber.isValid(param) | ||
/** | ||
* Telephone number validation | ||
* | ||
* It will validate telephone number based on it's prefix | ||
* | ||
* @param {string} number - The telephone number to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidTelephoneNumber(number: string): boolean { | ||
return telNumber.isValid(number) | ||
} | ||
/** | ||
* Telephone number data getter | ||
* | ||
* Return object data based on provided telephone number | ||
* | ||
* @param {string} number - The telephone number | ||
* @return {object} IDataTelephoneNumber object | ||
**/ | ||
export function getDataTelephoneNumber(number: string): IDataTelephoneNumber { | ||
return telNumber.getData(number) | ||
} | ||
/** | ||
* Telephone number formating | ||
* | ||
* Format telephone number to local calling format (0) and international calling format (+XX) | ||
* | ||
* @param {string} number - The telephone number to be formated | ||
* @param {boolean} int - Local calling format (leading zero) or international calling format (leading country code) | ||
* @return {string} Formated number | ||
**/ | ||
export function formatTelephoneNumber(number: string, int:boolean = false): string { | ||
return telNumber.format(number, int) | ||
} |
@@ -1,24 +0,36 @@ | ||
import { IValid, IValidLength } from "../interface/index" | ||
import { PROVINCES_DATA } from "../datas/province" | ||
import { IValid } from "../interface" | ||
import { PROVINCE_DATA, PROVINCE_KEYS } from "../datas/province" | ||
import { correctLength } from '../helpers' | ||
export class ZIPCode implements IValid, IValidLength { | ||
VALID_ZIPCODE = Object.keys(PROVINCES_DATA).reduce( | ||
(a, b) => a.concat((PROVINCES_DATA as any)[b].zipCode), [] | ||
) as any[] | ||
/** | ||
* Nusantara Valid: _zipCode.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
* | ||
* @class The ZIPCode class | ||
**/ | ||
class ZIPCode implements IValid { | ||
isValid(zip: string | number): boolean { | ||
ZIP_RANGE = PROVINCE_KEYS.reduce( | ||
(a, b) => a.concat((PROVINCE_DATA as any)[b].zipCode), [] | ||
) as object[] | ||
isValid(zip: string | number, provinceKey: string = ''): boolean { | ||
if (!zip) return false | ||
const sZIP = zip.toString() | ||
let zipArray = this.ZIP_RANGE | ||
zip = zip.toString() | ||
return this.isValidLength(sZIP) && this.isValidZIPCode(sZIP) | ||
} | ||
const validLength = correctLength(0, zip.length, { minLength: 5 }) | ||
isValidLength(zip: string): boolean { | ||
return zip.length == 5 | ||
if (provinceKey) | ||
zipArray = (PROVINCE_DATA as any)[provinceKey].zipCode | ||
return validLength | ||
&& this.isValidZIPCode(zip, zipArray) | ||
} | ||
isValidZIPCode(zip: string): boolean { | ||
for (let val of this.VALID_ZIPCODE) { | ||
if (val.from <= zip && val.to <= zip) { | ||
isValidZIPCode(zip: string, zipRange: any[]): boolean { | ||
for (let val of zipRange) { | ||
if (val.from <= zip && val.to >= zip) { | ||
return true | ||
@@ -32,6 +44,28 @@ } | ||
const zip = new ZIPCode() | ||
const theZIP = new ZIPCode() | ||
export function isValid(param: string | number) { | ||
return zip.isValid(param) | ||
/** | ||
* ZIP validation without any comparison with user provided data. | ||
* | ||
* It will check if the ZIP is included / exist in VALID_ZIPCODE array and if the ZIP has the correct length of 6. | ||
* | ||
* @param {string} zip - The ZIP, the one to be validated | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidZIP(zip: string | number): boolean { | ||
return theZIP.isValid(zip) | ||
} | ||
/** | ||
* ZIP validation with comparison with user provided provinceKey. | ||
* | ||
* It will check if the ZIP is included / exist in ZIP range from PROVINCE_DATA[provinceKey].zipCode[] | ||
* | ||
* @param {string | number} zip - The ZIP, the one to be validated | ||
* @param {object} comparison - The data to compare with, provinceKey (key from PROVINCE_DATA) | ||
* @return {boolean} Is valid or not | ||
**/ | ||
export function isValidZIPWithComparison(zip: string | number, comparison: { provinceKey?: string }): boolean { | ||
const { provinceKey = '' } = comparison | ||
return theZIP.isValid(zip, provinceKey) | ||
} |
@@ -1,20 +0,19 @@ | ||
// isValid (true / false) | ||
export { isValid as isValidATMNumber } from './_atmNumber' | ||
export { isValid as isValidCCNumber } from './_creditCard' | ||
export { isValid as isValidCellularNumber } from './_cellularNumber' | ||
export { isValid as isValidEmail } from './_email' | ||
export { isValid as isValidNIK } from './_nomorIndukKependudukan' | ||
export { isValid as isValidNIP } from './_nomorIndukPegawaiNegeriSipil' | ||
export { isValid as isValidNISN } from './_nomorIndukSiswaNasional' | ||
export { isValid as isValidNPWP } from './_nomorPokokWajibPajak' | ||
export { isValid as isValidTelephoneNumber } from './_telephoneNumber' | ||
export { isValid as isValidTNKB } from './_tandaNomorKendaraanBermotor' | ||
export { isValid as isValidZIP } from './_zipCode' | ||
// format (string) | ||
export { format as formatCCNumber } from './_creditCard' | ||
export { format as formatNPWP } from './_nomorPokokWajibPajak' | ||
// getData (any) | ||
export { getData as getBankData } from './_bank' | ||
export { getData as getProvinceData } from './_province' | ||
/** | ||
* Nusantara Valid: functions/index.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
export * from './_atmNumber' | ||
export * from './_bank' | ||
export * from './_cellularNumber' | ||
export * from './_cellularProvider' | ||
export * from './_creditCard' | ||
export * from './_email' | ||
export * from './_nomorIndukKependudukan' | ||
export * from './_nomorIndukPegawaiNegeriSipil' | ||
export * from './_nomorIndukSiswaNasional' | ||
export * from './_nomorPokokWajibPajak' | ||
export * from './_province' | ||
export * from './_telephoneNumber' | ||
export * from './_tandaNomorKendaraanBermotor' | ||
export * from './_zipCode' |
@@ -0,7 +1,11 @@ | ||
import { numbersOnly } from './_numbersOnly' | ||
/** | ||
* Format date from string | ||
* | ||
* @param {string} date - The string date in YYYYMMDD format | ||
* @return {Date} Formated date. | ||
**/ | ||
export function formatDate(date: string): Date { | ||
const newDate = date.replace(/(\d{4})(\d{2})(?:(\d{2})?)/, "$1-$2-$3") | ||
const formatedDate = new Date(newDate) | ||
return formatedDate | ||
return new Date(numbersOnly(date).replace(/(\d{4})(?:(\d{2})?)(?:(\d{2})?)/, "$1-$2-$3")) | ||
} |
@@ -0,1 +1,7 @@ | ||
/** | ||
* Strip all non number characters | ||
* | ||
* @param {string | number} input - Input parameter. Can be string or number | ||
* @return {string} Clean number. Free from any non number characters. | ||
**/ | ||
export function numbersOnly (input: string | number): string | ||
@@ -2,0 +8,0 @@ { |
@@ -0,4 +1,11 @@ | ||
/** | ||
* Nusantara Valid: helpers/index.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
export * from './_numbersOnly' | ||
export * from './_parseCellularNumber' | ||
export * from './_parseTelephoneNumber' | ||
export * from './_formatDate' | ||
export * from './_cleanPhoneNumbers' | ||
export * from './_correctLength' | ||
export * from './_formatDate' | ||
export * from './_includes' | ||
export * from './_range' |
@@ -0,3 +1,8 @@ | ||
/** | ||
* IFormat class interface | ||
* | ||
* @interface | ||
**/ | ||
export interface IFormat { | ||
format: (args: any) => any; | ||
format: (args: any) => string; | ||
} |
@@ -0,3 +1,8 @@ | ||
/** | ||
* IGetData class interface | ||
* | ||
* @interface | ||
**/ | ||
export interface IGetData { | ||
getData: (args: any) => any; | ||
} |
@@ -0,3 +1,8 @@ | ||
/** | ||
* IValid class interface | ||
* | ||
* @interface | ||
**/ | ||
export interface IValid { | ||
isValid: (args: any) => boolean; | ||
} |
@@ -0,4 +1,9 @@ | ||
/** | ||
* Nusantara Valid: interface/index.ts | ||
* | ||
* Licensed under MIT (https://github.com/magicjar/nusantara-valid/blob/master/LICENSE) | ||
**/ | ||
export * from './_IData' | ||
export * from './_IFormat' | ||
export * from './_IValid' | ||
export * from './_IValidLength' | ||
export * from './_IGetData' | ||
export * from './_IGetData' | ||
export * from './_IValid' |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
472705
7690
242
16
53
1