UNPKG

1.88 kBJavaScriptView Raw
1const lex = {
2 type(key, value) {
3 return `"${key}" must be of type "${value}"`;
4 },
5 minLength(key, value, ruleName, ruleValue) {
6 return `"${key}" must be at least "${ruleValue}" characters`;
7 },
8 maxLength(key, value, ruleName, ruleValue) {
9 return `"${key}" may be at most "${ruleValue}" characters`;
10 },
11 minProperties(key, value, ruleName, ruleValue) {
12 return `"${key}" must hold at least "${ruleValue}" properties`;
13 },
14 maxProperties(key, value, ruleName, ruleValue) {
15 return `"${key}" may hold at most "${ruleValue}" properties`;
16 },
17 patternProperties(key, value, ruleName, ruleValue) {
18 return `"${key}" must hold "${ruleValue}" properties`;
19 },
20 minItems(key, value, ruleName, ruleValue) {
21 return `"${key}" must have at leat "${ruleValue}" items`;
22 },
23 maxItems(key, value, ruleName, ruleValue) {
24 return `"${key}" may have at most "${ruleValue}" items`;
25 },
26 required(key, _, name) {
27 return `"${key}" is ${name} but unset`;
28 },
29 additional(key, value, name) {
30 return `"${key}" is not allowed as ${name} key `;
31 },
32 fallback(key, value, ruleName, ruleValue, prop) {
33 const ruleValueString = typeof ruleValue === 'string' ? JSON.stringify(ruleValue) : ruleValue;
34 return `"${key}" does not meet rule "${ruleName}=${ruleValueString}" - ${prop.description}`;
35 }
36};
37
38module.exports = function schemaError(error, schema) {
39 return Object.keys(error.validation)
40 .reduce((messages, key) => {
41 const validation = error.validation[key];
42 const names = Object.keys(validation);
43
44 return messages.concat(
45 names
46 .map(name => lex[name] || lex.fallback)
47 .map((formatter, index) => {
48 const name = names[index];
49 const props = schema.properties || {};
50 const prop = props[key] || {};
51 return formatter(
52 key,
53 validation[name],
54 name,
55 prop[name] || '',
56 prop
57 );
58 })
59 );
60 }, []);
61};