Skip to content

Commit 1175c73

Browse files
authored
Merge pull request #129 from shystruk/improvements
Add dependentValidateError. Upgrade papaparse
2 parents 0f6c355 + 2d385ac commit 1175c73

File tree

12 files changed

+59
-30
lines changed

12 files changed

+59
-30
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ function(email, row) {
136136
}
137137
```
138138

139+
### dependentValidateError
140+
Type: `Function` <br>
141+
142+
If dependentValidate returns false dependentValidateError function will be called with arguments **headerName, rowNumber, columnNumber**
143+
139144
### isArray
140145
Type: `Boolean` <br>
141146

demo-ts/dist/bundle.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo/demo.csv

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
First Name;Last Name;Email;Password;Roles
2-
Vasyl;Stokolosa;[email protected];123;admin, manager
3-
Vasyl_2;Stokolosa_2;[email protected];123123123;admin, manager, user
4-
;Stokolosa_2;api@test;123123123;admin, manager, user
1+
First Name;Last Name;Email;Password;Roles;Country
2+
Vasyl;Stokolosa;[email protected];123;admin, manager;Ukraine
3+
Vasyl_2;Stokolosa_2;[email protected];123123123;admin, manager, user;USA
4+
;Stokolosa_2;api@test;123123123;user;Ukraine

demo/dist/bundle.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo/dist/bundle.js.LICENSE.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* @license
22
Papa Parse
3-
v5.3.2
3+
v5.4.1
44
https://github.com/mholt/PapaParse
55
License: MIT
66
*/

demo/dist/bundle.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo/index.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ const validateError = (headerName, rowNumber, columnNumber) => {
88
return `<div class="red">${headerName} is not valid in the <strong>${rowNumber} row</strong> / <strong>${columnNumber} column</strong></div>`
99
}
1010

11+
const dependentValidateError = (headerName, rowNumber, columnNumber) => (
12+
`<div class="red">${headerName} is not valid. Country should be set to Ukraine or role is not user. <strong>${rowNumber} row</strong> / <strong>${columnNumber} column</strong></div>`
13+
)
14+
15+
const isRoleForCountryValid = (country, row) => {
16+
const role = row[4];
17+
return country === 'Ukraine' && role === 'user';
18+
}
19+
1120
const uniqueError = (headerName, rowNumber) => {
1221
return `<div class="red">${headerName} is not unique at the <strong>${rowNumber} row</strong></div>`
1322
}
@@ -31,7 +40,8 @@ const CSVConfig = {
3140
{ name: 'Last Name', inputName: 'lastName', required: true, requiredError, optional: true },
3241
{ name: 'Email', inputName: 'email', required: true, requiredError, unique: true, uniqueError, validate: isEmailValid, validateError },
3342
{ name: 'Password', inputName: 'password', required: true, requiredError, validate: isPasswordValid, validateError },
34-
{ name: 'Roles', inputName: 'roles', required: true, requiredError, isArray: true }
43+
{ name: 'Roles', inputName: 'roles', required: true, requiredError, isArray: true },
44+
{ name: 'Country', inputName: 'country', optional: true, dependentValidate: isRoleForCountryValid, dependentValidateError }
3545
],
3646
isColumnIndexAlphabetic: true
3747
}

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "csv-file-validator",
3-
"version": "2.1.0",
3+
"version": "2.2.0",
44
"description": "Validation of CSV file against user defined schema (returns back object with data and invalid messages)",
55
"main": "./src/csv-file-validator.js",
66
"types": "./src/csv-file-validator.d.ts",
@@ -34,10 +34,10 @@
3434
"dependencies": {
3535
"famulus": "^2.2.3",
3636
"lodash": "^4.17.21",
37-
"papaparse": "^5.3.2"
37+
"papaparse": "^5.4.1"
3838
},
3939
"devDependencies": {
40-
"@types/papaparse": "^5.3.2",
40+
"@types/papaparse": "^5.3.15",
4141
"ava": "^0.25.0",
4242
"codecov.io": "^0.1.6",
4343
"nyc": "^11.4.1",

src/csv-file-validator.d.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,25 @@ export interface FieldSchema {
5050
*/
5151
validate?: (field: string|number|boolean) => boolean;
5252

53+
/**
54+
* If validate returns false validateError function
55+
* will be called with arguments headerName, rowNumber, columnNumber.
56+
*/
57+
validateError?: (headerName: string, rowNumber: number,
58+
columnNumber: number) => string;
59+
5360
/**
5461
* Validate column value that depends on other values in other columns.
5562
* Must return true for valid field and false for invalid.
5663
*/
5764
dependentValidate?: (field: string, row: [string]) => boolean;
5865

5966
/**
60-
* If validate returns false validateError function
67+
* If dependentValidate returns false dependentValidateError function
6168
* will be called with arguments headerName, rowNumber, columnNumber.
6269
*/
63-
validateError?: (headerName: string, rowNumber: number,
64-
columnNumber: number) => string;
70+
dependentValidateError?: (headerName: string, rowNumber: number,
71+
columnNumber: number) => string;
6572
}
6673

6774
export interface RowError {

src/csv-file-validator.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@
129129
file.inValidData.push({
130130
rowIndex: rowIndex + 1,
131131
columnIndex: columnIndex,
132-
message: _isFunction(valueConfig.validateError)
133-
? valueConfig.validateError(valueConfig.name, rowIndex + 1, columnIndex)
132+
message: _isFunction(valueConfig.dependentValidateError)
133+
? valueConfig.dependentValidateError(valueConfig.name, rowIndex + 1, columnIndex)
134134
: String(valueConfig.name + ' not passed dependent validation in the ' + (rowIndex + 1) + ' row / ' + (columnIndex + 1) + ' column')
135135
});
136136
}

test.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ const validateError = (headerName, rowNumber, columnNumber) => (
99
`<div class="red">${headerName} is not valid in the <strong>${rowNumber} row</strong> / <strong>${columnNumber} column</strong></div>`
1010
)
1111

12+
const dependentValidateError = (headerName, rowNumber, columnNumber) => (
13+
`<div class="red">${headerName} is not valid. Country should be set to Ukraine. <strong>${rowNumber} row</strong> / <strong>${columnNumber} column</strong></div>`
14+
)
15+
1216
const isEmailValid = (email) => {
1317
const reqExp = /[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$/
1418
return reqExp.test(email)
@@ -29,7 +33,7 @@ const CSVConfig = {
2933
{ name: 'Email', inputName: 'email', required: true, requiredError, unique: true, uniqueError, validate: isEmailValid, validateError },
3034
{ name: 'Password', inputName: 'password', required: true, requiredError, validate: isPasswordValid, validateError },
3135
{ name: 'Roles', inputName: 'roles', required: true, requiredError, isArray: true },
32-
{ name: 'Country', inputName: 'country', optional: true, dependentValidate: isRoleForCountryValid }
36+
{ name: 'Country', inputName: 'country', optional: true, dependentValidate: isRoleForCountryValid, dependentValidateError }
3337
]
3438
}
3539

@@ -103,6 +107,9 @@ test('should return invalid messages with data', async t => {
103107

104108
t.is(csvData.inValidData.length, 5);
105109
t.is(csvData.data.length, 2);
110+
t.is(csvData.inValidData[3].message,
111+
'<div class="red">Country is not valid. Country should be set to Ukraine. <strong>3 row</strong> / <strong>6 column</strong></div>'
112+
);
106113
});
107114

108115
test('should return data, the file is valid', async t => {

yarn.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@
139139
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
140140
integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
141141

142-
"@types/papaparse@^5.3.2":
143-
version "5.3.2"
144-
resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.3.2.tgz#6ccace6eac8ddb03a6fd06883b84dd6c6561f69f"
145-
integrity sha512-BNbCHJkTE4RwmAFkCxEalET4mDvGr/1ld7ZtQ4i/laWI/iiVt+GL07stdvufle4KfywyvloqqpIiJscXNCrKxA==
142+
"@types/papaparse@^5.3.15":
143+
version "5.3.15"
144+
resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.3.15.tgz#7cafa16757a1d121422deefbb10b6310b224ecc4"
145+
integrity sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==
146146
dependencies:
147147
"@types/node" "*"
148148

@@ -3312,10 +3312,10 @@ package-json@^4.0.0:
33123312
registry-url "^3.0.3"
33133313
semver "^5.1.0"
33143314

3315-
papaparse@^5.3.2:
3316-
version "5.3.2"
3317-
resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.2.tgz#d1abed498a0ee299f103130a6109720404fbd467"
3318-
integrity sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==
3315+
papaparse@^5.4.1:
3316+
version "5.4.1"
3317+
resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.4.1.tgz#f45c0f871853578bd3a30f92d96fdcfb6ebea127"
3318+
integrity sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==
33193319

33203320
parse-glob@^3.0.4:
33213321
version "3.0.4"

0 commit comments

Comments
 (0)