3 KeywordErrorDefinition,
7 import {_, not, and, Name, Code} from "../../compile/codegen"
8 import {alwaysValidSchema, Type} from "../../compile/util"
9 import N from "../../compile/names"
11 export type UnevaluatedPropertiesError = ErrorObject<
12 "unevaluatedProperties",
13 {unevaluatedProperty: string},
17 const error: KeywordErrorDefinition = {
18 message: "must NOT have unevaluated properties",
19 params: ({params}) => _`{unevaluatedProperty: ${params.unevaluatedProperty}}`,
22 const def: CodeKeywordDefinition = {
23 keyword: "unevaluatedProperties",
25 schemaType: ["boolean", "object"],
29 const {gen, schema, data, errsCount, it} = cxt
30 /* istanbul ignore if */
31 if (!errsCount) throw new Error("ajv implementation error")
32 const {allErrors, props} = it
33 if (props instanceof Name) {
34 gen.if(_`${props} !== true`, () =>
35 gen.forIn("key", data, (key: Name) =>
36 gen.if(unevaluatedDynamic(props, key), () => unevaluatedPropCode(key))
39 } else if (props !== true) {
40 gen.forIn("key", data, (key: Name) =>
42 ? unevaluatedPropCode(key)
43 : gen.if(unevaluatedStatic(props, key), () => unevaluatedPropCode(key))
47 cxt.ok(_`${errsCount} === ${N.errors}`)
49 function unevaluatedPropCode(key: Name): void {
50 if (schema === false) {
51 cxt.setParams({unevaluatedProperty: key})
53 if (!allErrors) gen.break()
57 if (!alwaysValidSchema(it, schema)) {
58 const valid = gen.name("valid")
61 keyword: "unevaluatedProperties",
63 dataPropType: Type.Str,
67 if (!allErrors) gen.if(not(valid), () => gen.break())
71 function unevaluatedDynamic(evaluatedProps: Name, key: Name): Code {
72 return _`!${evaluatedProps} || !${evaluatedProps}[${key}]`
75 function unevaluatedStatic(evaluatedProps: {[K in string]?: true}, key: Name): Code {
77 for (const p in evaluatedProps) {
78 if (evaluatedProps[p] === true) ps.push(_`${key} !== ${p}`)