quantique-field-validator 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,10 @@ const defaultErrorMessages = (rules, type) => {
14
14
  Alphanumeric: "value must be alphanumeric",
15
15
  chassisNumber: "Invalid chassis number",
16
16
  engineNumber: "Invalid engine number",
17
+ ipAddress: "Invalid IP Address",
18
+ name: "Invalid name",
19
+ rto: "Invalid RTO",
20
+ ifsc: "Invalid Bank IFSC Code",
17
21
  customValidation:
18
22
  rules.errorMessages?.customValidation || "Custom validation failed",
19
23
  };
@@ -0,0 +1,41 @@
1
+ //Bank IFSC validation
2
+ const validateBankIFSC = (
3
+ value,
4
+ rules = { minLength: 11, maxLength: 11 },
5
+ defaultErrorMessages,
6
+ type
7
+ ) => {
8
+ if (rules?.minLength && value?.length < rules?.minLength) {
9
+ return {
10
+ isValid: false,
11
+ error:
12
+ rules?.errorMessages?.minLength ||
13
+ defaultErrorMessages(rules, type).minLength,
14
+ };
15
+ }
16
+
17
+ if (rules?.maxLength && value?.length > rules?.maxLength) {
18
+ return {
19
+ isValid: false,
20
+ error:
21
+ rules?.errorMessages?.maxLength ||
22
+ defaultErrorMessages(rules, type).maxLength,
23
+ };
24
+ }
25
+
26
+ const defaultRegex = /^[A-Z]{4}0[A-Z0-9]{6}$/;
27
+ const regexToUse = rules?.regex ? new RegExp(rules.regex) : defaultRegex;
28
+ if (!regexToUse.test(value)) {
29
+ return {
30
+ isValid: false,
31
+ error: rules?.errorMessages?.invalid
32
+ ? rules?.errorMessages?.invalid
33
+ : defaultErrorMessages(rules, type).ifsc ||
34
+ defaultErrorMessages(rules, type).invalid,
35
+ };
36
+ }
37
+
38
+ return { isValid: true, error: '' };
39
+ };
40
+
41
+ module.exports = validateBankIFSC;
@@ -0,0 +1,36 @@
1
+ // First/Middle/Last Name validation
2
+ const validateFirstMiddleLastName = (value, rules, defaultErrorMessages, type) => {
3
+ if (rules?.minLength && value?.length < rules?.minLength) {
4
+ return {
5
+ isValid: false,
6
+ error:
7
+ rules?.errorMessages?.minLength ||
8
+ defaultErrorMessages(rules, type).minLength,
9
+ };
10
+ }
11
+
12
+ if (rules?.maxLength && value?.length > rules?.maxLength) {
13
+ return {
14
+ isValid: false,
15
+ error:
16
+ rules?.errorMessages?.maxLength ||
17
+ defaultErrorMessages(rules, type).maxLength,
18
+ };
19
+ }
20
+
21
+ const defaultRegex = /^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð]+$/u;
22
+ const regexToUse = rules?.regex ? new RegExp(rules.regex) : defaultRegex;
23
+ if (!regexToUse.test(value)) {
24
+ return {
25
+ isValid: false,
26
+ error: rules?.errorMessages?.invalid
27
+ ? rules?.errorMessages?.invalid
28
+ : defaultErrorMessages(rules, type).name ||
29
+ defaultErrorMessages(rules, type).invalid,
30
+ };
31
+ }
32
+
33
+ return { isValid: true, error: '' };
34
+ };
35
+
36
+ module.exports = validateFirstMiddleLastName;
@@ -8,7 +8,7 @@ const validateGST = (value, rules, defaultErrorMessages, type) => {
8
8
  isValid: false,
9
9
  error:
10
10
  rules?.errorMessages?.regex ||
11
- "Please enterer a valid GSTIN number" ||
11
+ "Please entere a valid GSTIN number" ||
12
12
  defaultErrorMessages(rules, type).invalid,
13
13
  };
14
14
  }
