| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| const code_1 = require("../code"); |
| const codegen_1 = require("../../compile/codegen"); |
| const util_1 = require("../../compile/util"); |
| const util_2 = require("../../compile/util"); |
| const def = { |
| keyword: "patternProperties", |
| type: "object", |
| schemaType: "object", |
| code(cxt) { |
| const { gen, schema, data, parentSchema, it } = cxt; |
| const { opts } = it; |
| const patterns = (0, code_1.allSchemaProperties)(schema); |
| const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); |
| if (patterns.length === 0 || |
| (alwaysValidPatterns.length === patterns.length && |
| (!it.opts.unevaluated || it.props === true))) { |
| return; |
| } |
| const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; |
| const valid = gen.name("valid"); |
| if (it.props !== true && !(it.props instanceof codegen_1.Name)) { |
| it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); |
| } |
| const { props } = it; |
| validatePatternProperties(); |
| function validatePatternProperties() { |
| for (const pat of patterns) { |
| if (checkProperties) |
| checkMatchingProperties(pat); |
| if (it.allErrors) { |
| validateProperties(pat); |
| } |
| else { |
| gen.var(valid, true); // TODO var |
| validateProperties(pat); |
| gen.if(valid); |
| } |
| } |
| } |
| function checkMatchingProperties(pat) { |
| for (const prop in checkProperties) { |
| if (new RegExp(pat).test(prop)) { |
| (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); |
| } |
| } |
| } |
| function validateProperties(pat) { |
| gen.forIn("key", data, (key) => { |
| gen.if((0, codegen_1._) `${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { |
| const alwaysValid = alwaysValidPatterns.includes(pat); |
| if (!alwaysValid) { |
| cxt.subschema({ |
| keyword: "patternProperties", |
| schemaProp: pat, |
| dataProp: key, |
| dataPropType: util_2.Type.Str, |
| }, valid); |
| } |
| if (it.opts.unevaluated && props !== true) { |
| gen.assign((0, codegen_1._) `${props}[${key}]`, true); |
| } |
| else if (!alwaysValid && !it.allErrors) { |
| // can short-circuit if `unevaluatedProperties` is not supported (opts.next === false) |
| // or if all properties were evaluated (props === true) |
| gen.if((0, codegen_1.not)(valid), () => gen.break()); |
| } |
| }); |
| }); |
| } |
| }, |
| }; |
| exports.default = def; |
| //# sourceMappingURL=patternProperties.js.map |