schema-shield 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -0
- package/dist/index.js +5 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +5 -1
- package/dist/utils/main-utils.d.ts +1 -0
- package/dist/utils/main-utils.d.ts.map +1 -1
- package/lib/utils/main-utils.ts +12 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -238,6 +238,92 @@ SchemaShield is designed to run seamlessly in restrictive environments like **Cl
|
|
|
238
238
|
- **CSP Compliant:** Works in environments where `eval()` and `new Function()` are banned for security.
|
|
239
239
|
- **Instant Startup:** No compilation overhead, minimizing "cold start" latency in Serverless functions.
|
|
240
240
|
|
|
241
|
+
### Serverless Example
|
|
242
|
+
|
|
243
|
+
```javascript
|
|
244
|
+
// Compile at module level - runs once at cold start
|
|
245
|
+
const validateRequest = new SchemaShield().compile({
|
|
246
|
+
type: "object",
|
|
247
|
+
properties: {
|
|
248
|
+
name: { type: "string" },
|
|
249
|
+
email: { type: "string", format: "email" }
|
|
250
|
+
},
|
|
251
|
+
required: ["name", "email"]
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// Vercel Edge / Cloudflare Worker handler
|
|
255
|
+
export default function handler(request) {
|
|
256
|
+
const result = validateRequest(request.body);
|
|
257
|
+
|
|
258
|
+
if (!result.valid) {
|
|
259
|
+
return new Response(JSON.stringify({ error: result.error.message }), {
|
|
260
|
+
status: 400,
|
|
261
|
+
headers: { "Content-Type": "application/json" }
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return new Response(JSON.stringify(result.data), { status: 200 });
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Sharing Compiled Validators
|
|
270
|
+
|
|
271
|
+
Compiled validators are safe to share across requests:
|
|
272
|
+
|
|
273
|
+
```javascript
|
|
274
|
+
// Compile once at startup
|
|
275
|
+
const validateUser = new SchemaShield().compile(userSchema);
|
|
276
|
+
|
|
277
|
+
// Reuse across requests - no mutable state
|
|
278
|
+
app.get("/user/:id", (req) => {
|
|
279
|
+
const result = validateUser(req.body);
|
|
280
|
+
// ...
|
|
281
|
+
});
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Interpreter Architecture
|
|
285
|
+
|
|
286
|
+
Unlike JIT compilers that generate code at runtime, SchemaShield uses a flat-loop interpreter:
|
|
287
|
+
|
|
288
|
+
1. **Compilation:** Schema is compiled into a tree of validator functions at compile-time
|
|
289
|
+
2. **Reference Resolution:** $ref links are resolved once during compilation
|
|
290
|
+
3. **Validation:** Data flows through the validator tree in a flat loop (no recursion)
|
|
291
|
+
|
|
292
|
+
### Performance Characteristics
|
|
293
|
+
|
|
294
|
+
| Schema Type | Performance | Notes |
|
|
295
|
+
|-------------|-------------|-------|
|
|
296
|
+
| Simple (type, properties) | Very fast | ~same as JIT |
|
|
297
|
+
| allOf/anyOf/oneOf | ~70% JIT | Sequential branch evaluation |
|
|
298
|
+
| Deep nesting | Stack-safe | Constant memory, no recursion |
|
|
299
|
+
| Many $refs | Fast | Resolved at compile-time |
|
|
300
|
+
|
|
301
|
+
### Performance Optimization Tips
|
|
302
|
+
|
|
303
|
+
```javascript
|
|
304
|
+
// Best: Flat structure
|
|
305
|
+
const fastSchema = {
|
|
306
|
+
type: "object",
|
|
307
|
+
properties: {
|
|
308
|
+
name: { type: "string" },
|
|
309
|
+
email: { type: "string", format: "email" }
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
// Slower: Deeply nested allOf/anyOf
|
|
314
|
+
const slowSchema = {
|
|
315
|
+
allOf: [
|
|
316
|
+
{ allOf: [{ allOf: [...] }]}
|
|
317
|
+
]
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
// Better: Flatten your schema
|
|
321
|
+
const betterSchema = {
|
|
322
|
+
type: "object",
|
|
323
|
+
properties: { /* ... */ }
|
|
324
|
+
};
|
|
325
|
+
```
|
|
326
|
+
|
|
241
327
|
## Features
|
|
242
328
|
|
|
243
329
|
- Supports draft-06 and draft-07 of the [JSON Schema](https://json-schema.org/) specification.
|
|
@@ -280,6 +366,70 @@ class CustomDate extends Date {}
|
|
|
280
366
|
schemaShield.addType("custom-date-class", (data) => data instanceof CustomDate);
|
|
281
367
|
```
|
|
282
368
|
|
|
369
|
+
## Security Implementation Examples
|
|
370
|
+
|
|
371
|
+
### CSP-Compliant Validation
|
|
372
|
+
|
|
373
|
+
SchemaShield works in strict CSP environments because it uses no code generation:
|
|
374
|
+
|
|
375
|
+
```javascript
|
|
376
|
+
// No eval(), no new Function() - CSP-safe
|
|
377
|
+
const validator = new SchemaShield().compile({
|
|
378
|
+
type: "object",
|
|
379
|
+
properties: {
|
|
380
|
+
name: { type: "string" }
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
// This works in strict CSP policies
|
|
385
|
+
const result = validator({ name: "John" });
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Preventing Prototype Pollution
|
|
389
|
+
|
|
390
|
+
SchemaShield prevents prototype pollution by design:
|
|
391
|
+
|
|
392
|
+
```javascript
|
|
393
|
+
const schema = {
|
|
394
|
+
type: "object",
|
|
395
|
+
properties: {
|
|
396
|
+
name: { type: "string" }
|
|
397
|
+
},
|
|
398
|
+
additionalProperties: false
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
const validator = new SchemaShield().compile(schema);
|
|
402
|
+
|
|
403
|
+
// Malicious input {"__proto__": {"evil": "value"}} will fail
|
|
404
|
+
validator({ "__proto__": { "evil": "value" } });
|
|
405
|
+
// { valid: false, error: ValidationError }
|
|
406
|
+
|
|
407
|
+
// Only explicitly defined properties are allowed
|
|
408
|
+
validator({ name: "John", age: 30 });
|
|
409
|
+
// { valid: false, error: ValidationError (additionalProperties: false) }
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Immutable Mode
|
|
413
|
+
|
|
414
|
+
Protect input data from accidental modification:
|
|
415
|
+
|
|
416
|
+
```javascript
|
|
417
|
+
const shield = new SchemaShield({ immutable: true });
|
|
418
|
+
const validator = shield.compile({
|
|
419
|
+
type: "object",
|
|
420
|
+
properties: {
|
|
421
|
+
name: { type: "string" }
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
const input = { name: "John" };
|
|
426
|
+
const result = validator(input);
|
|
427
|
+
|
|
428
|
+
// Input remains unchanged
|
|
429
|
+
console.log(input);
|
|
430
|
+
// { name: "John" }
|
|
431
|
+
```
|
|
432
|
+
|
|
283
433
|
## Error Handling
|
|
284
434
|
|
|
285
435
|
SchemaShield provides comprehensive error handling for schema validation. When a validation error occurs:
|
package/dist/index.js
CHANGED
|
@@ -35,11 +35,15 @@ var ValidationError = class extends Error {
|
|
|
35
35
|
instancePath = "";
|
|
36
36
|
data;
|
|
37
37
|
schema;
|
|
38
|
+
constructor(message) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.message = message;
|
|
41
|
+
}
|
|
38
42
|
_getCause(pointer = "#", instancePointer = "#") {
|
|
39
43
|
let schemaPath = `${pointer}/${this.keyword}`;
|
|
40
44
|
let instancePath = `${instancePointer}`;
|
|
41
45
|
if (typeof this.item !== "undefined") {
|
|
42
|
-
if (typeof this.item === "string" && this.item in this.schema) {
|
|
46
|
+
if (typeof this.item === "string" && this.schema && typeof this.schema === "object" && this.item in this.schema) {
|
|
43
47
|
schemaPath += `/${this.item}`;
|
|
44
48
|
}
|
|
45
49
|
instancePath += `/${this.item}`;
|
package/dist/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var e=class extends Error{message;item;keyword;cause;schemaPath="";instancePath="";data;schema;_getCause(t="#",r="#"){let a=`${t}/${this.keyword}`,i=`${r}`;return void 0!==this.item&&("string"==typeof this.item&&this.item in this.schema&&(a+=`/${this.item}`),i+=`/${this.item}`),this.instancePath=i,this.schemaPath=a,this.cause&&this.cause instanceof e?this.cause._getCause(a,i):this}getCause(){return this._getCause()}_getTree(){const e={message:this.message,keyword:this.keyword,item:this.item,schemaPath:this.schemaPath,instancePath:this.instancePath,data:this.data};return this.cause&&(e.cause=this.cause._getTree()),e}getTree(){return this.getCause(),this._getTree()}getPath(){const e=this.getCause();return{schemaPath:e.schemaPath,instancePath:e.instancePath}}},t=()=>!0;function r(r,a,n){if(n)return t;const s=new e(`Invalid ${r}`);return s.keyword=r,s.schema=a,i(`defineError_${r}`,(e,t={})=>(s.message=e,s.item=t.item,s.cause=t.cause&&!0!==t.cause?t.cause:void 0,s.data=t.data,s))}function a(e){return!!e&&"object"==typeof e&&!Array.isArray(e)&&"$validate"in e}function i(e,t){return Object.defineProperty(t,"name",{value:e})}var n=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,s=/^P(?!$)((\d+Y)?(\d+M)?(\d+W)?(\d+D)?)(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?$/,o=/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/,l=/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i,f=/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i,u=/^(\d{4})-(\d{2})-(\d{2})$/,c=/^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)(\.\d+)?(Z|([+-])([01]\d|2[0-3]):([0-5]\d))$/,d=/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i,y=/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/,h=/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i,p=/^[^@\s]+@[^@\s]+\.[^@\s]+$/,m=/^[^\s!@#$%^&*()_+\=\[\]{};':"\\|,<>\/?]+$/,v=[31,28,31,30,31,30,31,31,30,31,30,31];function b(e,t){const r=e.charCodeAt(t)-48,a=e.charCodeAt(t+1)-48;return r<0||r>9||a<0||a>9?-1:10*r+a}function g(e,t,r){let a=0,i=t;for(let n=t;n<=r;n++){if(n!==r&&46!==e.charCodeAt(n))continue;const t=n-i;if(t<1||t>3)return!1;if(t>1&&48===e.charCodeAt(i))return!1;let s=0;for(let t=i;t<n;t++){const r=e.charCodeAt(t)-48;if(r<0||r>9)return!1;s=10*s+r}if(s>255)return!1;a++,i=n+1}return 4===a}var A={"date-time"(e){const t=e.length;if(t<19)return!1;if(45!==e.charCodeAt(4)||45!==e.charCodeAt(7)||58!==e.charCodeAt(13)||58!==e.charCodeAt(16))return!1;const r=e.charCodeAt(10);if(84!==r&&116!==r)return!1;const a=((e,t)=>{const r=e.charCodeAt(0)-48,a=e.charCodeAt(1)-48,i=e.charCodeAt(2)-48,n=e.charCodeAt(3)-48;return r<0||r>9||a<0||a>9||i<0||i>9||n<0||n>9?-1:1e3*r+100*a+10*i+n})(e),i=b(e,5),n=b(e,8),s=b(e,11),o=b(e,14),l=b(e,17);if(a<0||i<0||n<0||s<0||o<0||l<0)return!1;if(s>23||o>59||l>60)return!1;let f=19,u=null,c=0,d=0;if(f<t&&46===e.charCodeAt(f)){f++;const r=f;for(;f<t&&(y=e.charCodeAt(f))>=48&&y<=57;)f++;if(f===r)return!1}var y;if(f<t){const r=e.charCodeAt(f);if(90===r||122===r)f++;else{if(43!==r&&45!==r)return!1;if(u=43===r?"+":"-",f+6>t||58!==e.charCodeAt(f+3))return!1;if(c=b(e,f+1),d=b(e,f+4),c<0||d<0||c>23||d>59)return!1;f+=6}}if(f!==t)return!1;if(i<1||i>12)return!1;if(n<1)return!1;const h=2===i?a%4!=0||a%100==0&&a%400!=0?28:29:v[i-1];if(!h||n>h)return!1;if(60===l){let e=60*s+o;if(u){const t=60*c+d;e+="+"===u?-t:t,e%=1440,e<0&&(e+=1440)}if(1439!==e)return!1}return!0},uri(e){return o.test(e)},email(e){return l.test(e)},ipv4(e){return(e=>g(e,0,e.length))(e)},ipv6(e){return(e=>{const t=e.length;if(0===t)return!1;let r=!1,a=!1,i=0,n=0;for(;n<t;){if(58===e.charCodeAt(n)){if(r=!0,n+1<t&&58===e.charCodeAt(n+1)){if(a)return!1;if(a=!0,n+=2,n===t)break;continue}return!1}const o=n;let l=0;for(;n<t&&((s=e.charCodeAt(n))>=48&&s<=57||s>=65&&s<=70||s>=97&&s<=102);){if(l++,l>4)return!1;n++}if(0===l)return!1;if(n<t&&46===e.charCodeAt(n))return!!r&&!!g(e,o,t)&&(a?i<6:6===i);if(i++,i>8)return!1;if(n===t)break;if(58!==e.charCodeAt(n))return!1;if(r=!0,n++,n===t)return!1;if(58===e.charCodeAt(n)){if(a)return!1;if(a=!0,n++,n===t)break}}var s;return!!r&&(a?i<8:8===i)})(e)},hostname(e){return f.test(e)},date(e){const t=u.exec(e);if(!t)return!1;const[,r,a,i]=t,n=Number(r),s=Number(a),o=Number(i);if(s<1||s>12)return!1;if(o<1)return!1;const l=2===s?n%4!=0||n%100==0&&n%400!=0?28:29:v[s-1];return!!l&&o<=l},regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer"(e){return(e=>{if(""===e)return!0;if(47!==e.charCodeAt(0))return!1;for(let t=1;t<e.length;t++){if(126!==e.charCodeAt(t))continue;const r=e.charCodeAt(t+1);if(48!==r&&49!==r)return!1;t++}return!0})(e)},"relative-json-pointer"(e){return(e=>{if(0===e.length)return!0;let t=0;for(;t<e.length;){const r=e.charCodeAt(t);if(r<48||r>57)break;t++}if(0===t)return!1;if(t===e.length)return!0;if(35===e.charCodeAt(t))return t+1===e.length;if(47!==e.charCodeAt(t))return!1;for(t+=1;t<e.length;t++){if(126!==e.charCodeAt(t))continue;const r=e.charCodeAt(t+1);if(48!==r&&49!==r)return!1;t++}return!0})(e)},time(e){return c.test(e)},"uri-reference"(e){return!e.includes("\\")&&d.test(e)},"uri-template"(e){return(e=>{for(let t=0;t<e.length;t++){const r=e.charCodeAt(t);if(125===r)return!1;if(123!==r)continue;const a=e.indexOf("}",t+1);if(-1===a||a===t+1)return!1;t=a}return!0})(e)},duration(e){return s.test(e)},uuid(e){return n.test(e)},iri(e){return y.test(e)},"iri-reference"(e){return!e.includes("\\")&&h.test(e)},"idn-email"(e){return p.test(e)},"idn-hostname"(e){return m.test(e)}},w={object(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},array(e){return Array.isArray(e)},string(e){return"string"==typeof e},number(e){return"number"==typeof e},integer(e){return"number"==typeof e&&e%1==0},boolean(e){return"boolean"==typeof e},null(e){return null===e},timestamp:!1,int8:!1,uint8:!1,int16:!1,uint16:!1,int32:!1,uint32:!1,float32:!1,float64:!1};function O(e,t){if(Object.is(e,t))return!1;if(Array.isArray(e)){if(!1===Array.isArray(t))return!0;if(e.length!==t.length)return!0;for(let r=0;r<t.length;r++)if(O(e[r],t[r]))return!0;return!1}if("object"==typeof e&&null!==e){if("object"!=typeof t||null===t)return!0;for(const r in t)if(O(e[r],t[r]))return!0;for(const r in e)if(!(r in t)&&O(e[r],void 0))return!0;return!1}return!0}function $(e){return null===e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e}function j(e){const t=e.length;if(0===t)return"0";const r=e[0],a=e[t-1],i=null===r?"null":typeof r,n=null===a?"null":typeof a;let s="";if(Array.isArray(r)){const e=k(r);s=null===e?`a:${r.length}`:e}let o="";if(Array.isArray(a)){const e=k(a);o=null===e?`a:${a.length}`:e}return`${t}:${i}:${s}:${n}:${o}`}function P(e){const t=Object.keys(e).sort();return`${t.length}:${t.join("")}`}function k(e){const t=e.length;if(0===t)return"a:0";if(!$(e[0])||!$(e[t-1]))return null;let r=`a:${t}:`;for(let a=0;a<t;a++){const t=e[a];if(null!==t)if("string"!=typeof t)if("number"!=typeof t){if("boolean"!=typeof t)return null;r+=t?"b:1;":"b:0;"}else{if(Number.isNaN(t)){r+="n:NaN;";continue}if(Object.is(t,-0)){r+="n:-0;";continue}r+=`n:${t};`}else r+=`s${t.length}:${t};`;else r+="l;"}return r}var V={items(e,t,r){if(!Array.isArray(t))return;const a=e.items,i=t.length;if("boolean"==typeof a)return!1===a&&i>0?r("Array items are not allowed",{data:t}):void 0;if(Array.isArray(a)){const e=a.length,n=e<i?e:i;for(let e=0;e<n;e++){const i=a[e];if("boolean"==typeof i){if(!1===i&&void 0!==t[e])return r("Array item is not allowed",{item:e,data:t[e]});continue}const n=i&&i.$validate;if("function"==typeof n){const a=n(t[e]);if(a)return r("Array item is invalid",{item:e,cause:a,data:t[e]})}}return}const n=a&&a.$validate;if("function"==typeof n)for(let e=0;e<i;e++){const a=n(t[e]);if(a)return r("Array item is invalid",{item:e,cause:a,data:t[e]})}},elements(e,t,r){if(!Array.isArray(t))return;const a=e.elements,i=a&&a.$validate;if("function"==typeof i)for(let e=0;e<t.length;e++){const a=i(t[e]);if(a)return r("Array item is invalid",{item:e,cause:a,data:t[e]})}},minItems(e,t,r){if(Array.isArray(t)&&!(t.length>=e.minItems))return r("Array is too short",{data:t})},maxItems(e,t,r){if(Array.isArray(t)&&!(t.length<=e.maxItems))return r("Array is too long",{data:t})},additionalItems(e,t,r){if(!Array.isArray(t)||!Array.isArray(e.items))return;let i=e._tupleItemsLength;if(void 0===i&&(i=e.items.length,Object.defineProperty(e,"_tupleItemsLength",{value:i,enumerable:!1,configurable:!1,writable:!1})),!(t.length<=i)){if(!1===e.additionalItems)return r("Array is too long",{data:t});if(!e.additionalItems||"object"!=typeof e.additionalItems||Array.isArray(e.additionalItems));else if(a(e.additionalItems)){for(let a=i;a<t.length;a++){const i=e.additionalItems.$validate(t[a]);if(i)return r("Array item is invalid",{item:a,cause:i,data:t[a]})}return}}},uniqueItems(e,t,r){if(!Array.isArray(t)||!e.uniqueItems)return;const a=t.length;if(a<=1)return;if(a<=8){for(let e=0;e<a;e++){const i=t[e];for(let n=e+1;n<a;n++){const e=t[n];if(i===e)return r("Array items are not unique",{data:e});if("number"==typeof i&&"number"==typeof e&&Number.isNaN(i)&&Number.isNaN(e))return r("Array items are not unique",{data:e});if(i&&e&&"object"==typeof i&&"object"==typeof e&&!O(i,e))return r("Array items are not unique",{data:e})}}return}const i=new Set;let n,s,o;for(let e=0;e<a;e++){const a=t[e];if($(a)){if(i.has(a))return r("Array items are not unique",{data:a});i.add(a);continue}if(!a||"object"!=typeof a)continue;if(Array.isArray(a)){const e=k(a);if(null!==e){if(n||(n=new Set),n.has(e))return r("Array items are not unique",{data:a});n.add(e);continue}s||(s=new Map);const t=j(a);let i=s.get(t);i||(i=[],s.set(t,i));for(let e=0;e<i.length;e++)if(!O(i[e],a))return r("Array items are not unique",{data:a});i.push(a);continue}o||(o=new Map);const l=P(a);let f=o.get(l);f||(f=[],o.set(l,f));for(let e=0;e<f.length;e++)if(!O(f[e],a))return r("Array items are not unique",{data:a});f.push(a)}},contains(e,t,r){if(!Array.isArray(t))return;if("boolean"==typeof e.contains)return e.contains?0===t.length?r("Array must contain at least one item",{data:t}):void 0:r("Array must not contain any items",{data:t});const a=e.contains.$validate;for(let e=0;e<t.length;e++)if(!a(t[e]))return;return r("Array must contain at least one item",{data:t})}};function _(e,t=!1,r=new WeakMap){if(null==e||"object"!=typeof e)return e;const a=e;if(r.has(a))return r.get(a);if(i=a,"function"==typeof structuredClone&&!("undefined"!=typeof Buffer&&i instanceof Buffer)&&(Array.isArray(i)||(e=>{if(!e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t})(i)||i instanceof Date||i instanceof RegExp||i instanceof Map||i instanceof Set||i instanceof ArrayBuffer||ArrayBuffer.isView(i))){const e=structuredClone(a);return r.set(a,e),e}var i;let n;switch(!0){case Array.isArray(a):n=[],r.set(a,n);for(let e=0,i=a.length;e<i;e++)n[e]=_(a[e],t,r);return n;case a instanceof Date:return n=new Date(a.getTime()),r.set(a,n),n;case a instanceof RegExp:return n=new RegExp(a.source,a.flags),r.set(a,n),n;case a instanceof Map:n=new Map,r.set(a,n);for(const[e,i]of a.entries())n.set(_(e,t,r),_(i,t,r));return n;case a instanceof Set:n=new Set,r.set(a,n);for(const e of a.values())n.add(_(e,t,r));return n;case a instanceof ArrayBuffer:return n=a.slice(0),r.set(a,n),n;case ArrayBuffer.isView(a):return n=new a.constructor(a.buffer.slice(0)),r.set(a,n),n;case"undefined"!=typeof Buffer&&a instanceof Buffer:return n=Buffer.from(a),r.set(a,n),n;case a instanceof Error:n=new a.constructor(a.message),r.set(a,n);break;case a instanceof Promise||a instanceof WeakMap||a instanceof WeakSet:return n=a,r.set(a,n),n;case a.constructor&&a.constructor!==Object:if(!t)return n=a,r.set(a,n),n;n=Object.create(Object.getPrototypeOf(a)),r.set(a,n);break;default:{n={},r.set(a,n);const e=Reflect.ownKeys(a);for(let i=0,s=e.length;i<s;i++){const s=e[i];n[s]=_(a[s],t,r)}return n}}const s=Object.getOwnPropertyDescriptors(a);for(const e of Reflect.ownKeys(s)){const a=s[e];"value"in a&&(a.value=_(a.value,t,r)),Object.defineProperty(n,e,a)}return n}var x={minimum(e,t,r,a){if("number"!=typeof t)return;let i=e.minimum;return"number"==typeof e.exclusiveMinimum?i=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(i+=1e-15),t<i?r("Value is less than the minimum",{data:t}):void 0},maximum(e,t,r,a){if("number"!=typeof t)return;let i=e.maximum;return"number"==typeof e.exclusiveMaximum?i=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(i-=1e-15),t>i?r("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,r,a){if("number"!=typeof t)return;const i=t/e.multipleOf;return isFinite(i)?((e,t,r=1e-15)=>Math.abs(e-t)<=r*Math.max(Math.abs(e),Math.abs(t)))(i,Math.round(i))?void 0:r("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,r,a){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?r("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,r,a){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?r("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},C=/[\\.^$*+?()[\]{}|]/;function I(e){return C.test(e)}var R=new Map;function S(e){const t=R.get(e);if(t)return t;let r;if(0===e.length)r=e=>!0;else if(I(e)){const t=e.length;if(t>=2&&"^"===e[0]&&"$"===e[t-1]){const t=e.slice(1,-1);r=I(t)?new RegExp(e,"u"):0===t.length?e=>0===e.length:e=>e===t}else if("^"===e[0]){const t=e.slice(1);r=I(t)?new RegExp(e,"u"):0===t.length?e=>!0:e=>e.startsWith(t)}else if("$"===e[t-1]){const t=e.slice(0,-1);r=I(t)?new RegExp(e,"u"):0===t.length?e=>!0:e=>e.endsWith(t)}else r=new RegExp(e,"u")}else r=t=>t.includes(e);return R.set(e,r),r}var M=512;function q(e){let t=e._patternPropertyEntries;if(t)return t;if(!e.patternProperties||"object"!=typeof e.patternProperties||Array.isArray(e.patternProperties))return;const r=Object.keys(e.patternProperties);t=new Array(r.length);for(let a=0;a<r.length;a++){const i=r[a],n=S(i),s=n instanceof RegExp?e=>n.test(e):n;t[a]={schemaProp:e.patternProperties[i],match:s}}return Object.defineProperty(e,"_patternPropertyEntries",{value:t,enumerable:!1,configurable:!1,writable:!1}),t}function E(e,t,r){let a=e._patternKeyMatchIndexCache;if(a){const e=a.get(t);if(e)return e}else a=new Map,Object.defineProperty(e,"_patternKeyMatchIndexCache",{value:a,enumerable:!1,configurable:!1,writable:!1});const i=[];for(let e=0;e<r.length;e++)r[e].match(t)&&i.push(e);return a.size<M&&a.set(t,i),i}function N(e,t){const r=`_${t}BranchEntries`;let a=e[r];if(a)return a;const i=e[t]||[];a=[];for(let e=0;e<i.length;e++)a.push((n=i[e])&&"object"==typeof n&&!Array.isArray(n)?"$validate"in n&&"function"==typeof n.$validate?{kind:"validate",validate:n.$validate}:{kind:"alwaysValid"}:"boolean"==typeof n?{kind:n?"alwaysValid":"alwaysInvalid"}:{kind:"literal",value:n});var n;return Object.defineProperty(e,r,{value:a,enumerable:!1,configurable:!1,writable:!1}),a}var z={...{required(e,t,r){if(t&&"object"==typeof t&&!Array.isArray(t))for(let a=0;a<e.required.length;a++){const i=e.required[a];if(!{}.hasOwnProperty.call(t,i))return r("Required property is missing",{item:i,data:t[i]})}},properties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=e._propKeys;a||(a=Object.keys(e.properties||{}),Object.defineProperty(e,"_propKeys",{value:a,enumerable:!1,configurable:!1,writable:!1}));let i=e._requiredSet;void 0===i&&(i=Array.isArray(e.required)?new Set(e.required):null,Object.defineProperty(e,"_requiredSet",{value:i,enumerable:!1,configurable:!1,writable:!1}));for(let n=0;n<a.length;n++){const s=a[n],o=e.properties[s];if({}.hasOwnProperty.call(t,s)){if("boolean"!=typeof o){if(o&&"$validate"in o){const e=o.$validate(t[s]);if(e)return r("Property is invalid",{item:s,cause:e,data:t[s]})}}else if(!1===o)return r("Property is not allowed",{item:s,data:t[s]})}else if(i&&i.has(s)&&o&&"object"==typeof o&&!Array.isArray(o)&&"default"in o){const e=o.$validate(o.default);if(e)return r("Default property is invalid",{item:s,cause:e,data:o.default});t[s]=_(o.default)}}},values(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;const a=e.values,i=a&&a.$validate;if("function"==typeof i)for(const e in t){if(!{}.hasOwnProperty.call(t,e))continue;const a=i(t[e]);if(a)return r("Property is invalid",{item:e,cause:a,data:t[e]})}},maxProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=0;for(const i in t)if({}.hasOwnProperty.call(t,i)&&(a++,a>e.maxProperties))return r("Too many properties",{data:t})},minProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=0;for(const r in t)if({}.hasOwnProperty.call(t,r)&&(a++,a>=e.minProperties))return;return r("Too few properties",{data:t})},additionalProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let i=e._apValidate;void 0===i&&(i=a(e.additionalProperties)?e.additionalProperties.$validate:null,Object.defineProperty(e,"_apValidate",{value:i,enumerable:!1,configurable:!1,writable:!1}));const n=q(e);for(const a in t)if({}.hasOwnProperty.call(t,a)&&!(e.properties&&{}.hasOwnProperty.call(e.properties,a)||n&&n.length&&E(e,a,n).length>0)){if(!1===e.additionalProperties)return r("Additional properties are not allowed",{item:a,data:t[a]});if(i){const e=i(t[a]);if(e)return r("Additional properties are invalid",{item:a,cause:e,data:t[a]})}}},patternProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;const a=q(e);if(a&&0!==a.length)for(const i in t){if(!{}.hasOwnProperty.call(t,i))continue;const n=E(e,i,a);if(0!==n.length)for(let e=0;e<n.length;e++){const s=a[n[e]].schemaProp;if("boolean"!=typeof s){if("$validate"in s){const e=s.$validate(t[i]);if(e)return r("Property is invalid",{item:i,cause:e,data:t[i]})}}else if(!1===s)return r("Property is not allowed",{item:i,data:t[i]})}else if(!(!1!==e.additionalProperties||e.properties&&{}.hasOwnProperty.call(e.properties,i)))return r("Additional properties are not allowed",{item:i,data:t[i]})}},propertyNames(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;const a=e.propertyNames;if("boolean"==typeof a){if(!1===a)for(const e in t)if({}.hasOwnProperty.call(t,e))return r("Properties are not allowed",{data:t});return}const i=a&&a.$validate;if("function"==typeof i)for(const e in t){if(!{}.hasOwnProperty.call(t,e))continue;const a=i(e);if(a)return r("Property name is invalid",{item:e,cause:a,data:t[e]})}},dependencies(e,t,r){if(t&&"object"==typeof t&&!Array.isArray(t))for(const a in e.dependencies){if(a in t==0)continue;const i=e.dependencies[a];if(Array.isArray(i)){for(let e=0;e<i.length;e++)if(!(i[e]in t))return r("Dependency is not satisfied",{item:e,data:i[e]});continue}if("boolean"==typeof i){if(i)continue;return r("Dependency is not satisfied",{data:i})}if("string"==typeof i){if(i in t)continue;return r("Dependency is not satisfied",{data:i})}const n=i.$validate(t);if(n)return r("Dependency is not satisfied",{cause:n,data:t})}},then:!1,else:!1,default:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...V,...{minLength(e,t,r){if(!("string"!=typeof t||t.length>=e.minLength))return r("Value is shorter than the minimum length",{data:t})},maxLength(e,t,r){if(!("string"!=typeof t||t.length<=e.maxLength))return r("Value is longer than the maximum length",{data:t})},pattern(e,t,r){if("string"!=typeof t)return;let a=e._patternMatch,i=e._patternMatchCache;if(!a)try{const t=S(e.pattern);a=t instanceof RegExp?e=>t.test(e):t,Object.defineProperty(e,"_patternMatch",{value:a,enumerable:!1,configurable:!1,writable:!1})}catch(e){return r("Invalid regular expression",{data:t,cause:e})}if(i){if(i.has(t)){if(i.get(t))return;return r("Value does not match the pattern",{data:t})}}else i=new Map,Object.defineProperty(e,"_patternMatchCache",{value:i,enumerable:!1,configurable:!1,writable:!1});const n=a(t);return i.size<512&&i.set(t,n),n?void 0:r("Value does not match the pattern",{data:t})},format(e,t,r,a){if("string"!=typeof t)return;let i=e._formatValidate,n=e._formatResultCacheEnabled,s=e._formatResultCache;if(void 0===i&&(i=a.getFormat(e.format),Object.defineProperty(e,"_formatValidate",{value:i,enumerable:!1,configurable:!1,writable:!1})),!i)return;if(void 0===n&&(n=a.isDefaultFormatValidator(e.format,i),Object.defineProperty(e,"_formatResultCacheEnabled",{value:n,enumerable:!1,configurable:!1,writable:!1})),!n){if(i(t))return;return r("Value does not match the format",{data:t})}if(s){if(s.has(t)){if(s.get(t))return;return r("Value does not match the format",{data:t})}}else s=new Map,Object.defineProperty(e,"_formatResultCache",{value:s,enumerable:!1,configurable:!1,writable:!1});const o=i(t);return s.size<512&&s.set(t,o),o?void 0:r("Value does not match the format",{data:t})}},...x,...{enum(e,t,r){let a=e._enumCache;if(!a){const t=new Set,r=[],i=e.enum;for(let e=0;e<i.length;e++){const a=i[e];null!==a&&"object"==typeof a?r.push(a):t.add(a)}a={primitiveSet:t,objectValues:r},Object.defineProperty(e,"_enumCache",{value:a,enumerable:!1,configurable:!1,writable:!1})}if("number"==typeof t&&Number.isNaN(t)||!a.primitiveSet.has(t)){if(null!==t&&"object"==typeof t)for(let e=0;e<a.objectValues.length;e++)if(!O(a.objectValues[e],t))return;return r("Value is not one of the allowed values",{data:t})}},allOf(e,t,r){const a=N(e,"allOf");if(1===a.length){const e=a[0];if("validate"===e.kind){const a=e.validate(t);return a?r("Value is not valid",{cause:a,data:t}):void 0}if("alwaysValid"===e.kind)return;return"alwaysInvalid"===e.kind||t!==e.value?r("Value is not valid",{data:t}):void 0}for(let e=0;e<a.length;e++){const i=a[e];if("validate"!==i.kind){if("alwaysValid"!==i.kind){if("alwaysInvalid"===i.kind)return r("Value is not valid",{data:t});if(t!==i.value)return r("Value is not valid",{data:t})}}else{const e=i.validate(t);if(e)return r("Value is not valid",{cause:e,data:t})}}},anyOf(e,t,r){const a=N(e,"anyOf");if(1===a.length){const e=a[0];if("validate"===e.kind){if(!e.validate(t))return;return r("Value is not valid",{data:t})}if("alwaysValid"===e.kind)return;if("alwaysInvalid"===e.kind)return r("Value is not valid",{data:t});if(t===e.value)return;return r("Value is not valid",{data:t})}for(let e=0;e<a.length;e++){const r=a[e];if("validate"!==r.kind){if("alwaysValid"===r.kind)return;if("alwaysInvalid"!==r.kind&&t===r.value)return}else if(!r.validate(t))return}return r("Value is not valid",{data:t})},oneOf(e,t,r){const a=N(e,"oneOf");if(1===a.length){const e=a[0];if("validate"===e.kind){if(!e.validate(t))return;return r("Value is not valid",{data:t})}if("alwaysValid"===e.kind)return;if("alwaysInvalid"===e.kind)return r("Value is not valid",{data:t});if(t===e.value)return;return r("Value is not valid",{data:t})}let i=0;for(let e=0;e<a.length;e++){const n=a[e];let s=!1;if(s="validate"===n.kind?!n.validate(t):"alwaysValid"===n.kind||"alwaysInvalid"!==n.kind&&t===n.value,s&&(i++,i>1))return r("Value is not valid",{data:t})}if(1!==i)return r("Value is not valid",{data:t})},const(e,t,r){if(t!==e.const&&!(t&&"object"==typeof t&&!Array.isArray(t)&&e.const&&"object"==typeof e.const&&!Array.isArray(e.const)&&!O(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&!O(t,e.const)))return r("Value is not valid",{data:t})},if(e,t){if("then"in e!=0||"else"in e!=0)if("boolean"!=typeof e.if){if(a(e.if))return e.if.$validate(t)?a(e.else)?e.else.$validate(t):void 0:a(e.then)?e.then.$validate(t):void 0}else if(e.if){if(a(e.then))return e.then.$validate(t)}else if(a(e.else))return e.else.$validate(t)},not:(e,t,r)=>"boolean"==typeof e.not?e.not?r("Value is not valid",{data:t}):void 0:e.not&&"object"==typeof e.not&&!Array.isArray(e.not)&&"$validate"in e.not&&e.not.$validate(t)?void 0:r("Value is not valid",{data:t}),$ref(e,t,r,a){if(e._resolvedRef)return e.$validate!==e._resolvedRef&&(e.$validate=e._resolvedRef),e._resolvedRef(t);const i=e.$ref;let n=a.getSchemaRef(i);return n||(n=a.getSchemaById(i)),n?n.$validate?(e._resolvedRef=n.$validate,e.$validate=e._resolvedRef,e._resolvedRef(t)):void 0:r(`Missing reference: ${i}`)}}},F={SchemaShield:class{types={};formats={};keywords={};immutable=!1;rootSchema=null;idRegistry=new Map;failFast=!0;constructor({immutable:e=!1,failFast:t=!0}={}){this.immutable=e,this.failFast=t;for(const[e,t]of Object.entries(w))t&&this.addType(e,t);for(const[e,t]of Object.entries(z))this.addKeyword(e,t);for(const[e,t]of Object.entries(A))t&&this.addFormat(e,t)}addType(t,r,a=!1){if(this.types[t]&&!a)throw new e(`Type "${t}" already exists`);this.types[t]=r}getType(e){return this.types[e]}addFormat(t,r,a=!1){if(this.formats[t]&&!a)throw new e(`Format "${t}" already exists`);this.formats[t]=r}getFormat(e){return this.formats[e]}isDefaultFormatValidator(e,t){return A[e]===t}addKeyword(t,r,a=!1){if(this.keywords[t]&&!a)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=r}getKeyword(e){return this.keywords[e]}getSchemaRef(e){if(this.rootSchema)return((e,t)=>{if(!t||"#"===t)return e;if(t.startsWith("#/")){const r=t.split("/").slice(1);let a=e;for(const e of r){const t=decodeURIComponent(e).replace(/~1/g,"/").replace(/~0/g,"~");if(!a||"object"!=typeof a||!(t in a))return;a=a[t]}return a}if(!t.includes("#")){if(e.definitions&&e.definitions[t])return e.definitions[t];if(e.defs&&e.defs[t])return e.defs[t];if(e.$id&&"string"==typeof e.$id&&(e.$id===t||e.$id.endsWith("/"+t)))return e}})(this.rootSchema,e)}getSchemaById(e){return this.idRegistry.get(e)}compile(t){this.idRegistry.clear();const a=this.compileSchema(t);if(this.rootSchema=a,!0===a._hasRef&&this.linkReferences(a),!a.$validate)if(!1===t){const e=r("oneOf",a,this.failFast);a.$validate=i("Validate_False",t=>e("Value is not valid",{data:t}))}else if(!0===t)a.$validate=i("Validate_Any",()=>{});else{if(!1===this.isSchemaLike(t))throw new e("Invalid schema");a.$validate=i("Validate_Any",()=>{})}const n=e=>{this.rootSchema=a;const t=this.immutable?_(e):e,r=a.$validate(t);return r?{data:t,error:r,valid:!1}:{data:t,error:null,valid:!0}};return n.compiledSchema=a,n}isPlainObject(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}isTrivialAlwaysValidSubschema(e){return!0===e||this.isPlainObject(e)&&0===Object.keys(e).length}shallowArrayEquals(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}flattenAssociativeBranches(e,t){const r=[];for(let a=0;a<t.length;a++){const i=t[a];if(this.isPlainObject(i)&&1===Object.keys(i).length&&Array.isArray(i[e])){const t=this.flattenAssociativeBranches(e,i[e]);for(let e=0;e<t.length;e++)r.push(t[e])}else r.push(i)}return r}flattenSingleWrapperOneOf(e){let t=e;for(;1===t.length;){const e=t[0];if(!this.isPlainObject(e)||1!==Object.keys(e).length||!Array.isArray(e.oneOf))break;t=e.oneOf}return t}normalizeSchemaForCompile(e){let t=e;const r=Object.keys(e),a=e=>1===r.length&&r[0]===e,i=(r,a)=>{t===e&&(t={...e}),t[r]=a};if(Array.isArray(e.allOf)){const t=this.flattenAssociativeBranches("allOf",e.allOf).filter(e=>!(this.isPlainObject(e)&&0===Object.keys(e).length));if(a("allOf")&&1===t.length&&this.isPlainObject(t[0]))return t[0];this.shallowArrayEquals(t,e.allOf)||i("allOf",t)}if(Array.isArray(e.anyOf)){const t=this.flattenAssociativeBranches("anyOf",e.anyOf);if(a("anyOf")&&1===t.length&&this.isPlainObject(t[0]))return t[0];this.shallowArrayEquals(t,e.anyOf)||i("anyOf",t)}if(Array.isArray(e.oneOf)){const t=this.flattenSingleWrapperOneOf(e.oneOf);if(a("oneOf")&&1===t.length&&this.isPlainObject(t[0]))return t[0];this.shallowArrayEquals(t,e.oneOf)||i("oneOf",t)}return t}markSchemaHasRef(e){!0!==e._hasRef&&Object.defineProperty(e,"_hasRef",{value:!0,enumerable:!1,configurable:!1,writable:!1})}shouldSkipKeyword(e,t){const r=e[t];switch(t){case"required":return Array.isArray(r)&&0===r.length;case"uniqueItems":return!1===r;case"properties":case"patternProperties":case"dependencies":return this.isPlainObject(r)&&0===Object.keys(r).length;case"propertyNames":case"items":return!0===r;case"additionalProperties":return!0===r||!1===r&&this.isPlainObject(e.patternProperties)&&Object.keys(e.patternProperties).length>0;case"additionalItems":return!0===r||!Array.isArray(e.items);case"allOf":if(!Array.isArray(r))return!1;if(0===r.length)return!0;for(let e=0;e<r.length;e++)if(!this.isTrivialAlwaysValidSubschema(r[e]))return!1;return!0;case"anyOf":if(!Array.isArray(r))return!1;for(let e=0;e<r.length;e++)if(this.isTrivialAlwaysValidSubschema(r[e]))return!0;return!1;default:return!1}}hasRequiredDefaults(e){const t=e.properties;if(!this.isPlainObject(t))return!1;const r=Object.keys(t);for(let e=0;e<r.length;e++){const a=t[r[e]];if(this.isPlainObject(a)&&"default"in a)return!0}return!1}isDefaultTypeValidator(e,t){return w[e]===t}compileSchema(e){e&&"object"==typeof e&&!Array.isArray(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const t=_(e=this.normalizeSchemaForCompile(e));let a=!1;if("string"==typeof e.$id&&this.idRegistry.set(e.$id,t),"$ref"in e){a=!0;const n=this.getKeyword("$ref");if(n){const a=r("$ref",e.$ref,this.failFast);t.$validate=i("Validate_Reference",e=>n(t,e,a,this))}return this.markSchemaHasRef(t),t}const n=[],s=[];if("type"in e){const t=r("type",e,this.failFast),a=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim()),o=[],l=[],f=[];let u,c=!0;for(const e of a){const t=this.getType(e);t&&(o.push(t),l.push(t.name),this.isDefaultTypeValidator(e,t)?f.push(e):c=!1)}if(0===o.length)throw r("type",e,this.failFast)("Invalid type for schema",{data:e.type});let d="";if(1===o.length&&c){const e=f[0];switch(d=e,e){case"object":u=e=>{if(null===e||"object"!=typeof e||Array.isArray(e))return t("Invalid type",{data:e})};break;case"array":u=e=>{if(!Array.isArray(e))return t("Invalid type",{data:e})};break;case"string":u=e=>{if("string"!=typeof e)return t("Invalid type",{data:e})};break;case"number":u=e=>{if("number"!=typeof e)return t("Invalid type",{data:e})};break;case"integer":u=e=>{if("number"!=typeof e||!Number.isInteger(e))return t("Invalid type",{data:e})};break;case"boolean":u=e=>{if("boolean"!=typeof e)return t("Invalid type",{data:e})};break;case"null":u=e=>{if(null!==e)return t("Invalid type",{data:e})};break;default:{const e=o[0];u=r=>{if(!e(r))return t("Invalid type",{data:r})}}}}else if(o.length>1&&c){d=f.join("_OR_");const e=f.includes("object"),r=f.includes("array"),a=f.includes("string"),i=f.includes("number"),n=f.includes("integer"),s=f.includes("boolean"),o=f.includes("null");u=l=>{const f=typeof l;if("number"===f){if(i||n&&Number.isInteger(l))return;return t("Invalid type",{data:l})}if("string"===f){if(a)return;return t("Invalid type",{data:l})}if("boolean"===f){if(s)return;return t("Invalid type",{data:l})}if("object"===f){if(null===l){if(o)return;return t("Invalid type",{data:l})}if(Array.isArray(l)){if(r)return;return t("Invalid type",{data:l})}if(e)return;return t("Invalid type",{data:l})}return t("Invalid type",{data:l})}}else if(1===o.length){d=l[0];const e=o[0];u=r=>{if(!e(r))return t("Invalid type",{data:r})}}else d=l.join("_OR_"),u=e=>{for(let t=0;t<o.length;t++)if(o[t](e))return;return t("Invalid type",{data:e})};n.push({name:d,validate:i(d,u)}),s.push(d)}const{type:o,$id:l,$ref:f,$validate:u,required:c,...d}=e,y=c?this.hasRequiredDefaults(e)?[...Object.keys(d),"required"]:["required",...Object.keys(d)]:Object.keys(d);for(const a of y){const o=this.getKeyword(a);if(!o)continue;if(this.shouldSkipKeyword(e,a))continue;const l=r(a,e[a],this.failFast),f=o.name||a;n.push({name:f,validate:i(f,e=>o(t,e,l,this))}),s.push(f)}const h=["enum","const","default","examples"];for(const r of y)if(!h.includes(r))if(!e[r]||"object"!=typeof e[r]||Array.isArray(e[r])){if(Array.isArray(e[r]))for(let i=0;i<e[r].length;i++)if(this.isSchemaLike(e[r][i])){const n=this.compileSchema(e[r][i]);!0===n._hasRef&&(a=!0),t[r][i]=n}}else{if("properties"===r){for(const i of Object.keys(e[r])){const n=this.compileSchema(e[r][i]);!0===n._hasRef&&(a=!0),t[r][i]=n}continue}const i=this.compileSchema(e[r]);!0===i._hasRef&&(a=!0),t[r]=i}if(a&&this.markSchemaHasRef(t),0===n.length)return t;if(1===n.length){const e=n[0];t.$validate=i(e.name,e.validate)}else{const e="Validate_"+s.join("_AND_"),r=e=>{for(let t=0;t<n.length;t++){const r=n[t].validate(e);if(r)return r}};t.$validate=i(e,r)}return t}isSchemaLike(e){if(e&&"object"==typeof e&&!Array.isArray(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}linkReferences(e){const t=[e];for(;t.length>0;){const e=t.pop();if(e&&"object"==typeof e){if("string"==typeof e.$ref&&"function"==typeof e.$validate&&"Validate_Reference"===e.$validate.name){const t=e.$ref;let a=this.getSchemaRef(t);if(void 0===a&&(a=this.getSchemaById(t)),"boolean"==typeof a){if(!0===a)e.$validate=i("Validate_Ref_True",()=>{});else{const t=r("$ref",e,this.failFast);e.$validate=i("Validate_Ref_False",e=>t("Value is not valid"))}continue}a&&"function"==typeof a.$validate&&(e.$validate=a.$validate)}for(const r in e){const a=e[r];if(a)if(Array.isArray(a))for(let e=0;e<a.length;e++){const r=a[e];r&&"object"==typeof r&&t.push(r)}else"object"==typeof a&&t.push(a)}}}}},ValidationError:e,deepClone:_};"undefined"!=typeof module?module.exports=F:self.SchemaShield=F})();//# sourceMappingURL=index.min.js.map
|
|
1
|
+
(()=>{var e=class extends Error{message;item;keyword;cause;schemaPath="";instancePath="";data;schema;constructor(e){super(e),this.message=e}_getCause(t="#",r="#"){let a=`${t}/${this.keyword}`,i=`${r}`;return void 0!==this.item&&("string"==typeof this.item&&this.schema&&"object"==typeof this.schema&&this.item in this.schema&&(a+=`/${this.item}`),i+=`/${this.item}`),this.instancePath=i,this.schemaPath=a,this.cause&&this.cause instanceof e?this.cause._getCause(a,i):this}getCause(){return this._getCause()}_getTree(){const e={message:this.message,keyword:this.keyword,item:this.item,schemaPath:this.schemaPath,instancePath:this.instancePath,data:this.data};return this.cause&&(e.cause=this.cause._getTree()),e}getTree(){return this.getCause(),this._getTree()}getPath(){const e=this.getCause();return{schemaPath:e.schemaPath,instancePath:e.instancePath}}},t=()=>!0;function r(r,a,n){if(n)return t;const s=new e(`Invalid ${r}`);return s.keyword=r,s.schema=a,i(`defineError_${r}`,(e,t={})=>(s.message=e,s.item=t.item,s.cause=t.cause&&!0!==t.cause?t.cause:void 0,s.data=t.data,s))}function a(e){return!!e&&"object"==typeof e&&!Array.isArray(e)&&"$validate"in e}function i(e,t){return Object.defineProperty(t,"name",{value:e})}var n=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,s=/^P(?!$)((\d+Y)?(\d+M)?(\d+W)?(\d+D)?)(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?$/,o=/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/,l=/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i,f=/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i,u=/^(\d{4})-(\d{2})-(\d{2})$/,c=/^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)(\.\d+)?(Z|([+-])([01]\d|2[0-3]):([0-5]\d))$/,d=/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i,h=/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/,y=/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i,p=/^[^@\s]+@[^@\s]+\.[^@\s]+$/,m=/^[^\s!@#$%^&*()_+\=\[\]{};':"\\|,<>\/?]+$/,v=[31,28,31,30,31,30,31,31,30,31,30,31];function b(e,t){const r=e.charCodeAt(t)-48,a=e.charCodeAt(t+1)-48;return r<0||r>9||a<0||a>9?-1:10*r+a}function g(e,t,r){let a=0,i=t;for(let n=t;n<=r;n++){if(n!==r&&46!==e.charCodeAt(n))continue;const t=n-i;if(t<1||t>3)return!1;if(t>1&&48===e.charCodeAt(i))return!1;let s=0;for(let t=i;t<n;t++){const r=e.charCodeAt(t)-48;if(r<0||r>9)return!1;s=10*s+r}if(s>255)return!1;a++,i=n+1}return 4===a}var A={"date-time"(e){const t=e.length;if(t<19)return!1;if(45!==e.charCodeAt(4)||45!==e.charCodeAt(7)||58!==e.charCodeAt(13)||58!==e.charCodeAt(16))return!1;const r=e.charCodeAt(10);if(84!==r&&116!==r)return!1;const a=((e,t)=>{const r=e.charCodeAt(0)-48,a=e.charCodeAt(1)-48,i=e.charCodeAt(2)-48,n=e.charCodeAt(3)-48;return r<0||r>9||a<0||a>9||i<0||i>9||n<0||n>9?-1:1e3*r+100*a+10*i+n})(e),i=b(e,5),n=b(e,8),s=b(e,11),o=b(e,14),l=b(e,17);if(a<0||i<0||n<0||s<0||o<0||l<0)return!1;if(s>23||o>59||l>60)return!1;let f=19,u=null,c=0,d=0;if(f<t&&46===e.charCodeAt(f)){f++;const r=f;for(;f<t&&(h=e.charCodeAt(f))>=48&&h<=57;)f++;if(f===r)return!1}var h;if(f<t){const r=e.charCodeAt(f);if(90===r||122===r)f++;else{if(43!==r&&45!==r)return!1;if(u=43===r?"+":"-",f+6>t||58!==e.charCodeAt(f+3))return!1;if(c=b(e,f+1),d=b(e,f+4),c<0||d<0||c>23||d>59)return!1;f+=6}}if(f!==t)return!1;if(i<1||i>12)return!1;if(n<1)return!1;const y=2===i?a%4!=0||a%100==0&&a%400!=0?28:29:v[i-1];if(!y||n>y)return!1;if(60===l){let e=60*s+o;if(u){const t=60*c+d;e+="+"===u?-t:t,e%=1440,e<0&&(e+=1440)}if(1439!==e)return!1}return!0},uri(e){return o.test(e)},email(e){return l.test(e)},ipv4(e){return(e=>g(e,0,e.length))(e)},ipv6(e){return(e=>{const t=e.length;if(0===t)return!1;let r=!1,a=!1,i=0,n=0;for(;n<t;){if(58===e.charCodeAt(n)){if(r=!0,n+1<t&&58===e.charCodeAt(n+1)){if(a)return!1;if(a=!0,n+=2,n===t)break;continue}return!1}const o=n;let l=0;for(;n<t&&((s=e.charCodeAt(n))>=48&&s<=57||s>=65&&s<=70||s>=97&&s<=102);){if(l++,l>4)return!1;n++}if(0===l)return!1;if(n<t&&46===e.charCodeAt(n))return!!r&&!!g(e,o,t)&&(a?i<6:6===i);if(i++,i>8)return!1;if(n===t)break;if(58!==e.charCodeAt(n))return!1;if(r=!0,n++,n===t)return!1;if(58===e.charCodeAt(n)){if(a)return!1;if(a=!0,n++,n===t)break}}var s;return!!r&&(a?i<8:8===i)})(e)},hostname(e){return f.test(e)},date(e){const t=u.exec(e);if(!t)return!1;const[,r,a,i]=t,n=Number(r),s=Number(a),o=Number(i);if(s<1||s>12)return!1;if(o<1)return!1;const l=2===s?n%4!=0||n%100==0&&n%400!=0?28:29:v[s-1];return!!l&&o<=l},regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer"(e){return(e=>{if(""===e)return!0;if(47!==e.charCodeAt(0))return!1;for(let t=1;t<e.length;t++){if(126!==e.charCodeAt(t))continue;const r=e.charCodeAt(t+1);if(48!==r&&49!==r)return!1;t++}return!0})(e)},"relative-json-pointer"(e){return(e=>{if(0===e.length)return!0;let t=0;for(;t<e.length;){const r=e.charCodeAt(t);if(r<48||r>57)break;t++}if(0===t)return!1;if(t===e.length)return!0;if(35===e.charCodeAt(t))return t+1===e.length;if(47!==e.charCodeAt(t))return!1;for(t+=1;t<e.length;t++){if(126!==e.charCodeAt(t))continue;const r=e.charCodeAt(t+1);if(48!==r&&49!==r)return!1;t++}return!0})(e)},time(e){return c.test(e)},"uri-reference"(e){return!e.includes("\\")&&d.test(e)},"uri-template"(e){return(e=>{for(let t=0;t<e.length;t++){const r=e.charCodeAt(t);if(125===r)return!1;if(123!==r)continue;const a=e.indexOf("}",t+1);if(-1===a||a===t+1)return!1;t=a}return!0})(e)},duration(e){return s.test(e)},uuid(e){return n.test(e)},iri(e){return h.test(e)},"iri-reference"(e){return!e.includes("\\")&&y.test(e)},"idn-email"(e){return p.test(e)},"idn-hostname"(e){return m.test(e)}},w={object(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)},array(e){return Array.isArray(e)},string(e){return"string"==typeof e},number(e){return"number"==typeof e},integer(e){return"number"==typeof e&&e%1==0},boolean(e){return"boolean"==typeof e},null(e){return null===e},timestamp:!1,int8:!1,uint8:!1,int16:!1,uint16:!1,int32:!1,uint32:!1,float32:!1,float64:!1};function O(e,t){if(Object.is(e,t))return!1;if(Array.isArray(e)){if(!1===Array.isArray(t))return!0;if(e.length!==t.length)return!0;for(let r=0;r<t.length;r++)if(O(e[r],t[r]))return!0;return!1}if("object"==typeof e&&null!==e){if("object"!=typeof t||null===t)return!0;for(const r in t)if(O(e[r],t[r]))return!0;for(const r in e)if(!(r in t)&&O(e[r],void 0))return!0;return!1}return!0}function $(e){return null===e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e}function j(e){const t=e.length;if(0===t)return"0";const r=e[0],a=e[t-1],i=null===r?"null":typeof r,n=null===a?"null":typeof a;let s="";if(Array.isArray(r)){const e=k(r);s=null===e?`a:${r.length}`:e}let o="";if(Array.isArray(a)){const e=k(a);o=null===e?`a:${a.length}`:e}return`${t}:${i}:${s}:${n}:${o}`}function P(e){const t=Object.keys(e).sort();return`${t.length}:${t.join("")}`}function k(e){const t=e.length;if(0===t)return"a:0";if(!$(e[0])||!$(e[t-1]))return null;let r=`a:${t}:`;for(let a=0;a<t;a++){const t=e[a];if(null!==t)if("string"!=typeof t)if("number"!=typeof t){if("boolean"!=typeof t)return null;r+=t?"b:1;":"b:0;"}else{if(Number.isNaN(t)){r+="n:NaN;";continue}if(Object.is(t,-0)){r+="n:-0;";continue}r+=`n:${t};`}else r+=`s${t.length}:${t};`;else r+="l;"}return r}var V={items(e,t,r){if(!Array.isArray(t))return;const a=e.items,i=t.length;if("boolean"==typeof a)return!1===a&&i>0?r("Array items are not allowed",{data:t}):void 0;if(Array.isArray(a)){const e=a.length,n=e<i?e:i;for(let e=0;e<n;e++){const i=a[e];if("boolean"==typeof i){if(!1===i&&void 0!==t[e])return r("Array item is not allowed",{item:e,data:t[e]});continue}const n=i&&i.$validate;if("function"==typeof n){const a=n(t[e]);if(a)return r("Array item is invalid",{item:e,cause:a,data:t[e]})}}return}const n=a&&a.$validate;if("function"==typeof n)for(let e=0;e<i;e++){const a=n(t[e]);if(a)return r("Array item is invalid",{item:e,cause:a,data:t[e]})}},elements(e,t,r){if(!Array.isArray(t))return;const a=e.elements,i=a&&a.$validate;if("function"==typeof i)for(let e=0;e<t.length;e++){const a=i(t[e]);if(a)return r("Array item is invalid",{item:e,cause:a,data:t[e]})}},minItems(e,t,r){if(Array.isArray(t)&&!(t.length>=e.minItems))return r("Array is too short",{data:t})},maxItems(e,t,r){if(Array.isArray(t)&&!(t.length<=e.maxItems))return r("Array is too long",{data:t})},additionalItems(e,t,r){if(!Array.isArray(t)||!Array.isArray(e.items))return;let i=e._tupleItemsLength;if(void 0===i&&(i=e.items.length,Object.defineProperty(e,"_tupleItemsLength",{value:i,enumerable:!1,configurable:!1,writable:!1})),!(t.length<=i)){if(!1===e.additionalItems)return r("Array is too long",{data:t});if(!e.additionalItems||"object"!=typeof e.additionalItems||Array.isArray(e.additionalItems));else if(a(e.additionalItems)){for(let a=i;a<t.length;a++){const i=e.additionalItems.$validate(t[a]);if(i)return r("Array item is invalid",{item:a,cause:i,data:t[a]})}return}}},uniqueItems(e,t,r){if(!Array.isArray(t)||!e.uniqueItems)return;const a=t.length;if(a<=1)return;if(a<=8){for(let e=0;e<a;e++){const i=t[e];for(let n=e+1;n<a;n++){const e=t[n];if(i===e)return r("Array items are not unique",{data:e});if("number"==typeof i&&"number"==typeof e&&Number.isNaN(i)&&Number.isNaN(e))return r("Array items are not unique",{data:e});if(i&&e&&"object"==typeof i&&"object"==typeof e&&!O(i,e))return r("Array items are not unique",{data:e})}}return}const i=new Set;let n,s,o;for(let e=0;e<a;e++){const a=t[e];if($(a)){if(i.has(a))return r("Array items are not unique",{data:a});i.add(a);continue}if(!a||"object"!=typeof a)continue;if(Array.isArray(a)){const e=k(a);if(null!==e){if(n||(n=new Set),n.has(e))return r("Array items are not unique",{data:a});n.add(e);continue}s||(s=new Map);const t=j(a);let i=s.get(t);i||(i=[],s.set(t,i));for(let e=0;e<i.length;e++)if(!O(i[e],a))return r("Array items are not unique",{data:a});i.push(a);continue}o||(o=new Map);const l=P(a);let f=o.get(l);f||(f=[],o.set(l,f));for(let e=0;e<f.length;e++)if(!O(f[e],a))return r("Array items are not unique",{data:a});f.push(a)}},contains(e,t,r){if(!Array.isArray(t))return;if("boolean"==typeof e.contains)return e.contains?0===t.length?r("Array must contain at least one item",{data:t}):void 0:r("Array must not contain any items",{data:t});const a=e.contains.$validate;for(let e=0;e<t.length;e++)if(!a(t[e]))return;return r("Array must contain at least one item",{data:t})}};function _(e,t=!1,r=new WeakMap){if(null==e||"object"!=typeof e)return e;const a=e;if(r.has(a))return r.get(a);if(i=a,"function"==typeof structuredClone&&!("undefined"!=typeof Buffer&&i instanceof Buffer)&&(Array.isArray(i)||(e=>{if(!e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t})(i)||i instanceof Date||i instanceof RegExp||i instanceof Map||i instanceof Set||i instanceof ArrayBuffer||ArrayBuffer.isView(i))){const e=structuredClone(a);return r.set(a,e),e}var i;let n;switch(!0){case Array.isArray(a):n=[],r.set(a,n);for(let e=0,i=a.length;e<i;e++)n[e]=_(a[e],t,r);return n;case a instanceof Date:return n=new Date(a.getTime()),r.set(a,n),n;case a instanceof RegExp:return n=new RegExp(a.source,a.flags),r.set(a,n),n;case a instanceof Map:n=new Map,r.set(a,n);for(const[e,i]of a.entries())n.set(_(e,t,r),_(i,t,r));return n;case a instanceof Set:n=new Set,r.set(a,n);for(const e of a.values())n.add(_(e,t,r));return n;case a instanceof ArrayBuffer:return n=a.slice(0),r.set(a,n),n;case ArrayBuffer.isView(a):return n=new a.constructor(a.buffer.slice(0)),r.set(a,n),n;case"undefined"!=typeof Buffer&&a instanceof Buffer:return n=Buffer.from(a),r.set(a,n),n;case a instanceof Error:n=new a.constructor(a.message),r.set(a,n);break;case a instanceof Promise||a instanceof WeakMap||a instanceof WeakSet:return n=a,r.set(a,n),n;case a.constructor&&a.constructor!==Object:if(!t)return n=a,r.set(a,n),n;n=Object.create(Object.getPrototypeOf(a)),r.set(a,n);break;default:{n={},r.set(a,n);const e=Reflect.ownKeys(a);for(let i=0,s=e.length;i<s;i++){const s=e[i];n[s]=_(a[s],t,r)}return n}}const s=Object.getOwnPropertyDescriptors(a);for(const e of Reflect.ownKeys(s)){const a=s[e];"value"in a&&(a.value=_(a.value,t,r)),Object.defineProperty(n,e,a)}return n}var x={minimum(e,t,r,a){if("number"!=typeof t)return;let i=e.minimum;return"number"==typeof e.exclusiveMinimum?i=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(i+=1e-15),t<i?r("Value is less than the minimum",{data:t}):void 0},maximum(e,t,r,a){if("number"!=typeof t)return;let i=e.maximum;return"number"==typeof e.exclusiveMaximum?i=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(i-=1e-15),t>i?r("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,r,a){if("number"!=typeof t)return;const i=t/e.multipleOf;return isFinite(i)?((e,t,r=1e-15)=>Math.abs(e-t)<=r*Math.max(Math.abs(e),Math.abs(t)))(i,Math.round(i))?void 0:r("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,r,a){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?r("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,r,a){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?r("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},C=/[\\.^$*+?()[\]{}|]/;function I(e){return C.test(e)}var R=new Map;function S(e){const t=R.get(e);if(t)return t;let r;if(0===e.length)r=e=>!0;else if(I(e)){const t=e.length;if(t>=2&&"^"===e[0]&&"$"===e[t-1]){const t=e.slice(1,-1);r=I(t)?new RegExp(e,"u"):0===t.length?e=>0===e.length:e=>e===t}else if("^"===e[0]){const t=e.slice(1);r=I(t)?new RegExp(e,"u"):0===t.length?e=>!0:e=>e.startsWith(t)}else if("$"===e[t-1]){const t=e.slice(0,-1);r=I(t)?new RegExp(e,"u"):0===t.length?e=>!0:e=>e.endsWith(t)}else r=new RegExp(e,"u")}else r=t=>t.includes(e);return R.set(e,r),r}var M=512;function q(e){let t=e._patternPropertyEntries;if(t)return t;if(!e.patternProperties||"object"!=typeof e.patternProperties||Array.isArray(e.patternProperties))return;const r=Object.keys(e.patternProperties);t=new Array(r.length);for(let a=0;a<r.length;a++){const i=r[a],n=S(i),s=n instanceof RegExp?e=>n.test(e):n;t[a]={schemaProp:e.patternProperties[i],match:s}}return Object.defineProperty(e,"_patternPropertyEntries",{value:t,enumerable:!1,configurable:!1,writable:!1}),t}function E(e,t,r){let a=e._patternKeyMatchIndexCache;if(a){const e=a.get(t);if(e)return e}else a=new Map,Object.defineProperty(e,"_patternKeyMatchIndexCache",{value:a,enumerable:!1,configurable:!1,writable:!1});const i=[];for(let e=0;e<r.length;e++)r[e].match(t)&&i.push(e);return a.size<M&&a.set(t,i),i}function N(e,t){const r=`_${t}BranchEntries`;let a=e[r];if(a)return a;const i=e[t]||[];a=[];for(let e=0;e<i.length;e++)a.push((n=i[e])&&"object"==typeof n&&!Array.isArray(n)?"$validate"in n&&"function"==typeof n.$validate?{kind:"validate",validate:n.$validate}:{kind:"alwaysValid"}:"boolean"==typeof n?{kind:n?"alwaysValid":"alwaysInvalid"}:{kind:"literal",value:n});var n;return Object.defineProperty(e,r,{value:a,enumerable:!1,configurable:!1,writable:!1}),a}var z={...{required(e,t,r){if(t&&"object"==typeof t&&!Array.isArray(t))for(let a=0;a<e.required.length;a++){const i=e.required[a];if(!{}.hasOwnProperty.call(t,i))return r("Required property is missing",{item:i,data:t[i]})}},properties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=e._propKeys;a||(a=Object.keys(e.properties||{}),Object.defineProperty(e,"_propKeys",{value:a,enumerable:!1,configurable:!1,writable:!1}));let i=e._requiredSet;void 0===i&&(i=Array.isArray(e.required)?new Set(e.required):null,Object.defineProperty(e,"_requiredSet",{value:i,enumerable:!1,configurable:!1,writable:!1}));for(let n=0;n<a.length;n++){const s=a[n],o=e.properties[s];if({}.hasOwnProperty.call(t,s)){if("boolean"!=typeof o){if(o&&"$validate"in o){const e=o.$validate(t[s]);if(e)return r("Property is invalid",{item:s,cause:e,data:t[s]})}}else if(!1===o)return r("Property is not allowed",{item:s,data:t[s]})}else if(i&&i.has(s)&&o&&"object"==typeof o&&!Array.isArray(o)&&"default"in o){const e=o.$validate(o.default);if(e)return r("Default property is invalid",{item:s,cause:e,data:o.default});t[s]=_(o.default)}}},values(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;const a=e.values,i=a&&a.$validate;if("function"==typeof i)for(const e in t){if(!{}.hasOwnProperty.call(t,e))continue;const a=i(t[e]);if(a)return r("Property is invalid",{item:e,cause:a,data:t[e]})}},maxProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=0;for(const i in t)if({}.hasOwnProperty.call(t,i)&&(a++,a>e.maxProperties))return r("Too many properties",{data:t})},minProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=0;for(const r in t)if({}.hasOwnProperty.call(t,r)&&(a++,a>=e.minProperties))return;return r("Too few properties",{data:t})},additionalProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;let i=e._apValidate;void 0===i&&(i=a(e.additionalProperties)?e.additionalProperties.$validate:null,Object.defineProperty(e,"_apValidate",{value:i,enumerable:!1,configurable:!1,writable:!1}));const n=q(e);for(const a in t)if({}.hasOwnProperty.call(t,a)&&!(e.properties&&{}.hasOwnProperty.call(e.properties,a)||n&&n.length&&E(e,a,n).length>0)){if(!1===e.additionalProperties)return r("Additional properties are not allowed",{item:a,data:t[a]});if(i){const e=i(t[a]);if(e)return r("Additional properties are invalid",{item:a,cause:e,data:t[a]})}}},patternProperties(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;const a=q(e);if(a&&0!==a.length)for(const i in t){if(!{}.hasOwnProperty.call(t,i))continue;const n=E(e,i,a);if(0!==n.length)for(let e=0;e<n.length;e++){const s=a[n[e]].schemaProp;if("boolean"!=typeof s){if("$validate"in s){const e=s.$validate(t[i]);if(e)return r("Property is invalid",{item:i,cause:e,data:t[i]})}}else if(!1===s)return r("Property is not allowed",{item:i,data:t[i]})}else if(!(!1!==e.additionalProperties||e.properties&&{}.hasOwnProperty.call(e.properties,i)))return r("Additional properties are not allowed",{item:i,data:t[i]})}},propertyNames(e,t,r){if(!t||"object"!=typeof t||Array.isArray(t))return;const a=e.propertyNames;if("boolean"==typeof a){if(!1===a)for(const e in t)if({}.hasOwnProperty.call(t,e))return r("Properties are not allowed",{data:t});return}const i=a&&a.$validate;if("function"==typeof i)for(const e in t){if(!{}.hasOwnProperty.call(t,e))continue;const a=i(e);if(a)return r("Property name is invalid",{item:e,cause:a,data:t[e]})}},dependencies(e,t,r){if(t&&"object"==typeof t&&!Array.isArray(t))for(const a in e.dependencies){if(a in t==0)continue;const i=e.dependencies[a];if(Array.isArray(i)){for(let e=0;e<i.length;e++)if(!(i[e]in t))return r("Dependency is not satisfied",{item:e,data:i[e]});continue}if("boolean"==typeof i){if(i)continue;return r("Dependency is not satisfied",{data:i})}if("string"==typeof i){if(i in t)continue;return r("Dependency is not satisfied",{data:i})}const n=i.$validate(t);if(n)return r("Dependency is not satisfied",{cause:n,data:t})}},then:!1,else:!1,default:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...V,...{minLength(e,t,r){if(!("string"!=typeof t||t.length>=e.minLength))return r("Value is shorter than the minimum length",{data:t})},maxLength(e,t,r){if(!("string"!=typeof t||t.length<=e.maxLength))return r("Value is longer than the maximum length",{data:t})},pattern(e,t,r){if("string"!=typeof t)return;let a=e._patternMatch,i=e._patternMatchCache;if(!a)try{const t=S(e.pattern);a=t instanceof RegExp?e=>t.test(e):t,Object.defineProperty(e,"_patternMatch",{value:a,enumerable:!1,configurable:!1,writable:!1})}catch(e){return r("Invalid regular expression",{data:t,cause:e})}if(i){if(i.has(t)){if(i.get(t))return;return r("Value does not match the pattern",{data:t})}}else i=new Map,Object.defineProperty(e,"_patternMatchCache",{value:i,enumerable:!1,configurable:!1,writable:!1});const n=a(t);return i.size<512&&i.set(t,n),n?void 0:r("Value does not match the pattern",{data:t})},format(e,t,r,a){if("string"!=typeof t)return;let i=e._formatValidate,n=e._formatResultCacheEnabled,s=e._formatResultCache;if(void 0===i&&(i=a.getFormat(e.format),Object.defineProperty(e,"_formatValidate",{value:i,enumerable:!1,configurable:!1,writable:!1})),!i)return;if(void 0===n&&(n=a.isDefaultFormatValidator(e.format,i),Object.defineProperty(e,"_formatResultCacheEnabled",{value:n,enumerable:!1,configurable:!1,writable:!1})),!n){if(i(t))return;return r("Value does not match the format",{data:t})}if(s){if(s.has(t)){if(s.get(t))return;return r("Value does not match the format",{data:t})}}else s=new Map,Object.defineProperty(e,"_formatResultCache",{value:s,enumerable:!1,configurable:!1,writable:!1});const o=i(t);return s.size<512&&s.set(t,o),o?void 0:r("Value does not match the format",{data:t})}},...x,...{enum(e,t,r){let a=e._enumCache;if(!a){const t=new Set,r=[],i=e.enum;for(let e=0;e<i.length;e++){const a=i[e];null!==a&&"object"==typeof a?r.push(a):t.add(a)}a={primitiveSet:t,objectValues:r},Object.defineProperty(e,"_enumCache",{value:a,enumerable:!1,configurable:!1,writable:!1})}if("number"==typeof t&&Number.isNaN(t)||!a.primitiveSet.has(t)){if(null!==t&&"object"==typeof t)for(let e=0;e<a.objectValues.length;e++)if(!O(a.objectValues[e],t))return;return r("Value is not one of the allowed values",{data:t})}},allOf(e,t,r){const a=N(e,"allOf");if(1===a.length){const e=a[0];if("validate"===e.kind){const a=e.validate(t);return a?r("Value is not valid",{cause:a,data:t}):void 0}if("alwaysValid"===e.kind)return;return"alwaysInvalid"===e.kind||t!==e.value?r("Value is not valid",{data:t}):void 0}for(let e=0;e<a.length;e++){const i=a[e];if("validate"!==i.kind){if("alwaysValid"!==i.kind){if("alwaysInvalid"===i.kind)return r("Value is not valid",{data:t});if(t!==i.value)return r("Value is not valid",{data:t})}}else{const e=i.validate(t);if(e)return r("Value is not valid",{cause:e,data:t})}}},anyOf(e,t,r){const a=N(e,"anyOf");if(1===a.length){const e=a[0];if("validate"===e.kind){if(!e.validate(t))return;return r("Value is not valid",{data:t})}if("alwaysValid"===e.kind)return;if("alwaysInvalid"===e.kind)return r("Value is not valid",{data:t});if(t===e.value)return;return r("Value is not valid",{data:t})}for(let e=0;e<a.length;e++){const r=a[e];if("validate"!==r.kind){if("alwaysValid"===r.kind)return;if("alwaysInvalid"!==r.kind&&t===r.value)return}else if(!r.validate(t))return}return r("Value is not valid",{data:t})},oneOf(e,t,r){const a=N(e,"oneOf");if(1===a.length){const e=a[0];if("validate"===e.kind){if(!e.validate(t))return;return r("Value is not valid",{data:t})}if("alwaysValid"===e.kind)return;if("alwaysInvalid"===e.kind)return r("Value is not valid",{data:t});if(t===e.value)return;return r("Value is not valid",{data:t})}let i=0;for(let e=0;e<a.length;e++){const n=a[e];let s=!1;if(s="validate"===n.kind?!n.validate(t):"alwaysValid"===n.kind||"alwaysInvalid"!==n.kind&&t===n.value,s&&(i++,i>1))return r("Value is not valid",{data:t})}if(1!==i)return r("Value is not valid",{data:t})},const(e,t,r){if(t!==e.const&&!(t&&"object"==typeof t&&!Array.isArray(t)&&e.const&&"object"==typeof e.const&&!Array.isArray(e.const)&&!O(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&!O(t,e.const)))return r("Value is not valid",{data:t})},if(e,t){if("then"in e!=0||"else"in e!=0)if("boolean"!=typeof e.if){if(a(e.if))return e.if.$validate(t)?a(e.else)?e.else.$validate(t):void 0:a(e.then)?e.then.$validate(t):void 0}else if(e.if){if(a(e.then))return e.then.$validate(t)}else if(a(e.else))return e.else.$validate(t)},not:(e,t,r)=>"boolean"==typeof e.not?e.not?r("Value is not valid",{data:t}):void 0:e.not&&"object"==typeof e.not&&!Array.isArray(e.not)&&"$validate"in e.not&&e.not.$validate(t)?void 0:r("Value is not valid",{data:t}),$ref(e,t,r,a){if(e._resolvedRef)return e.$validate!==e._resolvedRef&&(e.$validate=e._resolvedRef),e._resolvedRef(t);const i=e.$ref;let n=a.getSchemaRef(i);return n||(n=a.getSchemaById(i)),n?n.$validate?(e._resolvedRef=n.$validate,e.$validate=e._resolvedRef,e._resolvedRef(t)):void 0:r(`Missing reference: ${i}`)}}},F={SchemaShield:class{types={};formats={};keywords={};immutable=!1;rootSchema=null;idRegistry=new Map;failFast=!0;constructor({immutable:e=!1,failFast:t=!0}={}){this.immutable=e,this.failFast=t;for(const[e,t]of Object.entries(w))t&&this.addType(e,t);for(const[e,t]of Object.entries(z))this.addKeyword(e,t);for(const[e,t]of Object.entries(A))t&&this.addFormat(e,t)}addType(t,r,a=!1){if(this.types[t]&&!a)throw new e(`Type "${t}" already exists`);this.types[t]=r}getType(e){return this.types[e]}addFormat(t,r,a=!1){if(this.formats[t]&&!a)throw new e(`Format "${t}" already exists`);this.formats[t]=r}getFormat(e){return this.formats[e]}isDefaultFormatValidator(e,t){return A[e]===t}addKeyword(t,r,a=!1){if(this.keywords[t]&&!a)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=r}getKeyword(e){return this.keywords[e]}getSchemaRef(e){if(this.rootSchema)return((e,t)=>{if(!t||"#"===t)return e;if(t.startsWith("#/")){const r=t.split("/").slice(1);let a=e;for(const e of r){const t=decodeURIComponent(e).replace(/~1/g,"/").replace(/~0/g,"~");if(!a||"object"!=typeof a||!(t in a))return;a=a[t]}return a}if(!t.includes("#")){if(e.definitions&&e.definitions[t])return e.definitions[t];if(e.defs&&e.defs[t])return e.defs[t];if(e.$id&&"string"==typeof e.$id&&(e.$id===t||e.$id.endsWith("/"+t)))return e}})(this.rootSchema,e)}getSchemaById(e){return this.idRegistry.get(e)}compile(t){this.idRegistry.clear();const a=this.compileSchema(t);if(this.rootSchema=a,!0===a._hasRef&&this.linkReferences(a),!a.$validate)if(!1===t){const e=r("oneOf",a,this.failFast);a.$validate=i("Validate_False",t=>e("Value is not valid",{data:t}))}else if(!0===t)a.$validate=i("Validate_Any",()=>{});else{if(!1===this.isSchemaLike(t))throw new e("Invalid schema");a.$validate=i("Validate_Any",()=>{})}const n=e=>{this.rootSchema=a;const t=this.immutable?_(e):e,r=a.$validate(t);return r?{data:t,error:r,valid:!1}:{data:t,error:null,valid:!0}};return n.compiledSchema=a,n}isPlainObject(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}isTrivialAlwaysValidSubschema(e){return!0===e||this.isPlainObject(e)&&0===Object.keys(e).length}shallowArrayEquals(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}flattenAssociativeBranches(e,t){const r=[];for(let a=0;a<t.length;a++){const i=t[a];if(this.isPlainObject(i)&&1===Object.keys(i).length&&Array.isArray(i[e])){const t=this.flattenAssociativeBranches(e,i[e]);for(let e=0;e<t.length;e++)r.push(t[e])}else r.push(i)}return r}flattenSingleWrapperOneOf(e){let t=e;for(;1===t.length;){const e=t[0];if(!this.isPlainObject(e)||1!==Object.keys(e).length||!Array.isArray(e.oneOf))break;t=e.oneOf}return t}normalizeSchemaForCompile(e){let t=e;const r=Object.keys(e),a=e=>1===r.length&&r[0]===e,i=(r,a)=>{t===e&&(t={...e}),t[r]=a};if(Array.isArray(e.allOf)){const t=this.flattenAssociativeBranches("allOf",e.allOf).filter(e=>!(this.isPlainObject(e)&&0===Object.keys(e).length));if(a("allOf")&&1===t.length&&this.isPlainObject(t[0]))return t[0];this.shallowArrayEquals(t,e.allOf)||i("allOf",t)}if(Array.isArray(e.anyOf)){const t=this.flattenAssociativeBranches("anyOf",e.anyOf);if(a("anyOf")&&1===t.length&&this.isPlainObject(t[0]))return t[0];this.shallowArrayEquals(t,e.anyOf)||i("anyOf",t)}if(Array.isArray(e.oneOf)){const t=this.flattenSingleWrapperOneOf(e.oneOf);if(a("oneOf")&&1===t.length&&this.isPlainObject(t[0]))return t[0];this.shallowArrayEquals(t,e.oneOf)||i("oneOf",t)}return t}markSchemaHasRef(e){!0!==e._hasRef&&Object.defineProperty(e,"_hasRef",{value:!0,enumerable:!1,configurable:!1,writable:!1})}shouldSkipKeyword(e,t){const r=e[t];switch(t){case"required":return Array.isArray(r)&&0===r.length;case"uniqueItems":return!1===r;case"properties":case"patternProperties":case"dependencies":return this.isPlainObject(r)&&0===Object.keys(r).length;case"propertyNames":case"items":return!0===r;case"additionalProperties":return!0===r||!1===r&&this.isPlainObject(e.patternProperties)&&Object.keys(e.patternProperties).length>0;case"additionalItems":return!0===r||!Array.isArray(e.items);case"allOf":if(!Array.isArray(r))return!1;if(0===r.length)return!0;for(let e=0;e<r.length;e++)if(!this.isTrivialAlwaysValidSubschema(r[e]))return!1;return!0;case"anyOf":if(!Array.isArray(r))return!1;for(let e=0;e<r.length;e++)if(this.isTrivialAlwaysValidSubschema(r[e]))return!0;return!1;default:return!1}}hasRequiredDefaults(e){const t=e.properties;if(!this.isPlainObject(t))return!1;const r=Object.keys(t);for(let e=0;e<r.length;e++){const a=t[r[e]];if(this.isPlainObject(a)&&"default"in a)return!0}return!1}isDefaultTypeValidator(e,t){return w[e]===t}compileSchema(e){e&&"object"==typeof e&&!Array.isArray(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const t=_(e=this.normalizeSchemaForCompile(e));let a=!1;if("string"==typeof e.$id&&this.idRegistry.set(e.$id,t),"$ref"in e){a=!0;const n=this.getKeyword("$ref");if(n){const a=r("$ref",e.$ref,this.failFast);t.$validate=i("Validate_Reference",e=>n(t,e,a,this))}return this.markSchemaHasRef(t),t}const n=[],s=[];if("type"in e){const t=r("type",e,this.failFast),a=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim()),o=[],l=[],f=[];let u,c=!0;for(const e of a){const t=this.getType(e);t&&(o.push(t),l.push(t.name),this.isDefaultTypeValidator(e,t)?f.push(e):c=!1)}if(0===o.length)throw r("type",e,this.failFast)("Invalid type for schema",{data:e.type});let d="";if(1===o.length&&c){const e=f[0];switch(d=e,e){case"object":u=e=>{if(null===e||"object"!=typeof e||Array.isArray(e))return t("Invalid type",{data:e})};break;case"array":u=e=>{if(!Array.isArray(e))return t("Invalid type",{data:e})};break;case"string":u=e=>{if("string"!=typeof e)return t("Invalid type",{data:e})};break;case"number":u=e=>{if("number"!=typeof e)return t("Invalid type",{data:e})};break;case"integer":u=e=>{if("number"!=typeof e||!Number.isInteger(e))return t("Invalid type",{data:e})};break;case"boolean":u=e=>{if("boolean"!=typeof e)return t("Invalid type",{data:e})};break;case"null":u=e=>{if(null!==e)return t("Invalid type",{data:e})};break;default:{const e=o[0];u=r=>{if(!e(r))return t("Invalid type",{data:r})}}}}else if(o.length>1&&c){d=f.join("_OR_");const e=f.includes("object"),r=f.includes("array"),a=f.includes("string"),i=f.includes("number"),n=f.includes("integer"),s=f.includes("boolean"),o=f.includes("null");u=l=>{const f=typeof l;if("number"===f){if(i||n&&Number.isInteger(l))return;return t("Invalid type",{data:l})}if("string"===f){if(a)return;return t("Invalid type",{data:l})}if("boolean"===f){if(s)return;return t("Invalid type",{data:l})}if("object"===f){if(null===l){if(o)return;return t("Invalid type",{data:l})}if(Array.isArray(l)){if(r)return;return t("Invalid type",{data:l})}if(e)return;return t("Invalid type",{data:l})}return t("Invalid type",{data:l})}}else if(1===o.length){d=l[0];const e=o[0];u=r=>{if(!e(r))return t("Invalid type",{data:r})}}else d=l.join("_OR_"),u=e=>{for(let t=0;t<o.length;t++)if(o[t](e))return;return t("Invalid type",{data:e})};n.push({name:d,validate:i(d,u)}),s.push(d)}const{type:o,$id:l,$ref:f,$validate:u,required:c,...d}=e,h=c?this.hasRequiredDefaults(e)?[...Object.keys(d),"required"]:["required",...Object.keys(d)]:Object.keys(d);for(const a of h){const o=this.getKeyword(a);if(!o)continue;if(this.shouldSkipKeyword(e,a))continue;const l=r(a,e[a],this.failFast),f=o.name||a;n.push({name:f,validate:i(f,e=>o(t,e,l,this))}),s.push(f)}const y=["enum","const","default","examples"];for(const r of h)if(!y.includes(r))if(!e[r]||"object"!=typeof e[r]||Array.isArray(e[r])){if(Array.isArray(e[r]))for(let i=0;i<e[r].length;i++)if(this.isSchemaLike(e[r][i])){const n=this.compileSchema(e[r][i]);!0===n._hasRef&&(a=!0),t[r][i]=n}}else{if("properties"===r){for(const i of Object.keys(e[r])){const n=this.compileSchema(e[r][i]);!0===n._hasRef&&(a=!0),t[r][i]=n}continue}const i=this.compileSchema(e[r]);!0===i._hasRef&&(a=!0),t[r]=i}if(a&&this.markSchemaHasRef(t),0===n.length)return t;if(1===n.length){const e=n[0];t.$validate=i(e.name,e.validate)}else{const e="Validate_"+s.join("_AND_"),r=e=>{for(let t=0;t<n.length;t++){const r=n[t].validate(e);if(r)return r}};t.$validate=i(e,r)}return t}isSchemaLike(e){if(e&&"object"==typeof e&&!Array.isArray(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}linkReferences(e){const t=[e];for(;t.length>0;){const e=t.pop();if(e&&"object"==typeof e){if("string"==typeof e.$ref&&"function"==typeof e.$validate&&"Validate_Reference"===e.$validate.name){const t=e.$ref;let a=this.getSchemaRef(t);if(void 0===a&&(a=this.getSchemaById(t)),"boolean"==typeof a){if(!0===a)e.$validate=i("Validate_Ref_True",()=>{});else{const t=r("$ref",e,this.failFast);e.$validate=i("Validate_Ref_False",e=>t("Value is not valid"))}continue}a&&"function"==typeof a.$validate&&(e.$validate=a.$validate)}for(const r in e){const a=e[r];if(a)if(Array.isArray(a))for(let e=0;e<a.length;e++){const r=a[e];r&&"object"==typeof r&&t.push(r)}else"object"==typeof a&&t.push(a)}}}}},ValidationError:e,deepClone:_};"undefined"!=typeof module?module.exports=F:self.SchemaShield=F})();//# sourceMappingURL=index.min.js.map
|