@@ -0,0 +1,41 @@
1
+ // IP Address validation
2
+ const validateIPAddress = (value, rules, defaultErrorMessages, type) => {
3
+ if (rules?.minLength && value?.length < rules?.minLength) {
4
+ return {
5
+ isValid: false,
6
+ error:
7
+ rules?.errorMessages?.minLength ||
8
+ defaultErrorMessages(rules, type).minLength,
9
+ };
10
+ }
11
+
12
+ if (rules?.maxLength && value?.length > rules?.maxLength) {
13
+ return {
14
+ isValid: false,
15
+ error:
16
+ rules?.errorMessages?.maxLength ||
17
+ defaultErrorMessages(rules, type).maxLength,
18
+ };
19
+ }
20
+
21
+ const defaultRegex =
22
+ rules?.version === 'v4'
23
+ ? /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
24
+ : rules?.version === 'v6'
25
+ ? /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/
26
+ : /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
27
+ const regexToUse = rules?.regex ? new RegExp(rules.regex) : defaultRegex;
28
+ if (!regexToUse.test(value)) {
29
+ return {
30
+ isValid: false,
31
+ error: rules?.errorMessages?.invalid
32
+ ? rules?.errorMessages?.invalid
33
+ : defaultErrorMessages(rules, type).ipAddress ||
34
+ defaultErrorMessages(rules, type).invalid,
35
+ };
36
+ }
37
+
38
+ return { isValid: true, error: '' };
39
+ };
40
+
41
+ module.exports = validateIPAddress;
@@ -4,27 +4,16 @@ const validatePanCard = (
4
4
  defaultErrorMessages,
5
5
  type
6
6
  ) => {
7
- const defaultRules = {
8
- regex: /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/,
9
- };
7
+ const defaultRegex = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;
8
+ const regexToUse = rules?.regex ? new RegExp(rules.regex) : defaultRegex;
10
9
 
11
-
12
- const effectiveRules = {
13
- ...defaultRules,
14
- ...rules,
15
- };
16
-
17
-
18
-
19
- if (
20
- effectiveRules?.regex &&
21
- !new RegExp(effectiveRules?.regex).test(value)
22
- ) {
10
+ if (!regexToUse.test(value)) {
23
11
  return {
24
12
  isValid: false,
25
13
  error:
26
- effectiveRules?.errorMessages?.invalid ||
27
- defaultErrorMessages(effectiveRules, type).invalid,
14
+ rules?.errorMessages?.regex ||
15
+ rules?.errorMessages?.invalid ||
16
+ defaultErrorMessages(rules, type).invalid,
28
17
  };
29
18
  }
30
19
 
@@ -0,0 +1,41 @@
1
+ // RTO validation
2
+ const validateRTO = (value, rules, defaultErrorMessages, type) => {
3
+ if (rules?.minLength && value?.length < rules?.minLength) {
4
+ return {
5
+ isValid: false,
6
+ error:
7
+ rules?.errorMessages?.minLength ||
8
+ defaultErrorMessages(rules, type).minLength,
9
+ };
10
+ }
11
+
12
+ if (rules?.maxLength && value?.length > rules?.maxLength) {
13
+ return {
14
+ isValid: false,
15
+ error:
16
+ rules?.errorMessages?.maxLength ||
17
+ defaultErrorMessages(rules, type).maxLength,
18
+ };
19
+ }
20
+
21
+ const defaultRegex =
22
+ rules?.version === 'new'
23
+ ? /^[A-Z]{2}-[0-9]{1,2}(-[A-Z]{1,2})?$/
24
+ : rules?.version === 'all'
25
+ ? /^[A-Z]{2}-?[0-9]{1,2}(-?[A-Z]{1,2})?$/
26
+ : /^[A-Z]{2}-[0-9]{1,2}$/;
27
+ const regexToUse = rules?.regex ? new RegExp(rules.regex) : defaultRegex;
28
+ if (!regexToUse.test(value)) {
29
+ return {
30
+ isValid: false,
31
+ error: rules?.errorMessages?.invalid
32
+ ? rules?.errorMessages?.invalid
33
+ : defaultErrorMessages(rules, type).rto ||
34
+ defaultErrorMessages(rules, type).invalid,
35
+ };
36
+ }
37
+
38
+ return { isValid: true, error: '' };
39
+ };
40
+
41
+ module.exports = validateRTO;
package/index.js CHANGED
@@ -7,23 +7,27 @@
7
7
  * @returns {object} - Returns { isValid: boolean, error: string }
8
8
  */
9
9
 
10
- const defaultErrorMessages = require("./Messages/defaultErrorMessages");
11
- const validateString = require("./Validators/validateString");
12
- const validateAlphanumeric = require("./Validators/validateAlphanumeric");
13
- const validateNumber = require("./Validators/validateNumber");
14
- const validateFloatNumber = require("./Validators/validateFloatNumber");
15
- const validateDate = require("./Validators/validateDate");
16
- const validateName = require("./Validators/validateName");
17
- const validateEmail = require("./Validators/validateEmail");
18
- const validateMobile = require("./Validators/validateMobile");
19
- const validateAddress = require("./Validators/validateAddress");
20
- const validatePassword = require("./Validators/validatePassword");
21
- const validateCustom = require("./Validators/validateCustom");
22
- const validateAadhaar = require("./Validators/validateAadhaar");
23
- const validatePanCard = require("./Validators/validatePanCard");
24
- const validateGST = require("./Validators/validateGST");
25
- const validateChassisNumber = require("./Validators/ValidateChassisNumber");
26
- const validateEngineNumber = require("./Validators/validateEngineNumber");
10
+ const defaultErrorMessages = require('./Messages/defaultErrorMessages');
11
+ const validateString = require('./Validators/validateString');
12
+ const validateAlphanumeric = require('./Validators/validateAlphanumeric');
13
+ const validateNumber = require('./Validators/validateNumber');
14
+ const validateFloatNumber = require('./Validators/validateFloatNumber');
15
+ const validateDate = require('./Validators/validateDate');
16
+ const validateName = require('./Validators/validateName');
17
+ const validateFirstMiddleLastName = require('./Validators/validateFirstMiddleLastName');
18
+ const validateEmail = require('./Validators/validateEmail');
19
+ const validateMobile = require('./Validators/validateMobile');
20
+ const validateAddress = require('./Validators/validateAddress');
21
+ const validatePassword = require('./Validators/validatePassword');
22
+ const validateCustom = require('./Validators/validateCustom');
23
+ const validateAadhaar = require('./Validators/validateAadhaar');
24
+ const validatePanCard = require('./Validators/validatePanCard');
25
+ const validateGST = require('./Validators/validateGST');
26
+ const validateChassisNumber = require('./Validators/ValidateChassisNumber');
27
+ const validateEngineNumber = require('./Validators/validateEngineNumber');
28
+ const validateIPAddress = require('./Validators/validateIPAddress');
29
+ const validateRTO = require('./Validators/validateRTO');
30
+ const validateBankIFSC = require('./Validators/validateBankIFSC');
27
31
 
28
32
  const dynamicValidator = (value, type, rules = {}, customValidator = null) => {
29
33
  // Trim the value if it's a string
@@ -32,7 +36,7 @@ const dynamicValidator = (value, type, rules = {}, customValidator = null) => {
32
36
  const selectedValue = value;
33
37
 
34
38
  // Check if field is required and empty
35
- if (rules.required && (!selectedValue || selectedValue === "")) {
39
+ if (rules.required && (!selectedValue || selectedValue === '')) {
36
40
  return {
37
41
  isValid: false,
38
42
  error:
@@ -42,16 +46,16 @@ const dynamicValidator = (value, type, rules = {}, customValidator = null) => {
42
46
  }
43
47
 
44
48
  // Skip further validation if the field is empty and not required
45
- if (!rules.required && (!selectedValue || selectedValue === "")) {
46
- return { isValid: true, error: "" };
49
+ if (!rules.required && (!selectedValue || selectedValue === '')) {
50
+ return { isValid: true, error: '' };
47
51
  }
48
52
 
49
53
  // First run custom validator if provided (highest priority)
50
- if (customValidator && typeof customValidator === "function") {
54
+ if (customValidator && typeof customValidator === 'function') {
51
55
  const customValidation = customValidator(selectedValue);
52
56
 
53
57
  if (
54
- typeof customValidation === "object" &&
58
+ typeof customValidation === 'object' &&
55
59
  customValidation.isValid === false
56
60
  ) {
57
61
  return {
@@ -70,11 +74,11 @@ const dynamicValidator = (value, type, rules = {}, customValidator = null) => {
70
74
  }
71
75
 
72
76
  // Then run any custom validator in rules
73
- if (rules.customValidator && typeof rules.customValidator === "function") {
77
+ if (rules.customValidator && typeof rules.customValidator === 'function') {
74
78
  const rulesCustomValidation = rules.customValidator(selectedValue);
75
79
 
76
80
  if (
77
- typeof rulesCustomValidation === "object" &&
81
+ typeof rulesCustomValidation === 'object' &&
78
82
  rulesCustomValidation.isValid === false
79
83
  ) {
80
84
  return {
@@ -93,57 +97,77 @@ const dynamicValidator = (value, type, rules = {}, customValidator = null) => {
93
97
 
94
98
  // Then validate based on type
95
99
  switch (type) {
96
- case "string":
100
+ case 'string':
97
101
  return validateString(selectedValue, rules, defaultErrorMessages, type);
98
- case "alphanumeric":
102
+ case 'alphanumeric':
99
103
  return validateAlphanumeric(
100
104
  selectedValue,
101
105
  rules,
102
106
  defaultErrorMessages,
103
107
  type
104
108
  );
105
- case "number":
109
+ case 'number':
106
110
  return validateNumber(selectedValue, rules, defaultErrorMessages, type);
107
- case "float":
111
+ case 'float':
108
112
  return validateFloatNumber(
109
113
  selectedValue,
110
114
  rules,
111
115
  defaultErrorMessages,
112
116
  type
113
117
  );
114
- case "date":
118
+ case 'date':
115
119
  return validateDate(selectedValue, rules, defaultErrorMessages, type);
116
- case "name":
120
+ case 'name':
117
121
  return validateName(selectedValue, rules, defaultErrorMessages, type);
118
- case "email":
122
+ case 'firstName':
123
+ case 'middleName':
124
+ case 'lastName':
125
+ return validateFirstMiddleLastName(
126
+ selectedValue,
127
+ rules,
128
+ defaultErrorMessages,
129
+ type
130
+ );
131
+ case 'email':
119
132
  return validateEmail(selectedValue, rules, defaultErrorMessages, type);
120
- case "mobile":
133
+ case 'mobile':
121
134
  return validateMobile(selectedValue, rules, defaultErrorMessages, type);
122
- case "address":
135
+ case 'address':
123
136
  return validateAddress(selectedValue, rules, defaultErrorMessages, type);
124
- case "password":
137
+ case 'password':
125
138
  return validatePassword(selectedValue, rules, defaultErrorMessages, type);
126
- case "chassis":
139
+ case 'chassis':
127
140
  return validateChassisNumber(
128
141
  selectedValue,
129
142
  rules,
130
143
  defaultErrorMessages,
131
144
  type
132
145
  );
133
- case "engine":
146
+ case 'engine':
134
147
  return validateEngineNumber(
135
148
  selectedValue,
136
149
  rules,
137
150
  defaultErrorMessages,
138
151
  type
139
152
  );
140
- case "aadhaar":
153
+ case 'aadhaar':
141
154
  return validateAadhaar(selectedValue, rules, defaultErrorMessages, type);
142
- case "pan":
155
+ case 'pan':
143
156
  return validatePanCard(selectedValue, rules, defaultErrorMessages, type);
144
- case "gst":
157
+ case 'gst':
145
158
  return validateGST(selectedValue, rules, defaultErrorMessages, type);
146
- case "custom":
159
+ case 'rto':
160
+ return validateRTO(selectedValue, rules, defaultErrorMessages, type);
161
+ case 'ifsc':
162
+ return validateBankIFSC(selectedValue, rules, defaultErrorMessages, type);
163
+ case 'ip':
164
+ return validateIPAddress(
165
+ selectedValue,
166
+ rules,
167
+ defaultErrorMessages,
168
+ type
169
+ );
170
+ case 'custom':
147
171
  return validateCustom(selectedValue, rules, defaultErrorMessages, type);
148
172
  default:
149
173
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quantique-field-validator",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Validator to verify all form fields.",
5
5
  "main": "index.js",
6
6
  "scripts": {