{"version":3,"file":"index.cjs","names":["suffixes","settings","getDraft","REGEX_FLAGS","addKeywords","DECLARATOR_ONEOF","$refKeyword","parseRef","validateRef","register","resolveRef","resolveRecursiveRef","getRef","compileNext","settings","$refKeyword","parseRef","validateRef","resolveRef","$refKeyword","parseRef","draft06Keyword","register","resolveRef","getRef","KEYWORD","settings","KEYWORD","KEYWORD","KEYWORD","KEYWORD","KEYWORD","KEYWORD","KEYWORD","KEYWORD","exclusiveMaximumKeyword","validateExclusiveMaximum","parse","exclusiveMinimumKeyword","validateExclusiveMinimum","KEYWORD","settings","REGEX_FLAGS","getChildSelection","KEYWORD","settings","safeResolveRef","canResolveRef","convertValue","getData","TYPE","getDefault","KEYWORD","itemsKeyword","parseItems","itemsResolver","validateItems","KEYWORD","KEYWORD","KEYWORD","KEYWORD","KEYWORD","KEYWORD","parseMinItems","KEYWORD","KEYWORD","KEYWORD","KEYWORD","KEYWORD","settings","REGEX_FLAGS","settings","REGEX_FLAGS","KEYWORD","KEYWORD","KEYWORD","KEYWORD","$refKeyword","exclusiveMaximumKeyword","exclusiveMinimumKeyword","itemsKeyword","KEYWORD","KEYWORD","$refKeyword","itemsKeyword","$refKeyword","itemsKeyword","compileNext","KEYWORD","unevaluatedItemsKeyword","parseUnevaluatedItems","validateUnevaluatedItems","KEYWORD","itemsKeyword","unevaluatedItemsKeyword","KEYWORD","parseItems","KEYWORD","KEYWORD","$refKeyword","settings","getRef","addKeywords"],"sources":["../src/utils/sanitizeErrors.ts","../src/settings.ts","../src/utils/getTypeOf.ts","../src/utils/isObject.ts","../src/methods/createSchema.ts","../src/methods/toSchemaNodes.ts","../src/utils/resolveUri.ts","../src/utils/mergeSchema.ts","../src/mergeNode.ts","../src/utils/omit.ts","../src/utils/pick.ts","../src/errors/render.ts","../src/validateNode.ts","../src/utils/hasProperty.ts","../src/utils/getValue.ts","../src/getNode.ts","../src/getNodeChild.ts","../src/SchemaNode.ts","../src/types.ts","../src/utils/splitRef.ts","../src/keywords/$ref.ts","../src/utils/collectValidationErrors.ts","../src/keywords/$defs.ts","../src/draft06/keywords/$ref.ts","../src/draft04/keywords/$ref.ts","../src/draft2019-09/keywords/additionalItems.ts","../src/keywords/additionalProperties.ts","../src/keywords/allOf.ts","../src/keywords/anyOf.ts","../src/keywords/contains.ts","../src/utils/isListOfStrings.ts","../src/keywords/dependentRequired.ts","../src/keywords/dependentSchemas.ts","../src/keywords/dependencies.ts","../src/keywords/deprecated.ts","../src/keywords/enum.ts","../src/errors/errors.ts","../src/draft04/keywords/exclusiveMaximum.ts","../src/draft04/keywords/exclusiveMinimum.ts","../src/keywords/format.ts","../src/formats/formats.ts","../src/draft2019-09/methods/getChildSelection.ts","../src/utils/getSchemaType.ts","../src/utils/isEmpty.ts","../src/keywords/oneOf.ts","../src/utils/isFile.ts","../src/draft2019-09/methods/getData.ts","../src/draft2019-09/keywords/items.ts","../src/keywords/maximum.ts","../src/keywords/maxItems.ts","../src/utils/punycode.ucs2decode.ts","../src/keywords/maxLength.ts","../src/keywords/maxProperties.ts","../src/keywords/minimum.ts","../src/keywords/minItems.ts","../src/keywords/minLength.ts","../src/keywords/minProperties.ts","../src/utils/getPrecision.ts","../src/keywords/multipleOf.ts","../src/keywords/not.ts","../src/keywords/pattern.ts","../src/keywords/patternProperties.ts","../src/keywords/properties.ts","../src/keywords/propertyNames.ts","../src/keywords/required.ts","../src/utils/copyDraft.ts","../src/Draft.ts","../src/methods/toDataNodes.ts","../src/keywords/type.ts","../src/keywords/uniqueItems.ts","../src/draft04.ts","../src/keywords/const.ts","../src/keywords/exclusiveMaximum.ts","../src/keywords/exclusiveMinimum.ts","../src/draft06.ts","../src/keywords/ifthenelse.ts","../src/draft07.ts","../src/draft2019-09/keywords/$ref.ts","../src/draft2019-09/keywords/unevaluatedItems.ts","../src/isPropertyEvaluated.ts","../src/keywords/unevaluatedProperties.ts","../src/draft2019.ts","../src/methods/getChildSelection.ts","../src/methods/getData.ts","../src/keywords/items.ts","../src/keywords/prefixItems.ts","../src/isItemEvaluated.ts","../src/keywords/unevaluatedItems.ts","../src/draft2020.ts","../src/compileSchema.ts","../src/draftEditor.ts","../src/keywords/propertyDependencies.ts"],"sourcesContent":["import { isAnnotation } from \"../types\";\nimport { ValidationAnnotation, ValidationReturnType } from \"../Keyword\";\n\n/**\n * Flattens nested validation array results and filters items to only include errors, annotations and promises\n */\nexport default function sanitizeErrors(\n    list: ValidationReturnType | ValidationReturnType[] | ValidationAnnotation[],\n    result: ValidationAnnotation[] = []\n) {\n    if (!Array.isArray(list)) {\n        if (list !== undefined) {\n            return [list];\n        }\n        return [];\n    }\n    for (const item of list) {\n        if (Array.isArray(item)) {\n            sanitizeErrors(item, result);\n        } else if (isAnnotation(item) || item instanceof Promise) {\n            result.push(item);\n        }\n    }\n    return result;\n}\n","export default {\n    DECLARATOR_ONEOF: \"oneOfProperty\",\n    propertyBlacklist: [\"_id\"],\n    DYNAMIC_PROPERTIES: [\n        \"$ref\",\n        \"$defs\",\n        \"if\",\n        \"then\",\n        \"else\",\n        \"allOf\",\n        \"anyOf\",\n        \"oneOf\",\n        \"dependentSchemas\",\n        \"dependentRequired\",\n        \"definitions\",\n        \"dependencies\",\n        \"patternProperties\",\n        \"propertyDependencies\"\n    ],\n    REGEX_FLAGS: \"u\",\n    /** additional keywords that should not produce an unknown-keyword-warning */\n    VALID_ANNOTATION_KEYWORDS: [\"$id\", \"$schema\", \"title\", \"description\", \"default\", \"oneOfProperty\"],\n    /**\n     * properties to keep from a $ref-schema when resolving a $ref (recursively)\n     * this allows to overwrite specified properties locally on a $ref-definition\n     *\n     * - draft 2019-09\n     * - draft 2020-12\n     *\n     * @example\n     * {\n     *   title: \"custom component\",\n     *   $ref: \"#/$defs/component\",\n     *\n     *   $defs: {\n     *     component: {\n     *       title: \"component\",\n     *       type: \"object\"\n     *     }\n     *   }\n     * }\n     * // results in\n     * {\n     *   title: \"custom component\"\n     *   type: \"object\"\n     * }\n     */\n    PROPERTIES_TO_MERGE: [\"title\", \"description\", \"default\", \"options\", \"x-options\", \"readOnly\", \"writeOnly\"]\n};\n","const toString = Object.prototype.toString;\n\nexport type JSType =\n\t| \"array\"\n\t| \"bigint\"\n\t| \"boolean\"\n\t| \"function\"\n\t| \"null\"\n\t| \"number\"\n\t| \"object\"\n\t| \"string\"\n\t| \"symbol\"\n\t| \"undefined\";\n\nexport function getTypeOf(value: unknown): JSType {\n\tconst type = toString.call(value).slice(8, -1).toLowerCase();\n\tif (type === \"file\") {\n\t\treturn \"object\";\n\t}\n\treturn type as JSType;\n}\n","import { getTypeOf } from \"./getTypeOf\";\n\nexport function isObject(v: unknown): v is Record<string, unknown> {\n    return getTypeOf(v) === \"object\";\n}\n","import { getTypeOf } from \"../utils/getTypeOf\";\nimport { JsonSchema } from \"../types\";\nimport { isObject } from \"../utils/isObject\";\n\n/**\n * Create a simple json schema for the given input data\n * @param  data - data to get json schema for\n */\nexport function createSchema(data: unknown): JsonSchema {\n    // if (data === undefined) {\n    //     return undefined;\n    // }\n\n    const schema: JsonSchema =\n        data === undefined\n            ? {}\n            : {\n                  type: getTypeOf(data)\n              };\n\n    if (schema.type === \"object\" && isObject(data)) {\n        schema.properties = {};\n        Object.keys(data).forEach((key) => (schema.properties[key] = createSchema(data[key])));\n    }\n\n    if (schema.type === \"array\" && Array.isArray(data)) {\n        if (data.length === 1) {\n            schema.items = createSchema(data[0]);\n        } else {\n            schema.items = data.map(createSchema);\n            const sameTypes = schema.items.find((item: JsonSchema) => item.type !== schema.items[0].type) == null;\n            if (sameTypes) {\n                schema.items = schema.items[0];\n            }\n        }\n    }\n\n    return schema;\n}\n","/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport { isSchemaNode, SchemaNode } from \"../types\";\n\nfunction eachProperty(nodeList: SchemaNode[], o?: Record<string, SchemaNode | unknown>) {\n    if (o != null) {\n        Object.values(o).forEach((node) => toSchemaNodes(node, nodeList));\n    }\n}\n\nfunction eachItem(nodeList: SchemaNode[], a?: SchemaNode[]) {\n    if (a != null) {\n        a.forEach((node) => toSchemaNodes(node, nodeList));\n    }\n}\n\nexport function toSchemaNodes(node: SchemaNode | unknown, nodeList: SchemaNode[] = []): SchemaNode[] {\n    if (!isSchemaNode(node)) {\n        return nodeList;\n    }\n\n    nodeList.push(node);\n\n    eachProperty(nodeList, node.$defs);\n    node.additionalProperties && toSchemaNodes(node.additionalProperties, nodeList);\n    eachItem(nodeList, node.allOf);\n    eachItem(nodeList, node.anyOf);\n    node.contains && toSchemaNodes(node.contains, nodeList);\n    eachProperty(nodeList, node.dependentSchemas);\n    node.if && toSchemaNodes(node.if, nodeList);\n    node.else && toSchemaNodes(node.else, nodeList);\n    node.then && toSchemaNodes(node.then, nodeList);\n    node.items && toSchemaNodes(node.items, nodeList);\n    eachItem(nodeList, node.prefixItems);\n    node.not && toSchemaNodes(node.not, nodeList);\n    eachItem(nodeList, node.oneOf);\n    node.patternProperties &&\n        Object.values(node.patternProperties).forEach(({ node }) => toSchemaNodes(node, nodeList));\n    eachProperty(nodeList, node.properties);\n    node.propertyNames && toSchemaNodes(node.propertyNames, nodeList);\n    node.unevaluatedProperties && toSchemaNodes(node.unevaluatedProperties, nodeList);\n    node.unevaluatedItems && toSchemaNodes(node.unevaluatedItems, nodeList);\n\n    return nodeList;\n}\n","import { resolve } from \"uri-js\";\n\nconst suffixes = /(#)+$/;\nconst trailingHash = /#$/;\nconst isDomain = /^[^:]+:\\/\\/[^/]+\\//;\nconst idAndPointer = /#.*$/;\n\n/**\n * Resolves a reference URI against a base URI.\n * Uses fast-uri (RFC 3986 compliant) for most cases, with special handling for JSON Schema specifics.\n *\n * This replaces the custom joinId logic while leveraging the standards-compliant fast-uri library.\n *\n * @param base - The base URI (e.g., current scope $id)\n * @param ref - The reference to resolve (e.g., $id, $ref, or json-pointer)\n * @returns The resolved absolute URI\n */\nexport function resolveUri(base?: string, ref?: string): string {\n    if (ref == null) {\n        return base?.replace(trailingHash, \"\") ?? \"#\";\n    }\n\n    if (base == null || base === \"#\") {\n        return ref?.replace(trailingHash, \"\");\n    }\n\n    // If ref starts with #, it's a fragment - for JSON Schema, append to base without its fragment\n    if (ref[0] === \"#\") {\n        if (base[0] === \"/\") {\n            return ref;\n        }\n        return `${base.replace(idAndPointer, \"\")}${ref.replace(suffixes, \"\")}`;\n    }\n\n    // If ref is a full domain, it's absolute\n    if (isDomain.test(ref)) {\n        return ref.replace(trailingHash, \"\");\n    }\n\n    return resolve(base, ref ?? \"\") ?? \"#\";\n}\n","import { JsonSchema } from \"../types\";\nimport { getTypeOf } from \"./getTypeOf\";\nimport { isObject } from \"./isObject\";\n\nexport function mergeSchema<T extends JsonSchema>(a: T, b: T, ...omit: string[]): T {\n    if (b?.type === \"error\") {\n        return b;\n    } else if (a?.type === \"error\") {\n        return a;\n    }\n\n    const aType = getTypeOf(a);\n    const bType = getTypeOf(b);\n    if (aType !== bType) {\n        return a;\n    }\n\n    const schema = mergeSchema2(a, b) as T;\n    for (const s of omit) {\n        delete schema[s]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n    }\n\n    return schema;\n}\n\nexport function mergeSchema2(a: unknown, b: unknown, property?: string): unknown {\n    if (isObject(a) && isObject(b)) {\n        const newObject: Record<string, unknown> = {};\n        [...Object.keys(a), ...Object.keys(b)]\n            .filter((item, index, array) => array.indexOf(item) === index)\n            .forEach((key) => (newObject[key] = mergeSchema2(a[key], b[key], key)));\n        return newObject;\n    }\n\n    const aIsArray = Array.isArray(a);\n    const bIsArray = Array.isArray(b);\n\n    if (aIsArray && bIsArray) {\n        if (property === \"required\" || property === \"anyOf\") {\n            return a.concat(b).filter((item, index, array) => array.indexOf(item) === index);\n        }\n        if (property === \"items\" || property === \"prefixItems\") {\n            const result: unknown[] = [];\n            for (let i = 0; i < b.length; i += 1) {\n                if (isObject(a[i]) && isObject(b[i]) && a[i].type === b[i].type) {\n                    result[i] = mergeSchema2(a[i], b[i]);\n                } else {\n                    result.push(b[i] ?? a[i]);\n                }\n            }\n            return result;\n        }\n        const result: unknown[] = [];\n        const append: unknown[] = [];\n        for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n            if (isObject(a[i]) && isObject(b[i])) {\n                result[i] = mergeSchema2(a[i], b[i]);\n            } else {\n                if (a[i] !== undefined && b[i] !== undefined) {\n                    result[i] = a[i];\n                    append.push(b[i]);\n                } else if (a[i] !== undefined) {\n                    result[i] = a[i];\n                } else if (b[i] !== undefined) {\n                    append.push(b[i]);\n                }\n            }\n        }\n        return [...result, ...append].filter((item, index, array) => array.indexOf(item) === index);\n    }\n\n    // mixed data-type for type keyword\n    if (property === \"type\" && (aIsArray || bIsArray)) {\n        // we merge to the specific type\n        if (aIsArray && a.includes(b)) {\n            return b;\n        }\n        if (bIsArray && b.includes(a)) {\n            return a;\n        }\n        // extend the types if they do not match\n        if (aIsArray) {\n            return [...a, b];\n        }\n        if (bIsArray) {\n            return [...b, a];\n        }\n    }\n\n    if (bIsArray) {\n        return b;\n    }\n\n    if (aIsArray) {\n        return a;\n    }\n\n    if (b !== undefined) {\n        return b;\n    }\n\n    return a;\n}\n","import { isSchemaNode, SchemaNode } from \"./types\";\nimport { mergeSchema } from \"./utils/mergeSchema\";\nimport { joinDynamicId } from \"./SchemaNode\";\n\ninterface SchemaNodeCB {\n    toJSON?: () => string;\n    order?: number;\n    (...args: any[]): any; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\nfunction sortCb(a: SchemaNodeCB, b: SchemaNodeCB) {\n    return (b.order ?? 0) - (a.order ?? 0);\n}\n\nexport function removeDuplicates(fun: SchemaNodeCB, funIndex: number, list: SchemaNodeCB[]) {\n    if (fun == null || list.indexOf(fun) !== funIndex) {\n        return false;\n    }\n    const funName = fun.toJSON?.() ?? fun.name;\n    return list.find((fun: SchemaNodeCB, index) => (fun.toJSON?.() ?? fun.name) === funName && index === funIndex);\n}\n\nfunction mergeObjects(a?: Record<string, SchemaNode>, b?: Record<string, SchemaNode>) {\n    if (a == null || b == null) {\n        return b || a;\n    }\n    const object: Record<string, SchemaNode> = {};\n    [...Object.keys(a), ...Object.keys(b)]\n        .filter((p, i, l) => l.indexOf(p) === i)\n        .forEach((key) => {\n            const result = mergeNode(a[key], b[key]);\n            if (isSchemaNode(result)) {\n                object[key] = result;\n            }\n        });\n\n    return object;\n}\n\nfunction combineArrays<T>(a?: T[], b?: T[]): T[] | undefined {\n    if (a == null || b == null) {\n        return b || a;\n    }\n    return a.concat(b).filter((value, index, list) => list.indexOf(value) === index);\n}\n\nfunction mergePatternProperties(a?: SchemaNode[\"patternProperties\"], b?: SchemaNode[\"patternProperties\"]) {\n    if (a == null || b == null) {\n        return a || b;\n    }\n    const result = [...a];\n    const pointerList = a.map((p) => p.node.evaluationPath);\n    b.forEach((p) => {\n        if (!pointerList.includes(p.node.evaluationPath)) {\n            result.push(p);\n        }\n    });\n    return result;\n}\n\nexport function mergeNode(a?: SchemaNode, b?: SchemaNode, ...omit: string[]): SchemaNode | undefined {\n    if (a == null || b == null) {\n        return a || b;\n    }\n\n    // do not merge items and prefixItems (+ additionalItems)\n    const arraySelection: Partial<SchemaNode> = {};\n    if ((a.items && b.prefixItems) || (a.prefixItems && b.items)) {\n        if (b.prefixItems) {\n            arraySelection.prefixItems = b.prefixItems;\n        } else {\n            arraySelection.items = b.items!;\n        }\n    } else {\n        // prefixItems?: SchemaNode[];\n        arraySelection.prefixItems = (b.prefixItems ?? a.prefixItems)!;\n        arraySelection.items = mergeNode(a.items, b.items)!;\n    }\n\n    // we have no node-type if (atype !== b.type) {return a; }\n\n    // @ts-expect-error simplified merging of objects\n    const mergedNode: SchemaNode = {\n        // note: {x: b.x ?? a.x} is already done by {...a, ...b}\n        ...a,\n        ...b,\n        ...arraySelection,\n        dynamicId: joinDynamicId(a.dynamicId, b.dynamicId),\n        oneOfIndex: a.oneOfIndex ?? b.oneOfIndex,\n        schema: mergeSchema(a.schema, b.schema, ...omit),\n        parent: a.parent,\n        resolvers: a.resolvers.concat(b.resolvers).filter(removeDuplicates).sort(sortCb),\n        reducers: a.reducers.concat(b.reducers).filter(removeDuplicates).sort(sortCb),\n        validators: a.validators.concat(b.validators).filter(removeDuplicates).sort(sortCb),\n\n        additionalProperties: mergeNode(a.additionalProperties, b.additionalProperties),\n        contains: mergeNode(a.contains, b.contains),\n        enum: combineArrays(a.enum, b.enum),\n        if: mergeNode(a.if, b.if),\n        then: mergeNode(a.then, b.then),\n        else: mergeNode(a.else, b.else),\n        not: mergeNode(a.not, b.not),\n        propertyNames: mergeNode(a.propertyNames, b.propertyNames),\n        unevaluatedProperties: mergeNode(a.unevaluatedProperties, b.unevaluatedProperties),\n        unevaluatedItems: mergeNode(a.unevaluatedItems, b.unevaluatedItems),\n        $defs: mergeObjects(a.$defs, b.$defs),\n        patternProperties: mergePatternProperties(a.patternProperties, b.patternProperties),\n        properties: mergeObjects(a.properties, b.properties),\n        required: combineArrays(a.required, b.required)\n    };\n\n    // this removes any function that has no keyword associated on schema\n    function filterKeywordsBySchema(fun: SchemaNodeCB) {\n        const funName = fun.toJSON?.() ?? fun.name;\n        if (mergedNode.schema?.[funName] === undefined) {\n            // @ts-expect-error forced key\n            mergedNode[funName] = undefined;\n            return false;\n        }\n        return true;\n    }\n\n    // @ts-expect-error forced key\n    omit?.forEach((key) => (mergedNode[key] = undefined));\n    // @todo better run addX features to determine removal as it is more performant and direct?\n    mergedNode.resolvers = mergedNode.resolvers.filter(filterKeywordsBySchema);\n    mergedNode.reducers = mergedNode.reducers.filter(filterKeywordsBySchema);\n    mergedNode.validators = mergedNode.validators.filter(filterKeywordsBySchema);\n\n    return mergedNode;\n}\n","/**\n * Omit properties from input schema. Accepts any number of properties to\n * remove. Example:\n *\n * ```ts\n * omit(myObject, \"if\", \"dependencies\");\n * ```\n *\n * @returns shallow copy of input object without specified properties\n */\nexport function omit(object: Record<string, unknown>, ...keysToOmit: string[]) {\n    const result: Record<string, unknown> = {};\n    Object.keys(object).forEach((key) => {\n        if (!keysToOmit.includes(key)) {\n            result[key] = object[key];\n        }\n    });\n    return result;\n}\n","import { isObject } from \"../utils/isObject\";\n\nexport function pick<T extends { [P in keyof T]: unknown }, K extends keyof T>(value: T, ...properties: K[]) {\n    if (!isObject(value) || properties.length === 0) {\n        return value;\n    }\n    const result = {} as Pick<T, K>;\n    properties.forEach((property) => {\n        if (value[property] !== undefined) {\n            result[property] = value[property];\n        }\n    });\n    return result;\n}\n","export function render(template: string, data: Record<string, unknown> = {}): string {\n    return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n        const variable = data[key];\n        if (variable === null || variable === undefined) return \"\"; // optional\n        if (typeof variable === \"object\") {\n            return JSON.stringify(variable);\n        }\n        return String(variable);\n    });\n}\n","import { BooleanSchema, isJsonError, JsonSchema, SchemaNode } from \"./types\";\nimport { SchemaNodeWithRequired, ValidationPath, ValidationReturnType } from \"./Keyword\";\nimport sanitizeErrors from \"./utils/sanitizeErrors\";\n\nexport function validateNode(node: SchemaNode, data: unknown, pointer: string, path: ValidationPath) {\n    if (isJsonError(node)) {\n        return [node];\n    }\n    path.push({ pointer, node });\n    const schema = node.schema as BooleanSchema | JsonSchema;\n    if (schema === true) {\n        return [];\n    }\n    if (schema === false) {\n        return [\n            node.createError(\"invalid-data-error\", {\n                value: data,\n                pointer,\n                schema: node.schema\n            })\n        ];\n    }\n    const errors: ValidationReturnType = [];\n    for (const validate of node.validators) {\n        const result = validate({ node: node as SchemaNodeWithRequired<keyof SchemaNode>, data, pointer, path });\n        if (Array.isArray(result)) {\n            errors.push(...result);\n        } else if (result) {\n            errors.push(result);\n        }\n    }\n    return sanitizeErrors(errors);\n}\n","const hasOwnProperty = Object.prototype.hasOwnProperty;\nexport const hasProperty = (value: Record<string, unknown>, property: string) =>\n    !(value[property] === undefined || !hasOwnProperty.call(value, property));\n","import { isObject } from \"../utils/isObject\";\n\nexport function getValue(data: unknown, key: string | number) {\n    if (isObject(data)) {\n        return data[key];\n    } else if (Array.isArray(data)) {\n        return data[key as number];\n    }\n}\n","import { GetNodeOptions, isSchemaNode, SchemaNode } from \"./SchemaNode\";\nimport { isJsonError, NodeOrError, OptionalNodeOrError } from \"./types\";\nimport { split } from \"@sagold/json-pointer\";\nimport { getValue } from \"./utils/getValue\";\n\n// prettier-ignore\nexport function getNode(pointer: string, data: unknown, options: { withSchemaWarning: true } & GetNodeOptions): NodeOrError;\nexport function getNode(pointer: string, data: unknown, options: { createSchema: true } & GetNodeOptions): NodeOrError;\nexport function getNode(pointer: string, data?: unknown, options?: GetNodeOptions): OptionalNodeOrError;\n\n/**\n * Returns a node containing JSON Schema of a data JSON Pointer.\n *\n * - the returned node will have a reduced schema based on given input data\n * - the returned node $ref is resolved\n *\n * To resolve dynamic schema where the type of JSON Schema is evaluated by\n * its value, a data object has to be passed in options.\n *\n * Per default this function will return `undefined` schema for valid properties\n * that do not have a defined schema. Use the option `withSchemaWarning: true` to\n * receive an error with `code: schema-warning` containing the location of its\n * last evaluated json-schema.\n *\n * @returns { node } or { error } where node can also be undefined (valid but undefined)\n */\nexport function getNode(\n    pointer: string,\n    data?: unknown,\n    options: GetNodeOptions = {}\n): OptionalNodeOrError | NodeOrError {\n    options.path = options.path ?? [];\n    options.withSchemaWarning = options.withSchemaWarning ?? false;\n    options.pointer = options.pointer ?? \"#\";\n    // @ts-expect-error explicitely any\n    const node = this as SchemaNode;\n    const keys = split(pointer);\n    if (keys.length === 0) {\n        const result = node.resolveRef(options);\n        return isJsonError(result) ? { node: undefined, error: result } : { node: result, error: undefined };\n    }\n    let currentPointer = \"#\";\n    let currentNode = node;\n    for (let i = 0, l = keys.length; i < l; i += 1) {\n        currentPointer = `${currentPointer}/${keys[i]}`;\n        const result = currentNode.getNodeChild(keys[i], data, { ...options, pointer: currentPointer });\n        if (result.error) {\n            return result;\n        }\n        if (result.node == null) {\n            return result;\n        }\n        currentNode = result.node;\n        data = getValue(data, keys[i]);\n    }\n\n    const { node: reducedNode, error: reduceError } = currentNode.resolveRef(options).reduceNode(data);\n\n    if (isJsonError(reduceError)) {\n        return { node: undefined, error: reduceError };\n    }\n    if (isSchemaNode(reducedNode)) {\n        return { node: reducedNode, error: undefined };\n    }\n\n    return { error: undefined };\n}\n","import { GetNodeOptions, isSchemaNode, SchemaNode } from \"./SchemaNode\";\nimport { isJsonError, NodeOrError, OptionalNodeOrError } from \"./types\";\nimport { getValue } from \"./utils/getValue\";\n\nexport function getNodeChild(key: string | number, data: unknown, options: { withSchemaWarning: true } & GetNodeOptions): NodeOrError; // prettier-ignore\nexport function getNodeChild(key: string | number, data: unknown, options: { createSchema: true } & GetNodeOptions): NodeOrError; // prettier-ignore\nexport function getNodeChild(key: string | number, data?: unknown, options?: GetNodeOptions): OptionalNodeOrError;\n\n/**\n * Returns the child for the given property-name or array-index\n *\n * - the returned child node is **not reduced**\n * - a child node $ref is resolved\n *\n * @returns { node } or { error } where node can also be undefined (valid but undefined)\n */\nexport function getNodeChild(\n    key: string | number,\n    data?: unknown,\n    options: GetNodeOptions = {}\n): OptionalNodeOrError | NodeOrError {\n    options.path = options.path ?? [];\n    options.withSchemaWarning = options.withSchemaWarning ?? false;\n    options.pointer = options.pointer ?? \"#\";\n    const { path, pointer } = options;\n\n    // reduce parent\n    // @ts-expect-error implicitely any\n    let parentNode = this as SchemaNode;\n    if (parentNode.reducers.length) {\n        const result = parentNode.reduceNode(data, { key, path, pointer });\n        if (result.error) {\n            return result;\n        }\n        if (isSchemaNode(result.node)) {\n            parentNode = result.node;\n        }\n    }\n\n    // find child node\n    for (const resolver of parentNode.resolvers) {\n        const schemaNode = resolver({ data, key, node: parentNode });\n        // a matching resolver found an error, return\n        if (isJsonError(schemaNode)) {\n            return { node: undefined, error: schemaNode };\n        }\n        // a matching resolver found a child node, return\n        if (isSchemaNode(schemaNode)) {\n            return { node: schemaNode.resolveRef({ pointer, path }), error: undefined };\n        }\n    }\n\n    // no child node was found, but the child node is valid\n    if (options.createSchema === true) {\n        const newNode = parentNode.compileSchema(\n            parentNode.createSchema(getValue(data, key)),\n            `${parentNode.evaluationPath}/additional`,\n            `${parentNode.schemaLocation}/additional`\n        );\n        return { node: newNode, error: undefined };\n    }\n\n    if (options.withSchemaWarning === true) {\n        const error = parentNode.createError(\"schema-warning\", {\n            pointer,\n            value: data,\n            schema: parentNode.schema,\n            key\n        });\n        return { node: undefined, error };\n    }\n\n    return { node: undefined };\n}\n","import { copy } from \"fast-copy\";\nimport sanitizeErrors from \"./utils/sanitizeErrors\";\nimport settings from \"./settings\";\nimport type {\n    JsonSchemaReducer,\n    JsonSchemaResolver,\n    JsonSchemaValidator,\n    Keyword,\n    Maybe,\n    ValidationAnnotation,\n    ValidationPath\n} from \"./Keyword\";\nimport { createSchema } from \"./methods/createSchema\";\nimport { Draft } from \"./Draft\";\nimport { toSchemaNodes } from \"./methods/toSchemaNodes\";\nimport {\n    isJsonError,\n    isJsonSchema,\n    JsonSchema,\n    BooleanSchema,\n    JsonError,\n    AnnotationData,\n    DefaultErrors,\n    OptionalNodeOrError,\n    NodeOrError,\n    JsonAnnotation,\n    isJsonAnnotation,\n    isBooleanSchema\n} from \"./types\";\nimport { isObject } from \"./utils/isObject\";\nimport { join } from \"@sagold/json-pointer\";\nimport { resolveUri } from \"./utils/resolveUri\";\nimport { mergeNode } from \"./mergeNode\";\nimport { omit } from \"./utils/omit\";\nimport { pick } from \"./utils/pick\";\nimport { render } from \"./errors/render\";\nimport { TemplateOptions } from \"./methods/getData\";\nimport { validateNode } from \"./validateNode\";\nimport { hasProperty } from \"./utils/hasProperty\";\nimport { getNode } from \"./getNode\";\nimport { getNodeChild } from \"./getNodeChild\";\nimport { DataNode } from \"./methods/toDataNodes\";\n\nconst { DYNAMIC_PROPERTIES, REGEX_FLAGS, DECLARATOR_ONEOF, VALID_ANNOTATION_KEYWORDS } = settings;\n\nexport function isSchemaNode(value: unknown): value is SchemaNode {\n    return isObject(value) && Array.isArray(value?.reducers) && Array.isArray(value?.resolvers);\n}\n\nexport function isReduceable(node: SchemaNode) {\n    for (let i = 0, l = DYNAMIC_PROPERTIES.length; i < l; i += 1) {\n        // @ts-expect-error interface to object conversion\n        if (hasProperty(node, DYNAMIC_PROPERTIES[i])) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction getDraft(drafts: Draft[], $schema: string) {\n    if (!Array.isArray(drafts) || drafts.length === 0) {\n        throw new Error(`Missing drafts in 'compileSchema({ $schema: \"${$schema}\" })'`);\n    }\n    if (drafts.length === 1) {\n        return drafts[0];\n    }\n    return drafts.find((d) => new RegExp(d.$schemaRegEx, REGEX_FLAGS).test($schema)) ?? drafts[drafts.length - 1];\n}\n\nexport type Context = {\n    /** root node of this JSON Schema */\n    rootNode: SchemaNode;\n    /** Fallback _draft_ version in case no _draft_ is specified by `schema.$schema` */\n    draft?: string;\n    /** available draft configurations */\n    drafts: Draft[];\n    /** [SHARED ACROSS REMOTES] root nodes of registered remote JSON Schema, stored by id/url */\n    remotes: Record<string, SchemaNode>;\n    /** references stored by fully resolved schema-$id + local-pointer */\n    refs: Record<string, SchemaNode>;\n    /** anchors stored by fully resolved schema-$id + $anchor */\n    anchors: Record<string, SchemaNode>;\n    /** [SHARED ACROSS REMOTES] dynamicAnchors stored by fully resolved schema-$id + $anchor */\n    dynamicAnchors: Record<string, SchemaNode>;\n    /** JSON Schema parser, validator, reducer and resolver for this JSON Schema (root schema and its child nodes) */\n    keywords: Draft[\"keywords\"];\n    /** JSON Schema draft dependend methods */\n    methods: Draft[\"methods\"];\n    /** draft version */\n    version: Draft[\"version\"];\n    /** draft errors & template-strings */\n    errors: Draft[\"errors\"];\n    /** draft formats & validators */\n    formats: Draft[\"formats\"];\n    /** [SHARED USING ADD REMOTE] getData default options */\n    getDataDefaultOptions?: TemplateOptions;\n    /** [SHARED USING ADD REMOTE] collect unknown keywords in schemaAnnotations */\n    withSchemaAnnotations?: boolean;\n    /** [SHARED USING ADD REMOTE] throw error on validation when ref cannot be resolved */\n    throwOnInvalidRef?: boolean;\n};\n\nexport interface SchemaNode extends SchemaNodeMethodsType {\n    /** shared context across nodes of JSON schema and shared properties across all remotes */\n    context: Context;\n    /** JSON Schema of node */\n    schema: JsonSchema;\n    /**\n     * Evaluation Path - The location of the keyword that produced the annotation or error.\n     * The purpose of this data is to show the resolution path which resulted in the subschema\n     * that contains the keyword.\n     *\n     * - relative to the root of the principal schema; should include (inline) any $ref segments in the path\n     * - JSON pointer\n     */\n    evaluationPath: string;\n    /**\n     * Schema Location - The direct location to the keyword that produced the annotation\n     * or error. This is provided as a convenience to the user so that they don't have to resolve\n     * the keyword's subschema, which may not be trivial task. It is only provided if the relative\n     * location contains $refs (otherwise, the two locations will be the same).\n     *\n     * - absolute URI\n     * - may not have any association to the principal schema\n     */\n    schemaLocation: string;\n    /** id created when combining subschemas */\n    dynamicId: string;\n    /** reference to parent node (node used to compile this node) */\n    parent?: SchemaNode | undefined;\n    /** JSON Pointer from last $id ~~to this location~~ to resolve $refs to $id#/idLocalPointer */\n    lastIdPointer: string;\n    /** when reduced schema containing `oneOf` schema, `oneOfIndex` stores `oneOf`-item used for merge */\n    oneOfIndex?: number;\n\n    reducers: JsonSchemaReducer[];\n    resolvers: JsonSchemaResolver[];\n    validators: JsonSchemaValidator[];\n    schemaValidation?: ValidationAnnotation[];\n\n    // parsed schema properties (registered by parsers)\n    $id?: string;\n    $defs?: Record<string, SchemaNode>;\n    $ref?: string;\n    additionalProperties?: SchemaNode;\n    allOf?: SchemaNode[];\n    anyOf?: SchemaNode[];\n    contains?: SchemaNode;\n    dependentRequired?: Record<string, string[]>;\n    dependentSchemas?: Record<string, SchemaNode | boolean>;\n    deprecated?: boolean;\n    else?: SchemaNode;\n    enum?: unknown[];\n    if?: SchemaNode;\n    /**\n     * # Items-array schema - for all drafts\n     *\n     * - for drafts prior 2020-12 `schema.items[]`-schema stored as `node.prefixItems`\n     *\n     * Validation succeeds if each element of the instance validates against the schema at the\n     * same position, if any.\n     *\n     * The `prefixItems` keyword restricts a number of items from the start of an array instance\n     * to validate against the given sequence of subschemas, where the item at a given index in\n     * the array instance is evaluated against the subschema at the given index in the `prefixItems`\n     * array, if any. Array items outside the range described by the `prefixItems` keyword is\n     * evaluated against the items keyword, if present.\n     *\n     * [Docs](https://www.learnjsonschema.com/2020-12/applicator/prefixitems/)\n     * | [Examples](https://json-schema.org/understanding-json-schema/reference/array#tupleValidation)\n     */\n    prefixItems?: SchemaNode[];\n    /**\n     * # Items-object schema for additional array item - for all drafts\n     *\n     * - for drafts prior 2020-12 `schema.additionalItems` object-schema stored as `node.items`\n     *\n     * Validation succeeds if each element of the instance not covered by `prefixItems` validates\n     * against this schema.\n     *\n     * The items keyword restricts array instance items not described by the sibling `prefixItems`\n     * keyword (if any), to validate against the given subschema. Whetherthis keyword was evaluated\n     * against any item of the array instance is reported using annotations.\n     *\n     * [Docs](https://www.learnjsonschema.com/2020-12/applicator/items/)\n     * | [Examples](https://json-schema.org/understanding-json-schema/reference/array#items)\n     * | [AdditionalItems Specification](https://json-schema.org/draft/2019-09/draft-handrews-json-schema-02#additionalItems)\n     */\n    items?: SchemaNode;\n    maximum?: number;\n    minimum?: number;\n    maxItems?: number;\n    maxLength?: number;\n    maxProperties?: number;\n    minItems?: number;\n    minLength?: number;\n    minProperties?: number;\n    not?: SchemaNode;\n    oneOf?: SchemaNode[];\n    multipleOf?: number;\n    pattern?: RegExp;\n    patternProperties?: { name: string; pattern: RegExp; node: SchemaNode }[];\n    propertyDependencies?: Record<string, Record<string, SchemaNode>>;\n    properties?: Record<string, SchemaNode>;\n    propertyNames?: SchemaNode;\n    required?: string[];\n    then?: SchemaNode;\n    type?: string | string[];\n    unevaluatedItems?: SchemaNode;\n    unevaluatedProperties?: SchemaNode;\n    uniqueItems?: true;\n}\n\n/**\n * Fixed SchemaNode mixin methods\n */\ninterface SchemaNodeMethodsType {\n    compileSchema(\n        schema: JsonSchema | BooleanSchema,\n        evaluationPath?: string,\n        schemaLocation?: string,\n        dynamicId?: string\n    ): SchemaNode;\n    createError<T extends string = DefaultErrors>(code: T, data: AnnotationData, message?: string): JsonError;\n    createAnnotation<T extends string = DefaultErrors>(code: T, data: AnnotationData, message?: string): JsonAnnotation;\n    createSchema(data?: unknown): JsonSchema;\n\n    /**\n     * Returns a node matching the given location (pointer) in data\n     *\n     * - the returned node will have a **reduced schema** based on given input data\n     * - return returned node $ref is resolved\n     *\n     * To resolve dynamic schema where the type of JSON Schema is evaluated by\n     * its value, a data object has to be passed in options.\n     *\n     * Per default this function will return `undefined` schema for valid properties\n     * that do not have a defined schema. Use the option `withSchemaWarning: true` to\n     * receive an error with `code: schema-warning` containing the location of its\n     * last evaluated json-schema.\n     *\n     * @returns { node } or { error } where node can also be undefined (valid but undefined)\n     */\n    getNode(pointer: string, data: unknown, options: { withSchemaWarning: true } & GetNodeOptions): NodeOrError;\n    getNode(pointer: string, data: unknown, options: { createSchema: true } & GetNodeOptions): NodeOrError;\n    getNode(pointer: string, data?: unknown, options?: GetNodeOptions): OptionalNodeOrError;\n\n    /**\n     * Returns the child for the given property-name or array-index\n     *\n     * - the returned child node is **not reduced**\n     * - a child node $ref is resolved\n     *\n     * @returns { node } or { error } where node can also be undefined (valid but undefined)\n     */\n    getNodeChild(\n        key: string | number,\n        data: unknown,\n        options: { withSchemaWarning: true } & GetNodeOptions\n    ): NodeOrError;\n    getNodeChild(key: string | number, data: unknown, options: { createSchema: true } & GetNodeOptions): NodeOrError;\n    getNodeChild(key: string | number, data?: unknown, options?: GetNodeOptions): OptionalNodeOrError;\n\n    getChildSelection(property: string | number): JsonError | SchemaNode[];\n    getNodeRef($ref: string): SchemaNode | undefined;\n    getNodeRoot(): SchemaNode;\n    getDraftVersion(): string;\n    getData(data?: unknown, options?: TemplateOptions): any; // eslint-disable-line @typescript-eslint/no-explicit-any\n    reduceNode(\n        data: unknown,\n        options?: { key?: string | number; pointer?: string; path?: ValidationPath }\n    ): OptionalNodeOrError;\n    resolveRef: (args?: { pointer?: string; path?: ValidationPath }) => SchemaNode;\n    validate(data: unknown, pointer?: string, path?: ValidationPath): ValidateReturnType;\n    addRemoteSchema(url: string, schema: JsonSchema | BooleanSchema): SchemaNode;\n    toSchemaNodes(): SchemaNode[];\n    toDataNodes(data: unknown, pointer?: string): DataNode[];\n    toJSON(): unknown;\n}\n\nexport type GetNodeOptions = {\n    /**\n     *  Per default `undefined` is returned for valid data, but undefined schema.\n     *\n     * - Using `withSchemaWarning:true` will return an error instead: `{ type: \"error\", code: \"schema-warning\" }`\n     */\n    withSchemaWarning?: boolean;\n    /**\n     *  Per default `undefined` is returned for valid data, but undefined schema.\n     *\n     * - Using `createSchema:true` will create a schema instead\n     */\n    createSchema?: boolean;\n    path?: ValidationPath;\n    pointer?: string;\n};\n\nexport type ValidateReturnType = {\n    /**\n     * True, if data is valid to the compiled schema.\n     * Does not include async errors.\n     */\n    valid: boolean;\n    /**\n     * List of validation errors or empty\n     */\n    errors: JsonError[];\n    /**\n     * List of annotations from validators\n     */\n    annotations: JsonAnnotation[];\n    /**\n     * List of Promises resolving to `JsonError|undefined` or empty.\n     */\n    errorsAsync: Promise<Maybe<ValidationAnnotation>[]>[];\n};\n\nexport function joinDynamicId(a?: string, b?: string) {\n    if (a == b) {\n        return a ?? \"\";\n    }\n    if (a == null || b == null) {\n        return (a || b) ?? \"\";\n    }\n    if (a.startsWith(b)) {\n        return a;\n    }\n    if (b.startsWith(a)) {\n        return b;\n    }\n    return `${a}+${b}`;\n}\n\nexport const SchemaNodeMethods = {\n    /**\n     * Compiles a child-schema of this node to its context\n     * @returns SchemaNode representing the passed JSON Schema\n     */\n    compileSchema(schema: JsonSchema, evaluationPath: string, schemaLocation?: string, dynamicId?: string): SchemaNode {\n        const parentNode = this as SchemaNode;\n        evaluationPath = evaluationPath ?? parentNode.evaluationPath;\n        const nextFragment = evaluationPath.split(\"/$ref\")[0];\n        const node: SchemaNode = {\n            lastIdPointer: parentNode.lastIdPointer, // ref helper\n            context: parentNode.context,\n            parent: parentNode,\n            evaluationPath,\n            dynamicId: joinDynamicId(parentNode.dynamicId, dynamicId),\n            schemaLocation: schemaLocation ?? join(parentNode.schemaLocation, nextFragment),\n            reducers: [],\n            resolvers: [],\n            validators: [],\n            schema,\n            ...SchemaNodeMethods\n        };\n\n        if (!isJsonSchema(schema) && !isBooleanSchema(schema)) {\n            node.schemaValidation = [\n                node.createError(\"schema-error\", {\n                    pointer: schemaLocation ?? evaluationPath,\n                    schema,\n                    value: undefined,\n                    message: `JSON schema must be object or boolean - reveived: '${schema}'`\n                })\n            ];\n            return node;\n        }\n        const schemaValidation = addKeywords(node).filter((err) => err != null);\n        node.schemaValidation = sanitizeErrors(schemaValidation);\n\n        return node;\n    },\n\n    createError<T extends string = DefaultErrors>(code: T, data: AnnotationData, message?: string): JsonError {\n        const node = this as SchemaNode;\n        let errorMessage = message;\n        if (errorMessage === undefined) {\n            const error = node.schema?.errorMessages?.[code] ?? node.context.errors[code];\n            if (typeof error === \"function\") {\n                return error(data);\n            }\n            errorMessage = render(error ?? name, data);\n        }\n        return { type: \"error\", code, message: errorMessage, data };\n    },\n\n    createAnnotation<T extends string = DefaultErrors>(\n        code: T,\n        data: AnnotationData,\n        message?: string\n    ): JsonAnnotation {\n        const node = this as SchemaNode;\n        let annotationMessage = message;\n        if (annotationMessage === undefined) {\n            const error = node.schema?.errorMessages?.[code] ?? node.context.errors[code];\n            if (typeof error === \"function\") {\n                return error(data);\n            }\n            annotationMessage = render(error ?? name, data);\n        }\n        return { type: \"annotation\", code, message: annotationMessage, data };\n    },\n\n    createSchema,\n\n    getChildSelection(property: string | number): JsonError | SchemaNode[] {\n        const node = this as SchemaNode;\n        return node.context.methods.getChildSelection(node, property);\n    },\n\n    getNode,\n    getNodeChild,\n\n    /**\n     * @returns for $ref, the corresponding SchemaNode or undefined\n     */\n    getNodeRef($ref: string): SchemaNode | undefined {\n        const node = this as SchemaNode;\n        return node.compileSchema({ $ref }, \"$dynamic\").resolveRef();\n    },\n\n    getNodeRoot() {\n        const node = this as SchemaNode;\n        return node.context.rootNode;\n    },\n\n    /**\n     * @returns draft version this JSON Schema is evaluated by\n     */\n    getDraftVersion() {\n        return (this as SchemaNode).context.version;\n    },\n\n    /**\n     * @returns data that is valid to the schema of this node\n     */\n    getData(data?: unknown, options?: TemplateOptions) {\n        const node = this as SchemaNode;\n        const opts = {\n            recursionLimit: 1,\n            ...node.context.getDataDefaultOptions,\n            cache: {},\n            ...(options ?? {})\n        };\n        return node.context.methods.getData(node, data, opts);\n    },\n\n    /**\n     * @returns SchemaNode with a reduced JSON Schema matching the given data\n     */\n    reduceNode(\n        data: unknown,\n        options: { key?: string | number; pointer?: string; path?: ValidationPath } = {}\n    ): OptionalNodeOrError {\n        const node = this as SchemaNode;\n        const { key = \"missing-key\", pointer = node.evaluationPath, path } = options;\n\n        // @ts-expect-error bool schema\n        if (node.schema === false) {\n            return { node, error: undefined };\n            // @ts-expect-error bool schema\n        } else if (node.schema === true) {\n            const nextNode = node.compileSchema(createSchema(data), node.evaluationPath, node.schemaLocation);\n            path?.push({ pointer, node });\n            return { node: nextNode, error: undefined };\n        }\n\n        let schema;\n        // we need to copy node to prevent modification of source\n        // @todo does mergeNode break immutability?\n        let workingNode = node.compileSchema(node.schema, node.evaluationPath, node.schemaLocation);\n        const reducers = node.reducers;\n        for (const reducer of reducers) {\n            const result = reducer({ data, key, node, pointer, path: path ?? [] });\n            if (isJsonError(result)) {\n                return { node: undefined, error: result };\n            }\n            if (result) {\n                // @ts-expect-error bool schema - for undefined & false schema return false schema\n                if (result.schema === false) {\n                    schema = false;\n                    break;\n                }\n                // compilation result for data of current schemain order to merge results, we rebuild\n                // node from schema alternatively we would need to merge by node-property\n                workingNode = mergeNode(workingNode, result) as SchemaNode;\n            }\n        }\n\n        if (schema === false) {\n            // @ts-expect-error bool schema\n            return { node: { ...node, schema: false, reducers: [] } as SchemaNode, error: undefined };\n        }\n\n        if (workingNode !== node) {\n            path?.push({ pointer, node });\n        }\n\n        // remove dynamic properties of node\n        workingNode.schema = omit(workingNode.schema, DECLARATOR_ONEOF, ...DYNAMIC_PROPERTIES);\n        // @ts-expect-error string accessing schema props\n        DYNAMIC_PROPERTIES.forEach((prop) => (workingNode[prop] = undefined));\n        return { node: workingNode, error: undefined };\n    },\n\n    /**\n     * @returns validation result of data validated by this node's JSON Schema\n     */\n    validate(data: unknown, pointer = \"#\", path: ValidationPath = []) {\n        const node = this as SchemaNode;\n        const errors = validateNode(node, data, pointer, path) ?? [];\n        const syncErrors: JsonError[] = [];\n        const annotations: JsonAnnotation[] = [];\n        const flatErrorList = sanitizeErrors(Array.isArray(errors) ? errors : [errors]).filter(isJsonError);\n\n        const errorsAsync: Promise<Maybe<ValidationAnnotation>[]>[] = [];\n        sanitizeErrors(Array.isArray(errors) ? errors : [errors]).forEach((error) => {\n            if (isJsonError(error)) {\n                if (node.context.throwOnInvalidRef && error.code === \"ref-error\") {\n                    const refError = new Error(\"Invalid $ref: \" + error.message);\n                    // @ts-expect-error unknown error-property\n                    refError.data = syncErrors;\n                    throw refError;\n                }\n\n                syncErrors.push(error);\n            } else if (error instanceof Promise) {\n                errorsAsync.push(error.then(sanitizeErrors));\n            } else if (isJsonAnnotation(error)) {\n                annotations.push(error);\n            }\n        });\n\n        const result: ValidateReturnType = {\n            valid: flatErrorList.length === 0,\n            errors: syncErrors,\n            annotations,\n            errorsAsync\n        };\n\n        return result;\n    },\n\n    /**\n     * Register a JSON Schema as a remote-schema to be resolved by $ref, $anchor, etc\n     * @returns the current node (not the remote schema-node)\n     */\n    addRemoteSchema(url: string, schema: JsonSchema | BooleanSchema): SchemaNode {\n        // @draft >= 6\n        if (isJsonSchema(schema)) {\n            schema.$id = resolveUri(schema.$id || url);\n        }\n\n        const node = this as SchemaNode;\n        const { context } = node;\n        const schemaId = isJsonSchema(schema) ? (node.context.draft ?? schema.$schema) : undefined;\n        const draft = getDraft(context.drafts, schemaId ?? context.rootNode.schema?.$schema);\n\n        const remoteNode: SchemaNode = {\n            evaluationPath: \"#\",\n            lastIdPointer: \"#\",\n            schemaLocation: \"#\",\n            dynamicId: \"\",\n            reducers: [],\n            resolvers: [],\n            validators: [],\n            schema,\n            context: {\n                ...context,\n                refs: {},\n                anchors: {},\n                ...copy(pick(draft, \"methods\", \"keywords\", \"version\", \"formats\", \"errors\"))\n            },\n            ...SchemaNodeMethods\n        } as SchemaNode;\n\n        remoteNode.context.rootNode = remoteNode;\n        remoteNode.context.remotes[resolveUri(url)] = remoteNode;\n        addKeywords(remoteNode);\n\n        return node;\n    },\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    resolveRef(args?: { pointer?: string; path?: ValidationPath }) {\n        throw new Error(\"method 'resolveRef' is not implemented\");\n        return this as SchemaNode;\n    },\n\n    /**\n     * @returns a list of all sub-schema as SchemaNode\n     */\n    toSchemaNodes() {\n        return toSchemaNodes(this);\n    },\n\n    /**\n     * @returns a list of values (including objects and arrays) and their corresponding JSON Schema as SchemaNode\n     */\n    toDataNodes(data: unknown, pointer?: string): DataNode[] {\n        const node = this as SchemaNode;\n        return node.context.methods.toDataNodes(node, data, pointer);\n    },\n\n    toJSON() {\n        const node = this as SchemaNode;\n        return { ...node, context: undefined, errors: undefined, parent: node.parent?.evaluationPath };\n    }\n} as const;\n\nconst whitelist = [\"$ref\", \"if\", \"$defs\"];\nconst noRefMergeDrafts = [\"draft-04\", \"draft-06\", \"draft-07\"];\n\nexport function addKeywords(node: SchemaNode) {\n    if (node.schema.$ref && noRefMergeDrafts.includes(node.context.version)) {\n        // for these draft versions only ref is validated\n        return node.context.keywords\n            .filter(({ keyword }) => whitelist.includes(keyword))\n            .map((keyword) => execKeyword(keyword, node));\n    }\n    const keys = Object.keys(node.schema);\n    const errors = node.context.keywords\n        .filter(({ keyword }) => whitelist.includes(keyword) || keys.includes(keyword))\n        .map((keyword) => execKeyword(keyword, node));\n\n    keys.filter(\n        (key) =>\n            !key.startsWith(\"x-\") &&\n            !VALID_ANNOTATION_KEYWORDS.includes(key) &&\n            node.context.keywords.find((keyword) => keyword.keyword === key) == null\n    ).forEach((keyword) => {\n        errors.push(\n            node.createAnnotation(\"unknown-keyword-warning\", {\n                pointer: `${node.schemaLocation}/${keyword}`,\n                schema: node.schema,\n                value: keyword,\n                draft: node.getDraftVersion()\n            })\n        );\n    });\n\n    return errors;\n}\n\nexport function execKeyword(keyword: Keyword, node: SchemaNode) {\n    // @todo consider first parsing all nodes\n    const errors = keyword.parse?.(node);\n    if (keyword.reduce && keyword.addReduce?.(node)) {\n        node.reducers.push(keyword.reduce);\n    }\n    if (keyword.resolve && keyword.addResolve?.(node)) {\n        node.resolvers.push(keyword.resolve);\n    }\n    if (keyword.validate && keyword.addValidate?.(node)) {\n        node.validators.push(keyword.validate);\n    }\n    return errors;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Draft } from \"./Draft\";\nimport { errors } from \"./errors/errors\";\nimport { SchemaNode, isSchemaNode, GetNodeOptions } from \"./SchemaNode\";\nimport { isObject } from \"./utils/isObject\";\n\nexport type BooleanSchema = boolean;\n// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style\nexport interface JsonSchema {\n    [keyword: string]: any;\n}\nexport function isJsonSchema(value: unknown): value is JsonSchema {\n    return isObject(value);\n}\n\nexport function isBooleanSchema(value: unknown): value is BooleanSchema {\n    return typeof value === \"boolean\";\n}\n\nexport type JsonPointer = string;\n\nexport type AnnotationData<D extends Record<string, unknown> = Record<string, unknown>> = D & {\n    /* json-pointer to location of error */\n    pointer: string;\n    /* json-schema of error location */\n    schema: JsonSchema;\n    /* value: data in error location */\n    value: unknown;\n};\n\nexport type Annotation<T = string, D extends AnnotationData = AnnotationData, S = string> = {\n    type: T;\n    code: S;\n    message: string;\n    data: D;\n    [p: string]: unknown;\n};\n\nexport type DefaultErrors = keyof typeof errors;\nexport type ErrorConfig = Record<DefaultErrors | string, string | ((error: AnnotationData) => void)>;\nexport type OptionalNodeOrError = { node?: SchemaNode; error: undefined } | { node: undefined; error?: JsonError };\nexport type NodeOrError = { node: SchemaNode; error: undefined } | { node: undefined; error: JsonError };\nexport type JsonError<D extends AnnotationData = AnnotationData> = Annotation<\"error\", D, ErrorConfig | string>;\nexport type JsonAnnotation<D extends AnnotationData = AnnotationData> = Annotation<\"annotation\", D>;\n\nexport type { SchemaNode, GetNodeOptions, Draft };\nexport { isSchemaNode };\n\nexport function isAnnotation(value: any): value is Annotation {\n    return isObject(value) && (value?.type && value?.code && value?.data) != null;\n}\n\n/**\n * ts type guard for json error\n * @returns true if passed type is a JsonError\n */\nexport function isJsonAnnotation(error: unknown): error is JsonAnnotation {\n    return isObject(error) && error.type === \"annotation\";\n}\n\n/**\n * ts type guard for json error\n * @returns true if passed type is a JsonError\n */\nexport function isJsonError(error: unknown): error is JsonError {\n    return isObject(error) && error.type === \"error\";\n}\n\nexport function isNumber(value: unknown): value is number {\n    return typeof value === \"number\";\n}\n","const suffixes = /(#)+$/g;\nconst emptyValues = [\"\", null, \"#\"];\n\nexport default function splitRef($ref: string) {\n    if (emptyValues.includes($ref)) {\n        return [];\n    }\n\n    $ref = $ref.replace(suffixes, \"\");\n    if ($ref.indexOf(\"#\") === -1) {\n        return [$ref.replace(/(#|\\/)+$/g, \"\")];\n    }\n\n    if ($ref.indexOf(\"#\") === 0) {\n        return [$ref.replace(suffixes, \"\")];\n    }\n\n    const result = $ref.split(\"#\");\n    result[0] = result[0].replace(/(#|\\/)+$/g, \"\");\n    result[1] = `#${result[1].replace(suffixes, \"\")}`;\n    return result;\n}\n","import { isJsonError, isSchemaNode, JsonError, SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaValidatorParams, ValidationPath, JsonSchemaReducerParams } from \"../Keyword\";\nimport { resolveUri } from \"../utils/resolveUri\";\nimport splitRef from \"../utils/splitRef\";\nimport { omit } from \"../utils/omit\";\nimport { isObject } from \"../utils/isObject\";\nimport { validateNode } from \"../validateNode\";\nimport { get, split } from \"@sagold/json-pointer\";\nimport { mergeNode } from \"../mergeNode\";\nimport { pick } from \"../utils/pick\";\nimport settings from \"src/settings\";\n\nexport const $refKeyword: Keyword = {\n    id: \"$ref\",\n    keyword: \"$ref\",\n    order: 10,\n    parse: parseRef,\n    addReduce: (node) => node.$ref != null || node.schema.$dynamicRef != null,\n    reduce: reduceRef,\n    addValidate: ({ schema }) => schema.$ref != null || schema.$dynamicRef != null,\n    validate: validateRef\n};\n\nfunction register(node: SchemaNode, path: string) {\n    if (node.context.refs[path] == null) {\n        node.context.refs[path] = node;\n    }\n}\n\nexport function parseRef(node: SchemaNode) {\n    // @ts-expect-error add ref resolution method to node\n    node.resolveRef = resolveRef;\n\n    // get and store current $id of node - this may be the same as parent $id\n    const currentId = resolveUri(node.parent?.$id, node.schema?.$id);\n    node.$id = currentId;\n    node.lastIdPointer = node.parent?.lastIdPointer ?? \"#\";\n    if (currentId !== node.parent?.$id && node.evaluationPath !== \"#\") {\n        node.lastIdPointer = node.evaluationPath;\n    }\n\n    // store this node for retrieval by $id + json-pointer from $id\n    if (node.lastIdPointer !== \"#\" && node.evaluationPath.startsWith(node.lastIdPointer)) {\n        const localPointer = `#${node.evaluationPath.replace(node.lastIdPointer, \"\")}`;\n        register(node, resolveUri(currentId, localPointer));\n    }\n    // store $rootId + json-pointer to this node\n    register(node, resolveUri(node.context.rootNode.$id, node.evaluationPath));\n\n    // @draft-2020:  A $dynamicRef to a $dynamicAnchor in the same schema resource behaves like a normal $ref to an $anchor\n    const anchor = node.schema.$anchor;\n    if (anchor) {\n        // store this node for retrieval by $id + anchor\n        const anchorUrl = `${currentId.replace(/#$/, \"\")}#${anchor}`;\n        if (node.context.anchors[anchorUrl] == null) {\n            node.context.anchors[anchorUrl] = node;\n        }\n    }\n\n    const dynamicAnchor = node.schema.$dynamicAnchor;\n    if (dynamicAnchor) {\n        // store this node for retrieval by $id + anchor\n        const dynamicAnchorUrl = `${currentId.replace(/#$/, \"\")}#${dynamicAnchor}`;\n        if (node.context.dynamicAnchors[dynamicAnchorUrl] == null) {\n            node.context.dynamicAnchors[dynamicAnchorUrl] = node;\n        }\n    }\n\n    // precompile reference\n    if (node.schema.$ref) {\n        node.$ref = resolveUri(currentId, node.schema.$ref);\n        if (node.$ref.startsWith(\"/\")) {\n            node.$ref = `#${node.$ref}`;\n        }\n    }\n\n    // validate simple ref to definitions\n    if (node.$ref?.startsWith(\"#/$defs/\")) {\n        if (get(node.getNodeRoot().schema, node.$ref) == null) {\n            return node.createError(\"schema-error\", {\n                pointer: `${node.schemaLocation}/$ref`,\n                schema: node.schema,\n                value: node.schema.$ref,\n                message: `Invalid $ref to missing target '${node.schema.ref}'`\n            });\n        }\n    }\n}\n\nexport function reduceRef({ node, data, key, pointer, path }: JsonSchemaReducerParams) {\n    if (node == null) {\n        return;\n    }\n\n    const resolvedNode = node.resolveRef({ pointer, path });\n    if (resolvedNode == null) {\n        return node.createError(\"ref-error\", {\n            ref: node.schema.$ref ?? node.schema.$dynamicRef,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n\n    if (resolvedNode.schemaLocation === node.schemaLocation) {\n        return resolvedNode;\n    }\n    const merged = mergeNode(node, resolvedNode) as SchemaNode;\n    const { node: reducedNode, error } = merged.reduceNode(data, { key, pointer, path });\n    return reducedNode ?? error;\n}\n\nexport function resolveRef(this: SchemaNode, { pointer, path = [] }: { pointer?: string; path?: ValidationPath } = {}) {\n    if (this.schema.$dynamicRef) {\n        const nextNode = resolveRecursiveRef(this, path);\n        if (isJsonError(nextNode)) {\n            return nextNode;\n        }\n        path.push({ pointer: pointer!, node: nextNode! });\n        return nextNode;\n    }\n\n    if (this.$ref == null) {\n        return this;\n    }\n\n    const resolvedNode = getRef(this);\n    if (isSchemaNode(resolvedNode)) {\n        path.push({ pointer: pointer!, node: resolvedNode });\n    }\n\n    return resolvedNode;\n}\n\nfunction validateRef({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    const nextNode = node.resolveRef({ pointer, path });\n    if (nextNode != null) {\n        // recursively resolveRef and validate\n        return validateNode(nextNode, data, pointer, path);\n    }\n    return node.createError(\"ref-error\", {\n        ref: node.schema.$ref ?? node.schema.$dynamicRef,\n        pointer,\n        schema: node.schema,\n        value: data\n    });\n}\n\n// 1. https://json-schema.org/draft/2019-09/json-schema-core#scopes\nfunction resolveRecursiveRef(node: SchemaNode, path: ValidationPath): SchemaNode | JsonError {\n    const history = path;\n    const refInCurrentScope = resolveUri(node.$id, node.schema.$dynamicRef);\n\n    // A $dynamicRef with a non-matching $dynamicAnchor in the same schema resource behaves like a normal $ref to $anchor\n    const nonMatchingDynamicAnchor = node.context.dynamicAnchors[refInCurrentScope] == null;\n    if (nonMatchingDynamicAnchor) {\n        if (node.context.anchors[refInCurrentScope]) {\n            return compileNext(node.context.anchors[refInCurrentScope], node);\n        }\n    }\n\n    for (const entry of history) {\n        // A $dynamicRef that initially resolves to a schema with a matching $dynamicAnchor resolves to the first $dynamicAnchor in the dynamic scope\n        if (entry.node.schema.$dynamicAnchor) {\n            return compileNext(entry.node, node);\n        }\n\n        // A $dynamicRef only stops at a $dynamicAnchor if it is in the same dynamic scope.\n        const refWithoutScope = node.schema.$dynamicRef.split(\"#\").pop();\n        const ref = resolveUri(entry.node.$id, `#${refWithoutScope}`);\n        const anchorNode = node.context.dynamicAnchors[ref];\n        if (anchorNode) {\n            return compileNext(node.context.dynamicAnchors[ref], node);\n        }\n    }\n\n    // A $dynamicRef without a matching $dynamicAnchor in the same schema resource behaves like a normal $ref to $anchor\n    return getRef(node, refInCurrentScope);\n}\n\nexport function compileNext(referencedNode: SchemaNode, sourceNode: SchemaNode) {\n    let referencedSchema = referencedNode.schema;\n    if (isObject(referencedNode.schema)) {\n        referencedSchema = {\n            ...omit(referencedNode.schema, \"$id\"),\n            ...pick(sourceNode.schema, ...settings.PROPERTIES_TO_MERGE)\n        };\n    }\n    return referencedNode.compileSchema(\n        referencedSchema,\n        `${sourceNode.evaluationPath}/$ref`,\n        referencedNode.schemaLocation\n    );\n}\n\nexport function getRef(node: SchemaNode, $ref = node?.$ref): SchemaNode | JsonError {\n    if ($ref == null) {\n        return node;\n    }\n\n    // resolve $ref by json-evaluationPath\n    if (node.context.refs[$ref]) {\n        return compileNext(node.context.refs[$ref], node);\n    }\n    // resolve $ref from $anchor\n    if (node.context.anchors[$ref]) {\n        return compileNext(node.context.anchors[$ref], node);\n    }\n    // resolve $ref from $dynamicAnchor\n    if (node.context.dynamicAnchors[$ref]) {\n        // A $ref to a $dynamicAnchor in the same schema resource behaves like a normal $ref to an $anchor\n        return compileNext(node.context.dynamicAnchors[$ref], node);\n    }\n\n    // check for remote-host + pointer pair to switch rootSchema\n    const fragments = splitRef($ref);\n    if (fragments.length === 0) {\n        return node.createError(\"ref-error\", {\n            ref: $ref,\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined\n        });\n    }\n\n    // resolve $ref as remote-host\n    if (fragments.length === 1) {\n        const $ref = fragments[0];\n        // this is a reference to remote-host root node\n        if (node.context.remotes[$ref]) {\n            return compileNext(node.context.remotes[$ref], node);\n        }\n\n        if ($ref[0] === \"#\") {\n            // support refOfUnknownKeyword\n            const rootSchema = node.context.rootNode.schema;\n            const targetSchema = get(rootSchema, $ref);\n            if (targetSchema) {\n                return node.compileSchema(targetSchema, `${node.evaluationPath}/$ref`, $ref);\n            }\n        }\n        // console.error(\"REF: UNFOUND 1\", $ref);\n        return node.createError(\"ref-error\", {\n            ref: $ref,\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined\n        });\n    }\n\n    if (fragments.length === 2) {\n        const $remoteHostRef = fragments[0];\n        // this is a reference to remote-host root node (and not a self reference)\n        if (node.context.remotes[$remoteHostRef] && node !== node.context.remotes[$remoteHostRef]) {\n            const referencedNode = node.context.remotes[$remoteHostRef];\n            // resolve full ref on remote schema - we store currently only store ref with domain\n            let nextNode = getRef(referencedNode, $ref);\n            if (nextNode) {\n                return nextNode;\n            }\n            // @note required for test spec 04\n            nextNode = getRef(referencedNode, fragments[1]);\n            if (nextNode) {\n                return nextNode;\n            }\n        }\n\n        // resolve by json-pointer (optional dynamicRef)\n        if (node.context.refs[$remoteHostRef]) {\n            const parentNode = node.context.refs[$remoteHostRef];\n            const path = split(fragments[1]);\n            // @todo add utility to resolve schema-pointer to schema\n            let currentNode = parentNode;\n            for (const item of path) {\n                const property = item === \"definitions\" ? \"$defs\" : item;\n                // @ts-expect-error random path\n                currentNode = currentNode[property];\n                if (currentNode == null) {\n                    // console.error(\"REF: FAILED RESOLVING ref json-pointer\", fragments[1]);\n                    return node.createError(\"ref-error\", {\n                        ref: $ref,\n                        pointer: node.evaluationPath,\n                        schema: node.schema,\n                        value: undefined,\n                        host: fragments[0],\n                        local: fragments[1]\n                    });\n                }\n            }\n            return currentNode;\n        }\n    }\n\n    return node.createError(\"ref-error\", {\n        ref: $ref,\n        pointer: node.evaluationPath,\n        schema: node.schema,\n        value: undefined\n    });\n}\n","import { ValidationAnnotation } from \"src/Keyword\";\nimport { SchemaNode } from \"src/SchemaNode\";\n\nexport function collectValidationErrors(errors: ValidationAnnotation[], ...compiled: SchemaNode[]) {\n    return compiled.reduce((errors, node) => {\n        if (node.schemaValidation) errors.push(...node.schemaValidation);\n        return errors;\n    }, errors);\n}\n","import { collectValidationErrors } from \"src/utils/collectValidationErrors\";\nimport { Keyword, ValidationAnnotation } from \"../Keyword\";\nimport { SchemaNode } from \"../types\";\nimport { isObject } from \"../utils/isObject\";\n\nexport const $defsKeyword: Keyword = {\n    id: \"$defs\",\n    keyword: \"$defs\",\n    parse: parseDefs\n};\n\nexport function parseDefs(node: SchemaNode) {\n    const errors: ValidationAnnotation[] = [];\n\n    if (node.schema.$defs) {\n        if (!isObject(node.schema.$defs)) {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: node.schemaLocation,\n                    schema: node.schema,\n                    value: node.schema.$defs,\n                    message: `$defs must be an object - received: ${typeof node.schema.$defs}`\n                })\n            );\n        } else {\n            node.$defs = node.$defs ?? {};\n            Object.keys(node.schema.$defs).forEach((property) => {\n                node.$defs![property] = node.compileSchema(\n                    node.schema.$defs[property],\n                    `${node.evaluationPath}/$defs/${urlEncodeJsonPointerProperty(property)}`,\n                    `${node.schemaLocation}/$defs/${property}`\n                );\n                collectValidationErrors(errors, node.$defs![property]);\n            });\n        }\n    }\n    if (node.schema.definitions) {\n        if (!isObject(node.schema.definitions)) {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: node.schemaLocation,\n                    schema: node.schema,\n                    value: node.schema.$defs,\n                    message: `definitions must be an object - received: ${typeof node.schema.definitions}`\n                })\n            );\n        }\n        node.$defs = node.$defs ?? {};\n        Object.keys(node.schema.definitions).forEach((property) => {\n            node.$defs![property] = node.compileSchema(\n                node.schema.definitions[property],\n                `${node.evaluationPath}/definitions/${urlEncodeJsonPointerProperty(property)}`,\n                `${node.schemaLocation}/definitions/${urlEncodeJsonPointerProperty(property)}`\n            );\n            collectValidationErrors(errors, node.$defs![property]);\n        });\n    }\n\n    return errors;\n}\n\nfunction urlEncodeJsonPointerProperty(property: string) {\n    property = property.replace(/~/g, \"~0\");\n    property = property.replace(/\\//g, \"~1\");\n    return encodeURIComponent(property);\n}\n","import { Keyword, JsonSchemaValidatorParams, ValidationPath } from \"../../Keyword\";\nimport { resolveRef } from \"../../keywords/$ref\";\nimport { isSchemaNode, SchemaNode } from \"../../types\";\nimport { resolveUri } from \"../../utils/resolveUri\";\nimport { validateNode } from \"../../validateNode\";\n\nexport const $refKeyword: Keyword = {\n    id: \"$ref\",\n    keyword: \"$ref\",\n    parse: parseRef,\n    addValidate: ({ schema }) => schema.$ref != null,\n    validate: validateRef\n};\n\nfunction parseRef(node: SchemaNode) {\n    // get and store current $id of node - this may be the same as parent $id\n    let currentId = node.parent?.$id;\n    if (node.schema?.$ref == null) {\n        currentId = resolveUri(node.parent?.$id, node.schema?.$id);\n    }\n    node.$id = currentId as string;\n    node.lastIdPointer = node.parent?.lastIdPointer ?? \"#\";\n\n    // @ts-expect-error add ref resolution method to node\n    node.resolveRef = resolveRef;\n\n    // store this node for retrieval by $id\n    if (node.context.refs[currentId as string] == null) {\n        node.context.refs[currentId as string] = node;\n    }\n\n    const idChanged = currentId !== node.parent?.$id;\n    if (idChanged) {\n        node.lastIdPointer = node.evaluationPath;\n    }\n\n    // store this node for retrieval by $id + json-pointer from $id\n    if (node.lastIdPointer !== \"#\" && node.evaluationPath.startsWith(node.lastIdPointer)) {\n        const localPointer = `#${node.evaluationPath.replace(node.lastIdPointer, \"\")}`;\n        node.context.refs[resolveUri(currentId, localPointer)] = node;\n    } else {\n        node.context.refs[resolveUri(currentId, node.evaluationPath)] = node;\n    }\n    node.context.refs[resolveUri(node.context.rootNode.$id, node.evaluationPath)] = node;\n\n    // precompile reference\n    if (node.schema.$ref) {\n        node.$ref = resolveUri(currentId, node.schema.$ref);\n    }\n}\n\nfunction validateRef({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    const nextNode = resolveAllRefs(node, pointer, path);\n    if (!isSchemaNode(nextNode)) {\n        return node.createError(\"ref-error\", {\n            ref: node.schema.$ref,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n    return validateNode(nextNode, data, pointer, path);\n}\n\nfunction resolveAllRefs(node: SchemaNode, pointer: string, path: ValidationPath) {\n    const nextNode = node.resolveRef({ pointer, path });\n    if (!isSchemaNode(nextNode)) {\n        return node.createError(\"ref-error\", {\n            ref: node.schema.$ref,\n            pointer,\n            schema: node.schema,\n            value: undefined\n        });\n    }\n    if (nextNode !== node && nextNode) {\n        return resolveAllRefs(nextNode, pointer, path);\n    }\n    return node;\n}\n","import { Keyword, ValidationPath } from \"../../Keyword\";\nimport { resolveUri } from \"../../utils/resolveUri\";\nimport { isObject } from \"../../utils/isObject\";\nimport { omit } from \"../../utils/omit\";\nimport splitRef from \"../../utils/splitRef\";\nimport { $refKeyword as draft06Keyword } from \"../../draft06/keywords/$ref\";\nimport { isSchemaNode, JsonError, SchemaNode } from \"../../types\";\n\nexport const $refKeyword: Keyword = {\n    id: \"$ref\",\n    keyword: \"$ref\",\n    parse: parseRef,\n    addValidate: ({ schema }) => schema.$ref != null,\n    validate: draft06Keyword.validate!\n};\n\nfunction register(node: SchemaNode, path: string) {\n    if (node.context.refs[path] == null) {\n        node.context.refs[path] = node;\n    }\n}\n\nfunction parseRef(node: SchemaNode) {\n    // get and store current id of node - this may be the same as parent id\n    let currentId = node.parent?.$id;\n    if (node.schema?.$ref == null && node.schema?.id) {\n        currentId = resolveUri(node.parent?.$id, node.schema.id);\n        // console.log(\"create id\", node.evaluationPath, \":\", node.parent?.$id, node.schema?.id, \"=>\", currentId);\n    }\n    node.$id = currentId as string;\n    node.lastIdPointer = node.parent?.lastIdPointer ?? \"#\";\n\n    // @ts-expect-error add ref resolution method to node\n    node.resolveRef = resolveRef;\n\n    // store this node for retrieval by id\n    if (node.context.refs[currentId as string] == null) {\n        node.context.refs[currentId as string] = node;\n    }\n\n    const idChanged = currentId !== node.parent?.$id;\n    if (idChanged) {\n        node.lastIdPointer = node.evaluationPath;\n    }\n\n    // store this node for retrieval by id + json-pointer from id\n    if (node.lastIdPointer !== \"#\" && node.evaluationPath.startsWith(node.lastIdPointer)) {\n        const localPointer = `#${node.evaluationPath.replace(node.lastIdPointer, \"\")}`;\n        register(node, resolveUri(currentId, localPointer));\n    } else {\n        register(node, resolveUri(currentId, node.evaluationPath));\n    }\n    register(node, resolveUri(node.context.rootNode.$id, node.evaluationPath));\n\n    // precompile reference\n    if (node.schema.$ref) {\n        node.$ref = resolveUri(currentId, node.schema.$ref);\n    }\n}\n\nfunction resolveRef(this: SchemaNode, { pointer, path }: { pointer?: string; path?: ValidationPath } = {}) {\n    if (this.$ref == null) {\n        return this;\n    }\n    const resolvedNode = getRef(this);\n    if (isSchemaNode(resolvedNode)) {\n        path?.push({ pointer: pointer!, node: resolvedNode });\n    }\n    return resolvedNode;\n}\n\nfunction compileNext(referencedNode: SchemaNode, evaluationPath = referencedNode.evaluationPath) {\n    const referencedSchema = isObject(referencedNode.schema)\n        ? omit(referencedNode.schema, \"id\")\n        : referencedNode.schema;\n    return referencedNode.compileSchema(referencedSchema, `${evaluationPath}/$ref`, referencedSchema.schemaLocation);\n}\n\nfunction getRef(node: SchemaNode, $ref = node?.$ref): SchemaNode | JsonError | undefined {\n    if ($ref == null) {\n        return node;\n    }\n\n    // resolve $ref by json-evaluationPath\n    if (node.context.refs[$ref]) {\n        // console.log(`ref resolve ${$ref} from refs`, node.context.refs[$ref].ref);\n        return compileNext(node.context.refs[$ref], node.evaluationPath);\n    }\n\n    if (node.context.anchors[$ref]) {\n        // console.log(`ref resolve ${$ref} from anchors`, node.context.anchors[$ref].ref);\n        return compileNext(node.context.anchors[$ref], node.evaluationPath);\n    }\n\n    // check for remote-host + pointer pair to switch rootSchema\n    const fragments = splitRef($ref);\n    if (fragments.length === 0) {\n        return node.createError(\"ref-error\", {\n            ref: $ref,\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined\n        });\n    }\n\n    // resolve $ref as remote-host\n    if (fragments.length === 1) {\n        const $ref = fragments[0];\n        // this is a reference to remote-host root node\n        if (node.context.remotes[$ref]) {\n            return compileNext(node.context.remotes[$ref], node.evaluationPath);\n        }\n        return node.createError(\"ref-error\", {\n            ref: $ref,\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined\n        });\n    }\n\n    if (fragments.length === 2) {\n        const $remoteHostRef = fragments[0];\n        // this is a reference to remote-host root node (and not a self reference)\n        if (node.context.remotes[$remoteHostRef] && node !== node.context.remotes[$remoteHostRef]) {\n            const referencedNode = node.context.remotes[$remoteHostRef];\n            // resolve full ref on remote schema - we store currently only store ref with domain\n            let nextNode = getRef(referencedNode, $ref);\n            if (nextNode) {\n                return nextNode;\n            }\n            // @note required for test spec 04\n            nextNode = getRef(referencedNode, fragments[1]);\n            if (nextNode) {\n                return nextNode;\n            }\n        }\n\n        // @todo this is a poc\n        const $localRef = fragments[0];\n        if (node.context.refs[$localRef]) {\n            const nextNode = node.context.refs[$localRef];\n            const property = fragments[1].split(\"$defs/\").pop();\n            if (property && nextNode?.$defs) {\n                return getRef(nextNode.$defs[property]);\n            }\n        }\n\n        // @todo returning error here breaks specs\n        return undefined;\n    }\n\n    return node.createError(\"ref-error\", {\n        ref: $ref,\n        pointer: node.evaluationPath,\n        schema: node.schema,\n        value: undefined\n    });\n}\n","import { isObject } from \"../../utils/isObject\";\nimport { Keyword, JsonSchemaResolverParams, JsonSchemaValidatorParams, ValidationReturnType } from \"../../Keyword\";\nimport { SchemaNode } from \"../../types\";\nimport { getValue } from \"../../utils/getValue\";\nimport { validateNode } from \"../../validateNode\";\n\nconst KEYWORD = \"additionalItems\";\n\nexport const additionalItemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    order: -10,\n    parse: parseAdditionalItems,\n    addResolve: (node: SchemaNode) => node.items != null,\n    resolve: additionalItemsResolver,\n    addValidate: ({ schema }) => schema[KEYWORD] != null && schema[KEYWORD] !== true && Array.isArray(schema.items),\n    validate: validateAdditionalItems\n};\n\n// must come as last resolver\nexport function parseAdditionalItems(node: SchemaNode) {\n    const { schema, evaluationPath, schemaLocation } = node;\n    if (schema.additionalItems == null || schema.additionalItems === false) {\n        return;\n    }\n\n    const additionalItems = schema[KEYWORD];\n\n    if (!(isObject(additionalItems) || additionalItems === true)) {\n        return node.createError(\"schema-error\", {\n            pointer: evaluationPath,\n            schema,\n            value: undefined,\n            message: `Keyword '${KEYWORD}' must be an object or a boolean - received '${typeof additionalItems}'`\n        });\n    }\n\n    if (!Array.isArray(schema.items)) {\n        return node.createAnnotation(\"schema-error\", {\n            pointer: evaluationPath,\n            schema,\n            value: undefined,\n            message: `Keyword '${KEYWORD}' is only evaluated with a given items-array`\n        });\n    }\n\n    node.items = node.compileSchema(\n        schema.additionalItems,\n        `${evaluationPath}/additionalItems`,\n        `${schemaLocation}/additionalItems`\n    );\n}\n\nfunction additionalItemsResolver({ node, key, data }: JsonSchemaResolverParams) {\n    if (Array.isArray(data)) {\n        // @attention: items, etc should already have been tried\n        const value = getValue(data, key);\n        // items is ensures by addResolve\n        const { node: childNode, error } = node.items!.reduceNode(value);\n        return childNode ?? error;\n    }\n}\n\nfunction validateAdditionalItems({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    if (!Array.isArray(data) || data.length === 0) {\n        // - no items to validate\n        return;\n    }\n    if (Array.isArray(schema.items) && schema.items.length >= data.length) {\n        // - no additional items\n        return;\n    }\n    const startIndex = Array.isArray(schema.items) ? schema.items.length : 0;\n    const errors: ValidationReturnType = [];\n    for (let i = startIndex; i < data.length; i += 1) {\n        const item = data[i];\n        if (node.items) {\n            const validationResult = validateNode(node.items, item, `${pointer}/${i}`, path);\n            if (validationResult) {\n                errors.push(...validationResult);\n            }\n        } else if (schema.additionalItems === false) {\n            errors.push(\n                node.createError(\"additional-items-error\", {\n                    key: i,\n                    pointer: `${pointer}/${i}`,\n                    value: data,\n                    schema\n                })\n            );\n        }\n    }\n    return errors;\n}\n","import settings from \"../settings\";\nimport { isObject } from \"../utils/isObject\";\nimport { Keyword, JsonSchemaResolverParams, JsonSchemaValidatorParams, ValidationReturnType } from \"../Keyword\";\nimport { isBooleanSchema, SchemaNode } from \"../types\";\nimport { getValue } from \"../utils/getValue\";\nimport { validateNode } from \"../validateNode\";\n\nexport const additionalPropertiesKeyword: Keyword = {\n    id: \"additionalProperties\",\n    keyword: \"additionalProperties\",\n    order: -10,\n    parse: parseAdditionalProperties,\n    addResolve: ({ schema }) => schema.additionalProperties != null,\n    resolve: additionalPropertyResolver,\n    addValidate: ({ schema }) =>\n        schema.additionalProperties !== true &&\n        schema.additionalProperties != null &&\n        // this is an arrangement with patternProperties. patternProperties validate before additionalProperties:\n        // https://spacetelescope.github.io/understanding-json-schema/reference/object.html#index-5\n        !(schema.additionalProperties === false && isObject(schema.patternProperties)),\n    validate: validateAdditionalProperty\n};\n\n// must come as last resolver\nexport function parseAdditionalProperties(node: SchemaNode) {\n    const { schema, evaluationPath, schemaLocation } = node;\n    if (schema.additionalProperties == null || isBooleanSchema(schema.additionalProperties)) {\n        return;\n    }\n\n    if (!isObject(schema.additionalProperties)) {\n        return node.createError(\"schema-error\", {\n            pointer: node.schemaLocation,\n            schema,\n            value: schema.additionalProperties,\n            message: `keyword 'additionalProperties' must be a valid JSON Schema - receoved: ${typeof schema.additionalProperties}`\n        });\n    }\n\n    node.additionalProperties = node.compileSchema(\n        schema.additionalProperties,\n        `${evaluationPath}/additionalProperties`,\n        `${schemaLocation}/additionalProperties`\n    );\n    return node.additionalProperties.schemaValidation;\n}\n\nfunction additionalPropertyResolver({ node, data, key }: JsonSchemaResolverParams) {\n    const value = getValue(data, key);\n    if (node.additionalProperties) {\n        const { node: reduced, error } = node.additionalProperties.reduceNode(value);\n        return reduced ?? error;\n    }\n    if (node.schema.additionalProperties === false) {\n        return node.createError(\"no-additional-properties-error\", {\n            pointer: `${key}`,\n            schema: node.schema,\n            value: getValue(data, key),\n            property: `${key}`\n            // @todo add pointer to resolver\n            // properties: expectedProperties\n        });\n    }\n}\n\n/**\n * @additionalProperties only checks properties and additionalProperties\n *\n * The additionalProperties keyword is used to control the handling of extra stuff, that is,\n * properties whose names are not listed in the properties keyword or match any of the regular\n * expressions in the patternProperties keyword. By default any additional properties are allowed.\n * https://json-schema.org/understanding-json-schema/reference/object\n */\nfunction validateAdditionalProperty({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    if (!isObject(data)) {\n        return;\n    }\n\n    const { schema } = node;\n    const errors: ValidationReturnType = [];\n    let receivedProperties = Object.keys(data).filter((prop) => settings.propertyBlacklist.includes(prop) === false);\n    const patternProperties = node.patternProperties;\n    if (Array.isArray(patternProperties)) {\n        // filter received properties by matching patternProperties\n        receivedProperties = receivedProperties.filter((prop) => {\n            for (const property of patternProperties) {\n                if (property.pattern.test(prop)) {\n                    return false; // remove\n                }\n            }\n            return true;\n        });\n    }\n\n    // adds an error for each an unexpected property\n    const expectedProperties = node.properties ? Object.keys(node.properties) : [];\n    receivedProperties\n        .filter((property) => expectedProperties.indexOf(property) === -1)\n        .forEach((property) => {\n            const propertyValue = getValue(data, property);\n            if (propertyValue === undefined) {\n                return; // do not validate undefined properties\n            }\n\n            if (isObject(node.additionalProperties)) {\n                const validationErrors = validateNode(\n                    node.additionalProperties,\n                    propertyValue,\n                    `${pointer}/${property}`,\n                    path\n                );\n                if (validationErrors) {\n                    // @note: we pass through specific errors here\n                    errors.push(...validationErrors);\n                }\n            } else {\n                errors.push(\n                    node.createError(\"no-additional-properties-error\", {\n                        pointer: `${pointer}/${property}`,\n                        schema,\n                        value: data,\n                        property,\n                        properties: expectedProperties\n                    })\n                );\n            }\n        });\n\n    return errors;\n}\n","import { mergeSchema } from \"../utils/mergeSchema\";\nimport {\n    Keyword,\n    JsonSchemaReducerParams,\n    JsonSchemaValidatorParams,\n    ValidationReturnType,\n    ValidationAnnotation\n} from \"../Keyword\";\nimport { SchemaNode } from \"../types\";\nimport { validateNode } from \"../validateNode\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nconst KEYWORD = \"allOf\";\n\nexport const allOfKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseAllOf,\n    addReduce: (node: SchemaNode) => node[KEYWORD] != null,\n    reduce: reduceAllOf,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateAllOf\n};\n\nexport function parseAllOf(node: SchemaNode) {\n    const { schema, evaluationPath, schemaLocation } = node;\n    if (schema[KEYWORD] == null) {\n        return;\n    }\n    if (!Array.isArray(schema[KEYWORD])) {\n        return node.createError(\"schema-error\", {\n            pointer: schemaLocation,\n            schema,\n            value: schema[KEYWORD],\n            message: `Keyword '${KEYWORD}' must be an array - received '${typeof schema[KEYWORD]}'`\n        });\n    }\n    if (schema[KEYWORD].length === 0) {\n        return;\n    }\n\n    node[KEYWORD] = schema[KEYWORD].map((s, index) =>\n        node.compileSchema(s, `${evaluationPath}/${KEYWORD}/${index}`, `${schemaLocation}/${KEYWORD}/${index}`)\n    );\n    return collectValidationErrors([], ...node[KEYWORD]);\n}\n\nfunction reduceAllOf({ node, data, key, pointer, path }: JsonSchemaReducerParams) {\n    if (node[KEYWORD] == null) {\n        return;\n    }\n\n    // note: parts of schemas could be merged, e.g. if they do not include\n    // dynamic schema parts\n    let mergedSchema = {};\n    let dynamicId = \"\";\n    for (let i = 0; i < node[KEYWORD].length; i += 1) {\n        const { node: schemaNode } = node[KEYWORD][i].reduceNode(data, { key, pointer, path });\n        if (schemaNode) {\n            const nestedDynamicId = schemaNode.dynamicId?.replace(node.dynamicId, \"\") ?? \"\";\n            const localDynamicId = nestedDynamicId === \"\" ? `${KEYWORD}/${i}` : nestedDynamicId;\n            dynamicId += `${dynamicId === \"\" ? \"\" : \",\"}${localDynamicId}`;\n\n            const schema = mergeSchema(node[KEYWORD][i].schema, schemaNode.schema);\n            mergedSchema = mergeSchema(mergedSchema, schema, KEYWORD, \"contains\");\n        }\n    }\n\n    return node.compileSchema(\n        mergedSchema,\n        `${node.evaluationPath}/${dynamicId}`,\n        node.schemaLocation,\n        `${node.schemaLocation}(${dynamicId})`\n    );\n}\n\nfunction validateAllOf({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    if (!Array.isArray(node[KEYWORD]) || node[KEYWORD].length === 0) {\n        return;\n    }\n    const errors: ValidationReturnType = [];\n    node[KEYWORD].forEach((allOfNode) => {\n        errors.push(...validateNode(allOfNode, data, pointer, path));\n    });\n    return errors;\n}\n","import { mergeSchema } from \"../utils/mergeSchema\";\nimport { Keyword, JsonSchemaReducerParams, JsonSchemaValidatorParams, ValidationAnnotation } from \"../Keyword\";\nimport { SchemaNode } from \"../types\";\nimport { validateNode } from \"../validateNode\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nconst KEYWORD = \"anyOf\";\n\nexport const anyOfKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseAnyOf,\n    addReduce: (node) => node[KEYWORD] != null,\n    reduce: reduceAnyOf,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateAnyOf\n};\n\nexport function parseAnyOf(node: SchemaNode) {\n    const { schema, evaluationPath, schemaLocation } = node;\n    if (schema[KEYWORD] == null) {\n        return;\n    }\n    if (!Array.isArray(schema[KEYWORD])) {\n        return node.createError(\"schema-error\", {\n            pointer: schemaLocation,\n            schema,\n            value: schema[KEYWORD],\n            message: `Keyword '${KEYWORD}' must be an array - received '${typeof schema[KEYWORD]}'`\n        });\n    }\n    if (schema[KEYWORD].length === 0) {\n        return;\n    }\n    node[KEYWORD] = schema[KEYWORD].map((s, index) =>\n        node.compileSchema(s, `${evaluationPath}/${KEYWORD}/${index}`, `${schemaLocation}/${KEYWORD}/${index}`)\n    );\n\n    return collectValidationErrors([], ...node[KEYWORD]);\n}\n\nfunction reduceAnyOf({ node, data, pointer, path }: JsonSchemaReducerParams) {\n    if (node[KEYWORD] == null) {\n        return;\n    }\n\n    let mergedSchema = {};\n    let dynamicId = \"\";\n    for (let i = 0; i < node[KEYWORD].length; i += 1) {\n        if (validateNode(node[KEYWORD][i], data, pointer, path).length === 0) {\n            const { node: schemaNode } = node[KEYWORD][i].reduceNode(data);\n\n            if (schemaNode) {\n                const nestedDynamicId = schemaNode.dynamicId?.replace(node.dynamicId, \"\") ?? \"\";\n                const localDynamicId = nestedDynamicId === \"\" ? `${KEYWORD}/${i}` : nestedDynamicId;\n                dynamicId += `${dynamicId === \"\" ? \"\" : \",\"}${localDynamicId}`;\n\n                const schema = mergeSchema(node[KEYWORD][i].schema, schemaNode.schema);\n                mergedSchema = mergeSchema(mergedSchema, schema, KEYWORD);\n            }\n        }\n    }\n    return node.compileSchema(\n        mergedSchema,\n        `${node.evaluationPath}${dynamicId}`,\n        node.schemaLocation,\n        `${node.schemaLocation}(${dynamicId})`\n    );\n}\n\nfunction validateAnyOf({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    if (node[KEYWORD] == null) {\n        return;\n    }\n    for (const anyOf of node[KEYWORD]) {\n        if (validateNode(anyOf, data, pointer, path).length === 0) {\n            return undefined;\n        }\n    }\n    return node.createError(\"any-of-error\", { pointer, schema: node.schema, value: data, anyOf: node.schema[KEYWORD] });\n}\n","import { isObject } from \"../utils/isObject\";\nimport { isBooleanSchema, isJsonSchema, SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { validateNode } from \"../validateNode\";\n\nconst KEYWORD = \"contains\";\n\nexport const containsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseContains,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateContains,\n    addReduce: (node) => node[KEYWORD] != null,\n    reduce: ({ node }) => {\n        return node.compileSchema(\n            {\n                items: {\n                    anyOf: [node[KEYWORD]!.schema] // we tested for contains in addReduce\n                }\n            },\n            node.evaluationPath,\n            node.schemaLocation\n        );\n    }\n};\n\nexport function parseContains(node: SchemaNode) {\n    const contains = node.schema[KEYWORD];\n    if (contains == null) {\n        return;\n    }\n    if (!(isJsonSchema(contains) || isBooleanSchema(contains))) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: contains,\n            message: `Keyword '${KEYWORD}' must be a valid JSON Schema - received '${typeof contains}'`\n        });\n    }\n\n    node[KEYWORD] = node.compileSchema(contains, `${node.evaluationPath}/${KEYWORD}`);\n    return node[KEYWORD].schemaValidation;\n}\n\nfunction validateContains({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    if (!Array.isArray(data)) {\n        return;\n    }\n    if (schema.contains === false) {\n        return node.createError(\"contains-array-error\", { pointer, value: data, schema });\n    }\n\n    if (schema.contains === true) {\n        if (Array.isArray(data) && data.length === 0) {\n            return node.createError(\"contains-any-error\", { pointer, value: data, schema });\n        }\n        return undefined;\n    }\n\n    if (!isObject(schema.contains) || !Array.isArray(data)) {\n        // - ignore invalid schema\n        // - ignore invalid dara\n        return undefined;\n    }\n\n    let count = 0;\n    for (const d of data) {\n        // we tested for contains in addValidate\n        if (validateNode(node.contains!, d, pointer, path).length === 0) {\n            count++;\n        }\n    }\n\n    // @draft >= 2019-09\n    const max = schema.maxContains ?? Infinity;\n    const min = schema.minContains ?? 1;\n    if (max >= count && min <= count) {\n        return undefined;\n    }\n    if (max < count) {\n        return node.createError(\"contains-max-error\", { pointer, schema, delta: count - max, value: data });\n    }\n    if (min > count) {\n        return node.createError(\"contains-min-error\", { pointer, schema, delta: min - count, value: data });\n    }\n    return node.createError(\"contains-error\", { pointer, schema, value: data });\n}\n","export function isListOfStrings(v: unknown): v is string[] {\n    return Array.isArray(v) && v.find((item) => typeof item !== \"string\") == null;\n}\n","import { Keyword, JsonSchemaValidatorParams, ValidationReturnType, ValidationAnnotation } from \"../Keyword\";\nimport { JsonError, SchemaNode } from \"../types\";\nimport { isListOfStrings } from \"../utils/isListOfStrings\";\nimport { isObject } from \"../utils/isObject\";\n\nconst KEYWORD = \"dependentRequired\";\n\nexport const dependentRequiredKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseDependentRequired,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateDependentRequired\n};\n\nexport function parseDependentRequired(node: SchemaNode) {\n    const { schema } = node;\n    if (schema[KEYWORD] == null) {\n        return;\n    }\n    if (!isObject(schema[KEYWORD])) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema,\n            value: schema[KEYWORD],\n            message: `Keyword '${KEYWORD}' must be an object - received '${typeof schema[KEYWORD]}'`\n        });\n    }\n\n    const errors: ValidationAnnotation[] = [];\n    node.dependentRequired = {};\n    for (const propertyName of Object.keys(schema[KEYWORD])) {\n        const list = schema[KEYWORD][propertyName];\n        if (isListOfStrings(list)) {\n            node.dependentRequired[propertyName] = list;\n        } else {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: `${node.schemaLocation}/${KEYWORD}/${propertyName}`,\n                    schema,\n                    value: list,\n                    message: `Keyword '${KEYWORD}[string]' must be a string[] - received '${typeof list}'`\n                })\n            );\n        }\n    }\n\n    return errors;\n}\n\nexport function validateDependentRequired({\n    node,\n    data,\n    pointer = \"#\"\n}: JsonSchemaValidatorParams): ValidationReturnType {\n    const { dependentRequired } = node;\n    if (dependentRequired == null || !isObject(data)) {\n        return undefined;\n    }\n    const errors: JsonError[] = [];\n    Object.keys(data).forEach((property) => {\n        const dependencies = dependentRequired[property];\n        if (!Array.isArray(dependencies)) {\n            return;\n        }\n        for (let i = 0, l = dependencies.length; i < l; i += 1) {\n            if (data[dependencies[i]] === undefined) {\n                errors.push(\n                    node.createError(\"missing-dependency-error\", {\n                        missingProperty: dependencies[i],\n                        pointer,\n                        schema: node.schema,\n                        value: data\n                    })\n                );\n            }\n        }\n    });\n    return errors;\n}\n","import { mergeSchema } from \"../utils/mergeSchema\";\nimport { isObject } from \"../utils/isObject\";\nimport { isSchemaNode, SchemaNode, JsonSchema, isBooleanSchema } from \"../types\";\nimport { Keyword, JsonSchemaReducerParams, JsonSchemaValidatorParams, ValidationAnnotation } from \"../Keyword\";\nimport { validateNode } from \"../validateNode\";\nimport sanitizeErrors from \"../utils/sanitizeErrors\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nconst KEYWORD = \"dependentSchemas\";\n\nexport const dependentSchemasKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseDependentSchemas,\n    addReduce: (node) => node.dependentSchemas != null,\n    reduce: reduceDependentSchemas,\n    addValidate: (node) => node.dependentSchemas != null,\n    validate: validateDependentSchemas\n};\n\nexport function parseDependentSchemas(node: SchemaNode) {\n    const { dependentSchemas } = node.schema;\n    if (dependentSchemas == null) {\n        return;\n    }\n    if (!isObject(dependentSchemas)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: dependentSchemas,\n            message: `Keyword '${KEYWORD}' must be an object - received '${typeof dependentSchemas}'`\n        });\n    }\n\n    const dependentProperties = Object.keys(dependentSchemas);\n    if (dependentProperties.length === 0) {\n        return;\n    }\n\n    const errors: ValidationAnnotation[] = [];\n    const parsedSchemas: Record<string, boolean | SchemaNode> = {};\n    for (const property of Object.keys(dependentSchemas)) {\n        const schema = dependentSchemas[property];\n        if (isObject(schema)) {\n            parsedSchemas[property] = node.compileSchema(\n                schema,\n                `${node.evaluationPath}/${KEYWORD}/${property}`,\n                `${node.schemaLocation}/${KEYWORD}/${property}`\n            );\n            collectValidationErrors(errors, parsedSchemas[property]);\n        } else if (isBooleanSchema(schema)) {\n            parsedSchemas[property] = schema;\n        } else {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: `${node.schemaLocation}/${KEYWORD}/${property}`,\n                    schema: node.schema,\n                    value: schema,\n                    message: `Keyword '${KEYWORD}[string]' must be a valid JSON Schema'`\n                })\n            );\n        }\n    }\n    node.dependentSchemas = parsedSchemas;\n    return errors;\n}\n\nexport function reduceDependentSchemas({ node, data }: JsonSchemaReducerParams) {\n    const { dependentSchemas } = node;\n    if (!isObject(data) || dependentSchemas == null) {\n        // @todo remove dependentSchemas\n        return node;\n    }\n\n    let mergedSchema: JsonSchema | undefined;\n    let added = 0;\n    let dynamicId = `${node.schemaLocation}(`;\n    Object.keys(data).forEach((propertyName) => {\n        if (dependentSchemas[propertyName] == null) {\n            return;\n        }\n        mergedSchema = mergedSchema ?? { properties: {} };\n        if (isSchemaNode(dependentSchemas[propertyName])) {\n            mergedSchema = mergeSchema(mergedSchema, dependentSchemas[propertyName].schema);\n        } else {\n            mergedSchema.properties[propertyName] = dependentSchemas[propertyName];\n        }\n        dynamicId += `${added ? \",\" : \"\"}${KEYWORD}/${propertyName}`;\n        added++;\n    });\n\n    if (mergedSchema == null) {\n        return node;\n    }\n\n    mergedSchema = mergeSchema(node.schema, mergedSchema, KEYWORD);\n    return node.compileSchema(mergedSchema, node.evaluationPath, node.schemaLocation, `${dynamicId})`);\n}\n\nexport function validateDependentSchemas({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    const { schema, dependentSchemas } = node;\n    if (!isObject(data) || dependentSchemas == null) {\n        return undefined;\n    }\n    const errors: ValidationAnnotation[] = [];\n    Object.keys(data).forEach((property) => {\n        const dependencies = dependentSchemas[property];\n        // @draft >= 6 boolean schema\n        if (dependencies === true) {\n            return;\n        }\n        if (dependencies === false) {\n            errors.push(node.createError(\"missing-dependency-error\", { pointer, schema, value: data }));\n            return;\n        }\n        if (isSchemaNode(dependencies)) {\n            sanitizeErrors(validateNode(dependencies, data, pointer, path), errors);\n            return;\n        }\n    });\n    return errors;\n}\n","import { isBooleanSchema, isJsonSchema, isSchemaNode, SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaReducerParams, JsonSchemaValidatorParams, ValidationAnnotation } from \"../Keyword\";\nimport { isObject } from \"../utils/isObject\";\nimport { mergeNode } from \"../mergeNode\";\nimport { hasProperty } from \"../utils/hasProperty\";\nimport { validateDependentRequired } from \"./dependentRequired\";\nimport { validateDependentSchemas } from \"./dependentSchemas\";\nimport sanitizeErrors from \"../utils/sanitizeErrors\";\nimport { isListOfStrings } from \"../utils/isListOfStrings\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nconst KEYWORD = \"dependencies\";\n\nexport const dependenciesKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseDependencies,\n    order: -9,\n    addReduce: (node) => node.schema[KEYWORD] != null, // because we remap this has to be tested on schema\n    reduce: reduceDependencies,\n    addValidate: (node) => node.schema[KEYWORD] != null, // because we remap this has to be tested on schema\n    validate: validateDependencies\n};\n\nexport function parseDependencies(node: SchemaNode) {\n    const { dependencies } = node.schema;\n    if (!isObject(dependencies)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: dependencies,\n            message: `Keyword '${KEYWORD}' must be an object - received ${typeof dependencies}`\n        });\n    }\n\n    const errors: ValidationAnnotation[] = [];\n    for (const property of Object.keys(dependencies)) {\n        const schema = dependencies[property] as string[];\n        if (isJsonSchema(schema) || isBooleanSchema(schema)) {\n            node.dependentSchemas = node.dependentSchemas ?? {};\n            node.dependentSchemas[property] = node.compileSchema(\n                schema,\n                `${node.evaluationPath}/${KEYWORD}/${property}`,\n                `${node.schemaLocation}/${KEYWORD}/${property}`\n            );\n            collectValidationErrors(errors, node.dependentSchemas[property]);\n        } else if (isListOfStrings(schema)) {\n            node.dependentRequired = node.dependentRequired ?? {};\n            node.dependentRequired[property] = schema;\n        } else {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: `${node.schemaLocation}/${KEYWORD}`,\n                    schema: node.schema,\n                    value: dependencies,\n                    message: `Keyword '${KEYWORD}[string]' must be JSON Schema or string[]`\n                })\n            );\n        }\n    }\n\n    return errors;\n}\n\nexport function reduceDependencies({ node, data, key, pointer, path }: JsonSchemaReducerParams) {\n    if (!isObject(data)) {\n        // @todo remove dependentSchemas\n        return node;\n    }\n\n    if (node.dependentRequired == null && node.dependentSchemas == null) {\n        return node;\n    }\n\n    let workingNode = node.compileSchema(node.schema, node.evaluationPath, node.schemaLocation);\n    let required = workingNode.schema.required ?? [];\n\n    let dynamicId = \"\";\n    const dependentRequired = node.dependentRequired;\n    if (dependentRequired) {\n        Object.keys(dependentRequired).forEach((propertyName) => {\n            if (!hasProperty(data, propertyName) && !required.includes(propertyName)) {\n                return;\n            }\n            if (dependentRequired[propertyName] == null) {\n                return;\n            }\n            required.push(...dependentRequired[propertyName]);\n\n            // @dynamicId\n            const localDynamicId = `${KEYWORD}/${propertyName}`;\n            dynamicId += `${dynamicId === \"\" ? \"\" : \",\"}${localDynamicId}`;\n        });\n    }\n\n    const dependentSchemas = node.dependentSchemas;\n    if (dependentSchemas) {\n        Object.keys(dependentSchemas).forEach((propertyName) => {\n            if (!hasProperty(data, propertyName) && !required.includes(propertyName)) {\n                return true;\n            }\n            const dependency = dependentSchemas[propertyName];\n            if (!isSchemaNode(dependency)) {\n                return true;\n            }\n\n            if (Array.isArray(dependency.schema.required)) {\n                required.push(...dependency.schema.required);\n            }\n\n            // @note pass on updated required-list to resolve nested dependencies. This is currently supported,\n            // but probably not how json-schema spec defines this behaviour (resolve only within sub-schema)\n            const reducedDependency = { ...dependency, schema: { ...dependency.schema, required } }.reduceNode(data, {\n                key,\n                pointer: `${pointer}/${KEYWORD}/${propertyName}`,\n                path\n            }).node as SchemaNode;\n\n            workingNode = mergeNode(workingNode, reducedDependency) as SchemaNode;\n\n            // @dynamicId\n            const nestedDynamicId = reducedDependency.dynamicId?.replace(node.dynamicId, \"\") ?? \"\";\n            const localDynamicId = nestedDynamicId === \"\" ? `${KEYWORD}/${propertyName}` : nestedDynamicId;\n            dynamicId += `${dynamicId === \"\" ? \"\" : \",\"}${localDynamicId}`;\n        });\n    }\n\n    if (workingNode === node) {\n        return node;\n    }\n\n    if (required.length === 0) {\n        return workingNode;\n    }\n\n    required = workingNode.schema.required ? workingNode.schema.required.concat(...required) : required;\n    required = required.filter((r: string, index: number, list: string[]) => list.indexOf(r) === index);\n    workingNode = mergeNode(workingNode, workingNode, KEYWORD) as SchemaNode;\n    return workingNode.compileSchema(\n        { ...workingNode.schema, required },\n        workingNode.evaluationPath,\n        workingNode.schemaLocation,\n        `${node.schemaLocation}(${dynamicId})`\n    );\n}\n\nfunction validateDependencies({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    if (!isObject(data)) {\n        return undefined;\n    }\n    const errors: ValidationAnnotation[] = [];\n    if (node.dependentRequired) {\n        sanitizeErrors(validateDependentRequired({ node, data, pointer, path }), errors);\n    }\n    if (node.dependentSchemas) {\n        const schemaErrors = validateDependentSchemas({ node, data, pointer, path });\n        sanitizeErrors(schemaErrors, errors);\n    }\n    return errors;\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\n\nconst KEYWORD = \"deprecated\";\n\nexport const deprecatedKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseDeprecated,\n    addValidate: (node) => node[KEYWORD] === true,\n    validate: validateDeprecated\n};\n\nfunction parseDeprecated(node: SchemaNode) {\n    const deprecated = node.schema[KEYWORD];\n    if (deprecated == null) {\n        return;\n    }\n    if (typeof deprecated !== \"boolean\") {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: deprecated,\n            message: `Keyword '${KEYWORD}' must be a boolean - received '${typeof deprecated}'`\n        });\n    }\n    node[KEYWORD] = deprecated;\n}\n\nfunction validateDeprecated({ node, data, pointer }: JsonSchemaValidatorParams) {\n    return [\n        node.createAnnotation(\n            \"deprecated-warning\",\n            {\n                pointer,\n                schema: node.schema,\n                value: data\n            },\n            node.schema.deprecatedMessage\n        )\n    ];\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { getTypeOf } from \"../utils/getTypeOf\";\n\nconst KEYWORD = \"enum\";\n\nexport const enumKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseEnum,\n    addValidate: (node) => node.enum != null,\n    validate: validateEnum\n};\n\nexport function parseEnum(node: SchemaNode) {\n    const { schema } = node;\n    if (schema[KEYWORD] == null) {\n        return;\n    }\n    if (!Array.isArray(schema[KEYWORD])) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema,\n            value: schema[KEYWORD],\n            message: `Keyword '${KEYWORD}' must be an array - received '${typeof schema[KEYWORD]}'`\n        });\n    }\n    node.enum = schema[KEYWORD];\n}\n\nfunction validateEnum({ node, data, pointer = \"#\" }: JsonSchemaValidatorParams) {\n    if (node.enum == null) {\n        return;\n    }\n    const type = getTypeOf(data);\n    if (type === \"object\" || type === \"array\") {\n        const valueStr = JSON.stringify(data);\n        for (const e of node.enum) {\n            if (JSON.stringify(e) === valueStr) {\n                return undefined;\n            }\n        }\n    } else if (node.enum.includes(data)) {\n        return undefined;\n    }\n    return node.createError(\"enum-error\", {\n        pointer,\n        schema: node.schema,\n        value: data,\n        values: node.enum\n    });\n}\n","export const errors = {\n    \"additional-items-error\": \"Array at `{{pointer}}` may not have an additional item `{{key}}`\",\n    \"additional-properties-error\":\n        \"Additional property `{{property}}` on `{{pointer}}` does not match schema `{{schema}}`\",\n    \"all-of-error\": \"Value `{{value}}` at `{{pointer}}` does not match schema of `{{allOf}}`\",\n    \"any-of-error\": \"Value `{{value}}` at `{{pointer}}` does not match any schema of `{{anyOf}}`\",\n    \"const-error\": \"Expected value at `{{pointer}}` to be `{{expected}}`, but value given is `{{value}}`\",\n    \"contains-any-error\": \"The array at `{{pointer}}` must contain at least one item\",\n    \"contains-array-error\": \"The property at `{{pointer}}` must not be an array\",\n    \"contains-error\": \"The array at `{{pointer}}` must contain an element that matches `{{schema}}`\",\n    \"contains-min-error\": \"The array at `{{pointer}}` contains {{delta}} too few items matching `{{schema}}`\",\n    \"contains-max-error\": \"The array at `{{pointer}}` contains {{delta}} too many items matching `{{schema}}`\",\n    \"enum-error\": \"Expected given value `{{value}}` in `{{pointer}}` to be one of `{{values}}`\",\n    \"exclusive-maximum-error\": \"Value in `{{pointer}}` is `{{length}}`, but should be at most `{{maximum}}`\",\n    \"exclusive-minimum-error\": \"Value in `{{pointer}}` is `{{length}}`, but should be at minimum `{{minimum}}`\",\n    \"forbidden-property-error\": \"Property name `{{property}}` at `{{pointer}}` is not allowed\",\n    \"format-date-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid date\",\n    \"format-date-time-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid date-time\",\n    \"format-duration-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid duration\",\n    \"format-email-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid email\",\n    \"format-hostname-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid hostname\",\n    \"format-idn-hostname-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid idn hostname\",\n    \"format-ipv4-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid IPv4 address\",\n    \"format-ipv4-leading-zero-error\":\n        \"IPv4 addresses starting with zero are invalid, since they are interpreted as octals\",\n    \"format-ipv6-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid IPv6 address\",\n    \"format-ipv6-leading-zero-error\":\n        \"IPv6 addresses starting with zero are invalid, since they are interpreted as octals\",\n    \"format-iri-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid iri\",\n    \"format-iri-reference-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid iri-reference\",\n    \"format-json-pointer-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid json-pointer\",\n    \"format-regex-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid regular expression\",\n    \"format-time-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid time\",\n    \"format-uri-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid uri\",\n    \"format-uri-reference-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid uri-reference\",\n    \"format-uri-template-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid uri-template\",\n    \"format-url-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid url\",\n    \"format-uuid-error\": \"Value `{{value}}` at `{{pointer}}` is not a valid uuid\",\n    \"invalid-data-error\": \"No value may be specified in `{{pointer}}`\",\n    \"invalid-property-name-error\": \"Invalid property name `{{property}}` at `{{pointer}}`\",\n    \"maximum-error\": \"Value in `{{pointer}}` is `{{length}}`, but should be `{{maximum}}` at maximum\",\n    \"max-items-error\": \"Too many items in `{{pointer}}`, should be `{{maximum}}` at most, but got `{{length}}`\",\n    \"max-length-error\": \"Value `{{pointer}}` should have a maximum length of `{{maxLength}}`, but got `{{length}}`.\",\n    \"max-properties-error\":\n        \"Too many properties in `{{pointer}}`, should be `{{maxProperties}}` at most, but got `{{length}}`\",\n    \"minimum-error\": \"Value in `{{pointer}}` is `{{length}}`, but should be `{{minimum}}` at minimum\",\n    \"min-items-error\": \"Too few items in `{{pointer}}`, should be at least `{{minItems}}`, but got `{{length}}`\",\n    \"min-items-one-error\": \"At least one item is required in `{{pointer}}`\",\n    \"min-length-error\": \"Value `{{pointer}}` should have a minimum length of `{{minLength}}`, but got `{{length}}`.\",\n    \"min-length-one-error\": \"A value is required in `{{pointer}}`\",\n    \"missing-one-of-declarator-error\": \"Missing oneOf declarator `{{declarator}}` in schema `{{schemaLocation}}`\",\n    \"min-properties-error\":\n        \"Too few properties in `{{pointer}}`, should be at least `{{minProperties}}`, but got `{{length}}`\",\n    \"missing-array-item-error\": \"Array at '{{pointer}}' has a missing item at '{{key}}'\",\n    \"missing-dependency-error\": \"The required propery '{{missingProperty}}' in `{{pointer}}` is missing\",\n    \"missing-one-of-property-error\":\n        \"Value at `{{pointer}}` must be object or array and have a property ${oneOfProperty}: ${value}\",\n    \"multiple-of-error\": \"Expected `{{value}}` in `{{pointer}}` to be multiple of `{{multipleOf}}`\",\n    \"multiple-one-of-error\": \"Value `{{value}}` should not match multiple schemas in oneOf `{{matches}}`\",\n    \"no-additional-properties-error\": \"Additional property `{{property}}` in `{{pointer}}` is not allowed\",\n    \"not-error\": \"Value `{{value}}` at pointer should not match schema `{{not}}`\",\n    \"one-of-error\": \"Value `{{value}}` in `{{pointer}}` does not match any given oneof schema\",\n    \"one-of-property-error\":\n        \"Failed finding a matching oneOfProperty schema in `{{pointer}}` where `{{property}}` matches `{{value}}`\",\n    \"pattern-error\": \"Value in `{{pointer}}` should match `{{description}}`, but received `{{received}}`\",\n    \"pattern-properties-error\":\n        \"Property `{{key}}` does not match any patterns in `{{pointer}}`. Valid patterns are: {{patterns}}\",\n    \"ref-error\": \"Could not resolve $ref '{{ref}}' from '{{pointer}}'\",\n    \"required-property-error\": \"The required property `{{key}}` is missing at `{{pointer}}`\",\n    /** return schema-warning with createSchemaWarning:true when a valid, but undefined property was found */\n    \"schema-warning\": \"Failed retrieving a schema from '{{pointer}}' to key '{{key}}'\",\n    \"type-error\": \"Expected `{{value}}` ({{received}}) in `{{pointer}}` to be of type `{{expected}}`\",\n    \"undefined-value-error\": \"Value must not be undefined in `{{pointer}}`\",\n    \"unevaluated-property-error\": \"Invalid unevaluated property `{{pointer}}`\",\n    \"unevaluated-items-error\": \"Invalid unevaluated item `{{pointer}}`\",\n    \"unique-items-error\":\n        \"Items in array must be unique. Value `{{value}}` in `{{pointer}}` is a duplicate of {{duplicatePointer}}.\",\n    \"unknown-property-error\": \"Could not find a valid schema for property `{{pointer}}` within object\",\n    \"value-not-empty-error\": \"A value for `{{property}}` is required at `{{pointer}}`\",\n    // annotations\n    \"deprecated-warning\": \"Value at `{{pointer}}` is deprecated\",\n    // schema validation\n    \"schema-error\": \"Invalid schema found at {{pointer}}: {{message}}\",\n    \"unknown-keyword-warning\": \"Keyword '{{value}}' is not a valid keyword to draft '{{draft}}'\",\n    \"unknown-format-warning\": \"Format {{value}} is not a valid format\"\n};\n","import { Keyword, JsonSchemaValidatorParams } from \"../../Keyword\";\nimport { SchemaNode } from \"../../SchemaNode\";\n\nexport const exclusiveMaximumKeyword: Keyword = {\n    id: \"exclusiveMaximum\",\n    keyword: \"exclusiveMaximum\",\n    parse,\n    addValidate: ({ schema }) => schema.exclusiveMaximum === true || !isNaN(schema.maximum),\n    validate: validateExclusiveMaximum\n};\n\nfunction parse(node: SchemaNode) {\n    const { exclusiveMaximum } = node.schema;\n    if (exclusiveMaximum != null && !(typeof exclusiveMaximum === \"number\" || typeof exclusiveMaximum === \"boolean\")) {\n        return node.createError(\"schema-error\", {\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined,\n            message: `Keyword 'exclusiveMaximum' must be a number - received '${typeof exclusiveMaximum}'`\n        });\n    }\n}\n\nfunction validateExclusiveMaximum({ node, data, pointer }: JsonSchemaValidatorParams) {\n    if (typeof data !== \"number\") {\n        return undefined;\n    }\n    if (node.schema.exclusiveMaximum && node.schema.maximum === data) {\n        return node.createError(\"maximum-error\", {\n            maximum: node.schema.exclusiveMaximum,\n            length: data,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../../Keyword\";\nimport { SchemaNode } from \"../../SchemaNode\";\n\nexport const exclusiveMinimumKeyword: Keyword = {\n    id: \"exclusiveMinimum\",\n    keyword: \"exclusiveMinimum\",\n    parse,\n    addValidate: ({ schema }) => schema.exclusiveMinimum === true || !isNaN(schema.minimum),\n    validate: validateExclusiveMinimum\n};\n\nfunction parse(node: SchemaNode) {\n    const { exclusiveMinimum } = node.schema;\n    if (exclusiveMinimum != null && !(typeof exclusiveMinimum === \"number\" || typeof exclusiveMinimum === \"boolean\")) {\n        return node.createError(\"schema-error\", {\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined,\n            message: `Keyword 'exclusiveMinimum' must be a number - received '${typeof exclusiveMinimum}'`\n        });\n    }\n}\n\nfunction validateExclusiveMinimum({ node, data, pointer }: JsonSchemaValidatorParams) {\n    if (typeof data !== \"number\") {\n        return undefined;\n    }\n    if (node.schema.exclusiveMinimum && node.schema.minimum === data) {\n        return node.createError(\"minimum-error\", {\n            minimum: node.schema.exclusiveMinimum,\n            length: data,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\n\nconst KEYWORD = \"format\";\n\nexport const formatKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseFormat,\n    addValidate: ({ schema }) => schema?.format != null,\n    validate: validateFormat\n};\n\nfunction parseFormat(node: SchemaNode) {\n    const format = node.schema[KEYWORD];\n    if (format == null) {\n        return;\n    }\n    if (typeof format !== \"string\") {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: format,\n            message: `Keyword '${KEYWORD}' must be a string - received '${typeof format}'`\n        });\n    }\n    if (node.context.formats[format] == null) {\n        return node.createAnnotation(\"unknown-format-warning\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: format,\n            message: `Keyword '${KEYWORD}' must be a string - received '${typeof format}'`\n        });\n    }\n}\n\nfunction validateFormat(options: JsonSchemaValidatorParams) {\n    const { node } = options;\n    const formatValidator = node.context.formats[node.schema.format];\n    return formatValidator?.(options);\n}\n","import { isWebUri } from \"valid-url\";\nimport { getTypeOf } from \"../utils/getTypeOf\";\nimport { JsonSchemaValidatorParams, ValidationReturnType } from \"../Keyword\";\nimport settings from \"../settings\";\n\nconst { REGEX_FLAGS } = settings;\nconst isValidIPV4 = /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/;\nconst isValidIPV6 =\n    /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))$/i;\nconst matchDate = /^(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)$/;\nconst matchTime =\n    /^(?<time>(?:([0-1]\\d|2[0-3]):[0-5]\\d:(?<second>[0-5]\\d|60)))(?:\\.\\d+)?(?<offset>(?:z|[+-]([0-1]\\d|2[0-3])(?::?[0-5]\\d)?))$/i;\nconst DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst isValidJsonPointer = /^(?:\\/(?:[^~/]|~0|~1)*)*$/;\nconst isValidRelativeJsonPointer = /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/;\nconst isValidDurationString = /^P(?!$)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?$/;\n\n// Default Json-Schema formats: date-time, email, hostname, ipv4, ipv6, uri, uriref\nexport const formats: Record<string, (options: JsonSchemaValidatorParams) => ValidationReturnType> = {\n    date: ({ node, pointer, data }) => {\n        const { schema } = node;\n        if (typeof data !== \"string\" || data === \"\") {\n            return undefined;\n        }\n        // https://github.com/cfworker/cfworker/blob/main/packages/json-schema/src/format.ts\n        // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n        const matches = data.match(matchDate);\n        if (!matches) {\n            return node.createError(\"format-date-error\", { value: data, pointer, schema });\n        }\n        const year = +matches[1];\n        const month = +matches[2];\n        const day = +matches[3];\n        // https://tools.ietf.org/html/rfc3339#appendix-C\n        const isLeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n        if (month >= 1 && month <= 12 && day >= 1 && day <= (month == 2 && isLeapYear ? 29 : DAYS[month])) {\n            return undefined;\n        }\n        return node.createError(\"format-date-error\", { value: data, pointer, schema });\n    },\n\n    \"date-time\": ({ node, pointer, data, path }) => {\n        const { schema } = node;\n        if (typeof data !== \"string\" || data === \"\") {\n            return undefined;\n        }\n        const dateAndTime = data.split(/t/i);\n        if (dateAndTime.length === 2) {\n            const dateIsValid = formats.date({ node, pointer, data: dateAndTime[0], path }) === undefined;\n            const timeIsValid = formats.time({ node, pointer, data: dateAndTime[1], path }) === undefined;\n            if (dateIsValid && timeIsValid) {\n                return undefined;\n            }\n        }\n        return node.createError(\"format-date-time-error\", { value: data, pointer, schema });\n    },\n\n    duration: ({ node, pointer, data }) => {\n        const type = getTypeOf(data);\n        if (type !== \"string\") {\n            return undefined;\n        }\n\n        // weeks cannot be combined with other units\n        const isInvalidDurationString = /(\\d+M)(\\d+W)|(\\d+Y)(\\d+W)/;\n\n        if (!isValidDurationString.test(data as string) || isInvalidDurationString.test(data as string)) {\n            return node.createError(\"format-duration-error\", {\n                value: data,\n                pointer,\n                schema: node.schema\n            });\n        }\n    },\n\n    email: ({ node, pointer, data }) => {\n        const { schema } = node;\n        if (typeof data !== \"string\" || data === \"\") {\n            return undefined;\n        }\n\n        const lastIndex = data.lastIndexOf(\"@\");\n        const name = data.substr(0, lastIndex);\n        const host = data.substr(lastIndex + 1);\n        if (!name || !host || name.length > 64 || host.length > 253) {\n            return node.createError(\"format-email-error\", { value: data, pointer, schema });\n        }\n\n        // if name is in double quotes: \"joe bloggs\"@example.com, whitespaces, dots etc are allowed\n        // so, we remove valid strings in quote\n        let strippedName = name;\n        if (/^\".*\"$/.test(name)) {\n            strippedName = name.replace(/(^\")|([. @]+)|(\"$)/g, \"\");\n        }\n\n        if (strippedName[0] === \".\" || strippedName.endsWith(\".\") || strippedName.includes(\"..\")) {\n            return node.createError(\"format-email-error\", { value: data, pointer, schema });\n        }\n        if (!/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+$/i.test(strippedName)) {\n            return node.createError(\"format-email-error\", { value: data, pointer, schema });\n        }\n\n        if (/^\\[.*\\]$/.test(host)) {\n            const possibleIp = host.substr(1, host.length - 2);\n            if (\n                isValidIPV4.test(possibleIp) ||\n                isValidIPV6.test(possibleIp) ||\n                /IPv6:::[0-9a-f]{1,4}/.test(possibleIp)\n            ) {\n                return undefined;\n            }\n        }\n\n        if (!/^[a-z0-9.-]+$/i.test(host)) {\n            return node.createError(\"format-email-error\", { value: data, pointer, schema });\n        }\n        if (!host.split(\".\").every((part) => /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/i.test(part))) {\n            return node.createError(\"format-email-error\", { value: data, pointer, schema });\n        }\n        return undefined;\n    },\n\n    \"json-pointer\": ({ node, pointer, data }) => {\n        const { schema } = node;\n        if (typeof data !== \"string\" || data === \"\") {\n            return undefined;\n        }\n        if (isValidJsonPointer.test(data)) {\n            return undefined;\n        }\n        return node.createError(\"format-json-pointer-error\", { value: data, pointer, schema });\n    },\n\n    \"relative-json-pointer\": ({ node, pointer, data }) => {\n        const { schema } = node;\n        if (typeof data !== \"string\") {\n            return undefined;\n        }\n        if (isValidRelativeJsonPointer.test(data)) {\n            return undefined;\n        }\n        return node.createError(\"format-json-pointer-error\", { value: data, pointer, schema });\n    },\n\n    regex: ({ node, pointer, data }) => {\n        const { schema } = node;\n        if (\n            typeof data === \"object\" ||\n            typeof data === \"number\" ||\n            Array.isArray(data) ||\n            getTypeOf(data) === \"boolean\"\n        ) {\n            return undefined;\n        }\n        if (typeof data === \"string\" && /\\\\Z$/.test(data) === false) {\n            try {\n                new RegExp(data, schema.regexFlags ?? REGEX_FLAGS);\n                return undefined;\n            } catch (e) {} // eslint-disable-line @typescript-eslint/no-unused-vars, no-empty\n\n            return node.createError(\"format-regex-error\", { value: data, pointer, schema });\n        }\n        // v7 tests, ignore non-regex values\n\n        return node.createError(\"format-regex-error\", { value: data, pointer, schema });\n    },\n\n    // hh:mm:ss.sTZD\n    // RFC 3339 https://datatracker.ietf.org/doc/html/rfc3339#section-4\n    time: ({ node, pointer, data }) => {\n        const { schema } = node;\n        if (typeof data !== \"string\" || data === \"\") {\n            return undefined;\n        }\n\n        // https://github.com/cfworker/cfworker/blob/main/packages/json-schema/src/format.ts\n        const matches = data.match(matchTime);\n        if (!matches) {\n            return node.createError(\"format-date-time-error\", { value: data, pointer, schema });\n        }\n\n        // leap second\n        if (matches.groups?.second === \"60\") {\n            // bail early\n            if (/23:59:60(z|\\+00:00)/i.test(data)) {\n                return undefined;\n            }\n            // check if sum matches 23:59\n            const minutes = matches.groups.time.match(/(\\d+):(\\d+):/);\n            const offsetMinutes = matches.groups.offset.match(/(\\d+):(\\d+)/);\n            if (minutes && offsetMinutes) {\n                const hour = parseInt(minutes[1]);\n                const offsetHour = parseInt(offsetMinutes[1]);\n                const min = parseInt(minutes[2]);\n                const offsetMin = parseInt(offsetMinutes[2]);\n                let deltaTime;\n                if (/^-/.test(matches.groups.offset)) {\n                    deltaTime = (hour + offsetHour) * 60 + (min + offsetMin);\n                } else {\n                    deltaTime = (24 + hour - offsetHour) * 60 + (min - offsetMin);\n                }\n                const hours = Math.floor(deltaTime / 60);\n                const actualHour = hours % 24;\n                const actualMinutes = deltaTime - hours * 60;\n                if (actualHour === 23 && actualMinutes === 59) {\n                    return undefined;\n                }\n            }\n            return node.createError(\"format-date-time-error\", { value: data, pointer, schema });\n        }\n\n        return undefined;\n    },\n\n    url: ({ node, data, pointer }) => {\n        const { schema } = node;\n        if (data === \"\" || isWebUri(`${data}`)) {\n            return undefined;\n        }\n        return node.createError(\"format-url-error\", { value: data, pointer, schema });\n    },\n\n    uuid: ({ node, data, pointer }) => {\n        const { schema } = node;\n        if (typeof data !== \"string\" || data === \"\") {\n            return undefined;\n        }\n        if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(data)) {\n            return undefined;\n        }\n        return node.createError(\"format-uuid-error\", { value: data, pointer, schema });\n    }\n};\n","import { JsonError, SchemaNode } from \"../../types\";\n\n/**\n * Returns a list of possible child-schemas for the given property key. In case of a oneOf selection, multiple schemas\n * could be added at the given property (e.g. item-index), thus an array of options is returned. In all other cases\n * a list with a single item will be returned\n */\nexport function getChildSelection(node: SchemaNode, property: string | number): SchemaNode[] | JsonError {\n    if (node.oneOf) {\n        return node.oneOf.map((childNode: SchemaNode) => childNode.resolveRef());\n    }\n    if (node.items?.oneOf) {\n        return node.items.oneOf.map((childNode: SchemaNode) => childNode.resolveRef());\n    }\n\n    // array.items[] found\n    if (node.prefixItems && node.prefixItems.length > +property) {\n        const { node: childNode, error } = node.getNodeChild(property);\n        if (childNode) {\n            return [childNode];\n        }\n        return error as JsonError;\n    }\n\n    // array.items[] exceeded (or undefined), but additionalItems specified\n    if (node.schema.additionalItems) {\n        // we fallback to a string if no schema is defined - might be subject for configuration\n        if (node.schema.additionalItems === true) {\n            return [node.compileSchema({ type: \"string\" })];\n        }\n        if (node.items) {\n            return [node.items.resolveRef()];\n        }\n    }\n\n    // array.items[] exceeded\n    if (node.prefixItems && node.prefixItems.length <= +property) {\n        return [];\n    }\n\n    const { node: childNode, error } = node.getNodeChild(property);\n    if (childNode) {\n        return [childNode as SchemaNode];\n    }\n    return error as JsonError;\n}\n","import { getTypeOf } from \"./getTypeOf\";\nimport { isObject } from \"../utils/isObject\";\nimport { BooleanSchema, JsonSchema, SchemaNode } from \"../types\";\n\nexport const SCHEMA_TYPES = [\"string\", \"number\", \"integer\", \"boolean\", \"null\", \"array\", \"object\"] as const;\nexport type SchemaType = (typeof SCHEMA_TYPES)[number];\nconst OBJECT_PROPERTIES = [\n    \"additionalProperties\",\n    // \"allOf\",\n    // \"anyOf\",\n    \"dependencies\",\n    \"dependentSchemas\",\n    \"dependentRequired\",\n    // \"enum\",\n    // \"format\",\n    // \"if\",\n    \"maxProperties\",\n    \"minProperties\",\n    // \"not\",\n    // \"oneOf\",\n    \"patternProperties\",\n    \"properties\",\n    \"propertyNames\",\n    \"required\",\n    \"unevaluatedProperties\" // 2019-09\n];\nconst ARRAY_PROPERTIES = [\n    // \"allOf\",\n    // \"anyOf\",\n    \"contains\",\n    // \"enum\",\n    // \"if\",\n    \"items\",\n    \"maxItems\",\n    \"minItems\",\n    // \"not\",\n    // \"oneOf\",\n    \"unevaluatedItems\",\n    \"uniqueItems\"\n];\n\n/**\n * @helper for getData\n * returns schema type, which might be an educated guess based on defined schema\n * properties if an exact type cannot be retried from type.\n */\nexport function getSchemaType(node: SchemaNode, data: unknown): SchemaType | undefined {\n    const dataType = getTypeOf(data);\n    const schema = node.schema as JsonSchema | BooleanSchema;\n    if (schema === true) {\n        if (dataType === \"bigint\") {\n            return \"number\";\n        }\n        return SCHEMA_TYPES.some((schemaType) => schemaType === dataType) ? (dataType as SchemaType) : undefined;\n    }\n    // boolean schema false or invalid schema\n    if (!isObject(schema)) {\n        return undefined;\n    }\n    const schemaType = schema.type;\n\n    // type: []\n    if (Array.isArray(schemaType)) {\n        if (schemaType.includes(dataType)) {\n            return dataType as SchemaType;\n        }\n        const defaultType = getTypeOf(schema.default);\n        if (schemaType.includes(defaultType)) {\n            return defaultType as SchemaType;\n        }\n        return schemaType[0];\n    }\n\n    // type: \"\"\n    if (schemaType) {\n        return schemaType as SchemaType;\n    }\n\n    // type: undefined, enum: []\n    if (Array.isArray(schema.enum)) {\n        const schemaEnum: unknown[] = schema.enum;\n        const enumSchemaType = schemaEnum.map((value) => getTypeOf(value)).filter((p, i, l) => l.indexOf(p) === i);\n        if (enumSchemaType.includes(dataType)) {\n            return dataType as SchemaType;\n        }\n        const defaultType = getTypeOf(schema.default);\n        if (enumSchemaType.includes(defaultType)) {\n            return defaultType as SchemaType;\n        }\n        return enumSchemaType[0] as SchemaType;\n    }\n\n    // type: undefined, enum: undefined -- define type by schema-properties\n    // @attenation this is prone to wrong results\n    const schemaProperties = Object.keys(node.schema);\n    const objectProperties = schemaProperties.filter((p) => OBJECT_PROPERTIES.includes(p));\n    const arrayProperties = schemaProperties.filter((p) => ARRAY_PROPERTIES.includes(p));\n\n    if (objectProperties.length > 0 && objectProperties.length > arrayProperties.length) {\n        return \"object\";\n    }\n\n    if (arrayProperties.length > 0 && arrayProperties.length > objectProperties.length) {\n        return \"array\";\n    }\n\n    // nothing found yet check dynamic properties for a type\n    if (node.if) {\n        return getSchemaType(node.if.resolveRef() ?? node.if, data);\n    }\n\n    if (node.allOf) {\n        for (const allOf of node.allOf) {\n            const type = getSchemaType(allOf.resolveRef() ?? allOf, data);\n            if (type) {\n                return type;\n            }\n        }\n    }\n\n    if (node.oneOf) {\n        for (const oneOf of node.oneOf) {\n            const type = getSchemaType(oneOf.resolveRef() ?? oneOf, data);\n            if (type) {\n                return type;\n            }\n        }\n    }\n\n    if (node.anyOf) {\n        for (const anyOf of node.anyOf) {\n            const type = getSchemaType(anyOf.resolveRef() ?? anyOf, data);\n            if (type) {\n                return type;\n            }\n        }\n    }\n\n    if (schema.$ref) {\n        const refNode = node.resolveRef();\n        if (refNode) {\n            return getSchemaType(refNode, data);\n        }\n    }\n\n    return undefined;\n}\n","import { getTypeOf } from \"./getTypeOf\";\n\nexport function isEmpty(v: unknown): boolean {\n\tconst type = getTypeOf(v);\n\tswitch (type) {\n\t\tcase \"string\":\n\t\tcase \"array\":\n\t\t\treturn (v as [])?.length === 0;\n\t\tcase \"null\":\n\t\tcase \"undefined\":\n\t\t\treturn true;\n\t\tcase \"object\":\n\t\t\treturn Object.keys(v as object).length === 0;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n","import {\n    Keyword,\n    JsonSchemaReducerParams,\n    JsonSchemaValidatorParams,\n    ValidationPath,\n    ValidationReturnType,\n    ValidationAnnotation\n} from \"../Keyword\";\nimport { isSchemaNode, SchemaNode } from \"../types\";\nimport settings from \"../settings\";\nimport { getValue } from \"../utils/getValue\";\nimport sanitizeErrors from \"../utils/sanitizeErrors\";\nimport { isObject } from \"../utils/isObject\";\nimport { validateNode } from \"../validateNode\";\nimport { joinDynamicId } from \"../SchemaNode\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nconst KEYWORD = \"oneOf\";\nconst { DECLARATOR_ONEOF } = settings;\n\nexport const oneOfKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseOneOf,\n    addReduce: (node) => node[KEYWORD] != null,\n    reduce: reduceOneOf,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: oneOfValidator\n};\n\nexport const oneOfFuzzyKeyword: Keyword = {\n    id: \"oneOf-fuzzy\",\n    keyword: \"oneOf\",\n    parse: parseOneOf,\n    addReduce: (node) => node.oneOf != null,\n    reduce: reduceOneOfFuzzy,\n    addValidate: (node) => node.oneOf != null,\n    validate: oneOfValidator\n};\n\nexport function parseOneOf(node: SchemaNode) {\n    const { schema, evaluationPath, schemaLocation } = node;\n    if (schema[KEYWORD] == null) {\n        return;\n    }\n    if (!Array.isArray(schema[KEYWORD])) {\n        return node.createError(\"schema-error\", {\n            pointer: schemaLocation,\n            schema,\n            value: schema[KEYWORD],\n            message: `Keyword '${KEYWORD}' must be an array - received '${typeof schema[KEYWORD]}'`\n        });\n    }\n    if (schema[KEYWORD].length === 0) {\n        return;\n    }\n\n    node[KEYWORD] = schema[KEYWORD].map((s, index) =>\n        node.compileSchema(s, `${evaluationPath}/${KEYWORD}/${index}`, `${schemaLocation}/${KEYWORD}/${index}`)\n    );\n    return collectValidationErrors([], ...node[KEYWORD]);\n}\n\nfunction reduceOneOf({ node, data, pointer, path }: Omit<JsonSchemaReducerParams, \"key\">) {\n    if (node.oneOf == null) {\n        return;\n    }\n\n    // !keyword: oneOfProperty\n    // an additional <DECLARATOR_ONEOF> (default `oneOfProperty`) on the schema will exactly determine the\n    // oneOf value (if set in data)\n    if (data != null && node.schema[DECLARATOR_ONEOF]) {\n        return reduceOneOfDeclarator({ node, data, pointer, path });\n    }\n\n    const matches: { index: number; node: SchemaNode }[] = [];\n    const errors: ValidationReturnType[] = [];\n    for (let i = 0; i < node.oneOf.length; i += 1) {\n        const validationErrors = validateNode(node.oneOf[i], data, pointer, path);\n        if (validationErrors.length === 0) {\n            matches.push({ index: i, node: node.oneOf[i] });\n        } else {\n            errors.push(...validationErrors);\n        }\n    }\n\n    if (matches.length === 1) {\n        const { node, index } = matches[0];\n        const { node: reducedNode, error } = node.reduceNode(data, { pointer, path });\n\n        if (reducedNode) {\n            const nestedDynamicId = reducedNode.dynamicId?.replace(node.dynamicId, \"\") ?? \"\";\n            const dynamicId = nestedDynamicId === \"\" ? `oneOf/${index}` : nestedDynamicId;\n\n            reducedNode.oneOfIndex = index; // @evaluation-info\n            reducedNode.dynamicId = joinDynamicId(reducedNode.dynamicId, `+${node.schemaLocation}(${dynamicId})`);\n            return reducedNode;\n        }\n        return error;\n    }\n\n    if (matches.length === 0) {\n        return node.createError(\"one-of-error\", {\n            value: JSON.stringify(data),\n            pointer,\n            schema: node.schema,\n            oneOf: node.schema.oneOf,\n            errors\n        });\n    }\n\n    return node.createError(\"one-of-error\", {\n        value: JSON.stringify(data),\n        pointer,\n        schema: node.schema,\n        oneOf: node.schema.oneOf,\n        errors\n    });\n}\n\n/**\n * Returns matching oneOf schema identified by matching schema for oneOfProperty\n */\nexport function reduceOneOfDeclarator({ node, data, pointer, path }: Omit<JsonSchemaReducerParams, \"key\">) {\n    if (node.oneOf == null) {\n        return;\n    }\n\n    const oneOfProperty = node.schema[DECLARATOR_ONEOF];\n    const oneOfPropertyValue = getValue(data, oneOfProperty);\n\n    // in this case, we also fail when data undefined as this always is valid,\n    // but not in context on an expected oneOfProperty\n    if (data === undefined || oneOfPropertyValue === undefined) {\n        return node.createError(\"missing-one-of-property-error\", {\n            oneOfProperty,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n\n    // find oneOf schema that has a matching oneOfProperty to the current input data\n    // TODO throw an error if multiple matches were found\n    const errors: ValidationReturnType = [];\n    for (let i = 0; i < node.oneOf.length; i += 1) {\n        const { node: resultNode } = node.oneOf[i].getNodeChild(oneOfProperty, data);\n        if (!isSchemaNode(resultNode)) {\n            // one of the oneOf schemas has a missing oneOfTypeProperty\n            // TODO this still might succeed\n            // TODO there is a possibility this throws an invalid error as we use input data\n            return node.createError(\"missing-one-of-declarator-error\", {\n                declarator: DECLARATOR_ONEOF,\n                oneOfProperty,\n                schemaLocation: node.oneOf[i].schemaLocation,\n                pointer: `${pointer}/oneOf/${i}`,\n                schema: node.schema,\n                value: data\n            });\n        }\n\n        // collect errors in case we fail finding a matching schema\n        const result = sanitizeErrors(\n            validateNode(resultNode, oneOfPropertyValue, `${pointer}/${oneOfProperty}`, path)\n        );\n\n        if (result.length > 0) {\n            errors.push(...result);\n        } else {\n            // return at once when we found a schema\n            // TODO should check all oneOf-schema\n            const { node: reducedNode } = node.oneOf[i].reduceNode(data, { pointer, path });\n            if (reducedNode) {\n                reducedNode.oneOfIndex = i; // @evaluation-info\n                return reducedNode;\n            }\n        }\n    }\n\n    return node.createError(\"one-of-property-error\", {\n        property: oneOfProperty,\n        value: data,\n        pointer,\n        schema: node.schema,\n        errors\n    });\n}\n\n/**\n * Returns a ranking for the data and given schema\n *\n * @param draft\n * @param - json schema type: object\n * @param data\n * @param [pointer]\n * @return ranking value (higher is better)\n */\nfunction fuzzyObjectValue(node: SchemaNode, data: Record<string, unknown>, pointer: string, path: ValidationPath) {\n    if (data == null || node.properties == null) {\n        return -1;\n    }\n    let value = 0;\n    const keys = Object.keys(node.properties ?? {});\n    for (const key of keys) {\n        if (data[key]) {\n            if (validateNode(node.properties[key], data[key], pointer, path).length === 0) {\n                value += 1;\n            }\n        }\n    }\n    return value;\n}\n\n/**\n * Selects and returns a oneOf schema for the given data\n *\n * @param draft\n * @param data\n * @param [schema] - current json schema containing property oneOf\n * @param [pointer] - json pointer to data\n * @return oneOf schema or an error\n */\nexport function reduceOneOfFuzzy({ node, data, pointer, path }: Omit<JsonSchemaReducerParams, \"key\">) {\n    // @todo: usingMergeNode may add reducers that are no longer available\n    if (node.oneOf == null) {\n        return node;\n    }\n\n    const oneOfResult = reduceOneOf({ node, data, pointer, path });\n    if (isSchemaNode(oneOfResult)) {\n        return oneOfResult;\n    }\n\n    // fuzzy match oneOf\n    if (isObject(data)) {\n        let nodeOfItem: SchemaNode | undefined;\n        let schemaOfIndex = -1;\n        let fuzzyGreatest = 0;\n\n        for (let i = 0; i < node.oneOf.length; i += 1) {\n            const oneNode = node.oneOf[i];\n            const fuzzyValue = fuzzyObjectValue(oneNode, data, pointer, path);\n\n            if (fuzzyGreatest < fuzzyValue) {\n                fuzzyGreatest = fuzzyValue;\n                nodeOfItem = oneNode;\n                schemaOfIndex = i;\n            }\n        }\n\n        if (nodeOfItem === undefined) {\n            return node.createError(\"one-of-error\", {\n                value: JSON.stringify(data),\n                pointer,\n                schema: node.schema,\n                oneOf: node.schema.oneOf\n            });\n        }\n\n        const { node: reducedNode, error } = nodeOfItem.reduceNode(data, { pointer, path });\n        if (reducedNode) {\n            reducedNode.oneOfIndex = schemaOfIndex; // @evaluation-info\n            return reducedNode;\n        }\n        return error;\n    }\n\n    return oneOfResult;\n}\n\nfunction validateFromDeclarator({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    const { oneOf, schema } = node;\n    if (!oneOf) {\n        return;\n    }\n\n    // with a declarator we only validate by a declarator to retrieve matches.\n    // - if a single match was found, we return validation errors if any\n    // - if no match was found we return a one-of-error\n    // - if multiples matches were found we return a multiple-one-of-error\n    const oneOfProperty = schema[DECLARATOR_ONEOF];\n    const oneOfValue = getValue(data, oneOfProperty);\n    const matches: { index: number; node: SchemaNode }[] = [];\n    const errors: ValidationReturnType = [];\n    for (const oneOfNode of oneOf) {\n        const { node: oneOfPropertyNode, error } = oneOfNode.getNodeChild(oneOfProperty, oneOfValue);\n        if (oneOfPropertyNode) {\n            const validationResult = validateNode(oneOfPropertyNode, oneOfValue, `${pointer}/${oneOfProperty}`, path);\n            if (validationResult.length > 0) {\n                errors.push(...validationResult);\n            } else {\n                matches.push({ index: oneOf.indexOf(oneOfNode), node: oneOfNode });\n            }\n        } else {\n            console.log(\n                `jlib oneOf error: failed getting schema for '${oneOfProperty}' to resolve ${DECLARATOR_ONEOF} in ${pointer}/oneOf/${oneOf.indexOf(oneOfNode)}`,\n                error\n            );\n        }\n    }\n\n    if (matches.length === 1) {\n        const match = matches[0];\n        match.node.oneOfIndex = match.index; // @evaluation-info\n        return validateNode(match.node, data, pointer, path);\n    }\n\n    if (matches.length > 1) {\n        return node.createError(\"multiple-one-of-error\", {\n            value: data,\n            pointer,\n            schema,\n            matches\n        });\n    }\n\n    return node.createError(\"one-of-error\", {\n        value: JSON.stringify(data),\n        pointer,\n        schema,\n        oneOf: schema.oneOf,\n        errors\n    });\n}\n\nfunction oneOfValidator({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    const { oneOf, schema } = node;\n    if (!oneOf) {\n        return;\n    }\n\n    if (schema[DECLARATOR_ONEOF]) {\n        return validateFromDeclarator({ node, data, pointer, path });\n    }\n\n    const matches: { index: number; node: SchemaNode }[] = [];\n    const errors: ValidationReturnType = [];\n    for (let i = 0; i < oneOf.length; i += 1) {\n        const validationResult = validateNode(oneOf[i], data, pointer, path);\n        if (validationResult.length > 0) {\n            errors.push(...validationResult);\n        } else {\n            matches.push({ index: i, node: oneOf[i] });\n        }\n    }\n\n    if (matches.length === 1) {\n        const { node, index } = matches[0];\n        node.oneOfIndex = index; // @evaluation-info\n        return undefined;\n    }\n\n    if (matches.length > 1) {\n        return node.createError(\"multiple-one-of-error\", {\n            value: data,\n            pointer,\n            schema,\n            matches\n        });\n    }\n\n    return node.createError(\"one-of-error\", {\n        value: JSON.stringify(data),\n        pointer,\n        schema,\n        oneOf: schema.oneOf,\n        errors\n    });\n}\n","let isFile: (value: unknown) => value is File;\n// @ts-expect-error forced types\nisFile = () => false;\n\ntry {\n    if (typeof File === \"function\") {\n        isFile = (value: unknown) => value instanceof File;\n    }\n} catch (e) {} // eslint-disable-line\n\nexport { isFile };\n","import { copy } from \"fast-copy\";\nimport { getTypeOf } from \"../../utils/getTypeOf\";\nimport { getSchemaType } from \"../../utils/getSchemaType\";\nimport { getValue } from \"../../utils/getValue\";\nimport { isEmpty } from \"../../utils/isEmpty\";\nimport { isJsonError } from \"../../types\";\nimport { isObject } from \"../../utils/isObject\";\nimport { isSchemaNode, SchemaNode } from \"../../types\";\nimport { mergeNode } from \"../../mergeNode\";\nimport { reduceOneOfFuzzy } from \"../../keywords/oneOf\";\nimport { isFile } from \"../../utils/isFile\";\n\nexport type TemplateOptions = {\n    /** Add all properties (required and optional) to the generated data */\n    addOptionalProps?: boolean;\n    /** Remove data that does not match input schema. Defaults to false */\n    removeInvalidData?: boolean;\n    /** Set to false to take default values as they are and not extend them.\n     *  Defaults to true.\n     *  This allows to control template data e.g. enforcing arrays to be empty,\n     *  regardless of minItems settings.\n     */\n    extendDefaults?: boolean;\n    /**\n     * Set to false to not use type specific initial values.Defaults to true\n     */\n    useTypeDefaults?: boolean;\n    /**\n     * Limits how often a $ref should be followed before aborting. Prevents infinite data-structure.\n     * Defaults to 1\n     */\n    recursionLimit?: number;\n    /** @internal disables recursion limit for next call */\n    disableRecursionLimit?: boolean;\n    /** @internal context to track recursion limit */\n    cache?: Record<string, Record<string, number>>;\n};\n\nfunction safeResolveRef(node: SchemaNode, options: TemplateOptions) {\n    if (node.$ref == null) {\n        return undefined;\n    }\n\n    options.cache = options.cache ?? {};\n    const { cache, recursionLimit = 1 } = options;\n\n    const origin = node.schemaLocation;\n    cache[origin] = cache[origin] ?? {};\n    cache[origin][node.$ref] = cache[origin][node.$ref] ?? 0;\n    const value = cache[origin][node.$ref];\n    if (value >= recursionLimit && options.disableRecursionLimit !== true) {\n        return false;\n    }\n    options.disableRecursionLimit = false;\n    cache[origin][node.$ref] += 1;\n    const resolvedNode = node.resolveRef();\n    if (resolvedNode && resolvedNode !== node) {\n        return resolvedNode;\n    }\n\n    return undefined;\n}\n\nfunction canResolveRef(node: SchemaNode, options: TemplateOptions) {\n    // @ts-expect-error unknown index\n    const counter = options.cache?.[node.schemaLocation]?.[node.$ref] ?? -1;\n    return counter < (options.recursionLimit ?? 1);\n}\n\n// only convert values where we do not lose original data\nfunction convertValue(type: string | undefined, value: unknown) {\n    const valueType = getTypeOf(value);\n    if (type === undefined || value == null || valueType === type || (valueType === \"number\" && type === \"integer\")) {\n        return value;\n    }\n\n    if (type === \"string\") {\n        return JSON.stringify(value);\n    } else if (valueType !== \"string\") {\n        return value;\n    }\n\n    try {\n        const parsedValue = JSON.parse(value as string);\n        if (getTypeOf(parsedValue) === type) {\n            return parsedValue;\n        }\n    } catch (e) {} // eslint-disable-line @typescript-eslint/no-unused-vars, no-empty\n\n    return value;\n}\n\nexport function getData(node: SchemaNode, data?: unknown, opts?: TemplateOptions) {\n    if (opts?.cache == null) {\n        throw new Error(\"Missing options\");\n    }\n\n    // @ts-expect-error boolean schema\n    if (node.schema === false || node.schema === true) {\n        return data;\n    }\n    // @attention - very special case to support file instances\n    if (isFile(data)) {\n        return data;\n    }\n\n    if (node.schema?.const !== undefined) {\n        return node.schema?.const;\n    }\n\n    let currentNode = node;\n    let defaultData = data;\n\n    if (Array.isArray(node.schema.enum) && node.schema.enum.length > 0) {\n        if (data === undefined) {\n            return node.schema.default ?? node.schema.enum[0];\n        }\n    }\n\n    if (node.schema.default !== undefined) {\n        if (defaultData === undefined) {\n            defaultData = node.schema.default;\n        }\n    }\n\n    // @keyword allOf\n    if (currentNode.allOf?.length) {\n        currentNode.allOf.forEach((partialNode) => {\n            defaultData = partialNode.getData(defaultData, opts) ?? defaultData;\n        });\n    }\n\n    // @keyword anyOf\n    if (currentNode.anyOf && currentNode.anyOf?.length > 0) {\n        defaultData = currentNode.anyOf[0].getData(defaultData, opts) ?? defaultData;\n    }\n\n    // @keyword oneOf\n    if (currentNode.oneOf && currentNode.oneOf?.length > 0) {\n        if (isEmpty(defaultData)) {\n            currentNode = mergeNode(currentNode, currentNode.oneOf[0]) as SchemaNode;\n        } else {\n            // find correct schema for data\n            const resolvedNode = reduceOneOfFuzzy({ node: currentNode, data: defaultData, path: [], pointer: \"#\" });\n            if (isJsonError(resolvedNode)) {\n                if (defaultData != null && opts.removeInvalidData !== true) {\n                    return defaultData;\n                }\n                // override\n                currentNode = currentNode.oneOf[0];\n                defaultData = undefined;\n            } else {\n                currentNode = mergeNode(currentNode, resolvedNode) as SchemaNode;\n            }\n        }\n    }\n\n    const resolvedNode = safeResolveRef(currentNode, opts);\n    if (resolvedNode === false) {\n        return defaultData;\n    }\n\n    if (isSchemaNode(resolvedNode)) {\n        defaultData = resolvedNode.getData(defaultData, opts) ?? defaultData;\n        currentNode = resolvedNode;\n    }\n\n    const type = getSchemaType(currentNode, defaultData);\n    const templateData = TYPE[type as string]?.(currentNode, defaultData, opts);\n    return templateData === undefined ? defaultData : templateData;\n}\n\nconst TYPE: Record<string, (node: SchemaNode, data: unknown, opts: TemplateOptions) => unknown> = {\n    null: (node, data, opts) => getDefault(node, data, null, opts.useTypeDefaults),\n    string: (node, data, opts) => getDefault(node, data, \"\", opts.useTypeDefaults),\n    number: (node, data, opts) => getDefault(node, data, 0, opts.useTypeDefaults),\n    integer: (node, data, opts) => getDefault(node, data, 0, opts.useTypeDefaults),\n    boolean: (node, data, opts) => getDefault(node, data, false, opts.useTypeDefaults),\n    // object: (draft, schema, data: Record<string, unknown> | undefined, pointer: JsonPointer, opts: TemplateOptions) => {\n    object: (node, data, opts) => {\n        const schema = node.schema;\n        const template = schema.default === undefined ? {} : schema.default;\n        const d: Record<string, unknown> = {}; // do not assign data here, to keep ordering from json-schema\n        const required = opts.extendDefaults === false && schema.default !== undefined ? [] : (schema.required ?? []);\n\n        const properties = node.properties;\n        if (properties) {\n            Object.keys(properties).forEach((propertyName) => {\n                const propertyNode = properties[propertyName];\n                const isRequired = required.includes(propertyName);\n                const input = getValue(data, propertyName);\n                const value = data === undefined || input === undefined ? getValue(template, propertyName) : input;\n                // Omit adding a property if it is not required or optional props should be added\n                if (value != null || isRequired || opts.addOptionalProps) {\n                    const propertyValue = propertyNode.getData(value, opts);\n                    if (propertyValue !== undefined || opts.useTypeDefaults !== false) {\n                        d[propertyName] = propertyValue;\n                    }\n                }\n            });\n        }\n\n        const dependentRequired = node.dependentRequired;\n        if (isObject(dependentRequired)) {\n            Object.keys(dependentRequired).forEach((propertyName) => {\n                const propertyValue = dependentRequired[propertyName];\n                const hasValue = getValue(d, propertyName) !== undefined;\n                if (hasValue) {\n                    propertyValue.forEach((addProperty) => {\n                        const { node: propertyNode } = node.getNodeChild(addProperty, d);\n                        if (propertyNode) {\n                            d[addProperty] = propertyNode.getData(getValue(d, addProperty), opts);\n                        }\n                    });\n                }\n                // if false and removeInvalidData => remove from data\n            });\n        }\n\n        // @keyword dependencies - has to be done after resolving properties so dependency may trigger\n        const dependentSchemas = node.dependentSchemas;\n        if (dependentSchemas) {\n            Object.keys(dependentSchemas).forEach((prop) => {\n                const dependency = dependentSchemas[prop];\n                if (d[prop] !== undefined && isSchemaNode(dependency)) {\n                    const dependencyData = dependency.getData(data ?? d, opts);\n                    Object.assign(d, dependencyData);\n                }\n                // if false and removeInvalidData => remove from data\n            });\n        }\n\n        // console.log(\"getData object\", data, opts);\n        if (data) {\n            if (\n                opts.removeInvalidData === true &&\n                (schema.additionalProperties === false || isObject(schema.additionalProperties))\n            ) {\n                const additionalProperties = node.additionalProperties;\n                if (isSchemaNode(additionalProperties)) {\n                    Object.keys(data).forEach((key) => {\n                        if (d[key] == null) {\n                            // merge valid missing data (additionals) to resulting object\n                            const value = getValue(data, key);\n                            if (additionalProperties.validate(value).valid) {\n                                d[key] = value;\n                            }\n                        }\n                    });\n                }\n            } else {\n                // merge any missing data (additionals) to resulting object\n                Object.keys(data).forEach((key) => d[key] == null && (d[key] = getValue(data, key)));\n            }\n        }\n\n        // @keyword if-then-else\n        if (node.if) {\n            const { valid } = node.if.validate(d);\n            if (valid && node.then) {\n                const templateData = node.then.getData(d, opts);\n                Object.assign(d, templateData);\n            } else if (!valid && node.else) {\n                const templateData = node.else.getData(d, opts);\n                Object.assign(d, templateData);\n            }\n        }\n\n        // returns object, which is ordered by json-schema\n        return { ...template, ...d };\n    },\n    // build array type of items, ignores additionalItems\n    array: (node, data, opts) => {\n        const schema = node.schema;\n        const template = schema.default === undefined ? [] : schema.default;\n        const d: unknown[] = Array.isArray(data) ? [...data] : template;\n        const minItems = opts.extendDefaults === false && schema.default !== undefined ? 0 : (schema.minItems ?? 0);\n\n        // when there are no array-items are defined\n        if (schema.items == null) {\n            // => all items are additionalItems\n            if (node.items) {\n                const itemCount = Math.max(minItems, d.length);\n                for (let i = 0; i < itemCount; i += 1) {\n                    d[i] = node.items.getData(d[i], opts);\n                }\n            }\n            return d || [];\n        }\n\n        // when items are defined per index\n        if (node.prefixItems) {\n            const input = Array.isArray(data) ? data : [];\n\n            // build defined set of items\n            const length = Math.max(minItems ?? 0, node.prefixItems.length);\n            for (let i = 0; i < length; i += 1) {\n                const childNode = node.prefixItems[i] ?? node.items;\n                if ((childNode && canResolveRef(childNode, opts)) || input[i] !== undefined) {\n                    const result = childNode.getData(d[i] == null ? template[i] : d[i], opts);\n                    if (result !== undefined) {\n                        d[i] = result;\n                    }\n                }\n            }\n            return d || [];\n        }\n\n        // this has to be defined as we checked all other cases\n        if (node.items == null) {\n            return d;\n        }\n\n        // build data from items-definition\n        if ((node.items && canResolveRef(node.items, opts)) || (Array.isArray(data) && data?.length > 0)) {\n            // @attention this should disable cache or break intended behaviour as we reset it after loop\n            // intention: reset cache after each property. last call will add counters\n            const cache = { ...opts.cache };\n            for (let i = 0, l = Math.max(minItems, d.length); i < l; i += 1) {\n                opts.cache = copy(cache);\n                const options = { ...opts, disableRecursionLimit: true };\n                const result = node.items.getData(d[i] == null ? template[i] : d[i], options);\n                // @attention if getData aborts recursion it currently returns undefined)\n                if (result === undefined) {\n                    return d;\n                } else {\n                    d[i] = result;\n                }\n            }\n        }\n\n        return d;\n    }\n};\n\nfunction getDefault({ schema }: SchemaNode, templateValue: unknown, initValue: unknown, useTypeDefaults?: boolean) {\n    if (templateValue !== undefined) {\n        return convertValue(schema.type, templateValue);\n    } else if (schema.const) {\n        return schema.const;\n    } else if (schema.default === undefined && Array.isArray(schema.enum)) {\n        return schema.enum[0];\n    } else if (schema.default === undefined && useTypeDefaults !== false) {\n        return initValue;\n    }\n    return schema.default;\n}\n","import { Keyword, JsonSchemaResolverParams, JsonSchemaValidatorParams, ValidationReturnType } from \"../../Keyword\";\nimport { SchemaNode } from \"../../types\";\nimport { isObject } from \"../../utils/isObject\";\nimport { validateNode } from \"../../validateNode\";\n\nconst KEYWORD = \"items\";\n\nexport const itemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseItems,\n    addResolve: (node) => (node.prefixItems || node[KEYWORD]) != null,\n    resolve: itemsResolver,\n    addValidate: ({ schema }) => schema.items != null,\n    validate: validateItems\n};\n\nfunction itemsResolver({ node, key }: JsonSchemaResolverParams) {\n    if (node.prefixItems?.[key as number]) {\n        return node.prefixItems[key as number];\n    }\n    if (node.items) {\n        return node.items;\n    }\n}\n\nexport function parseItems(node: SchemaNode) {\n    const { schema, evaluationPath } = node;\n    const items = schema[KEYWORD];\n    if (items == null || typeof items === \"boolean\") {\n        return;\n    }\n\n    if (isObject(items)) {\n        const propertyNode = node.compileSchema(\n            items,\n            `${evaluationPath}/${KEYWORD}`,\n            `${node.schemaLocation}/${KEYWORD}`\n        );\n        node.items = propertyNode;\n        return;\n    }\n\n    if (Array.isArray(items)) {\n        node.prefixItems = items.map((itemSchema, index) =>\n            node.compileSchema(\n                itemSchema,\n                `${evaluationPath}/${KEYWORD}/${index}`,\n                `${node.schemaLocation}/${KEYWORD}/${index}`\n            )\n        );\n        return;\n    }\n\n    return node.createError(\"schema-error\", {\n        pointer: evaluationPath,\n        schema,\n        value: undefined,\n        message: `Keyword '${KEYWORD}' must be an object or array - received '${typeof items}'`\n    });\n}\n\nfunction validateItems({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    if (!Array.isArray(data) || data.length === 0) {\n        return;\n    }\n\n    // @draft >= 7 bool schema\n    if (schema.items === false) {\n        if (Array.isArray(data) && data.length === 0) {\n            return undefined;\n        }\n        return node.createError(\"invalid-data-error\", { pointer, value: data, schema });\n    }\n\n    const errors: ValidationReturnType = [];\n    if (node.prefixItems) {\n        // note: schema is valid when data does not have enough elements as defined by array-list\n        for (let i = 0; i < Math.min(node.prefixItems.length, data.length); i += 1) {\n            const itemData = data[i];\n            const itemNode = node.prefixItems[i];\n            const result = validateNode(itemNode, itemData, `${pointer}/${i}`, path);\n            errors.push(...result);\n        }\n        return errors;\n    }\n\n    if (node.items) {\n        for (let i = 0; i < data.length; i += 1) {\n            const itemData = data[i];\n            const result = validateNode(node.items, itemData, `${pointer}/${i}`, path);\n            if (result) {\n                errors.push(...result);\n            }\n        }\n        return errors;\n    }\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { isNumber, SchemaNode } from \"../types\";\n\nconst KEYWORD = \"maximum\";\n\nexport const maximumKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMaximum,\n    addValidate: (node) => node.maximum != null,\n    validate: validateMaximum\n};\n\nfunction parseMaximum(node: SchemaNode) {\n    const max = node.schema[KEYWORD];\n    if (max == null) {\n        return;\n    }\n    if (!isNumber(max)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: max,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof max}'`\n        });\n    }\n    node[KEYWORD] = max;\n}\n\nfunction validateMaximum({ node, data, pointer }: JsonSchemaValidatorParams) {\n    if (!isNumber(data)) {\n        return undefined;\n    }\n\n    const max = node[KEYWORD];\n    const { schema } = node;\n    if (max && max < data) {\n        return node.createError(\"maximum-error\", {\n            maximum: max,\n            length: data,\n            value: data,\n            pointer,\n            schema\n        });\n    }\n    if (max && schema.exclusiveMaximum === true && max === data) {\n        return node.createError(\"maximum-error\", {\n            maximum: max,\n            length: data,\n            pointer,\n            schema,\n            value: data\n        });\n    }\n    return undefined;\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { isNumber, SchemaNode } from \"../types\";\n\nconst KEYWORD = \"maxItems\";\n\nexport const maxItemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMaxItems,\n    addValidate: ({ schema }) => !isNaN(schema.maxItems),\n    validate: validateMaxItems\n};\n\nfunction parseMaxItems(node: SchemaNode) {\n    const max = node.schema[KEYWORD];\n    if (max == null) {\n        return;\n    }\n    if (!isNumber(max)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: max,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof max}'`\n        });\n    }\n    node[KEYWORD] = max;\n}\n\nfunction validateMaxItems({ node, data, pointer }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    if (Array.isArray(data) && schema.maxItems < data.length) {\n        return node.createError(\"max-items-error\", {\n            maximum: schema.maxItems,\n            length: data.length,\n            schema,\n            value: data,\n            pointer\n        });\n    }\n}\n","/* eslint no-bitwise: 0 */\n\n/**\n * taken from punycode@2.1.0\n *\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param string The Unicode input string (UCS-2).\n * @returns The new array of code points.\n */\nexport default function ucs2decode(string: string): string[] {\n    const output: number[] = [];\n    let counter = 0;\n    const length = string.length;\n    while (counter < length) {\n        const value = string.charCodeAt(counter++);\n        if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n            // It's a high surrogate, and there is a next character.\n            const extra = string.charCodeAt(counter++);\n            if ((extra & 0xfc00) == 0xdc00) {\n                // Low surrogate.\n                output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n            } else {\n                // It's an unmatched surrogate; only append this code unit, in case the\n                // next code unit is the high surrogate of a surrogate pair.\n                output.push(value);\n                counter--;\n            }\n        } else {\n            output.push(value);\n        }\n    }\n    return output as unknown as string[];\n}\n","import ucs2decode from \"../utils/punycode.ucs2decode\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { isNumber } from \"../types\";\n\nconst KEYWORD = \"maxLength\";\n\nexport const maxLengthKeyword: Keyword<\"maxLength\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMaxLength,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateMaxLength\n};\n\nfunction parseMaxLength(node: SchemaNode) {\n    const max = node.schema[KEYWORD];\n    if (max == null) {\n        return;\n    }\n    if (!isNumber(max)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: max,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof max}'`\n        });\n    }\n    node[KEYWORD] = max;\n}\n\nfunction validateMaxLength({ node, data, pointer = \"#\" }: JsonSchemaValidatorParams<\"maxLength\">) {\n    if (typeof data !== \"string\") {\n        return;\n    }\n    const maxLength = node[KEYWORD];\n    const length = ucs2decode(data).length;\n    if (maxLength < length) {\n        return node.createError(\"max-length-error\", {\n            maxLength: maxLength,\n            length,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","import { isObject } from \"../utils/isObject\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { isNumber } from \"../types\";\n\nconst KEYWORD = \"maxProperties\";\n\nexport const maxPropertiesKeyword: Keyword<typeof KEYWORD> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMaxProperties,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateMaxProperties\n};\n\nfunction parseMaxProperties(node: SchemaNode) {\n    const max = node.schema[KEYWORD];\n    if (max == null) {\n        return;\n    }\n    if (!isNumber(max)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: max,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof max}'`\n        });\n    }\n    node[KEYWORD] = max;\n}\n\nfunction validateMaxProperties({ node, data, pointer = \"#\" }: JsonSchemaValidatorParams<typeof KEYWORD>) {\n    if (!isObject(data)) {\n        return;\n    }\n    const maxProperties = node[KEYWORD];\n    const propertyCount = Object.keys(data).length;\n    if (maxProperties < propertyCount) {\n        return node.createError(\"max-properties-error\", {\n            maxProperties: maxProperties,\n            length: propertyCount,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { isNumber, SchemaNode } from \"../types\";\n\nconst KEYWORD = \"minimum\";\n\nexport const minimumKeyword: Keyword<\"minimum\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMinimum,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateMinimum\n};\n\nfunction parseMinimum(node: SchemaNode) {\n    const min = node.schema[KEYWORD];\n    if (min == null) {\n        return;\n    }\n    if (!isNumber(min)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: min,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof min}'`\n        });\n    }\n    node[KEYWORD] = min;\n}\n\nfunction validateMinimum({ node, data, pointer }: JsonSchemaValidatorParams<\"minimum\">) {\n    if (!isNumber(data)) {\n        return undefined;\n    }\n    const min = node[KEYWORD];\n    if (min > data) {\n        return node.createError(\"minimum-error\", {\n            minimum: min,\n            length: data,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n    if (node.schema.exclusiveMinimum === true && node.schema.minimum === data) {\n        return node.createError(\"minimum-error\", {\n            minimum: min,\n            length: data,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n    return undefined;\n}\n","import { JsonSchemaValidatorParams, Keyword } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { isNumber } from \"../types\";\n\nconst KEYWORD = \"minItems\";\n\nexport const minItemsKeyword: Keyword<\"minItems\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMinItems,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateMinItems\n};\n\nfunction parseMinItems(node: SchemaNode) {\n    const min = node.schema[KEYWORD];\n    if (min == null) {\n        return;\n    }\n    if (!isNumber(min)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: min,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof min}'`\n        });\n    }\n    node[KEYWORD] = min;\n}\n\nfunction validateMinItems({ node, data, pointer }: JsonSchemaValidatorParams<\"minItems\">) {\n    if (!Array.isArray(data)) {\n        return;\n    }\n    const minItems = node[KEYWORD];\n    if (minItems > data.length) {\n        return node.createError(\"min-items-error\", {\n            minItems: minItems,\n            length: data.length,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","import ucs2decode from \"../utils/punycode.ucs2decode\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { isNumber } from \"../types\";\n\nconst KEYWORD = \"minLength\";\n\nexport const minLengthKeyword: Keyword<\"minLength\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMinLength,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateMinLength\n};\n\nfunction parseMinLength(node: SchemaNode) {\n    const min = node.schema[KEYWORD];\n    if (min == null) {\n        return;\n    }\n    if (!isNumber(min)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: min,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof min}'`\n        });\n    }\n    node[KEYWORD] = min;\n}\n\nfunction validateMinLength({ node, data, pointer = \"#\" }: JsonSchemaValidatorParams<\"minLength\">) {\n    if (typeof data !== \"string\") {\n        return;\n    }\n    const length = ucs2decode(data).length;\n    const minLength = node[KEYWORD];\n    if (minLength <= length) {\n        return;\n    }\n    return node.createError(\"min-length-error\", {\n        minLength,\n        length,\n        pointer,\n        schema: node.schema,\n        value: data\n    });\n}\n","import { isObject } from \"../utils/isObject\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { isNumber } from \"../types\";\n\nconst KEYWORD = \"minProperties\";\n\nexport const minPropertiesKeyword: Keyword<\"minProperties\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMinItems,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateMinProperties\n};\n\nfunction parseMinItems(node: SchemaNode) {\n    const min = node.schema[KEYWORD];\n    if (min == null) {\n        return;\n    }\n    if (!isNumber(min)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: min,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof min}'`\n        });\n    }\n    node[KEYWORD] = min;\n}\n\nfunction validateMinProperties({ node, data, pointer = \"#\" }: JsonSchemaValidatorParams<\"minProperties\">) {\n    if (!isObject(data)) {\n        return;\n    }\n    const propertyCount = Object.keys(data).length;\n    if (node.schema.minProperties > propertyCount) {\n        return node.createError(\"min-properties-error\", {\n            minProperties: node.schema.minProperties,\n            length: propertyCount,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","/**\n * returns the floating point precision of a decimal number or 0\n */\nexport function getPrecision(value: number): number {\n    const string = `${value}`;\n    if (string.includes(\"e-\")) {\n        return parseInt(string.replace(/.*e-/, \"\"));\n    }\n    const index = string.indexOf(\".\");\n    return index === -1 ? 0 : string.length - (index + 1);\n}\n","import { getPrecision } from \"../utils/getPrecision\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { isNumber } from \"../types\";\n\nconst KEYWORD = \"multipleOf\";\n\nexport const multipleOfKeyword: Keyword<\"multipleOf\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseMultipleOf,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateMultipleOf\n};\n\nfunction parseMultipleOf(node: SchemaNode) {\n    const multipleOf = node.schema[KEYWORD];\n    if (multipleOf == null) {\n        return;\n    }\n    if (!isNumber(multipleOf)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: multipleOf,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof multipleOf}'`\n        });\n    }\n    node[KEYWORD] = multipleOf;\n}\n\nfunction validateMultipleOf({ node, data, pointer }: JsonSchemaValidatorParams<\"multipleOf\">) {\n    if (typeof data !== \"number\") {\n        return undefined;\n    }\n    const multipleOf = node[KEYWORD];\n    const valuePrecision = getPrecision(data);\n    const multiplePrecision = getPrecision(multipleOf);\n    if (valuePrecision > multiplePrecision) {\n        // value with higher precision then multipleOf-precision can never be multiple\n        return node.createError(\"multiple-of-error\", {\n            multipleOf,\n            value: data,\n            pointer,\n            schema: node.schema\n        });\n    }\n\n    const precision = Math.pow(10, multiplePrecision);\n    const val = Math.round(data * precision);\n    const multiple = Math.round(multipleOf * precision);\n    if ((val % multiple) / precision !== 0) {\n        return node.createError(\"multiple-of-error\", {\n            multipleOf: multipleOf,\n            value: data,\n            pointer,\n            schema: node.schema\n        });\n    }\n\n    // maybe also check overflow\n    // https://stackoverflow.com/questions/1815367/catch-and-compute-overflow-during-multiplication-of-two-large-integers\n    return undefined;\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { isBooleanSchema, isJsonSchema, SchemaNode } from \"../types\";\nimport { validateNode } from \"../validateNode\";\n\nconst KEYWORD = \"not\";\n\nexport const notKeyword: Keyword<\"not\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseNot,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateNot\n};\n\nexport function parseNot(node: SchemaNode) {\n    const { schema, evaluationPath, schemaLocation } = node;\n    const not = schema[KEYWORD];\n    if (not == null) {\n        return;\n    }\n    if (!isJsonSchema(not) && !isBooleanSchema(not)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${schemaLocation}/${KEYWORD}`,\n            schema,\n            value: not,\n            message: `Keyword '${KEYWORD}' must be a valid JSON Schema - received '${typeof not}'`\n        });\n    }\n    node[KEYWORD] = node.compileSchema(schema[KEYWORD], `${evaluationPath}/not`, `${schemaLocation}/not`);\n    return node[KEYWORD].schemaValidation;\n}\n\nfunction validateNot({ node, data, pointer, path }: JsonSchemaValidatorParams<\"not\">) {\n    const { schema } = node;\n    // not has been tested in addValidate\n    if (validateNode(node[KEYWORD]!, data, pointer, path).length === 0) {\n        return node.createError(\"not-error\", { value: data, not: schema[KEYWORD], pointer, schema });\n    }\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport settings from \"../settings\";\n\nconst KEYWORD = \"pattern\";\nconst { REGEX_FLAGS } = settings;\n\nexport const patternKeyword: Keyword<\"pattern\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parsePattern,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validatePattern\n};\n\nfunction parsePattern(node: SchemaNode) {\n    const pattern = node.schema[KEYWORD];\n    if (pattern == null) {\n        return;\n    }\n    if (typeof pattern !== \"string\") {\n        return node.createError(\"schema-error\", {\n            pointer: node.schemaLocation,\n            schema: node.schema,\n            value: pattern,\n            message: `Keyword 'pattern' must be a string - received '${typeof pattern}'`\n        });\n    }\n    try {\n        node[KEYWORD] = new RegExp(pattern, node.schema.regexFlags ?? REGEX_FLAGS);\n    } catch (e) {\n        return node.createError(\"schema-error\", {\n            pointer: node.schemaLocation,\n            schema: node.schema,\n            value: pattern,\n            message: (e as Error).message\n        });\n    }\n}\n\nfunction validatePattern({ node, data, pointer = \"#\" }: JsonSchemaValidatorParams<\"pattern\">) {\n    if (typeof data !== \"string\") {\n        return;\n    }\n    if (node.pattern.test(data) === false) {\n        const { schema } = node;\n        return node.createError(\"pattern-error\", {\n            pattern: schema.pattern,\n            description: schema.patternExample || schema.pattern,\n            received: data,\n            schema,\n            value: data,\n            pointer\n        });\n    }\n}\n","import { mergeSchema } from \"../utils/mergeSchema\";\nimport { JsonSchema, SchemaNode } from \"../types\";\nimport { isObject } from \"../utils/isObject\";\nimport {\n    Keyword,\n    JsonSchemaReducerParams,\n    JsonSchemaResolverParams,\n    JsonSchemaValidatorParams,\n    ValidationReturnType,\n    ValidationAnnotation\n} from \"../Keyword\";\nimport { getValue } from \"../utils/getValue\";\nimport { validateNode } from \"../validateNode\";\nimport settings from \"../settings\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nconst { REGEX_FLAGS } = settings;\n\nexport const patternPropertiesKeyword: Keyword = {\n    id: \"patternProperties\",\n    keyword: \"patternProperties\",\n    parse: parsePatternProperties,\n    addReduce: (node) => node.patternProperties != null,\n    reduce: reducePatternProperties,\n    addResolve: (node) => node.patternProperties != null,\n    resolve: patternPropertyResolver,\n    addValidate: (node) => node.patternProperties != null,\n    validate: validatePatternProperties\n};\n\nexport function parsePatternProperties(node: SchemaNode) {\n    const { schema } = node;\n    if (!isObject(schema.patternProperties)) {\n        return;\n    }\n    const patterns = Object.keys(schema.patternProperties);\n    if (patterns.length === 0) {\n        return;\n    }\n\n    node.patternProperties = patterns.map((pattern) => ({\n        name: pattern,\n        pattern: new RegExp(pattern, schema.regexFlags ?? REGEX_FLAGS),\n        node: node.compileSchema(\n            schema.patternProperties[pattern],\n            `${node.evaluationPath}/patternProperties/${pattern}`,\n            `${node.schemaLocation}/patternProperties/${pattern}`\n        )\n    }));\n\n    return collectValidationErrors([], ...node.patternProperties.map(({ node }) => node));\n}\n\nfunction patternPropertyResolver({ node, key }: JsonSchemaResolverParams) {\n    return node.patternProperties?.find(({ pattern }) => pattern.test(`${key}`))?.node;\n}\n\nfunction reducePatternProperties({ node, data, key }: JsonSchemaReducerParams) {\n    const { patternProperties } = node;\n    if (patternProperties == null) {\n        return;\n    }\n\n    let mergedSchema: JsonSchema | undefined;\n    const dataProperties = Object.keys(data ?? {});\n    if (key) {\n        dataProperties.push(`${key}`);\n    }\n\n    let dynamicId = `${node.schemaLocation}(`;\n    dataProperties.push(...Object.keys(node.schema.properties ?? {}));\n    dataProperties.forEach((propertyName, index, list) => {\n        if (list.indexOf(propertyName) !== index) {\n            // duplicate\n            return;\n        }\n        // build schema of property\n        let propertySchema = node.schema.properties?.[propertyName] ?? {};\n        const matchingPatterns = patternProperties.filter((property) => property.pattern.test(propertyName));\n        matchingPatterns.forEach((pp) => (propertySchema = mergeSchema(propertySchema, pp.node.schema)));\n        if (matchingPatterns.length > 0) {\n            mergedSchema = mergedSchema ?? { properties: {} };\n            mergedSchema.properties[propertyName] = propertySchema;\n            dynamicId += `${matchingPatterns.map(({ name }) => `patternProperties/${name}`).join(\",\")}`;\n        }\n    });\n\n    if (mergedSchema == null) {\n        return node;\n    }\n\n    mergedSchema = mergeSchema(node.schema, mergedSchema, \"patternProperties\");\n    return node.compileSchema(mergedSchema, node.evaluationPath, node.schemaLocation, `${dynamicId})`);\n}\n\nfunction validatePatternProperties({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    if (!isObject(data)) {\n        return;\n    }\n    const { schema, patternProperties } = node;\n    const properties = schema.properties || {};\n    const patterns = Object.keys(schema.patternProperties).join(\",\");\n    const errors: ValidationReturnType = [];\n    const keys = Object.keys(data);\n\n    keys.forEach((key) => {\n        const value = getValue(data, key);\n        // patternProperties was tested in addValidate\n        const matchingPatterns = patternProperties!.filter((property) => property.pattern.test(key));\n        matchingPatterns.forEach(({ node }) => errors.push(...validateNode(node, value, `${pointer}/${key}`, path)));\n\n        if (properties[key]) {\n            return;\n        }\n\n        if (matchingPatterns.length === 0 && schema.additionalProperties === false) {\n            // this is an arrangement with additionalProperties\n            errors.push(\n                node.createError(\"no-additional-properties-error\", {\n                    key,\n                    pointer: `${pointer}/${key}`,\n                    schema,\n                    value,\n                    patterns\n                })\n            );\n        }\n    });\n\n    return errors;\n}\n","import { getValue } from \"../utils/getValue\";\nimport { SchemaNode } from \"../types\";\nimport {\n    Keyword,\n    JsonSchemaResolverParams,\n    JsonSchemaValidatorParams,\n    ValidationReturnType,\n    ValidationAnnotation\n} from \"../Keyword\";\nimport { isObject } from \"../utils/isObject\";\nimport { validateNode } from \"../validateNode\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nexport const propertiesKeyword: Keyword = {\n    id: \"property\",\n    keyword: \"properties\",\n    parse: parseProperties,\n    addResolve: (node: SchemaNode) => node.properties != null,\n    resolve: propertyResolver,\n    addValidate: (node: SchemaNode) => node.properties != null,\n    validate: validateProperties\n};\n\nfunction propertyResolver({ node, key }: JsonSchemaResolverParams) {\n    return node.properties?.[key];\n}\n\nexport function parseProperties(node: SchemaNode) {\n    const { schema, evaluationPath, schemaLocation } = node;\n    if (schema.properties == null) {\n        return;\n    }\n\n    if (schema.properties && !isObject(schema.properties)) {\n        return node.createError(\"schema-error\", {\n            pointer: schemaLocation,\n            schema,\n            value: undefined,\n            message: \"keyword `properties` must be of type `object`\"\n        });\n    }\n\n    const errors: ValidationAnnotation[] = [];\n    const parsedProperties: Record<string, SchemaNode> = {};\n    Object.keys(schema.properties).forEach((propertyName) => {\n        const propertyNode = node.compileSchema(\n            schema.properties[propertyName],\n            `${evaluationPath}/properties/${propertyName}`,\n            `${schemaLocation}/properties/${propertyName}`\n        );\n        parsedProperties[propertyName] = propertyNode;\n        collectValidationErrors(errors, parsedProperties[propertyName]);\n    });\n    node.properties = parsedProperties;\n\n    return errors;\n}\n\nfunction validateProperties({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    if (!isObject(data)) {\n        return;\n    }\n    // move validation through properties\n    const errors: ValidationReturnType = [];\n    const properties = node.properties ?? {};\n    Object.keys(data).forEach((propertyName) => {\n        const value = getValue(data, propertyName);\n        const propertyNode = properties[propertyName];\n\n        if (propertyNode == null || value === void 0) {\n            return;\n        }\n\n        const result = validateNode(propertyNode, value, `${pointer}/${propertyName}`, path);\n        errors.push(...result);\n    });\n    return errors;\n}\n","import { isBooleanSchema, isJsonSchema, JsonError } from \"../types\";\nimport { isObject } from \"../utils/isObject\";\nimport { SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { validateNode } from \"../validateNode\";\n\nconst KEYWORD = \"propertyNames\";\n\nexport const propertyNamesKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parsePropertyNames,\n    addValidate: (node) => node.schema[KEYWORD] != null,\n    validate: validatePropertyNames\n};\n\nexport function parsePropertyNames(node: SchemaNode) {\n    const propertyNames = node.schema[KEYWORD];\n    if (propertyNames == null) {\n        return;\n    }\n    if (!(isJsonSchema(propertyNames) || isBooleanSchema(propertyNames))) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: propertyNames,\n            message: `Keyword '${KEYWORD}' must be a valid JSON Schema - received '${typeof propertyNames}'`\n        });\n    }\n    if (isBooleanSchema(propertyNames)) {\n        return;\n    }\n    node.propertyNames = node.compileSchema(\n        propertyNames,\n        `${node.evaluationPath}/propertyNames`,\n        `${node.schemaLocation}/propertyNames`\n    );\n    return node.propertyNames.schemaValidation;\n}\n\nfunction validatePropertyNames({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    if (!isObject(data)) {\n        return undefined;\n    }\n\n    // bool schema\n    if (schema.propertyNames === false) {\n        // empty objects are valid\n        if (Object.keys(data).length === 0) {\n            return undefined;\n        }\n        return node.createError(\"invalid-property-name-error\", {\n            property: Object.keys(data),\n            pointer,\n            value: data,\n            schema\n        });\n    }\n\n    if (schema[KEYWORD] === true) {\n        return undefined;\n    }\n\n    const propertyNames = node[KEYWORD];\n    if (!isObject(propertyNames)) {\n        // ignore invalid schema\n        return undefined;\n    }\n\n    const errors: JsonError[] = [];\n    const properties = Object.keys(data);\n    properties.forEach((prop) => {\n        const validationResult = validateNode(propertyNames, prop, `${pointer}/${prop}`, path);\n        if (validationResult.length > 0) {\n            errors.push(\n                node.createError(\"invalid-property-name-error\", {\n                    property: prop,\n                    pointer,\n                    validationError: validationResult[0],\n                    value: data[prop],\n                    schema\n                })\n            );\n        }\n    });\n\n    return errors;\n}\n","import { isObject } from \"../utils/isObject\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { hasProperty } from \"../utils/hasProperty\";\nimport { SchemaNode } from \"../SchemaNode\";\nimport { isListOfStrings } from \"../utils/isListOfStrings\";\n\nconst KEYWORD = \"required\";\n\nexport const requiredKeyword: Keyword<\"required\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseRequired,\n    addValidate: (node) => node.required != null,\n    validate: validateRequired\n};\n\nfunction parseRequired(node: SchemaNode) {\n    const required = node.schema[KEYWORD];\n    if (required == null) {\n        return;\n    }\n\n    if (!isListOfStrings(required)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: required,\n            message: `Keyword '${KEYWORD}' must be a string[]`\n        });\n    }\n\n    node.required = required;\n}\n\nfunction validateRequired({ node, data, pointer = \"#\" }: JsonSchemaValidatorParams<\"required\">) {\n    const { required } = node;\n    if (!isObject(data)) {\n        return undefined;\n    }\n    return required.map((property: string) => {\n        if (!hasProperty(data, property)) {\n            return node.createError(\"required-property-error\", {\n                key: property,\n                pointer,\n                schema: node.schema,\n                value: data\n            });\n        }\n        return undefined;\n    });\n}\n","import { Draft } from \"../types\";\n\nexport function copyDraft(draft: Draft) {\n    return {\n        ...draft,\n        keywords: [...draft.keywords.map((f) => ({ ...f }))]\n    };\n}\n","import type { JsonSchemaValidator, Keyword } from \"./Keyword\";\nimport { copyDraft } from \"./utils/copyDraft\";\nimport { createSchema } from \"./methods/createSchema\";\nimport { toDataNodes } from \"./methods/toDataNodes\";\nimport { ErrorConfig } from \"./types\";\nimport { getChildSelection } from \"./methods/getChildSelection\";\nimport { getData } from \"./methods/getData\";\n\nexport type DraftVersion = \"draft-04\" | \"draft-06\" | \"draft-07\" | \"draft-2019-09\" | \"draft-2020-12\" | \"latest\";\n\nexport interface Draft {\n    /** test-string if draft can be used with $schema-url */\n    $schemaRegEx: string;\n    /** draft-version of this draft, e.g. draft-2020-12 */\n    version: DraftVersion;\n    /** supported keywords and implementation */\n    keywords: Keyword[];\n    /** draft-dependent methods */\n    methods: {\n        createSchema: typeof createSchema;\n        getChildSelection: typeof getChildSelection;\n        getData: typeof getData;\n        toDataNodes: typeof toDataNodes;\n    };\n    /** meta-schema url associated with this draft */\n    $schema?: string;\n    /** draft errors (this can still be global) */\n    errors: ErrorConfig;\n    formats: Record<string, JsonSchemaValidator>;\n}\n\ntype PartialDraft = Partial<Omit<Draft, \"errors\" | \"formats\">> & {\n    errors?: Partial<Draft[\"errors\"]>;\n    formats?: Partial<Draft[\"formats\"]>;\n};\n\nexport function extendDraft(draft: Draft, extension: PartialDraft) {\n    const { keywords } = addKeywords(draft, ...(extension.keywords ?? []));\n    const errors = { ...draft.errors, ...(extension.errors ?? {}) } as Draft[\"errors\"];\n    const formats = { ...draft.formats, ...((extension.formats ?? {}) as Draft[\"formats\"]) };\n    return sanitizeKeywords({\n        ...draft,\n        ...extension,\n        formats,\n        keywords,\n        errors\n    });\n}\n\nexport function addKeywords(draft: Draft, ...keywords: Keyword[]): Draft {\n    const customizedDraft = copyDraft(draft);\n    keywords.forEach((keyword) => addKeyword(customizedDraft, keyword));\n    return customizedDraft;\n}\n\n/**\n * Create a new draft adding or replacing a keyword based on keyword-property\n */\nfunction addKeyword(draft: Draft, keyword: Keyword) {\n    const index = draft.keywords.findIndex((f) => f.keyword === keyword.keyword);\n    if (index === -1) {\n        draft.keywords.push(keyword);\n    } else {\n        draft.keywords[index] = keyword;\n    }\n}\n\nexport function sanitizeKeywords(draft: Draft) {\n    draft.keywords?.forEach((keyword) => {\n        const logKeyword = () => keyword.keyword;\n        if (keyword.validate) {\n            keyword.validate.toJSON = logKeyword;\n            keyword.validate.order = keyword.order ?? 0;\n        }\n        if (keyword.reduce) {\n            keyword.reduce.toJSON = logKeyword;\n            keyword.reduce.order = keyword.order ?? 0;\n        }\n        if (keyword.resolve) {\n            keyword.resolve.toJSON = logKeyword;\n            keyword.resolve.order = keyword.order ?? 0;\n        }\n    });\n    draft.keywords?.sort((a, b) => (b.order ?? 0) - (a.order ?? 0));\n    return draft;\n}\n","import { getValue } from \"../utils/getValue\";\nimport { isObject } from \"../utils/isObject\";\nimport { SchemaNode } from \"../types\";\n\nexport type DataNode = { node: SchemaNode; value: unknown; pointer: string };\n\nexport function toDataNodes(node: SchemaNode, data: unknown, pointer = \"#\", dataNodes: DataNode[] = []) {\n    const currentNode = node.resolveRef() ?? node;\n    dataNodes.push({\n        node: currentNode,\n        value: data,\n        pointer\n    });\n\n    if (isObject(data)) {\n        Object.keys(data).forEach((key) => {\n            const { node: nextNode } = currentNode.getNodeChild(key, data);\n            if (nextNode) {\n                toDataNodes(nextNode, getValue(data, key), `${pointer}/${key}`, dataNodes);\n            }\n        });\n    } else if (Array.isArray(data)) {\n        data.forEach((next: unknown, key: number) => {\n            const { node: nextNode } = currentNode.getNodeChild(key, data);\n            if (nextNode) {\n                toDataNodes(nextNode, getValue(data, key), `${pointer}/${key}`, dataNodes);\n            }\n        });\n    }\n\n    return dataNodes;\n}\n","import { getTypeOf, JSType } from \"../utils/getTypeOf\";\nimport { SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaReducerParams, JsonSchemaValidatorParams } from \"../Keyword\";\n\nconst KEYWORD = \"type\";\nconst validTyes = [\"null\", \"boolean\", \"number\", \"integer\", \"string\", \"object\", \"array\"];\n\nexport const typeKeyword: Keyword<\"type\"> = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseType,\n    addReduce: (node) => Array.isArray(node.type),\n    reduce: reduceType,\n    addValidate: (node) => node.type != null,\n    validate: validateType\n};\n\nfunction parseType(node: SchemaNode) {\n    const type = node.schema[KEYWORD];\n    if (type == null) {\n        return;\n    }\n    if (typeof type !== \"string\" && !Array.isArray(type)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: type,\n            message: `Keyword '${KEYWORD}' must be a string or a string[] - received ${typeof type}`\n        });\n    }\n    if (typeof type === \"string\" && !validTyes.includes(type)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: type,\n            message: `Keyword '${KEYWORD}' is not a valid JSON Schema type - received '${type}'. Expected one of ${validTyes.join(\", \")}`\n        });\n    }\n\n    if (Array.isArray(type)) {\n        const invalidTypeIndex = type.findIndex((t) => !validTyes.includes(t));\n        if (invalidTypeIndex !== -1) {\n            return node.createError(\"schema-error\", {\n                pointer: `${node.schemaLocation}/${KEYWORD}/${invalidTypeIndex}`,\n                schema: node.schema,\n                value: type[invalidTypeIndex],\n                message: `Keyword '${KEYWORD}' contains an invalid JSON Schema type: '${type[invalidTypeIndex]}'`\n            });\n        }\n    }\n\n    node[KEYWORD] = type;\n}\n\nfunction reduceType({ node, pointer, data }: JsonSchemaReducerParams): undefined | SchemaNode {\n    const dataType = getJsonSchemaType(data, node.type!);\n    if (dataType !== \"undefined\" && Array.isArray(node.schema.type) && node.schema.type.includes(dataType)) {\n        return node.compileSchema({ ...node.schema, pointer, type: dataType }, node.evaluationPath);\n    }\n    return undefined;\n}\n\nfunction getJsonSchemaType(value: unknown, expectedType: string | string[]): JSType | \"integer\" {\n    const jsType = getTypeOf(value);\n    if (\n        jsType === \"number\" &&\n        (expectedType === \"integer\" || (Array.isArray(expectedType) && expectedType.includes(\"integer\")))\n    ) {\n        return Number.isInteger(value) || isNaN(value as number) ? \"integer\" : \"number\";\n    }\n    return jsType;\n}\n\nfunction validateType({ node, data, pointer }: JsonSchemaValidatorParams<\"type\">) {\n    const type = node[KEYWORD];\n    const dataType = getJsonSchemaType(data, type);\n    if (data === undefined || type === dataType || (Array.isArray(type) && type.includes(dataType))) {\n        return;\n    }\n\n    return node.createError(\"type-error\", {\n        value: data,\n        received: dataType,\n        expected: type,\n        schema: node.schema,\n        pointer\n    });\n}\n","import { JsonError, SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport deepEqual from \"fast-deep-equal\";\n\nconst KEYWORD = \"uniqueItems\";\n\nexport const uniqueItemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseUniqueItems,\n    addValidate: ({ schema }) => schema[KEYWORD] === true,\n    validate: validateUniqueItems\n};\n\nfunction parseUniqueItems(node: SchemaNode) {\n    const uniqueItems = node.schema[KEYWORD];\n    if (uniqueItems == null || uniqueItems === false) {\n        return;\n    }\n    if (typeof uniqueItems !== \"boolean\") {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: uniqueItems,\n            message: `Keyword '${KEYWORD}' must be a boolean - received ${typeof uniqueItems}`\n        });\n    }\n    node.uniqueItems = true;\n}\n\nfunction validateUniqueItems({ node, data, pointer }: JsonSchemaValidatorParams) {\n    if (!Array.isArray(data)) {\n        return undefined;\n    }\n    const { schema } = node;\n    const duplicates: number[] = [];\n    const errors: JsonError[] = [];\n    data.forEach((item, index) => {\n        for (let i = index + 1; i < data.length; i += 1) {\n            if (deepEqual(item, data[i]) && !duplicates.includes(i)) {\n                errors.push(\n                    node.createError(\"unique-items-error\", {\n                        pointer: `${pointer}/${i}`,\n                        duplicatePointer: `${pointer}/${index}`,\n                        arrayPointer: pointer,\n                        value: JSON.stringify(item),\n                        schema\n                    })\n                );\n                duplicates.push(i);\n            }\n        }\n    });\n\n    return errors;\n}\n","import { $defsKeyword } from \"./keywords/$defs\";\nimport { $refKeyword } from \"./draft04/keywords/$ref\";\nimport { additionalItemsKeyword } from \"./draft2019-09/keywords/additionalItems\";\nimport { additionalPropertiesKeyword } from \"./keywords/additionalProperties\";\nimport { allOfKeyword } from \"./keywords/allOf\";\nimport { anyOfKeyword } from \"./keywords/anyOf\";\nimport { containsKeyword } from \"./keywords/contains\";\nimport { createSchema } from \"./methods/createSchema\";\nimport { dependenciesKeyword } from \"./keywords/dependencies\";\nimport { deprecatedKeyword } from \"./keywords/deprecated\";\nimport { enumKeyword } from \"./keywords/enum\";\nimport { errors } from \"./errors/errors\";\nimport { exclusiveMaximumKeyword } from \"./draft04/keywords/exclusiveMaximum\";\nimport { exclusiveMinimumKeyword } from \"./draft04/keywords/exclusiveMinimum\";\nimport { formatKeyword } from \"./keywords/format\";\nimport { formats } from \"./formats/formats\";\nimport { getChildSelection } from \"./draft2019-09/methods/getChildSelection\";\nimport { getData } from \"./draft2019-09/methods/getData\";\nimport { itemsKeyword } from \"./draft2019-09/keywords/items\";\nimport { maximumKeyword } from \"./keywords/maximum\";\nimport { maxItemsKeyword } from \"./keywords/maxItems\";\nimport { maxLengthKeyword } from \"./keywords/maxLength\";\nimport { maxPropertiesKeyword } from \"./keywords/maxProperties\";\nimport { minimumKeyword } from \"./keywords/minimum\";\nimport { minItemsKeyword } from \"./keywords/minItems\";\nimport { minLengthKeyword } from \"./keywords/minLength\";\nimport { minPropertiesKeyword } from \"./keywords/minProperties\";\nimport { multipleOfKeyword } from \"./keywords/multipleOf\";\nimport { notKeyword } from \"./keywords/not\";\nimport { oneOfKeyword } from \"./keywords/oneOf\";\nimport { patternKeyword } from \"./keywords/pattern\";\nimport { patternPropertiesKeyword } from \"./keywords/patternProperties\";\nimport { propertiesKeyword } from \"./keywords/properties\";\nimport { propertyNamesKeyword } from \"./keywords/propertyNames\";\nimport { requiredKeyword } from \"./keywords/required\";\nimport { sanitizeKeywords } from \"./Draft\";\nimport { toDataNodes } from \"./methods/toDataNodes\";\nimport { typeKeyword } from \"./keywords/type\";\nimport { uniqueItemsKeyword } from \"./keywords/uniqueItems\";\n\n/**\n * @draft-04\n *\n * remove from draft06\n * - booleans as schemas allowable anywhere, not just \"additionalProperties\" and \"additionalItems\"\n * - propertyNames\n * - contains\n * - const\n * - format: uri-reference\n * - format: uri-template\n * - format: json-pointer\n * - examples: array of examples with no validation effect; the value of \"default\" is usable as an example without repeating it under this keyword\n *\n * revert from draft06\n * - $id replaces id\n * - $ref only allowed where a schema is expected\n * - \"exclusiveMinimum\" and exclusiveMaximum changed from a boolean to a number to be consistent with the principle of keyword independence\n * - type integer any number with a zero fractional part; 1.0 is now a valid \"integer\"  type in draft-06 and later\n * - required  allows an empty array\n * - dependencies allows an empty array for property dependencies\n */\nexport const draft04 = sanitizeKeywords({\n    version: \"draft-04\",\n    $schemaRegEx: \"draft-?0?4\",\n    $schema: \"http://json-schema.org/draft-04/schema#\",\n    errors,\n    formats,\n    methods: {\n        createSchema,\n        getData,\n        getChildSelection,\n        toDataNodes\n    },\n    keywords: [\n        $refKeyword,\n        allOfKeyword,\n        anyOfKeyword,\n        containsKeyword,\n        $defsKeyword,\n        dependenciesKeyword, // optional support for old draft-version\n        deprecatedKeyword,\n        enumKeyword,\n        exclusiveMaximumKeyword,\n        exclusiveMinimumKeyword,\n        formatKeyword,\n        itemsKeyword,\n        maximumKeyword,\n        maxItemsKeyword,\n        maxLengthKeyword,\n        maxPropertiesKeyword,\n        minimumKeyword,\n        minItemsKeyword,\n        minLengthKeyword,\n        minPropertiesKeyword,\n        multipleOfKeyword,\n        notKeyword,\n        patternPropertiesKeyword,\n        patternKeyword,\n        propertiesKeyword,\n        propertyNamesKeyword,\n        requiredKeyword,\n        typeKeyword,\n        uniqueItemsKeyword,\n        oneOfKeyword,\n        additionalItemsKeyword,\n        additionalPropertiesKeyword\n    ]\n});\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport equal from \"fast-deep-equal\";\n\nexport const constKeyword: Keyword = {\n    id: \"const\",\n    keyword: \"const\",\n    addValidate: ({ schema }) => schema.const !== undefined,\n    validate: validateConst\n};\n\nfunction validateConst({ node, data, pointer }: JsonSchemaValidatorParams) {\n    if (!equal(data, node.schema.const)) {\n        return [\n            node.createError(\"const-error\", { pointer, schema: node.schema, value: data, expected: node.schema.const })\n        ];\n    }\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\n\nconst KEYWORD = \"exclusiveMaximum\";\n\nexport const exclusiveMaximumKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseExclusiveMaximum,\n    addValidate: ({ schema }) => schema.exclusiveMaximum != null && !isNaN(parseInt(schema.exclusiveMaximum)),\n    validate: validateExclusiveMaximum\n};\n\nfunction parseExclusiveMaximum(node: SchemaNode) {\n    const max = node.schema[KEYWORD];\n    if (max == null) {\n        return;\n    }\n    if (typeof max !== \"number\") {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: max,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof max}'`\n        });\n    }\n}\n\nfunction validateExclusiveMaximum({ node, data, pointer }: JsonSchemaValidatorParams) {\n    if (typeof data !== \"number\") {\n        return undefined;\n    }\n    if (node.schema.exclusiveMaximum <= data) {\n        return node.createError(\"exclusive-maximum-error\", {\n            maximum: node.schema.exclusiveMaximum,\n            length: data,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","import { Keyword, JsonSchemaValidatorParams } from \"../Keyword\";\nimport { SchemaNode } from \"../SchemaNode\";\n\nconst KEYWORD = \"exclusiveMinimum\";\n\nexport const exclusiveMinimumKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseExclusiveMinimum,\n    addValidate: ({ schema }) => schema[KEYWORD] != null && !isNaN(parseInt(schema[KEYWORD])),\n    validate: validateExclusiveMinimum\n};\n\nfunction parseExclusiveMinimum(node: SchemaNode) {\n    const min = node.schema[KEYWORD];\n    if (min == null) {\n        return;\n    }\n    if (typeof min !== \"number\") {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: min,\n            message: `Keyword '${KEYWORD}' must be a number - received '${typeof min}'`\n        });\n    }\n}\n\nfunction validateExclusiveMinimum({ node, data, pointer }: JsonSchemaValidatorParams) {\n    if (typeof data !== \"number\") {\n        return undefined;\n    }\n    if (node.schema.exclusiveMinimum >= data) {\n        return node.createError(\"exclusive-minimum-error\", {\n            minimum: node.schema.exclusiveMinimum,\n            length: data,\n            pointer,\n            schema: node.schema,\n            value: data\n        });\n    }\n}\n","import { $defsKeyword } from \"./keywords/$defs\";\nimport { $refKeyword } from \"./draft06/keywords/$ref\";\nimport { additionalItemsKeyword } from \"./draft2019-09/keywords/additionalItems\";\nimport { additionalPropertiesKeyword } from \"./keywords/additionalProperties\";\nimport { allOfKeyword } from \"./keywords/allOf\";\nimport { anyOfKeyword } from \"./keywords/anyOf\";\nimport { constKeyword } from \"./keywords/const\";\nimport { containsKeyword } from \"./keywords/contains\";\nimport { createSchema } from \"./methods/createSchema\";\nimport { dependenciesKeyword } from \"./keywords/dependencies\";\nimport { deprecatedKeyword } from \"./keywords/deprecated\";\nimport { enumKeyword } from \"./keywords/enum\";\nimport { errors } from \"./errors/errors\";\nimport { exclusiveMaximumKeyword } from \"./keywords/exclusiveMaximum\";\nimport { exclusiveMinimumKeyword } from \"./keywords/exclusiveMinimum\";\nimport { formatKeyword } from \"./keywords/format\";\nimport { formats } from \"./formats/formats\";\nimport { getChildSelection } from \"./draft2019-09/methods/getChildSelection\";\nimport { getData } from \"./draft2019-09/methods/getData\";\nimport { itemsKeyword } from \"./draft2019-09/keywords/items\";\nimport { maximumKeyword } from \"./keywords/maximum\";\nimport { maxItemsKeyword } from \"./keywords/maxItems\";\nimport { maxLengthKeyword } from \"./keywords/maxLength\";\nimport { maxPropertiesKeyword } from \"./keywords/maxProperties\";\nimport { minimumKeyword } from \"./keywords/minimum\";\nimport { minItemsKeyword } from \"./keywords/minItems\";\nimport { minLengthKeyword } from \"./keywords/minLength\";\nimport { minPropertiesKeyword } from \"./keywords/minProperties\";\nimport { multipleOfKeyword } from \"./keywords/multipleOf\";\nimport { notKeyword } from \"./keywords/not\";\nimport { oneOfKeyword } from \"./keywords/oneOf\";\nimport { patternKeyword } from \"./keywords/pattern\";\nimport { patternPropertiesKeyword } from \"./keywords/patternProperties\";\nimport { propertiesKeyword } from \"./keywords/properties\";\nimport { propertyNamesKeyword } from \"./keywords/propertyNames\";\nimport { requiredKeyword } from \"./keywords/required\";\nimport { sanitizeKeywords } from \"./Draft\";\nimport { toDataNodes } from \"./methods/toDataNodes\";\nimport { typeKeyword } from \"./keywords/type\";\nimport { uniqueItemsKeyword } from \"./keywords/uniqueItems\";\n\n/**\n * @draft-06 https://json-schema.org/draft-06/json-schema-release-notes\n *\n * new\n * - booleans as schemas allowable anywhere, not just \"additionalProperties\" and \"additionalItems\"\n * - propertyNames\n * - contains\n * - const\n * - format: uri-reference\n * - format: uri-template\n * - format: json-pointer\n * - examples: array of examples with no validation effect; the value of \"default\" is usable as an example without repeating it under this keyword\n *\n * changes\n * - $id replaces id\n * - $ref only allowed where a schema is expected\n * - \"exclusiveMinimum\" and exclusiveMaximum changed from a boolean to a number to be consistent with the principle of keyword independence\n * - type integer any number with a zero fractional part; 1.0 is now a valid \"integer\"  type in draft-06 and later\n * - required  allows an empty array\n * - dependencies allows an empty array for property dependencies\n */\nexport const draft06 = sanitizeKeywords({\n    version: \"draft-06\",\n    $schemaRegEx: \"draft-?0?6\",\n    $schema: \"http://json-schema.org/draft-06/schema#\",\n    errors,\n    formats,\n    methods: {\n        createSchema,\n        getData,\n        getChildSelection,\n        toDataNodes\n    },\n    keywords: [\n        $refKeyword,\n        allOfKeyword,\n        anyOfKeyword,\n        constKeyword,\n        containsKeyword,\n        $defsKeyword,\n        dependenciesKeyword, // optional support for old draft-version\n        deprecatedKeyword,\n        enumKeyword,\n        exclusiveMaximumKeyword,\n        exclusiveMinimumKeyword,\n        formatKeyword,\n        itemsKeyword,\n        maximumKeyword,\n        maxItemsKeyword,\n        maxLengthKeyword,\n        maxPropertiesKeyword,\n        minimumKeyword,\n        minItemsKeyword,\n        minLengthKeyword,\n        minPropertiesKeyword,\n        multipleOfKeyword,\n        notKeyword,\n        patternPropertiesKeyword,\n        patternKeyword,\n        propertiesKeyword,\n        propertyNamesKeyword,\n        requiredKeyword,\n        typeKeyword,\n        uniqueItemsKeyword,\n        oneOfKeyword,\n        additionalItemsKeyword,\n        additionalPropertiesKeyword\n    ]\n});\n","import { mergeSchema } from \"../utils/mergeSchema\";\nimport { Keyword, JsonSchemaReducerParams, JsonSchemaValidatorParams, ValidationAnnotation } from \"../Keyword\";\nimport { isBooleanSchema, isJsonSchema, SchemaNode } from \"../types\";\nimport { validateNode } from \"../validateNode\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nexport const ifKeyword: Keyword = {\n    id: \"if-then-else\",\n    keyword: \"if\",\n    parse: parseIfThenElse,\n    addReduce: (node: SchemaNode) => node.if != null && (node.then != null || node.else != null),\n    reduce: reduceIf,\n    addValidate: (node) => node.if != null,\n    validate: validateIfThenElse\n};\n\nexport function parseIfThenElse(node: SchemaNode) {\n    const { schema, evaluationPath } = node;\n    const errors: ValidationAnnotation[] = [];\n    if (schema.if != null) {\n        if (isJsonSchema(schema.if) || isBooleanSchema(schema.if)) {\n            node.if = node.compileSchema(schema.if, `${evaluationPath}/if`);\n            collectValidationErrors(errors, node.if);\n        } else {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: `${node.schemaLocation}/if`,\n                    schema: node.schema,\n                    value: schema.if,\n                    message: `Keyword 'if' must be valid JSON Schema - received '${typeof schema.if}'`\n                })\n            );\n        }\n    }\n    if (schema.then != null) {\n        if (isJsonSchema(schema.then) || isBooleanSchema(schema.then)) {\n            node.then = node.compileSchema(schema.then, `${evaluationPath}/then`);\n            collectValidationErrors(errors, node.then);\n        } else {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: `${node.schemaLocation}/then`,\n                    schema: node.schema,\n                    value: schema.then,\n                    message: `Keyword 'then' must be valid JSON Schema - received '${typeof schema.then}'`\n                })\n            );\n        }\n    }\n    if (schema.else != null) {\n        if (isJsonSchema(schema.else) || isBooleanSchema(schema.else)) {\n            node.else = node.compileSchema(schema.else, `${evaluationPath}/else`);\n            collectValidationErrors(errors, node.else);\n        } else {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: `${node.schemaLocation}/else`,\n                    schema: node.schema,\n                    value: schema.else,\n                    message: `Keyword 'else' must be valid JSON Schema - received '${typeof schema.else}'`\n                })\n            );\n        }\n    }\n    return errors;\n}\n\nfunction reduceIf({ node, data, pointer, path }: JsonSchemaReducerParams) {\n    // @todo issue with mergeNode (node.if == null)\n    if (data === undefined || node.if == null) {\n        return undefined;\n    }\n\n    if (validateNode(node.if, data, pointer, [...(path ?? [])]).length === 0) {\n        if (node.then) {\n            // reduce creates a new node\n            const { node: schemaNode } = node.then.reduceNode(data);\n            if (schemaNode) {\n                const nestedDynamicId = schemaNode.dynamicId?.replace(node.dynamicId, \"\").replace(/^#/, \"\") ?? \"\";\n                const dynamicId = nestedDynamicId === \"\" ? `(then)` : nestedDynamicId;\n\n                const schema = mergeSchema(node.then.schema, schemaNode.schema, \"if\", \"then\", \"else\");\n                return node.compileSchema(\n                    schema,\n                    node.then.evaluationPath,\n                    node.schemaLocation,\n                    `${node.schemaLocation}${dynamicId}`\n                );\n            }\n        }\n    } else if (node.else) {\n        const { node: schemaNode } = node.else.reduceNode(data);\n        if (schemaNode) {\n            const nestedDynamicId = schemaNode.dynamicId?.replace(node.dynamicId, \"\") ?? \"\";\n            const dynamicId = nestedDynamicId === \"\" ? `(else)` : nestedDynamicId;\n\n            const schema = mergeSchema(node.else.schema, schemaNode.schema, \"if\", \"then\", \"else\");\n            return node.compileSchema(\n                schema,\n                node.else.evaluationPath,\n                node.schemaLocation,\n                `${node.schemaLocation}${dynamicId}`\n            );\n        }\n    }\n    return undefined;\n}\n\nfunction validateIfThenElse({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    // @todo issue with mergeNode\n    if (node.if == null) {\n        return;\n    }\n    if (validateNode(node.if, data, pointer, [...(path ?? [])]).length === 0) {\n        if (node.then) {\n            return validateNode(node.then, data, pointer, path);\n        }\n    } else if (node.else) {\n        return validateNode(node.else, data, pointer, path);\n    }\n}\n","import { $defsKeyword } from \"./keywords/$defs\";\nimport { $refKeyword } from \"./draft06/keywords/$ref\";\nimport { additionalItemsKeyword } from \"./draft2019-09/keywords/additionalItems\";\nimport { additionalPropertiesKeyword } from \"./keywords/additionalProperties\";\nimport { allOfKeyword } from \"./keywords/allOf\";\nimport { anyOfKeyword } from \"./keywords/anyOf\";\nimport { constKeyword } from \"./keywords/const\";\nimport { containsKeyword } from \"./keywords/contains\";\nimport { createSchema } from \"./methods/createSchema\";\nimport { dependenciesKeyword } from \"./keywords/dependencies\";\nimport { deprecatedKeyword } from \"./keywords/deprecated\";\nimport { enumKeyword } from \"./keywords/enum\";\nimport { errors } from \"./errors/errors\";\nimport { exclusiveMaximumKeyword } from \"./keywords/exclusiveMaximum\";\nimport { exclusiveMinimumKeyword } from \"./keywords/exclusiveMinimum\";\nimport { formatKeyword } from \"./keywords/format\";\nimport { formats } from \"./formats/formats\";\nimport { getChildSelection } from \"./draft2019-09/methods/getChildSelection\";\nimport { getData } from \"./draft2019-09/methods/getData\";\nimport { ifKeyword } from \"./keywords/ifthenelse\";\nimport { itemsKeyword } from \"./draft2019-09/keywords/items\";\nimport { maximumKeyword } from \"./keywords/maximum\";\nimport { maxItemsKeyword } from \"./keywords/maxItems\";\nimport { maxLengthKeyword } from \"./keywords/maxLength\";\nimport { maxPropertiesKeyword } from \"./keywords/maxProperties\";\nimport { minimumKeyword } from \"./keywords/minimum\";\nimport { minItemsKeyword } from \"./keywords/minItems\";\nimport { minLengthKeyword } from \"./keywords/minLength\";\nimport { minPropertiesKeyword } from \"./keywords/minProperties\";\nimport { multipleOfKeyword } from \"./keywords/multipleOf\";\nimport { notKeyword } from \"./keywords/not\";\nimport { oneOfKeyword } from \"./keywords/oneOf\";\nimport { patternKeyword } from \"./keywords/pattern\";\nimport { patternPropertiesKeyword } from \"./keywords/patternProperties\";\nimport { propertiesKeyword } from \"./keywords/properties\";\nimport { propertyNamesKeyword } from \"./keywords/propertyNames\";\nimport { requiredKeyword } from \"./keywords/required\";\nimport { sanitizeKeywords } from \"./Draft\";\nimport { toDataNodes } from \"./methods/toDataNodes\";\nimport { typeKeyword } from \"./keywords/type\";\nimport { uniqueItemsKeyword } from \"./keywords/uniqueItems\";\n\n/**\n * @draft-07 https://json-schema.org/draft-07/json-schema-release-notes\n *\n * new\n * - \"$comment\"\n * - \"if\", \"then\", \"else\"\n * - \"readOnly\"\n * - \"writeOnly\"\n * - \"contentMediaType\"\n * - \"contentEncoding\"\n */\nexport const draft07 = sanitizeKeywords({\n    version: \"draft-07\",\n    $schemaRegEx: \"draft-?0?7\",\n    $schema: \"http://json-schema.org/draft-07/schema#\",\n    errors,\n    formats,\n    methods: {\n        createSchema,\n        getData,\n        getChildSelection,\n        toDataNodes\n    },\n    keywords: [\n        $refKeyword,\n        allOfKeyword,\n        anyOfKeyword,\n        constKeyword,\n        containsKeyword,\n        $defsKeyword,\n        dependenciesKeyword, // optional support for old draft-version\n        deprecatedKeyword,\n        enumKeyword,\n        exclusiveMaximumKeyword,\n        exclusiveMinimumKeyword,\n        formatKeyword,\n        ifKeyword,\n        itemsKeyword,\n        maximumKeyword,\n        maxItemsKeyword,\n        maxLengthKeyword,\n        maxPropertiesKeyword,\n        minimumKeyword,\n        minItemsKeyword,\n        minLengthKeyword,\n        minPropertiesKeyword,\n        multipleOfKeyword,\n        notKeyword,\n        patternPropertiesKeyword,\n        patternKeyword,\n        propertiesKeyword,\n        propertyNamesKeyword,\n        requiredKeyword,\n        typeKeyword,\n        uniqueItemsKeyword,\n        oneOfKeyword,\n        additionalItemsKeyword,\n        additionalPropertiesKeyword\n    ]\n});\n","import { Keyword, JsonSchemaValidatorParams, ValidationPath } from \"../../Keyword\";\nimport { resolveUri } from \"../../utils/resolveUri\";\nimport splitRef from \"../../utils/splitRef\";\nimport { validateNode } from \"../../validateNode\";\nimport { isSchemaNode, JsonError, SchemaNode } from \"../../types\";\nimport { get, split } from \"@sagold/json-pointer\";\nimport { reduceRef, compileNext } from \"../../keywords/$ref\";\n\nexport const $refKeyword: Keyword = {\n    id: \"$ref\",\n    keyword: \"$ref\",\n    parse: parseRef,\n    addValidate: ({ schema }) => schema.$ref != null || schema.$recursiveRef != null,\n    validate: validateRef,\n    addReduce: ({ schema }) => schema.$ref != null || schema.$recursiveRef != null,\n    reduce: reduceRef\n};\n\nfunction register(node: SchemaNode, path: string) {\n    if (node.context.refs[path] == null) {\n        node.context.refs[path] = node;\n    }\n}\n\nexport function parseRef(node: SchemaNode) {\n    // @ts-expect-error add ref resolution method to node\n    node.resolveRef = resolveRef;\n\n    // get and store current $id of node - this may be the same as parent $id\n    const currentId = resolveUri(node.parent?.$id, node.schema?.$id);\n    node.$id = currentId;\n    node.lastIdPointer = node.parent?.lastIdPointer ?? \"#\";\n    if (currentId !== node.parent?.$id && node.evaluationPath !== \"#\") {\n        node.lastIdPointer = node.evaluationPath;\n    }\n\n    // store this node for retrieval by $id + json-pointer from $id\n    if (node.lastIdPointer !== \"#\" && node.evaluationPath.startsWith(node.lastIdPointer)) {\n        const localPointer = `#${node.evaluationPath.replace(node.lastIdPointer, \"\")}`;\n        register(node, resolveUri(currentId, localPointer));\n    }\n    // store $rootId + json-pointer to this node\n    register(node, resolveUri(node.context.rootNode.$id, node.evaluationPath));\n\n    // store this node for retrieval by $id + anchor\n    if (node.schema.$anchor) {\n        node.context.anchors[`${currentId.replace(/#$/, \"\")}#${node.schema.$anchor}`] = node;\n    }\n\n    // precompile reference\n    if (node.schema.$ref) {\n        node.$ref = resolveUri(currentId, node.schema.$ref);\n        if (node.$ref.startsWith(\"/\")) {\n            node.$ref = `#${node.$ref}`;\n        }\n    }\n}\n\n// export function reduceRef({ node, data, key, pointer, path }: JsonSchemaReducerParams) {\n//     const resolvedNode = node.resolveRef({ pointer, path });\n//     if (resolvedNode.schemaLocation === node.schemaLocation) {\n//         return resolvedNode;\n//     }\n//     const result = resolvedNode.reduceNode(data, { key, pointer, path });\n//     return result.node ?? result.error;\n//     // const merged = mergeNode({ ...node, $ref: undefined, schema: { ...node.schema, $ref: undefined } }, resolvedNode);\n//     // const { node: reducedNode, error } = merged.reduceNode(data, { key, pointer, path });\n//     // return reducedNode ?? error;\n// }\n\nexport function resolveRef(this: SchemaNode, { pointer, path }: { pointer?: string; path?: ValidationPath } = {}) {\n    if (this.schema.$recursiveRef) {\n        const nextNode = resolveRecursiveRef(this, path ?? []);\n        if (isSchemaNode(nextNode)) {\n            path?.push({ pointer: pointer!, node: nextNode! });\n        }\n        return nextNode;\n    }\n\n    if (this.$ref == null) {\n        return this;\n    }\n\n    const resolvedNode = getRef(this);\n    if (isSchemaNode(resolvedNode)) {\n        path?.push({ pointer: pointer!, node: resolvedNode });\n    }\n    return resolvedNode;\n}\n\nfunction validateRef({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    const nextNode = node.resolveRef({ pointer, path });\n    if (nextNode != null) {\n        return validateNode(nextNode, data, pointer, path);\n    }\n    return node.createError(\"ref-error\", {\n        ref: node.schema.$ref ?? node.schema.$recursiveRef,\n        pointer,\n        schema: node.schema,\n        value: data\n    });\n}\n\n// 1. https://json-schema.org/draft/2019-09/json-schema-core#scopes\nfunction resolveRecursiveRef(node: SchemaNode, path: ValidationPath): SchemaNode | JsonError {\n    const history = path;\n\n    // RESTRICT BY CHANGE IN BASE-URL\n    // go back in history until we have a domain definition and use this as start node to search for an anchor\n    let startIndex = 0;\n    for (let i = history.length - 1; i >= 0; i--) {\n        if (history[i].node.schema.$recursiveAnchor === false) {\n            // $recursiveRef with $recursiveAnchor: false works like $ref\n            return getRef(node, resolveUri(node.$id, node.schema.$recursiveRef));\n        }\n        if (/^https?:\\/\\//.test(history[i].node.schema.$id ?? \"\") && history[i].node.schema.$recursiveAnchor !== true) {\n            startIndex = i;\n            break;\n        }\n    }\n\n    // FROM THERE FIND FIRST OCCURENCE OF AN ANCHOR\n    const firstAnchor = history.find((s, index) => index >= startIndex && s.node.schema.$recursiveAnchor === true);\n    if (firstAnchor) {\n        return firstAnchor.node;\n    }\n\n    // $recursiveRef with no $recursiveAnchor works like $ref?\n    const nextNode = getRef(node, resolveUri(node.$id, node.schema.$recursiveRef));\n    return nextNode;\n}\n\nexport default function getRef(node: SchemaNode, $ref = node?.$ref): SchemaNode | JsonError {\n    if ($ref == null) {\n        return node;\n    }\n\n    // resolve $ref by json-evaluationPath\n    if (node.context.refs[$ref]) {\n        return compileNext(node.context.refs[$ref], node);\n    }\n    // resolve $ref from $anchor\n    if (node.context.anchors[$ref]) {\n        return compileNext(node.context.anchors[$ref], node);\n    }\n\n    // check for remote-host + pointer pair to switch rootSchema\n    const fragments = splitRef($ref);\n    if (fragments.length === 0) {\n        // console.error(\"REF: INVALID\", $ref);\n        return node.createError(\"ref-error\", {\n            ref: $ref,\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined\n        });\n    }\n\n    // resolve $ref as remote-host\n    if (fragments.length === 1) {\n        const $ref = fragments[0];\n        // this is a reference to remote-host root node\n        if (node.context.remotes[$ref]) {\n            return compileNext(node.context.remotes[$ref], node);\n        }\n        if ($ref[0] === \"#\") {\n            // @todo there is a bug joining multiple fragments to e.g. #/base#/examples/0\n            // from \"$id\": \"/base\" +  $ref \"#/examples/0\" (in refOfUnknownKeyword spec)\n            const ref = $ref.match(/#[^#]*$/)?.pop() as string; // sanitize pointer\n            // support refOfUnknownKeyword\n            const rootSchema = node.context.rootNode.schema;\n            const targetSchema = get(rootSchema, ref);\n            if (targetSchema) {\n                return node.compileSchema(targetSchema, `${node.evaluationPath}/$ref`, ref);\n            }\n        }\n        // console.error(\"REF: UNFOUND 1\", $ref);\n        return node.createError(\"ref-error\", {\n            ref: $ref,\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined\n        });\n    }\n\n    if (fragments.length === 2) {\n        const $remoteHostRef = fragments[0];\n        // this is a reference to remote-host root node (and not a self reference)\n        if (node.context.remotes[$remoteHostRef] && node !== node.context.remotes[$remoteHostRef]) {\n            const referencedNode = node.context.remotes[$remoteHostRef];\n            // resolve full ref on remote schema - we store currently only store ref with domain\n            let nextNode = getRef(referencedNode, $ref);\n            if (nextNode) {\n                return nextNode;\n            }\n            // @note required for test spec 04\n            nextNode = getRef(referencedNode, fragments[1]);\n            if (nextNode) {\n                return nextNode;\n            }\n        }\n\n        // resolve by json-pointer (optional dynamicRef)\n        if (node.context.refs[$remoteHostRef]) {\n            const parentNode = node.context.refs[$remoteHostRef];\n            const path = split(fragments[1]);\n            // @todo add utility to resolve schema-pointer to schema\n            let currentNode = parentNode;\n            for (const item of path) {\n                const property = item === \"definitions\" ? \"$defs\" : item;\n                // @ts-expect-error random path\n                currentNode = currentNode[property];\n                if (currentNode == null) {\n                    // console.error(\"REF: FAILED RESOLVING ref json-pointer\", fragments[1]);\n                    return node.createError(\"ref-error\", {\n                        ref: $ref,\n                        pointer: node.evaluationPath,\n                        schema: node.schema,\n                        value: undefined,\n                        host: fragments[0],\n                        local: fragments[1]\n                    });\n                }\n            }\n            return currentNode;\n        }\n    }\n\n    return node.createError(\"ref-error\", {\n        ref: $ref,\n        pointer: node.evaluationPath,\n        schema: node.schema,\n        value: undefined\n    });\n}\n","import { isObject } from \"../../utils/isObject\";\nimport { SchemaNode } from \"../../types\";\nimport { Keyword, JsonSchemaValidatorParams, ValidationReturnType } from \"../../Keyword\";\nimport { validateNode } from \"../../validateNode\";\n\nconst KEYWORD = \"unevaluatedItems\";\n\n/**\n * @draft >= 2019-09\n * Similar to additionalItems, but can \"see\" into subschemas and across references\n * https://json-schema.org/draft/2019-09/json-schema-core#rfc.section.9.3.1.3\n */\nexport const unevaluatedItemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseUnevaluatedItems,\n    addValidate: ({ schema }) => schema[KEYWORD] != null,\n    validate: validateUnevaluatedItems\n};\n\nexport function parseUnevaluatedItems(node: SchemaNode) {\n    const { unevaluatedItems } = node.schema;\n    if (unevaluatedItems == null || typeof unevaluatedItems === \"boolean\") {\n        return;\n    }\n\n    if (!isObject(unevaluatedItems)) {\n        return node.createError(\"schema-error\", {\n            pointer: node.evaluationPath,\n            schema: node.schema,\n            value: undefined,\n            message: `Keyword '${KEYWORD}' must be an object - received '${typeof unevaluatedItems}'`\n        });\n    }\n\n    node.unevaluatedItems = node.compileSchema(\n        node.schema.unevaluatedItems,\n        `${node.evaluationPath}/${KEYWORD}`,\n        `${node.schemaLocation}/${KEYWORD}`\n    );\n}\n\nfunction validateUnevaluatedItems({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    // if not in items, and not matches additionalItems\n    if (\n        !Array.isArray(data) ||\n        data.length === 0 ||\n        schema.unevaluatedItems == null ||\n        schema.unevaluatedItems === true\n    ) {\n        return undefined;\n    }\n\n    // const reducedNode = node;\n    let { node: reducedNode } = node.reduceNode(data, { pointer, path });\n    reducedNode = reducedNode ?? node;\n    if (reducedNode.schema.unevaluatedItems === true || reducedNode.schema.additionalItems === true) {\n        return undefined;\n    }\n\n    // console.log(\"EVAL\", reducedNode.schema);\n\n    const validIf = node.if != null && validateNode(node.if, data, pointer, path).length === 0;\n    const errors: ValidationReturnType = [];\n    // \"unevaluatedItems with nested items\"\n    for (let i = 0; i < data.length; i += 1) {\n        const value = data[i];\n        const { node: child } = node.getNodeChild(i, data, { path });\n        // console.log(`CHILD '${i}':`, data[i], \"=>\", child?.schema);\n\n        if (child) {\n            // when a single node is invalid\n            if (validateNode(child, value, `${pointer}/${i}`, path).length > 0) {\n                // nothing should validate, so we validate unevaluated items only\n                const unevaluatedItems = node.unevaluatedItems;\n                if (unevaluatedItems) {\n                    data.forEach((value) => {\n                        const result = validateNode(unevaluatedItems, value, `${pointer}/${i}`, path);\n                        if (result == null) {\n                            return;\n                        }\n                        if (Array.isArray(result)) {\n                            return errors.push(...result);\n                        }\n                        errors.push(result);\n                    });\n                }\n                if (node.schema.unevaluatedItems === false) {\n                    return node.createError(\"unevaluated-items-error\", {\n                        pointer: `${pointer}/${i}`,\n                        value: JSON.stringify(value),\n                        schema\n                    });\n                }\n            }\n        }\n        // \"unevaluatedItems false\"\n        if (child === undefined) {\n            // valid if ensures node.if is set\n            if (validIf && node.if!.prefixItems && node.if!.prefixItems.length > i) {\n                // evaluated by if -- skip\n            } else if (node.unevaluatedItems) {\n                const result = validateNode(node.unevaluatedItems, value, `${pointer}/${i}`, path);\n                if (result.length > 0) {\n                    errors.push(...result);\n                }\n            } else {\n                errors.push(\n                    node.createError(\"unevaluated-items-error\", {\n                        pointer: `${pointer}/${i}`,\n                        value: JSON.stringify(value),\n                        schema\n                    })\n                );\n            }\n        }\n    }\n\n    return errors;\n}\n","import { ValidationPath } from \"./Keyword\";\nimport { SchemaNode } from \"./types\";\nimport { hasProperty } from \"./utils/hasProperty\";\n// import { getValue } from \"./utils/getValue\";\nimport { validateNode } from \"./validateNode\";\n\ntype Options = {\n    /** array node */\n    node: SchemaNode;\n    /** array data */\n    data: Record<string, unknown>;\n    /** array index to evaluate */\n    key: string;\n    /** pointer to array */\n    pointer: string;\n\n    path: ValidationPath;\n};\n\n/**\n * Returns true if an item is evaluated\n *\n * - Note that this check is partial, the remainder is done in unevaluatedItems\n * - This function currently checks for schema that are not visible by simple validation\n * - We could introduce this method as a new keyword-layer\n */\nexport function isPropertyEvaluated({ node, data, key, pointer, path }: Options) {\n    if (Array.isArray(node.schema.required) && !node.schema.required.find((prop) => hasProperty(data, prop))) {\n        return false;\n    }\n\n    if (node.schema.unevaluatedProperties === true || node.schema.additionalProperties === true) {\n        return true;\n    }\n\n    if (node.properties?.[key] && node.properties[key].validate(data[key], pointer, path).valid) {\n        return true;\n    }\n\n    if (node.patternProperties && node.patternProperties.find((p) => p.pattern.test(key))) {\n        return true;\n    }\n\n    if (node.allOf) {\n        for (const allOf of node.allOf) {\n            if (isPropertyEvaluated({ node: allOf, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n\n    if (node.anyOf) {\n        for (const anyOf of node.anyOf) {\n            if (isPropertyEvaluated({ node: anyOf, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n\n    if (node.oneOf) {\n        for (const oneOf of node.oneOf) {\n            if (isPropertyEvaluated({ node: oneOf, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n\n    if (node.if) {\n        if (isPropertyEvaluated({ node: node.if, data, key, pointer, path })) {\n            return true;\n        }\n\n        const validIf = validateNode(node.if, data, pointer, path).length === 0;\n        if (validIf && node.then) {\n            if (isPropertyEvaluated({ node: node.then, data, key, pointer, path })) {\n                return true;\n            }\n        } else if (!validIf && node.else) {\n            if (isPropertyEvaluated({ node: node.else, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n\n    const resolved = node.resolveRef({ pointer, path });\n    if (resolved !== node) {\n        if (isPropertyEvaluated({ node: resolved, data, key, pointer, path })) {\n            return true;\n        }\n    }\n\n    return false;\n}\n","import { isObject } from \"../utils/isObject\";\nimport { isBooleanSchema, isJsonSchema, SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaValidatorParams, ValidationReturnType } from \"../Keyword\";\nimport { validateNode } from \"../validateNode\";\nimport { isPropertyEvaluated } from \"../isPropertyEvaluated\";\n\nconst KEYWORD = \"unevaluatedProperties\";\n\nexport const unevaluatedPropertiesKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseUnevaluatedProperties,\n    addValidate: ({ schema }) => schema[KEYWORD] != null, // currently we do not store boolean schema\n    validate: validateUnevaluatedProperties\n};\n\nexport function parseUnevaluatedProperties(node: SchemaNode) {\n    const unevaluatedProperties = node.schema[KEYWORD];\n    if (unevaluatedProperties == null) {\n        return;\n    }\n    if (!(isJsonSchema(unevaluatedProperties) || isBooleanSchema(unevaluatedProperties))) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: unevaluatedProperties,\n            message: `Keyword '${KEYWORD}' must be a valid JSON Schema - received '${typeof unevaluatedProperties}'`\n        });\n    }\n\n    if (isBooleanSchema(unevaluatedProperties)) {\n        return;\n    }\n\n    node.unevaluatedProperties = node.compileSchema(\n        node.schema.unevaluatedProperties,\n        `${node.evaluationPath}/${KEYWORD}`,\n        `${node.schemaLocation}/${KEYWORD}`\n    );\n    return node.unevaluatedProperties.schemaValidation;\n}\n\n// @todo we should use collected annotation to evaluated unevaluate properties\nfunction validateUnevaluatedProperties({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    if (!isObject(data)) {\n        return undefined;\n    }\n\n    const unevaluated = Object.keys(data)\n        // do not validate undefined properties\n        .filter((property) => data[property] !== undefined);\n\n    if (unevaluated.length === 0) {\n        return undefined;\n    }\n\n    const errors: ValidationReturnType = [];\n    for (const propertyName of unevaluated) {\n        // Properties defined directly on this schema object are always\n        // evaluated by the \"properties\" keyword, regardless of whether the\n        // value passes validation (per JSON Schema spec, annotations from\n        // adjacent keywords are always collected)\n        if (node.properties?.[propertyName]) {\n            continue;\n        }\n        if (isPropertyEvaluated({ node, data, key: propertyName, pointer, path })) {\n            continue;\n        }\n\n        const { node: child } = node.getNodeChild(propertyName, data, { pointer, path });\n\n        if (child === undefined) {\n            if (node.unevaluatedProperties) {\n                const validationResult = validateNode(\n                    node.unevaluatedProperties,\n                    data[propertyName],\n                    `${pointer}/${propertyName}`,\n                    path\n                );\n                errors.push(...validationResult);\n            } else if (node.schema.unevaluatedProperties === false) {\n                errors.push(\n                    node.createError(\"unevaluated-property-error\", {\n                        pointer: `${pointer}/${propertyName}`,\n                        value: JSON.stringify(data[propertyName]),\n                        schema: node.schema\n                    })\n                );\n            }\n        }\n\n        if (child && validateNode(child, data[propertyName], `${pointer}/${propertyName}`, path).length > 0) {\n            if (node.unevaluatedProperties) {\n                const validationResult = validateNode(\n                    node.unevaluatedProperties,\n                    data[propertyName],\n                    `${pointer}/${propertyName}`,\n                    path\n                );\n                errors.push(...validationResult);\n            } else if (node.schema.unevaluatedProperties === false) {\n                errors.push(\n                    node.createError(\"unevaluated-property-error\", {\n                        pointer: `${pointer}/${propertyName}`,\n                        value: JSON.stringify(data[propertyName]),\n                        schema: node.schema\n                    })\n                );\n            }\n        }\n    }\n\n    return errors;\n}\n","import { $defsKeyword } from \"./keywords/$defs\";\nimport { $refKeyword } from \"./draft2019-09/keywords/$ref\";\nimport { additionalItemsKeyword } from \"./draft2019-09/keywords/additionalItems\";\nimport { additionalPropertiesKeyword } from \"./keywords/additionalProperties\";\nimport { allOfKeyword } from \"./keywords/allOf\";\nimport { anyOfKeyword } from \"./keywords/anyOf\";\nimport { constKeyword } from \"./keywords/const\";\nimport { containsKeyword } from \"./keywords/contains\";\nimport { createSchema } from \"./methods/createSchema\";\nimport { dependenciesKeyword } from \"./keywords/dependencies\";\nimport { dependentRequiredKeyword } from \"./keywords/dependentRequired\";\nimport { dependentSchemasKeyword } from \"./keywords/dependentSchemas\";\nimport { deprecatedKeyword } from \"./keywords/deprecated\";\nimport { enumKeyword } from \"./keywords/enum\";\nimport { errors } from \"./errors/errors\";\nimport { exclusiveMaximumKeyword } from \"./keywords/exclusiveMaximum\";\nimport { exclusiveMinimumKeyword } from \"./keywords/exclusiveMinimum\";\nimport { formatKeyword } from \"./keywords/format\";\nimport { formats } from \"./formats/formats\";\nimport { getChildSelection } from \"./draft2019-09/methods/getChildSelection\";\nimport { getData } from \"./draft2019-09/methods/getData\";\nimport { ifKeyword } from \"./keywords/ifthenelse\";\nimport { itemsKeyword } from \"./draft2019-09/keywords/items\";\nimport { maximumKeyword } from \"./keywords/maximum\";\nimport { maxItemsKeyword } from \"./keywords/maxItems\";\nimport { maxLengthKeyword } from \"./keywords/maxLength\";\nimport { maxPropertiesKeyword } from \"./keywords/maxProperties\";\nimport { minimumKeyword } from \"./keywords/minimum\";\nimport { minItemsKeyword } from \"./keywords/minItems\";\nimport { minLengthKeyword } from \"./keywords/minLength\";\nimport { minPropertiesKeyword } from \"./keywords/minProperties\";\nimport { multipleOfKeyword } from \"./keywords/multipleOf\";\nimport { notKeyword } from \"./keywords/not\";\nimport { oneOfKeyword } from \"./keywords/oneOf\";\nimport { patternKeyword } from \"./keywords/pattern\";\nimport { patternPropertiesKeyword } from \"./keywords/patternProperties\";\nimport { propertiesKeyword } from \"./keywords/properties\";\nimport { propertyNamesKeyword } from \"./keywords/propertyNames\";\nimport { requiredKeyword } from \"./keywords/required\";\nimport { sanitizeKeywords } from \"./Draft\";\nimport { toDataNodes } from \"./methods/toDataNodes\";\nimport { typeKeyword } from \"./keywords/type\";\nimport { unevaluatedItemsKeyword } from \"./draft2019-09/keywords/unevaluatedItems\";\nimport { unevaluatedPropertiesKeyword } from \"./keywords/unevaluatedProperties\";\nimport { uniqueItemsKeyword } from \"./keywords/uniqueItems\";\n\n/**\n * @draft-2019 https://json-schema.org/draft/2019-09/release-notes\n *\n * new\n * - $anchor\n * - $recursiveAnchor and $recursiveRef\n * - $vocabulary\n *\n * changed\n * - $defs (renamed from definitions)\n * - $id\n * - $ref\n * - dependencies has been split into dependentSchemas and dependentRequired\n */\nexport const draft2019 = sanitizeKeywords({\n    version: \"draft-2019-09\",\n    $schemaRegEx: \"draft[/-]2019-?(09)?\",\n    $schema: \"https://json-schema.org/draft/2019-09/schema\",\n    errors,\n    formats,\n    methods: {\n        createSchema,\n        getData,\n        getChildSelection,\n        toDataNodes\n    },\n    keywords: [\n        $refKeyword,\n        allOfKeyword,\n        anyOfKeyword,\n        constKeyword,\n        containsKeyword,\n        $defsKeyword,\n        dependenciesKeyword, // optional support for old draft-version\n        dependentRequiredKeyword, // draft-2019: new\n        dependentSchemasKeyword, // draft-2019: new\n        deprecatedKeyword,\n        enumKeyword,\n        exclusiveMaximumKeyword,\n        exclusiveMinimumKeyword,\n        formatKeyword,\n        ifKeyword,\n        itemsKeyword,\n        maximumKeyword,\n        maxItemsKeyword,\n        maxLengthKeyword,\n        maxPropertiesKeyword,\n        minimumKeyword,\n        minItemsKeyword,\n        minLengthKeyword,\n        minPropertiesKeyword,\n        multipleOfKeyword,\n        notKeyword,\n        patternPropertiesKeyword,\n        patternKeyword,\n        propertiesKeyword,\n        propertyNamesKeyword,\n        requiredKeyword,\n        typeKeyword,\n        unevaluatedItemsKeyword,\n        unevaluatedPropertiesKeyword,\n        uniqueItemsKeyword,\n        oneOfKeyword,\n        additionalItemsKeyword,\n        additionalPropertiesKeyword\n    ]\n});\n","import { isSchemaNode, JsonError, SchemaNode } from \"../types\";\n\n/**\n * Returns a list of possible child-schemas for the given property key. In case of a oneOf selection, multiple schemas\n * could be added at the given property (e.g. item-index), thus an array of options is returned. In all other cases\n * a list with a single item will be returned\n */\nexport function getChildSelection(node: SchemaNode, property: string | number) {\n    if (node.oneOf) {\n        return node.oneOf.map((childNode: SchemaNode) => childNode.resolveRef());\n    }\n    if (node.items?.oneOf) {\n        return node.items.oneOf.map((childNode: SchemaNode) => childNode.resolveRef());\n    }\n    // array.items[] found\n    if (node.prefixItems && node.prefixItems.length > +property) {\n        const { node: childNode, error } = node.getNodeChild(property);\n        if (isSchemaNode(childNode)) {\n            return [childNode];\n        }\n        // @todo improve return type guard?\n        return error as JsonError;\n    }\n    if (node.schema.items === true) {\n        return [node.compileSchema({ type: \"string\" })];\n    }\n    if (node.schema.items === false) {\n        return [];\n    }\n    // array.items[] exceeded (or undefined), but additionalItems specified\n    if (node.items) {\n        // we fallback to a string if no schema is defined - might be subject for configuration\n        return [node.items.resolveRef()];\n    }\n    // array.items[] exceeded\n    if (node.prefixItems && node.prefixItems.length <= +property) {\n        return [];\n    }\n\n    const { node: childNode, error } = node.getNodeChild(property);\n    // @todo improve return type?\n    return (error as JsonError) ?? [childNode];\n}\n","import { copy } from \"fast-copy\";\nimport { getTypeOf } from \"../utils/getTypeOf\";\nimport { getSchemaType } from \"../utils/getSchemaType\";\nimport { getValue } from \"../utils/getValue\";\nimport { isEmpty } from \"../utils/isEmpty\";\nimport { isJsonError } from \"../types\";\nimport { isObject } from \"../utils/isObject\";\nimport { isSchemaNode, SchemaNode } from \"../types\";\nimport { mergeNode } from \"../mergeNode\";\nimport { reduceOneOfFuzzy } from \"../keywords/oneOf\";\nimport { isFile } from \"../utils/isFile\";\n\nexport type TemplateOptions = {\n    /** Add all properties (required and optional) to the generated data */\n    addOptionalProps?: boolean;\n    /** Remove data that does not match input schema. Defaults to false */\n    removeInvalidData?: boolean;\n    /** Set to false to take default values as they are and not extend them.\n     *  Defaults to true.\n     *  This allows to control template data e.g. enforcing arrays to be empty,\n     *  regardless of minItems settings.\n     */\n    extendDefaults?: boolean;\n    /**\n     * Set to false to not use type specific initial values.Defaults to true\n     */\n    useTypeDefaults?: boolean;\n    /**\n     * Limits how often a $ref should be followed before aborting. Prevents infinite data-structure.\n     * Defaults to 1\n     */\n    recursionLimit?: number;\n    /** @internal disables recursion limit for next call */\n    disableRecursionLimit?: boolean;\n    /** @internal context to track recursion limit */\n    cache?: Record<string, Record<string, number>>;\n};\n\nfunction safeResolveRef(node: SchemaNode, options: TemplateOptions) {\n    if (node.$ref == null) {\n        return undefined;\n    }\n    options.cache = options.cache ?? {};\n    const { cache, recursionLimit = 1 } = options;\n\n    const origin = node.schemaLocation;\n    cache[origin] = cache[origin] ?? {};\n    cache[origin][node.$ref] = cache[origin][node.$ref] ?? 0;\n    const value = cache[origin][node.$ref];\n    if (value >= recursionLimit && options.disableRecursionLimit !== true) {\n        return false;\n    }\n    options.disableRecursionLimit = false;\n    cache[origin][node.$ref] += 1;\n    const resolvedNode = node.resolveRef();\n    if (resolvedNode && resolvedNode !== node) {\n        return resolvedNode;\n    }\n\n    return undefined;\n}\n\nfunction canResolveRef(node: SchemaNode, options: TemplateOptions) {\n    // @ts-expect-error unknown index\n    const counter = options.cache?.[node.schemaLocation]?.[node.$ref] ?? -1;\n    return counter < (options.recursionLimit ?? 1);\n}\n\n// only convert values where we do not lose original data\nfunction convertValue(type: string | undefined, value: unknown) {\n    const valueType = getTypeOf(value);\n    if (type === undefined || value == null || valueType === type || (valueType === \"number\" && type === \"integer\")) {\n        return value;\n    }\n\n    if (type === \"string\") {\n        return JSON.stringify(value);\n    } else if (valueType !== \"string\") {\n        return value;\n    }\n\n    try {\n        const parsedValue = JSON.parse(value as string);\n        if (getTypeOf(parsedValue) === type) {\n            return parsedValue;\n        }\n    } catch (e) {} // eslint-disable-line @typescript-eslint/no-unused-vars, no-empty\n\n    return value;\n}\n\nexport function getData(node: SchemaNode, data?: unknown, opts?: TemplateOptions) {\n    if (opts?.cache == null) {\n        throw new Error(\"Missing options\");\n    }\n\n    // @ts-expect-error boolean schema\n    if (node.schema === false || node.schema === true) {\n        return data;\n    }\n    // @attention - very special case to support file instances\n    if (isFile(data)) {\n        return data;\n    }\n\n    if (node.schema?.const !== undefined) {\n        return node.schema?.const;\n    }\n\n    let currentNode = node;\n    let defaultData = data;\n\n    if (Array.isArray(node.schema.enum) && node.schema.enum.length > 0) {\n        if (data === undefined) {\n            return node.schema.default ?? node.schema.enum[0];\n        }\n    }\n\n    if (node.schema.default !== undefined) {\n        if (defaultData === undefined) {\n            defaultData = node.schema.default;\n        }\n    }\n\n    // @keyword allOf\n    if (currentNode.allOf?.length) {\n        currentNode.allOf.forEach((partialNode) => {\n            defaultData = partialNode.getData(defaultData, opts) ?? defaultData;\n        });\n    }\n\n    // @keyword anyOf\n    if (currentNode.anyOf && currentNode.anyOf?.length > 0) {\n        defaultData = currentNode.anyOf[0].getData(defaultData, opts) ?? defaultData;\n    }\n\n    // @keyword oneOf\n    if (currentNode.oneOf && currentNode.oneOf?.length > 0) {\n        if (isEmpty(defaultData)) {\n            currentNode = mergeNode(currentNode, currentNode.oneOf[0]) as SchemaNode;\n        } else {\n            // find correct schema for data\n            const resolvedNode = reduceOneOfFuzzy({ node: currentNode, data: defaultData, path: [], pointer: \"#\" });\n            if (isJsonError(resolvedNode)) {\n                if (defaultData != null && opts.removeInvalidData !== true) {\n                    return defaultData;\n                }\n                // override\n                currentNode = currentNode.oneOf[0];\n                defaultData = undefined;\n            } else {\n                currentNode = mergeNode(currentNode, resolvedNode) as SchemaNode;\n            }\n        }\n    }\n\n    const resolvedNode = safeResolveRef(currentNode, opts);\n    if (resolvedNode === false) {\n        return defaultData;\n    }\n\n    if (isSchemaNode(resolvedNode)) {\n        defaultData = resolvedNode.getData(defaultData, opts) ?? defaultData;\n        currentNode = resolvedNode;\n    }\n\n    const type = getSchemaType(currentNode, defaultData);\n    const templateData = TYPE[type as string]?.(currentNode, defaultData, opts);\n    return templateData === undefined ? defaultData : templateData;\n}\n\nconst TYPE: Record<string, (node: SchemaNode, data: unknown, opts: TemplateOptions) => unknown> = {\n    null: (node, data, opts) => getDefault(node, data, null, opts.useTypeDefaults),\n    string: (node, data, opts) => getDefault(node, data, \"\", opts.useTypeDefaults),\n    number: (node, data, opts) => getDefault(node, data, 0, opts.useTypeDefaults),\n    integer: (node, data, opts) => getDefault(node, data, 0, opts.useTypeDefaults),\n    boolean: (node, data, opts) => getDefault(node, data, false, opts.useTypeDefaults),\n    // object: (draft, schema, data: Record<string, unknown> | undefined, pointer: JsonPointer, opts: TemplateOptions) => {\n    object: (node, data, opts) => {\n        const schema = node.schema;\n        const template = schema.default === undefined ? {} : schema.default;\n        const d: Record<string, unknown> = {}; // do not assign data here, to keep ordering from json-schema\n        const required = opts.extendDefaults === false && schema.default !== undefined ? [] : (schema.required ?? []);\n\n        const properties = node.properties;\n        if (properties) {\n            Object.keys(properties).forEach((propertyName) => {\n                const propertyNode = properties[propertyName];\n                const isRequired = required.includes(propertyName);\n                const input = getValue(data, propertyName);\n                const value = data === undefined || input === undefined ? getValue(template, propertyName) : input;\n                // Omit adding a property if it is not required or optional props should be added\n                if (value != null || isRequired || opts.addOptionalProps) {\n                    const propertyValue = propertyNode.getData(value, opts);\n                    if (propertyValue !== undefined || opts.useTypeDefaults !== false) {\n                        d[propertyName] = propertyValue;\n                    }\n                }\n            });\n        }\n\n        const dependentRequired = node.dependentRequired;\n        if (isObject(dependentRequired)) {\n            Object.keys(dependentRequired).forEach((propertyName) => {\n                const propertyValue = dependentRequired[propertyName];\n                const hasValue = getValue(d, propertyName) !== undefined;\n                if (hasValue) {\n                    propertyValue.forEach((addProperty) => {\n                        const { node: propertyNode } = node.getNodeChild(addProperty, d);\n                        if (propertyNode) {\n                            d[addProperty] = propertyNode.getData(getValue(d, addProperty), opts);\n                        }\n                    });\n                }\n                // if false and removeInvalidData => remove from data\n            });\n        }\n\n        // @keyword dependencies - has to be done after resolving properties so dependency may trigger\n        const dependentSchemas = node.dependentSchemas;\n        if (dependentSchemas) {\n            Object.keys(dependentSchemas).forEach((prop) => {\n                const dependency = dependentSchemas[prop];\n                if (d[prop] !== undefined && isSchemaNode(dependency)) {\n                    const dependencyData = dependency.getData(data ?? d, opts);\n                    Object.assign(d, dependencyData);\n                }\n                // if false and removeInvalidData => remove from data\n            });\n        }\n\n        // console.log(\"getData object\", data, opts);\n        if (data) {\n            if (\n                opts.removeInvalidData === true &&\n                (schema.additionalProperties === false || isObject(schema.additionalProperties))\n            ) {\n                if (isSchemaNode(node.additionalProperties)) {\n                    Object.keys(data).forEach((key) => {\n                        if (d[key] == null) {\n                            // merge valid missing data (additionals) to resulting object\n                            const value = getValue(data, key);\n                            if (node.additionalProperties?.validate(value).valid) {\n                                d[key] = value;\n                            }\n                        }\n                    });\n                }\n            } else {\n                // merge any missing data (additionals) to resulting object\n                Object.keys(data).forEach((key) => d[key] == null && (d[key] = getValue(data, key)));\n            }\n        }\n\n        // @keyword if-then-else\n        if (node.if) {\n            const { errors } = node.if.validate(d);\n            if (errors.length === 0 && node.then) {\n                const templateData = node.then.getData(d, opts);\n                Object.assign(d, templateData);\n            } else if (errors.length > 0 && node.else) {\n                const templateData = node.else.getData(d, opts);\n                Object.assign(d, templateData);\n            }\n        }\n\n        // returns object, which is ordered by json-schema\n        return { ...template, ...d };\n    },\n    // build array type of items, ignores additionalItems\n    array: (node, data, opts) => {\n        const schema = node.schema;\n        const template = schema.default === undefined ? [] : schema.default;\n        const d: unknown[] = Array.isArray(data) ? [...data] : template;\n        const minItems = opts.extendDefaults === false && schema.default !== undefined ? 0 : (schema.minItems ?? 0);\n\n        // when there are no array-items are defined\n        if (schema.prefixItems == null) {\n            // => all items are additionalItems\n            if (node.items && (canResolveRef(node.items, opts) || d?.length > 0)) {\n                const cache = { ...opts.cache };\n                const itemCount = Math.max(minItems, d.length);\n                for (let i = 0; i < itemCount; i += 1) {\n                    opts.cache = copy(cache);\n                    const options = { ...opts, disableRecursionLimit: true };\n                    d[i] = node.items.getData(d[i] == null ? template[i] : d[i], options);\n                }\n            }\n            return d || [];\n        }\n\n        // when items are defined per index\n        if (node.prefixItems) {\n            const input = Array.isArray(data) ? data : [];\n\n            // build defined set of items\n            const length = Math.max(minItems ?? 0, node.prefixItems.length);\n            for (let i = 0; i < length; i += 1) {\n                const childNode = node.prefixItems[i] ?? node.items;\n                if ((childNode && canResolveRef(childNode, opts)) || input[i] !== undefined) {\n                    const result = childNode.getData(d[i] == null ? template[i] : d[i], opts);\n                    if (result !== undefined) {\n                        d[i] = result;\n                    }\n                }\n            }\n            return d || [];\n        }\n\n        // this has to be defined as we checked all other cases\n        if (node.items == null) {\n            return d;\n        }\n\n        // build data from items-definition\n        // @ts-expect-error testing length of unknown type of data\n        if ((node.items && canResolveRef(node.items, opts)) || data?.length > 0) {\n            // @attention this should disable cache or break intended behaviour as we reset it after loop\n            // @todo test recursion of items\n            // intention: reset cache after each property. last call will add counters\n            const cache = { ...opts.cache };\n            for (let i = 0, l = Math.max(minItems, d.length); i < l; i += 1) {\n                opts.cache = copy(cache);\n                const options = { ...opts, disableRecursionLimit: true };\n                const result = node.items.getData(d[i] == null ? template[i] : d[i], options);\n                // @attention if getData aborts recursion it currently returns undefined)\n                if (result === undefined) {\n                    return d;\n                } else {\n                    d[i] = result;\n                }\n            }\n        }\n\n        return d;\n    }\n};\n\nfunction getDefault({ schema }: SchemaNode, templateValue: unknown, initValue: unknown, useTypeDefaults?: boolean) {\n    if (templateValue !== undefined) {\n        return convertValue(schema.type, templateValue);\n    } else if (schema.const) {\n        return schema.const;\n    } else if (schema.default === undefined && Array.isArray(schema.enum)) {\n        return schema.enum[0];\n    } else if (schema.default === undefined && useTypeDefaults !== false) {\n        return initValue;\n    }\n    return schema.default;\n}\n","import { Keyword, JsonSchemaResolverParams, JsonSchemaValidatorParams, ValidationReturnType } from \"../Keyword\";\nimport { isBooleanSchema, isJsonSchema, SchemaNode } from \"../types\";\nimport { validateNode } from \"../validateNode\";\n\nconst KEYWORD = \"items\";\n\nexport const itemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseItems,\n    addResolve: (node) => node[KEYWORD] != null,\n    resolve: itemsResolver,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validateItems\n};\n\nfunction itemsResolver({ node, key }: JsonSchemaResolverParams) {\n    // prefixItems should handle this, abort\n    // Note: This keeps features sort independent for arrays\n    if (node.prefixItems && node.prefixItems?.length > +key) {\n        return;\n    }\n    return node.items;\n}\n\nexport function parseItems(node: SchemaNode) {\n    const items = node.schema[KEYWORD];\n    if (items == null) {\n        return;\n    }\n    if (!(isJsonSchema(items) || isBooleanSchema(items))) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: items,\n            message: `Keyword '${KEYWORD}' must be a valid JSON Schema - received '${typeof items}'`\n        });\n    }\n\n    if (items !== true) {\n        // @todo remove skipping boolean schema\n        node[KEYWORD] = node.compileSchema(\n            items,\n            `${node.evaluationPath}/${KEYWORD}`,\n            `${node.schemaLocation}/${KEYWORD}`\n        );\n        return node[KEYWORD].schemaValidation;\n    }\n}\n\nfunction validateItems({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    if (!Array.isArray(data) || data.length === 0) {\n        return;\n    }\n\n    const withPrefixItems = Array.isArray(schema.prefixItems);\n    if (withPrefixItems && schema.prefixItems.length >= data.length) {\n        return undefined;\n    }\n\n    if (schema.items === false) {\n        if (Array.isArray(data) && data.length === 0) {\n            return undefined;\n        }\n        return node.createError(\"invalid-data-error\", { pointer, value: data, schema });\n    }\n\n    const errors: ValidationReturnType = [];\n    if (node.items) {\n        for (let i = schema.prefixItems?.length ?? 0; i < data.length; i += 1) {\n            const itemData = data[i];\n            const result = validateNode(node.items, itemData, `${pointer}/${i}`, path);\n            if (result) {\n                errors.push(...result);\n            }\n        }\n        return errors;\n    }\n}\n","import { SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaResolverParams, JsonSchemaValidatorParams, ValidationReturnType } from \"../Keyword\";\nimport { validateNode } from \"../validateNode\";\nimport { collectValidationErrors } from \"src/utils/collectValidationErrors\";\n\nconst KEYWORD = \"prefixItems\";\n\nexport const prefixItemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseItems,\n    addResolve: (node) => node[KEYWORD] != null,\n    resolve: prefixItemsResolver,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validatePrefixItems\n};\n\nfunction prefixItemsResolver({ node, key }: JsonSchemaResolverParams) {\n    if (node.prefixItems && node.prefixItems[key as number]) {\n        return node.prefixItems[key as number];\n    }\n}\n\nexport function parseItems(node: SchemaNode) {\n    const { schema, evaluationPath } = node;\n    if (Array.isArray(schema.prefixItems)) {\n        node.prefixItems = schema.prefixItems.map((itemSchema, index) =>\n            node.compileSchema(\n                itemSchema,\n                `${evaluationPath}/${KEYWORD}/${index}`,\n                `${node.schemaLocation}/${KEYWORD}/${index}`\n            )\n        );\n        return collectValidationErrors([], ...node.prefixItems);\n    }\n}\n\nfunction validatePrefixItems({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    if (!Array.isArray(data) || data.length === 0) {\n        return;\n    }\n\n    const errors: ValidationReturnType = [];\n    const prefixItems = node[KEYWORD];\n    if (prefixItems) {\n        // note: schema is valid when data does not have enough elements as defined by array-list\n        for (let i = 0; i < Math.min(prefixItems.length, data.length); i += 1) {\n            const itemData = data[i];\n            // @todo v1 reevaluate: incomplete schema is created here?\n            const itemNode = prefixItems[i];\n            const result = validateNode(itemNode, itemData, `${pointer}/${i}`, path);\n            errors.push(...result);\n        }\n        return errors;\n    }\n}\n","import { ValidationPath } from \"./Keyword\";\nimport { SchemaNode } from \"./types\";\nimport { getValue } from \"./utils/getValue\";\nimport { validateNode } from \"./validateNode\";\n\ntype Options = {\n    /** array node */\n    node: SchemaNode;\n    /** array data */\n    data: unknown[];\n    /** array index to evaluate */\n    key: number;\n    /** pointer to array */\n    pointer: string;\n\n    path: ValidationPath;\n};\n\n/**\n * Returns true if an item is evaluated\n *\n * - Note that this check is partial, the remainder is done in unevaluatedItems\n * - This function currently checks for schema that are not visible by simple validation\n * - We could introduce this method as a new keyword-layer\n */\nexport function isItemEvaluated({ node, data, key, pointer, path }: Options) {\n    const value = getValue(data, key);\n\n    if (node.schema.unevaluatedItems === true || node.schema.items === true) {\n        return true;\n    }\n\n    if (node.contains && validateNode(node.contains, value, `${pointer}/${key}`, path).length === 0) {\n        return true;\n    }\n\n    if (node.allOf) {\n        for (const allOf of node.allOf) {\n            if (isItemEvaluated({ node: allOf, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n    if (node.anyOf) {\n        for (const anyOf of node.anyOf) {\n            if (isItemEvaluated({ node: anyOf, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n\n    if (node.oneOf) {\n        for (const oneOf of node.oneOf) {\n            if (isItemEvaluated({ node: oneOf, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n\n    if (node.if) {\n        if (isItemEvaluated({ node: node.if, data, key, pointer, path })) {\n            return true;\n        }\n        const validIf = validateNode(node.if, data, pointer, path).length === 0;\n\n        if (validIf && node.if.prefixItems && node.if.prefixItems.length > key) {\n            // evaluated by if\n            return true;\n        }\n\n        if (validIf && node.then) {\n            if (isItemEvaluated({ node: node.then, data, key, pointer, path })) {\n                return true;\n            }\n        } else if (!validIf && node.else) {\n            if (isItemEvaluated({ node: node.else, data, key, pointer, path })) {\n                return true;\n            }\n        }\n    }\n}\n","import { isBooleanSchema, isJsonSchema, SchemaNode } from \"../types\";\nimport { Keyword, JsonSchemaValidatorParams, ValidationReturnType } from \"../Keyword\";\nimport { validateNode } from \"../validateNode\";\nimport { isItemEvaluated } from \"../isItemEvaluated\";\n\nconst KEYWORD = \"unevaluatedItems\";\n\n/**\n * @draft >= 2019-09\n * Similar to additionalItems, but can \"see\" into subschemas and across references\n * https://json-schema.org/draft/2019-09/json-schema-core#rfc.section.9.3.1.3\n */\nexport const unevaluatedItemsKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parseUnevaluatedItems,\n    addValidate: ({ schema }) => schema.unevaluatedItems != null, // currently we do not store boolean schema\n    validate: validateUnevaluatedItems\n};\n\nexport function parseUnevaluatedItems(node: SchemaNode) {\n    const unevaluatedItems = node.schema[KEYWORD];\n    if (unevaluatedItems == null) {\n        return;\n    }\n    if (!(isJsonSchema(unevaluatedItems) || isBooleanSchema(unevaluatedItems))) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: unevaluatedItems,\n            message: `Keyword '${KEYWORD}' must be a valid JSON Schema - received '${typeof unevaluatedItems}'`\n        });\n    }\n\n    if (isBooleanSchema(unevaluatedItems)) {\n        return;\n    }\n\n    node.unevaluatedItems = node.compileSchema(\n        node.schema.unevaluatedItems,\n        `${node.evaluationPath}/${KEYWORD}`,\n        `${node.schemaLocation}/${KEYWORD}`\n    );\n    return node.unevaluatedItems.schemaValidation;\n}\n\nfunction validateUnevaluatedItems({ node, data, pointer, path }: JsonSchemaValidatorParams) {\n    const { schema } = node;\n    // if not in items, and not matches additionalItems\n    if (\n        !Array.isArray(data) ||\n        data.length === 0 ||\n        schema.unevaluatedItems == null ||\n        schema.unevaluatedItems === true\n    ) {\n        return undefined;\n    }\n\n    const errors: ValidationReturnType = [];\n    // \"unevaluatedItems with nested items\"\n    for (let i = 0; i < data.length; i += 1) {\n        if (isItemEvaluated({ node, data, pointer, key: i, path })) {\n            continue;\n        }\n\n        const value = data[i];\n        const { node: child } = node.getNodeChild(i, data, { path });\n\n        if (child === undefined) {\n            if (node.unevaluatedItems) {\n                const result = validateNode(node.unevaluatedItems, value, `${pointer}/${i}`, path);\n                if (result.length > 0) {\n                    errors.push(...result);\n                }\n            } else {\n                errors.push(\n                    node.createError(\"unevaluated-items-error\", {\n                        pointer: `${pointer}/${i}`,\n                        value: JSON.stringify(value),\n                        schema\n                    })\n                );\n            }\n        }\n\n        if (child && validateNode(child, value, `${pointer}/${i}`, path).length > 0) {\n            // when a single node is invalid\n            if (\n                node.unevaluatedItems &&\n                node.unevaluatedItems.validate(value, `${pointer}/${i}`, path).valid === false\n            ) {\n                return node.createError(\"unevaluated-items-error\", {\n                    pointer: `${pointer}/${i}`,\n                    value: JSON.stringify(value),\n                    schema\n                });\n            }\n\n            if (node.schema.unevaluatedItems === false) {\n                return node.createError(\"unevaluated-items-error\", {\n                    pointer: `${pointer}/${i}`,\n                    value: JSON.stringify(value),\n                    schema\n                });\n            }\n        }\n    }\n\n    return errors;\n}\n","import { $defsKeyword } from \"./keywords/$defs\";\nimport { $refKeyword } from \"./keywords/$ref\";\nimport { additionalPropertiesKeyword } from \"./keywords/additionalProperties\";\nimport { allOfKeyword } from \"./keywords/allOf\";\nimport { anyOfKeyword } from \"./keywords/anyOf\";\nimport { constKeyword } from \"./keywords/const\";\nimport { containsKeyword } from \"./keywords/contains\";\nimport { createSchema } from \"./methods/createSchema\";\nimport { dependenciesKeyword } from \"./keywords/dependencies\";\nimport { dependentRequiredKeyword } from \"./keywords/dependentRequired\";\nimport { dependentSchemasKeyword } from \"./keywords/dependentSchemas\";\nimport { deprecatedKeyword } from \"./keywords/deprecated\";\nimport { enumKeyword } from \"./keywords/enum\";\nimport { errors } from \"./errors/errors\";\nimport { exclusiveMaximumKeyword } from \"./keywords/exclusiveMaximum\";\nimport { exclusiveMinimumKeyword } from \"./keywords/exclusiveMinimum\";\nimport { formatKeyword } from \"./keywords/format\";\nimport { formats } from \"./formats/formats\";\nimport { getChildSelection } from \"./methods/getChildSelection\";\nimport { getData } from \"./methods/getData\";\nimport { ifKeyword } from \"./keywords/ifthenelse\";\nimport { itemsKeyword } from \"./keywords/items\";\nimport { maximumKeyword } from \"./keywords/maximum\";\nimport { maxItemsKeyword } from \"./keywords/maxItems\";\nimport { maxLengthKeyword } from \"./keywords/maxLength\";\nimport { maxPropertiesKeyword } from \"./keywords/maxProperties\";\nimport { minimumKeyword } from \"./keywords/minimum\";\nimport { minItemsKeyword } from \"./keywords/minItems\";\nimport { minLengthKeyword } from \"./keywords/minLength\";\nimport { minPropertiesKeyword } from \"./keywords/minProperties\";\nimport { multipleOfKeyword } from \"./keywords/multipleOf\";\nimport { notKeyword } from \"./keywords/not\";\nimport { oneOfKeyword } from \"./keywords/oneOf\";\nimport { patternKeyword } from \"./keywords/pattern\";\nimport { patternPropertiesKeyword } from \"./keywords/patternProperties\";\nimport { prefixItemsKeyword } from \"./keywords/prefixItems\";\nimport { propertiesKeyword } from \"./keywords/properties\";\nimport { propertyNamesKeyword } from \"./keywords/propertyNames\";\nimport { requiredKeyword } from \"./keywords/required\";\nimport { sanitizeKeywords } from \"./Draft\";\nimport { toDataNodes } from \"./methods/toDataNodes\";\nimport { typeKeyword } from \"./keywords/type\";\nimport { unevaluatedItemsKeyword } from \"./keywords/unevaluatedItems\";\nimport { unevaluatedPropertiesKeyword } from \"./keywords/unevaluatedProperties\";\nimport { uniqueItemsKeyword } from \"./keywords/uniqueItems\";\n\n/**\n * @draft-2020-12 https://json-schema.org/draft/2020-12/release-notes\n *\n * - The items and additionalItems keywords have been replaced with prefixItems and items\n * - Although the meaning of items has changed, the syntax for defining arrays remains the same.\n *  Only the syntax for defining tuples has changed. The idea is that an array has items (items)\n *  and optionally has some positionally defined items that come before the normal items (prefixItems).\n * - The $recursiveRef and $recursiveAnchor keywords were replaced by the more powerful $dynamicRef and\n *  $dynamicAnchor keywords\n * - This draft specifies that any item in an array that passes validation of the contains schema is\n *  considered \"evaluated\".\n * - Regular expressions are now expected (but not strictly required) to support unicode characters.\n * - This draft drops support for the schema media type parameter\n * - If you reference an external schema, that schema can declare its own $schema and that may be different\n *  than the $schema of the referencing schema. Implementations need to be prepared to switch processing\n *  modes or throw an error if they don't support the $schema of the referenced schema\n * - Implementations that collect annotations should now include annotations for unknown keywords in the\n *  \"verbose\" output format.\n * - The format vocabulary was broken into two separate vocabularies. The \"format-annotation\" vocabulary\n *  treats the format keyword as an annotation and the \"format-assertion\" vocabulary treats the format\n *  keyword as an assertion. The \"format-annotation\" vocabulary is used in the default meta-schema and\n *  is required.\n *\n */\nexport const draft2020 = sanitizeKeywords({\n    version: \"draft-2020-12\",\n    $schemaRegEx: \"draft[/-]2020-?(12)?\",\n    $schema: \"https://json-schema.org/draft/2020-12/schema\",\n    errors,\n    formats,\n    methods: {\n        createSchema,\n        getData,\n        getChildSelection,\n        toDataNodes\n    },\n    keywords: [\n        $refKeyword,\n        additionalPropertiesKeyword,\n        allOfKeyword,\n        anyOfKeyword,\n        constKeyword,\n        containsKeyword,\n        $defsKeyword,\n        dependenciesKeyword,\n        dependentRequiredKeyword,\n        dependentSchemasKeyword,\n        deprecatedKeyword,\n        enumKeyword,\n        exclusiveMaximumKeyword,\n        exclusiveMinimumKeyword,\n        formatKeyword,\n        ifKeyword,\n        itemsKeyword,\n        maximumKeyword,\n        maxItemsKeyword,\n        maxLengthKeyword,\n        maxPropertiesKeyword,\n        minimumKeyword,\n        minItemsKeyword,\n        minLengthKeyword,\n        minPropertiesKeyword,\n        multipleOfKeyword,\n        notKeyword,\n        oneOfKeyword,\n        patternKeyword,\n        patternPropertiesKeyword,\n        prefixItemsKeyword,\n        propertiesKeyword,\n        propertyNamesKeyword,\n        requiredKeyword,\n        typeKeyword,\n        unevaluatedItemsKeyword,\n        unevaluatedPropertiesKeyword,\n        uniqueItemsKeyword\n    ]\n});\n","import { copy } from \"fast-copy\";\nimport { getRef } from \"./keywords/$ref\";\nimport { draft04 } from \"./draft04\";\nimport { draft06 } from \"./draft06\";\nimport { draft07 } from \"./draft07\";\nimport { draft2019 } from \"./draft2019\";\nimport { draft2020 } from \"./draft2020\";\nimport { pick } from \"./utils/pick\";\nimport {\n    JsonSchema,\n    BooleanSchema,\n    Draft,\n    isJsonSchema,\n    JsonAnnotation,\n    JsonError,\n    isJsonError,\n    isJsonAnnotation,\n    isBooleanSchema\n} from \"./types\";\nimport { TemplateOptions } from \"./methods/getData\";\nimport { SchemaNode, SchemaNodeMethods, addKeywords, isSchemaNode } from \"./SchemaNode\";\nimport settings from \"./settings\";\nimport sanitizeErrors from \"./utils/sanitizeErrors\";\n\nconst { REGEX_FLAGS } = settings;\n\nexport type CompileOptions = {\n    /**\n     * List of drafts to support.\n     *\n     * Drafts are selected by testing the passed `schema.$schema` for a matching id, which\n     * is tested by each draft's `Draft.$schemaRegEx`. In case no draft matches `schema.$schema`\n     * the last draft in the list will be used.\n     *\n     * @default [draft04, draft06, draft07, draft2019, draft2020]\n     *\n     * @example\n     * import { draft04, draft07, draft2020 } from \"json-schema-library\"\n     * compileSchema({ $schema: \"draft-04\" }, { drafts: [draft04, draft07, draft2020] })\n     */\n    drafts?: Draft[];\n    /**\n     * Fallback _draft_ version in case no _draft_ is specified by `schema.$schema`.\n     *\n     * Drafts are selected by given `schema.$schema` or the last draft from `drafts` as a fallback.\n     * Specifying `draft` will workthe same as a specifying `schema.$schema` in case no $schema is\n     * defined. When no match can be found, the last _draft_ from `drafts` will be used.\n     *\n     * @example\n     * // uses draft-04\n     * compileSchema({ $schema: \"draft-04\" }, { drafts: [draft04, draft07, draft2020] })\n     *\n     * // uses draft-2020-12\n     * compileSchema({}, { drafts: [draft04, draft07, draft2020] })\n     *\n     * // uses draft-07\n     * compileSchema({}, { draft: \"draft-07\", drafts: [draft04, draft07, draft2020] })\n\n     * // uses draft-04\n     * compileSchema({ $schema: \"draft-04\" }, { draft: \"draft-07\", drafts: [draft04, draft07, draft2020] })\n     *\n     * // uses draft-2020\n     * compileSchema({ $schema: \"draft-04\" }, { draft: \"draft-07\", drafts: [draft2020] })\n     */\n    draft?: string;\n    /**\n     * Set node and its remote schemata as remote schemata for this node and schema to resolve $ref\n     */\n    remote?: SchemaNode;\n    /**\n     * a list of remotes to add, requires a unique $id for each schema. Will be ignored if `remote` is set\n     */\n    remotes?: JsonSchema[];\n    /**\n     * Enables `format`-keyword assertions when this is set tor `true` or sets assertion as defined by\n     * the given meta-schema. Set to `false` to deactivate format validation.\n     *\n     * @default true\n     */\n    formatAssertion?: boolean | \"meta-schema\" | undefined;\n    /** Set default options for all `node.getData` requests */\n    getDataDefaultOptions?: TemplateOptions;\n    /** Set to true to throw an Error on errors in input schema. Defaults to false */\n    throwOnInvalidSchema?: boolean;\n    /** Set to true to throw an Error when encountering an unresolvable ref  */\n    throwOnInvalidRef?: boolean;\n};\n\nconst defaultDrafts: Draft[] = [draft04, draft06, draft07, draft2019, draft2020];\n\nfunction getDraft(drafts: Draft[], $schema: string) {\n    return drafts.find((d) => new RegExp(d.$schemaRegEx, REGEX_FLAGS).test($schema)) ?? drafts[drafts.length - 1];\n}\n\n/**\n * With compileSchema we replace the schema and all sub-schemas with a schemaNode,\n * wrapping each schema with utilities and as much preevaluation as possible. Each\n * node will be reused for each task, but will create a compiledNode for bound data.\n */\nexport function compileSchema(schema: JsonSchema | BooleanSchema, options: CompileOptions = {}) {\n    let remote = options.remote;\n    if (Array.isArray(options.remotes) && options.remotes.length > 0 && !options.remote) {\n        const remotes = [...options.remotes];\n        remotes.forEach((remote, index) => {\n            if (remote.$id == null) {\n                throw new Error(`required $id on remotes[${index}] is missing`);\n            }\n        });\n        remote = compileSchema(remotes.shift()!);\n        remotes.forEach((r) => remote?.addRemoteSchema(r.$id, r));\n    }\n\n    let formatAssertion = options.formatAssertion ?? true;\n    const drafts = options.drafts ?? defaultDrafts;\n    const draft = getDraft(drafts, isJsonSchema(schema) ? (options.draft ?? schema.$schema) : undefined);\n    const node: SchemaNode & { schemaErrors?: JsonError[]; schemaAnnotations: JsonAnnotation[] } = {\n        evaluationPath: \"#\",\n        lastIdPointer: \"#\",\n        schemaLocation: \"#\",\n        dynamicId: \"\",\n        reducers: [],\n        resolvers: [],\n        validators: [],\n        schema: schema as JsonSchema,\n        // @ts-expect-error self-reference added later\n        context: {\n            remotes: {},\n            dynamicAnchors: {},\n            ...(remote?.context ?? {}),\n            anchors: {},\n            refs: {},\n            ...copy(pick(draft, \"methods\", \"keywords\", \"version\", \"formats\", \"errors\")),\n            draft: options.draft,\n            getDataDefaultOptions: options.getDataDefaultOptions,\n            throwOnInvalidRef: options.throwOnInvalidRef ?? false,\n            drafts\n        },\n        ...SchemaNodeMethods\n    };\n\n    node.context.rootNode = node;\n    node.context.remotes[(isJsonSchema(schema) ? schema.$id : undefined) ?? \"#\"] = node;\n\n    if (remote) {\n        const metaSchema = getRef(node, node.schema.$schema);\n        if (isSchemaNode(metaSchema) && metaSchema.schema.$vocabulary) {\n            const vocabs = Object.keys(metaSchema.schema.$vocabulary);\n            // const withAnnotations = vocabs.find((vocab) => vocab.includes(\"vocab/format-annotation\"));\n            const formatAssertionString = vocabs.find((vocab) => vocab.includes(\"vocab/format-assertion\"));\n            if (formatAssertionString && formatAssertion === \"meta-schema\") {\n                formatAssertion = metaSchema.schema.$vocabulary[formatAssertionString] === true;\n            }\n            const validKeywords = Object.keys(metaSchema.getData({}, { addOptionalProps: true }) as object);\n            if (validKeywords.length > 0) {\n                node.context.keywords = node.context.keywords.filter((f) => validKeywords.includes(f.keyword));\n            }\n        }\n    }\n\n    if (formatAssertion === false) {\n        node.context.keywords = node.context.keywords.filter((f) => f.keyword !== \"format\");\n    }\n\n    if (!isJsonSchema(schema) && !isBooleanSchema(schema)) {\n        node.schemaErrors = [\n            node.createError(\"schema-error\", {\n                pointer: \"#\",\n                schema,\n                value: undefined,\n                message: `JSON schema must be object or boolean - reveived: '${schema}'`\n            })\n        ];\n        return node;\n    }\n\n    // parse and validate schema\n    let schemaValidation = addKeywords(node).filter((err) => err != null);\n    schemaValidation = sanitizeErrors(schemaValidation);\n    const schemaErrors: JsonError[] = [];\n    const schemaAnnotations: JsonAnnotation[] = [];\n    schemaValidation.forEach((error) => {\n        if (isJsonError(error)) {\n            schemaErrors.push(error);\n        } else if (isJsonAnnotation(error)) {\n            schemaAnnotations.push(error);\n        }\n    });\n\n    if (options.throwOnInvalidSchema && schemaErrors.length > 0) {\n        const error = new Error(\"Invalid schema passed to compileSchema\");\n        // @ts-expect-error unknown error-property\n        error.data = schemaErrors;\n        throw error;\n    }\n\n    node.schemaErrors = schemaErrors;\n    node.schemaAnnotations = schemaAnnotations;\n\n    return node;\n}\n","import { extendDraft } from \"./Draft\";\nimport { draft2020 } from \"./draft2020\";\nimport { oneOfFuzzyKeyword } from \"./keywords/oneOf\";\nimport { render } from \"./errors/render\";\n\n/**\n * @deprecated\n * @draft-editor https://json-schema.org/draft/2020-12/release-notes\n *\n * Uses Draft 2020-12 and changes resolveOneOf to be fuzzy\n */\nexport const draftEditor = extendDraft(draft2020, {\n    $schemaRegEx: \".\",\n    keywords: [oneOfFuzzyKeyword],\n    errors: {\n        \"min-length-error\": (data) => {\n            if (data.minLength === 1) {\n                return {\n                    type: \"error\",\n                    code: \"min-length-one-error\",\n                    message: \"An input is required\",\n                    data\n                };\n            }\n            return {\n                type: \"error\",\n                code: \"min-length-error\",\n                message: render(\n                    \"Value in `{{pointer}}` is `{{length}}`, but should be `{{minLength}}` at minimum\",\n                    data\n                ),\n                data\n            };\n        }\n    }\n});\n","import { collectValidationErrors } from \"src/utils/collectValidationErrors\";\nimport {\n    Keyword,\n    JsonSchemaValidatorParams,\n    JsonSchemaReducerParams,\n    ValidationReturnType,\n    ValidationAnnotation\n} from \"../Keyword\";\nimport { isBooleanSchema, isJsonSchema, SchemaNode } from \"../types\";\nimport { hasProperty } from \"../utils/hasProperty\";\nimport { isObject } from \"../utils/isObject\";\nimport { mergeSchema } from \"../utils/mergeSchema\";\nimport sanitizeErrors from \"../utils/sanitizeErrors\";\nimport { validateNode } from \"../validateNode\";\n\nconst KEYWORD = \"propertyDependencies\";\n\nfunction findMatchingSchemata(node: SchemaNode, data: Record<string, unknown>) {\n    const dependentProperties = node[KEYWORD];\n    if (dependentProperties == null) {\n        return undefined;\n    }\n    const dependentPropertyNames = Object.keys(dependentProperties);\n    const matchingSchemata: { property: string; value: string; node: SchemaNode }[] = [];\n    for (const propertyName of dependentPropertyNames) {\n        if (hasProperty(data, propertyName)) {\n            const value = data[propertyName];\n            if (dependentProperties[propertyName][value as string]) {\n                matchingSchemata.push({\n                    property: propertyName,\n                    value: `${value}`,\n                    node: dependentProperties[propertyName][value as string]\n                });\n            }\n        }\n    }\n    return matchingSchemata;\n}\n\n/**\n * @experimental `propertyDependencies` to resolve schema by nested name and value\n * @reference https://docs.google.com/presentation/d/1ajXlCQcsjjiMLsluFIILR7sN5aDRBnfqQ9DLbcFbqjI/mobilepresent?slide=id.p\n *\n * - matching schemas are resolved and validiated\n * - multiple matching schemas are resolved and validiated\n * - ignores keyword if no schema is matched\n *\n * @example\n * {\n *   type: \"object\",\n *   propertyDependencies: {\n *      propertyName: {\n *          propertyValue: { $ref: \"#/$defs/schema\" }\n *      }\n *   }\n * }\n *\n * matches\n *\n * {\n *   \"propertyName\": \"propertyValue\",\n *   \"otherData\": 123\n * } with \"#/$defs/schema\"\n */\nexport const propertyDependenciesKeyword: Keyword = {\n    id: KEYWORD,\n    keyword: KEYWORD,\n    parse: parsePropertyDependencies,\n    addValidate: (node) => node[KEYWORD] != null,\n    validate: validatePropertyDependencies,\n    addReduce: (node) => node[KEYWORD] != null,\n    reduce: reducePropertyDependencies\n};\n\nfunction parsePropertyDependencies(node: SchemaNode) {\n    const propertyDependencies = node.schema[KEYWORD];\n    if (!isObject(propertyDependencies)) {\n        return node.createError(\"schema-error\", {\n            pointer: `${node.schemaLocation}/${KEYWORD}`,\n            schema: node.schema,\n            value: propertyDependencies,\n            message: `Keyword '${KEYWORD}' must be an object - received '${typeof propertyDependencies}'`\n        });\n    }\n    const parsed: Record<string, Record<string, SchemaNode>> = {};\n    const errors: ValidationAnnotation[] = [];\n    Object.keys(propertyDependencies).map((propertyName) => {\n        const values = propertyDependencies[propertyName];\n        if (!isObject(values)) {\n            errors.push(\n                node.createError(\"schema-error\", {\n                    pointer: `${node.schemaLocation}/${KEYWORD}/${propertyName}`,\n                    schema: node.schema,\n                    value: propertyDependencies,\n                    message: `Keyword '${KEYWORD}[string]' must be an object - received '${typeof propertyDependencies}'`\n                })\n            );\n            return;\n        }\n        Object.keys(values).forEach((value) => {\n            const schema = values[value];\n            if (!(isJsonSchema(schema) || isBooleanSchema(schema))) {\n                errors.push(\n                    node.createError(\"schema-error\", {\n                        pointer: `${node.schemaLocation}/${KEYWORD}/${propertyName}/${value}`,\n                        schema: node.schema,\n                        value: schema,\n                        message: `Keyword '${KEYWORD}[string][string]' must be a valid JSON Schema - received '${typeof schema}'`\n                    })\n                );\n                return;\n            }\n            parsed[propertyName] = parsed[propertyName] ?? {};\n            parsed[propertyName][value] = node.compileSchema(\n                schema,\n                `${node.evaluationPath}/${KEYWORD}/${propertyName}/${value}`,\n                `${node.schemaLocation}/${KEYWORD}/${propertyName}/${value}`\n            );\n            collectValidationErrors(errors, parsed[propertyName][value]);\n        });\n    });\n    node[KEYWORD] = parsed;\n    return errors;\n}\n\nfunction validatePropertyDependencies({ node, data, pointer = \"#\", path }: JsonSchemaValidatorParams) {\n    if (!isObject(data)) {\n        return undefined;\n    }\n    const matchingSchemata = findMatchingSchemata(node, data);\n    if (matchingSchemata == null || matchingSchemata.length === 0) {\n        return undefined;\n    }\n    const errors: ValidationReturnType[] = [];\n    for (const match of matchingSchemata) {\n        const result = validateNode(match.node, data, pointer, path);\n        errors.push(result);\n    }\n    return sanitizeErrors(errors);\n}\n\nfunction reducePropertyDependencies({ node, data, key, pointer, path }: JsonSchemaReducerParams) {\n    if (!isObject(data)) {\n        return undefined;\n    }\n    const matchingSchemata = findMatchingSchemata(node, data);\n    if (matchingSchemata == null || matchingSchemata.length === 0) {\n        return undefined;\n    }\n\n    let mergedSchema = {};\n    let dynamicId = \"\";\n    for (const match of matchingSchemata) {\n        const { node: schemaNode } = match.node.reduceNode(data, { key, pointer, path });\n        if (schemaNode) {\n            const nestedDynamicId = schemaNode.dynamicId?.replace(node.dynamicId, \"\") ?? \"\";\n            const localDynamicId =\n                nestedDynamicId === \"\" ? `propertyDependencies/${match.property}/${match.value}` : nestedDynamicId;\n            dynamicId += `${dynamicId === \"\" ? \"\" : \",\"}${localDynamicId}`;\n\n            const schema = mergeSchema(match.node.schema, schemaNode.schema);\n            mergedSchema = mergeSchema(mergedSchema, schema, \"propertyDependencies\");\n        }\n    }\n\n    return node.compileSchema(\n        mergedSchema,\n        `${node.evaluationPath}/${dynamicId}`,\n        node.schemaLocation,\n        `${node.schemaLocation}(${dynamicId})`\n    );\n}\n"],"mappings":"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"}