Skip to content

Commit 8fbf1cc

Browse files
committed
add record rule
1 parent a746f93 commit 8fbf1cc

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

lib/messages.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,6 @@ module.exports = {
8181
classInstanceOf: "The '{field}' field must be an instance of the '{expected}' class.",
8282

8383
objectID: "The '{field}' field must be an valid ObjectID",
84+
85+
record: "The '{field}' must be an Object."
8486
};

lib/rules/record.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module.exports = function compileRecordRule({ schema, messages }, path, context) {
2+
const sourceCode = [];
3+
sourceCode.push(`
4+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
5+
${this.makeError({ type: "record", actual: "value", messages })}
6+
return value;
7+
}
8+
`);
9+
10+
const keyRuleName = schema.key || "string";
11+
const valueRuleName = schema.value || "any";
12+
13+
sourceCode.push(`
14+
let tmp;
15+
for (let key in value) {
16+
`);
17+
18+
const keyRule = this.getRuleFromSchema(keyRuleName);
19+
const keyInnerSource = `
20+
tmp = ${context.async ? "await " : ""}context.fn[%%INDEX%%](key, field, value, errors, context);
21+
`;
22+
sourceCode.push(this.compileRule(keyRule, context, null, keyInnerSource, "tmp"));
23+
24+
const valueRule = this.getRuleFromSchema(valueRuleName);
25+
const valueInnerSource = `
26+
tmp = ${context.async ? "await " : ""}context.fn[%%INDEX%%](value[key], field ? field + "." + key : key, value, errors, context);
27+
`;
28+
sourceCode.push(this.compileRule(valueRule, context, `${path}[key]`, valueInnerSource, "tmp"));
29+
sourceCode.push(`
30+
}
31+
`);
32+
33+
return {
34+
source: sourceCode.join("\n")
35+
};
36+
};

lib/validator.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ function loadRules() {
3030
number: require("./rules/number"),
3131
object: require("./rules/object"),
3232
objectID: require("./rules/objectID"),
33+
record: require("./rules/record"),
3334
string: require("./rules/string"),
3435
tuple: require("./rules/tuple"),
3536
url: require("./rules/url"),

0 commit comments

Comments
 (0)