Skip to content

Commit

Permalink
Merge pull request #2 from Santhosh-Kumar-99/FEATURE/taxID
Browse files Browse the repository at this point in the history
Feature/tax
  • Loading branch information
Santhosh-Kumar-99 authored Jan 26, 2023
2 parents e7569d5 + 6c6b864 commit c446a94
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 11 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ Validator | Description
**isSlug** | Check if the string is of type slug. `Options` allow a single hyphen between string. e.g. [`cn-cn`, `cn-c-c`]
**isStrongPassword(str [, options])** | Check if a password is strong or not. Allows for custom requirements or scoring rules. If `returnScore` is true, then the function returns an integer score for the password rather than a boolean.<br/>Default options: <br/>`{ minLength: 8, minLowercase: 1, minUppercase: 1, minNumbers: 1, minSymbols: 1, returnScore: false, pointsPerUnique: 1, pointsPerRepeat: 0.5, pointsForContainingLower: 10, pointsForContainingUpper: 10, pointsForContainingNumber: 10, pointsForContainingSymbol: 10 }`
**isTime(str [, options])** | Check if the input is a valid time. e.g. [`23:01:59`, new Date().toLocaleTimeString()].<br/><br/> `options` is an object which can contain the keys `hourFormat` or `mode`.<br/><br/>`hourFormat` is a key and defaults to `'hour24'`.<br/><br/>`mode` is a key and defaults to `'default'`. <br/><br/>`hourFomat` can contain the values `'hour12'` or `'hour24'`, `'hour24'` will validate hours in 24 format and `'hour12'` will validate hours in 12 format. <br/><br/>`mode` can contain the values `'default'` or `'withSeconds'`, `'default'` will validate `HH:MM` format, `'withSeconds'` will validate the `HH:MM:SS` format.
**isTaxID(str, locale)** | Check if the given value is a valid Tax Identification Number. Default locale is `en-US`.<br/><br/>More info about exact TIN support can be found in `src/lib/isTaxID.js`<br/><br/>Supported locales: `[ 'bg-BG', 'cs-CZ', 'de-AT', 'de-DE', 'dk-DK', 'el-CY', 'el-GR', 'en-CA', 'en-GB', 'en-IE', 'en-IN-GSTIN', 'en-US', 'es-ES', 'et-EE', 'fi-FI', 'fr-BE', 'fr-CA', 'fr-FR', 'fr-LU', 'hr-HR', 'hu-HU', 'it-IT', 'lb-LU', 'lt-LT', 'lv-LV' 'mt-MT', 'nl-BE', 'nl-NL', 'pl-PL', 'pt-BR', 'pt-PT', 'ro-RO', 'sk-SK', 'sl-SI', 'sv-SE' ]`
**isTaxID(str, locale, localeOption)** | Check if the given value is a valid Tax Identification Number. Default locale is `en-US`.<br/><br/>More info about exact TIN support can be found in `src/lib/isTaxID.js`<br/><br/>Specify localeOption if country has multiple Tax Identification Number.<br/><br/>Supported localeOption: `['GSTIN','PAN']` for `en-IN` locale.<br></br>Supported locales: `[ 'bg-BG', 'cs-CZ', 'de-AT', 'de-DE', 'dk-DK', 'el-CY', 'el-GR', 'en-CA', 'en-GB', 'en-IE', 'en-IN-GSTIN', 'en-US', 'es-ES', 'et-EE', 'fi-FI', 'fr-BE', 'fr-CA', 'fr-FR', 'fr-LU', 'hr-HR', 'hu-HU', 'it-IT', 'lb-LU', 'lt-LT', 'lv-LV' 'mt-MT', 'nl-BE', 'nl-NL', 'pl-PL', 'pt-BR', 'pt-PT', 'ro-RO', 'sk-SK', 'sl-SI', 'sv-SE' ]`
**isURL(str [, options])** | check if the string is an URL.<br/><br/>`options` is an object which defaults to `{ protocols: ['http','https','ftp'], require_tld: true, require_protocol: false, require_host: true, require_port: false, require_valid_protocol: true, allow_underscores: false, host_whitelist: false, host_blacklist: false, allow_trailing_dot: false, allow_protocol_relative_urls: false, allow_fragments: true, allow_query_components: true, disallow_auth: false, validate_length: true }`.<br/><br/>require_protocol - if set as true isURL will return false if protocol is not present in the URL.<br/>require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option.<br/>protocols - valid protocols can be modified with this option.<br/>require_host - if set as false isURL will not check if host is present in the URL.<br/>require_port - if set as true isURL will check if port is present in the URL.<br/>allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed.<br/>allow_fragments - if set as false isURL will return false if fragments are present.<br/>allow_query_components - if set as false isURL will return false if query components are present.<br/>validate_length - if set as false isURL will skip string length validation (2083 characters is IE max URL length).
**isUUID(str [, version])** | check if the string is a UUID (version 1, 2, 3, 4 or 5).
**isVariableWidth(str)** | check if the string contains a mixture of full and half-width chars.
Expand Down
42 changes: 34 additions & 8 deletions src/lib/isTaxID.js
Original file line number Diff line number Diff line change
Expand Up @@ -1136,7 +1136,10 @@ const taxIdFormat = {
'en-CA': /^\d{9}$/,
'en-GB': /^\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\d{6}[ABCD ]$/i,
'en-IE': /^\d{7}[A-W][A-IW]{0,1}$/i,
'en-IN-GSTIN': /^((?!39)(?!00)[0-3][0-9]|97)([A-Z]{3}[ABCFGHLJPT][A-Z](?!0000)[0-9]{4}[A-Z])[1-9A-Z]Z[0-9 A-Z]$/,
'en-IN': {
GSTIN: /^((?!39)(?!00)[0-3][0-9]|97)([A-Z]{3}[ABCFGHLJPT][A-Z](?!0000)[0-9]{4}[A-Z])[1-9A-Z]Z[0-9 A-Z]$/,
PAN: /^[A-Z]{3}[ABCFGHLJPT][A-Z](?!0000)[0-9]{4}[A-Z]$/,
},
'en-US': /^\d{2}[- ]{0,1}\d{7}$/,
'es-ES': /^(\d{0,8}|[XYZKLM]\d{7})[A-HJ-NP-TV-Z]$/i,
'et-EE': /^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$/,
Expand Down Expand Up @@ -1212,13 +1215,21 @@ const sanitizeRegexes = {
// sanitizeRegexes locale aliases
sanitizeRegexes['nl-BE'] = sanitizeRegexes['fr-BE'];

// If locale has multiple TIN
const multipleTinLocale = {
'en-IN': {
GSTIN: true,
PAN: true,
},
};

/*
* Validator function
* Return true if the passed string is a valid tax identification number
* for the specified locale.
* Throw an error exception if the locale is not supported.
*/
export default function isTaxID(str, locale = 'en-US') {
export default function isTaxID(str, locale = 'en-US', localeOption) {
assertString(str);
// Copy TIN to avoid replacement if sanitized
let strcopy = str.slice(0);
Expand All @@ -1227,15 +1238,30 @@ export default function isTaxID(str, locale = 'en-US') {
if (locale in sanitizeRegexes) {
strcopy = strcopy.replace(sanitizeRegexes[locale], '');
}
if (!taxIdFormat[locale].test(strcopy)) {
return false;
}

if (locale in taxIdCheck) {
return taxIdCheck[locale](strcopy);
// Check if locale has multiple TIN
if (locale in multipleTinLocale) {
if (!localeOption) throw new Error(`Locale requires localeOption ${localeOption}`);

if (!(multipleTinLocale[locale][localeOption])) throw new Error(`Locale Option ${localeOption} not available for specified locale ${locale}`);

if (!(taxIdFormat[locale][localeOption].test(strcopy))) return false;

if (locale in taxIdCheck) {
return taxIdCheck[locale][localeOption](strcopy);
}
} else {
if (localeOption || localeOption === '') throw new Error(`Locale ${locale} do not have localeOption '${localeOption}'`);

if (!taxIdFormat[locale].test(strcopy)) {
return false;
}
if (locale in taxIdCheck) {
return taxIdCheck[locale](strcopy);
}
}
// Fallthrough; not all locales have algorithmic checks
return true;
}

throw new Error(`Invalid locale '${locale}'`);
}
28 changes: 26 additions & 2 deletions test/validators.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ let validator_js = fs.readFileSync(require.resolve('../validator.js')).toString(
function test(options) {
let args = options.args || [];
args.unshift(null);
console.log(args);
if (options.error) {
options.error.forEach((error) => {
args[0] = error;
Expand Down Expand Up @@ -12090,15 +12091,38 @@ describe('Validators', () => {
});
test({
validator: 'isTaxID',
args: ['en-IN-GSTIN'],
args: ['en-IN', 'GSTIN'],
valid: [
'27AAPFU0939F1ZV',
'27AASCS2460H1Z0',
'29AAGCB7383J1Z4'],
invalid: [
'',
'00AAGCB0000J1Z4',
'29AAGCB7383J114',
'88AAPFU093921ZV'],
'88AAPFU093921ZV',
'**AAGCB7689J1Z4',
'S AAGCB7893J1Z4'],
});
test({
validator: 'isTaxID',
args: ['en-IN', 'PAN'],
valid: [
'MFWAA0001A',
'ABPPA2020K',
'KLSPK0909Z',
'ACSLY4499S',
'ABPPA2020K'],
invalid: [
'',
'123PA0001A',
'ACSZA2020K',
'ACSP19090K',
'ACSPA0000K',
'ACSYA44999',
'ACS A4499A',
'*#$PA4499J',
'ACSLY4499SK'],
});
test({
validator: 'isTaxID',
Expand Down

0 comments on commit c446a94

Please sign in to comment.