New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

nusantara-valid

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nusantara-valid - npm Package Compare versions

Comparing version 0.1.0 to 0.2.0

dist/esm/nusantara-valid.js

1462

dist/cjs/nusantara-valid.js

@@ -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",

@@ -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
```
### E-Mail
``` 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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc