code(cxt) {
const { gen, schema, data, parentSchema, it } = cxt;
const { opts } = it;
- const patterns = code_1.schemaProperties(it, schema);
- // TODO mark properties matching patterns with always valid schemas as evaluated
- if (patterns.length === 0)
+ 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 = util_2.evaluatedPropsToName(gen, it.props);
+ it.props = (0, util_2.evaluatedPropsToName)(gen, it.props);
}
const { props } = it;
validatePatternProperties();
function checkMatchingProperties(pat) {
for (const prop in checkProperties) {
if (new RegExp(pat).test(prop)) {
- util_1.checkStrictMode(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`);
+ (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`);
}
}
}
function validateProperties(pat) {
gen.forIn("key", data, (key) => {
- gen.if(codegen_1._ `${code_1.usePattern(gen, pat)}.test(${key})`, () => {
- cxt.subschema({
- keyword: "patternProperties",
- schemaProp: pat,
- dataProp: key,
- dataPropType: util_2.Type.Str,
- }, valid);
+ 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(codegen_1._ `${props}[${key}]`, true);
+ gen.assign((0, codegen_1._) `${props}[${key}]`, true);
}
- else if (!it.allErrors) {
+ 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(codegen_1.not(valid), () => gen.break());
+ gen.if((0, codegen_1.not)(valid), () => gen.break());
}
});
});