Skip to content

Commit 63d3bde

Browse files
committed
Added option to generate a message with a function callback
1 parent 361d1a2 commit 63d3bde

File tree

6 files changed

+512
-392
lines changed

6 files changed

+512
-392
lines changed

README.md

+16-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Validate
22

3-
> **This package is build for node and can not be used into the browser yet**
3+
> A simple validation util for react or vue. It works in nodejs to.
44
5-
```js
5+
```js example
66
const { validate, email, length, required } = require('validate')
77

88
const rules = {
@@ -11,17 +11,23 @@ const rules = {
1111
validator: value => {
1212
return length(value, { max: 75 }) && email(value)
1313
},
14-
message: 'The given email address is invalid',
14+
message: ({ value }) => {
15+
return `${value} is not valid email address or the length is to high.`
16+
},
1517
},
1618
password: {
1719
validator: value => {
1820
return length(value, { min: 4, max: 18 })
1921
},
22+
message: ({ value, field }) => {
23+
return `The length of your password is tho short it must be between 4 and 18 charters long.`
24+
},
2025
},
2126
subscription: {
2227
validator: value => {
2328
return required(value)
2429
},
30+
message: `Please choose a subscription type`,
2531
},
2632
},
2733
}
@@ -30,3 +36,10 @@ const { valid } = validate(fields, {
3036
rules,
3137
})
3238
```
39+
40+
## Good the now.
41+
42+
No sanitizing has been done on the return value in the message function. It is your job
43+
to use a library to achieve this.
44+
45+
[dompurify](https://www.npmjs.com/package/dompurify)

jest.config.js

-3
This file was deleted.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"jest": "^26.2.2",
2020
"prettier": "^2.0.5",
2121
"rollup": "^2.23.1",
22-
"rollup-plugin-filesize": "^9.0.2"
22+
"rollup-plugin-filesize": "^9.0.2",
23+
"@types/jest": "^26.0.10"
2324
}
2425
}

src/__tests__/validate.test.js

+36-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { validate, email, length, required } = require('../validate')
1+
const { validate, email, length, required } = require('../index')
22

33
const defaultRules = {
44
fields: {
@@ -29,7 +29,7 @@ it('initializes', () => {
2929

3030
it('returns invalid when there are no rules', () => {
3131
const fields = {
32-
password: 'homepage'
32+
password: 'homepage',
3333
}
3434
const rules = {}
3535

@@ -115,3 +115,37 @@ it('validates to false when one one of the validation rules returns false', () =
115115
]
116116
`)
117117
})
118+
119+
it('supports the message object to be a function and then calls it with the field and the value', () => {
120+
const email = '[email protected]'
121+
const validator = jest.fn(() => false)
122+
const message = jest.fn(
123+
({ field, value }) => `The field ${field} is incorrect with value ${value}`,
124+
)
125+
const passwordMessage = 'it works with a string to'
126+
127+
const fields = { email, password: 'password', subscription: true }
128+
const rules = {
129+
fields: {
130+
email: { validator, message },
131+
password: { validator, message: passwordMessage },
132+
subscription: { validator, message: () => undefined },
133+
},
134+
}
135+
136+
const { valid, results } = validate(fields, { rules })
137+
138+
expect(message).toBeCalledTimes(1)
139+
expect(message).toBeCalledWith({ field: 'email', value: email })
140+
expect(valid).toEqual(false)
141+
142+
expect(results.find(item => item.field === 'email').message).toEqual(
143+
`The field email is incorrect with value ${email}`,
144+
)
145+
expect(results.find(item => item.field === 'password').message).toEqual(
146+
passwordMessage,
147+
)
148+
expect(results.find(item => item.field === 'subscription').message).toEqual(
149+
"Validation failed for field 'subscription'",
150+
)
151+
})

src/index.js

+24-4
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,19 @@ function validate(fields, { rules }) {
1212
if (rule.validator(value)) {
1313
checked.push({ field, value: fields[field], valid: true, message: '' })
1414
} else {
15+
const value = fields[field]
16+
17+
const message = compileTheMessage({
18+
message: rules.fields[field].message,
19+
value,
20+
field,
21+
})
22+
1523
checked.push({
1624
field,
17-
value: fields[field],
25+
value,
1826
valid: false,
19-
message:
20-
rules.fields[field].message ||
21-
`Validation failed for field '${field}'`,
27+
message,
2228
})
2329
}
2430
})
@@ -29,6 +35,20 @@ function validate(fields, { rules }) {
2935
}
3036
}
3137

38+
function compileTheMessage({ message, value, field }) {
39+
const defaultOutputString = `Validation failed for field '${field}'`
40+
41+
if (!message) return defaultOutputString
42+
if (typeof message === 'function') {
43+
const output = message({ field, value })
44+
45+
if (!output) return defaultOutputString
46+
return output
47+
}
48+
49+
return message
50+
}
51+
3252
module.exports = {
3353
validate,
3454
...require('./validation/index.js'),

0 commit comments

Comments
 (0)