123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- "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
|