Spaces:
Running
Running
import type {CodeKeywordDefinition, KeywordCxt} from "ajv" | |
import {_, or, and, getProperty, Code} from "ajv/dist/compile/codegen" | |
export default function getDef(): CodeKeywordDefinition { | |
return { | |
keyword: "deepRequired", | |
type: "object", | |
schemaType: "array", | |
code(ctx: KeywordCxt) { | |
const {schema, data} = ctx | |
const props = (schema as string[]).map((jp: string) => _`(${getData(jp)}) === undefined`) | |
ctx.fail(or(...props)) | |
function getData(jsonPointer: string): Code { | |
if (jsonPointer === "") throw new Error("empty JSON pointer not allowed") | |
const segments = jsonPointer.split("/") | |
let x: Code = data | |
const xs = segments.map((s, i) => | |
i ? (x = _`${x}${getProperty(unescapeJPSegment(s))}`) : x | |
) | |
return and(...xs) | |
} | |
}, | |
metaSchema: { | |
type: "array", | |
items: {type: "string", format: "json-pointer"}, | |
}, | |
} | |
} | |
function unescapeJPSegment(s: string): string { | |
return s.replace(/~1/g, "/").replace(/~0/g, "~") | |
} | |
module.exports = getDef | |