-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathproperties.ts
51 lines (47 loc) · 1.82 KB
/
properties.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import { getValue } from "../utils/getValue";
import { SchemaNode } from "../types";
import { Keyword, JsonSchemaResolverParams, JsonSchemaValidatorParams, ValidationResult } from "../Keyword";
import { isObject } from "../utils/isObject";
import { validateNode } from "../validateNode";
export const propertiesKeyword: Keyword = {
id: "property",
keyword: "properties",
parse: parseProperties,
addResolve: (node: SchemaNode) => node.properties != null,
resolve: propertyResolver,
addValidate: (node: SchemaNode) => node.properties != null,
validate: validateProperties
};
function propertyResolver({ node, key }: JsonSchemaResolverParams) {
return node.properties?.[key];
}
export function parseProperties(node: SchemaNode) {
const { schema, evaluationPath, schemaLocation } = node;
if (schema.properties) {
node.properties = {};
Object.keys(schema.properties).forEach((propertyName) => {
const propertyNode = node.compileSchema(
schema.properties[propertyName],
`${evaluationPath}/properties/${propertyName}`,
`${schemaLocation}/properties/${propertyName}`
);
node.properties[propertyName] = propertyNode;
});
}
}
function validateProperties({ node, data, pointer, path }: JsonSchemaValidatorParams) {
if (!isObject(data)) {
return;
}
// move validation through properties
const errors: ValidationResult[] = [];
Object.keys(data).forEach((propertyName) => {
if (node.properties[propertyName] == null) {
return;
}
const propertyNode = node.properties[propertyName];
const result = validateNode(propertyNode, getValue(data, propertyName), `${pointer}/${propertyName}`, path);
errors.push(...result);
});
return errors;
}