1 | "use strict";
|
---|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
3 | const code_1 = require("../code");
|
---|
4 | const codegen_1 = require("../../compile/codegen");
|
---|
5 | const util_1 = require("../../compile/util");
|
---|
6 | const util_2 = require("../../compile/util");
|
---|
7 | const def = {
|
---|
8 | keyword: "patternProperties",
|
---|
9 | type: "object",
|
---|
10 | schemaType: "object",
|
---|
11 | code(cxt) {
|
---|
12 | const { gen, schema, data, parentSchema, it } = cxt;
|
---|
13 | const { opts } = it;
|
---|
14 | const patterns = code_1.allSchemaProperties(schema);
|
---|
15 | const alwaysValidPatterns = patterns.filter((p) => util_1.alwaysValidSchema(it, schema[p]));
|
---|
16 | if (patterns.length === 0 ||
|
---|
17 | (alwaysValidPatterns.length === patterns.length &&
|
---|
18 | (!it.opts.unevaluated || it.props === true))) {
|
---|
19 | return;
|
---|
20 | }
|
---|
21 | const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties;
|
---|
22 | const valid = gen.name("valid");
|
---|
23 | if (it.props !== true && !(it.props instanceof codegen_1.Name)) {
|
---|
24 | it.props = util_2.evaluatedPropsToName(gen, it.props);
|
---|
25 | }
|
---|
26 | const { props } = it;
|
---|
27 | validatePatternProperties();
|
---|
28 | function validatePatternProperties() {
|
---|
29 | for (const pat of patterns) {
|
---|
30 | if (checkProperties)
|
---|
31 | checkMatchingProperties(pat);
|
---|
32 | if (it.allErrors) {
|
---|
33 | validateProperties(pat);
|
---|
34 | }
|
---|
35 | else {
|
---|
36 | gen.var(valid, true); // TODO var
|
---|
37 | validateProperties(pat);
|
---|
38 | gen.if(valid);
|
---|
39 | }
|
---|
40 | }
|
---|
41 | }
|
---|
42 | function checkMatchingProperties(pat) {
|
---|
43 | for (const prop in checkProperties) {
|
---|
44 | if (new RegExp(pat).test(prop)) {
|
---|
45 | util_1.checkStrictMode(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`);
|
---|
46 | }
|
---|
47 | }
|
---|
48 | }
|
---|
49 | function validateProperties(pat) {
|
---|
50 | gen.forIn("key", data, (key) => {
|
---|
51 | gen.if(codegen_1._ `${code_1.usePattern(cxt, pat)}.test(${key})`, () => {
|
---|
52 | const alwaysValid = alwaysValidPatterns.includes(pat);
|
---|
53 | if (!alwaysValid) {
|
---|
54 | cxt.subschema({
|
---|
55 | keyword: "patternProperties",
|
---|
56 | schemaProp: pat,
|
---|
57 | dataProp: key,
|
---|
58 | dataPropType: util_2.Type.Str,
|
---|
59 | }, valid);
|
---|
60 | }
|
---|
61 | if (it.opts.unevaluated && props !== true) {
|
---|
62 | gen.assign(codegen_1._ `${props}[${key}]`, true);
|
---|
63 | }
|
---|
64 | else if (!alwaysValid && !it.allErrors) {
|
---|
65 | // can short-circuit if `unevaluatedProperties` is not supported (opts.next === false)
|
---|
66 | // or if all properties were evaluated (props === true)
|
---|
67 | gen.if(codegen_1.not(valid), () => gen.break());
|
---|
68 | }
|
---|
69 | });
|
---|
70 | });
|
---|
71 | }
|
---|
72 | },
|
---|
73 | };
|
---|
74 | exports.default = def;
|
---|
75 | //# sourceMappingURL=patternProperties.js.map |
---|