@cloudflare/cabidela 0.0.15 → 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -1,8 +1,19 @@
1
- # Cabidela
1
+ <div align="center">
2
+ <a href="https://cabidela.pages.dev/">
3
+ <img src="https://raw.githubusercontent.com/cloudflare/cabidela/refs/heads/main/assets/cabidela.png" width="500" height="auto" alt="cabidela"/>
4
+ </a>
5
+ </div>
2
6
 
3
- Cabidela is a small, fast, eval-less, [Cloudflare Workers](https://developers.cloudflare.com/workers/) compatible, dynamic JSON Schema validator.
4
7
 
5
- It implements a large subset of <https://json-schema.org/draft/2020-12/json-schema-validation> that should cover most use-cases. But not all. See limitations below.
8
+ <p align="center">
9
+ <em>Small, fast, eval-less, [Cloudflare Workers](https://developers.cloudflare.com/workers/) compatible, dynamic JSON Schema validator.</em>
10
+ </p>
11
+
12
+ <hr />
13
+
14
+ # What is
15
+
16
+ Cabidela is a small, fast, eval-less, [Cloudflare Workers](https://developers.cloudflare.com/workers/) compatible, dynamic JSON Schema validator. It implements a large subset of <https://json-schema.org/draft/2020-12/json-schema-validation> that should cover most use-cases. But not all. See limitations below.
6
17
 
7
18
  ## How to use
8
19
 
@@ -0,0 +1,29 @@
1
+ type CabidelaOptions = {
2
+ applyDefaults?: boolean;
3
+ errorMessages?: boolean;
4
+ fullErrors?: boolean;
5
+ };
6
+ type SchemaNavigation = {
7
+ path: Array<string>;
8
+ schema: any;
9
+ payload: any;
10
+ evaluatedProperties: Set<string>;
11
+ carryProperties?: boolean;
12
+ absorvErrors?: boolean;
13
+ errors: Set<string>;
14
+ };
15
+ declare class Cabidela {
16
+ schema: any;
17
+ options: CabidelaOptions;
18
+ constructor(schema: any, options?: CabidelaOptions);
19
+ setSchema(schema: any): void;
20
+ setOptions(options: CabidelaOptions): void;
21
+ throw(message: string, needle: SchemaNavigation): void;
22
+ parseAdditionalProperties(needle: SchemaNavigation, contextAdditionalProperties: any, contextEvaluatedProperties: Set<string>): number;
23
+ parseObject(needle: SchemaNavigation): boolean;
24
+ parseList(list: any, needle: SchemaNavigation, breakCondition?: Function): number;
25
+ parseSubSchema(needle: SchemaNavigation): number;
26
+ validate(payload: any): boolean;
27
+ }
28
+
29
+ export { Cabidela, type CabidelaOptions, type SchemaNavigation };
package/dist/index.d.ts CHANGED
@@ -1,18 +1,18 @@
1
- export type CabidelaOptions = {
1
+ type CabidelaOptions = {
2
2
  applyDefaults?: boolean;
3
3
  errorMessages?: boolean;
4
4
  fullErrors?: boolean;
5
5
  };
6
- export type SchemaNavigation = {
6
+ type SchemaNavigation = {
7
7
  path: Array<string>;
8
8
  schema: any;
9
9
  payload: any;
10
- evaluatedProperties?: Set<string>;
10
+ evaluatedProperties: Set<string>;
11
11
  carryProperties?: boolean;
12
12
  absorvErrors?: boolean;
13
- errors?: Set<string>;
13
+ errors: Set<string>;
14
14
  };
15
- export declare class Cabidela {
15
+ declare class Cabidela {
16
16
  schema: any;
17
17
  options: CabidelaOptions;
18
18
  constructor(schema: any, options?: CabidelaOptions);
@@ -25,3 +25,5 @@ export declare class Cabidela {
25
25
  parseSubSchema(needle: SchemaNavigation): number;
26
26
  validate(payload: any): boolean;
27
27
  }
28
+
29
+ export { Cabidela, type CabidelaOptions, type SchemaNavigation };
package/dist/index.js CHANGED
@@ -1,3 +1,29 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Cabidela: () => Cabidela
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+
1
27
  // src/helpers.ts
2
28
  var resolvePayload = (path, obj) => {
3
29
  let resolvedObject = path.reduce(function(prev, curr) {
@@ -46,7 +72,12 @@ var Cabidela = class {
46
72
  options;
47
73
  constructor(schema, options) {
48
74
  this.schema = schema;
49
- this.options = { fullErrors: true, applyDefaults: false, errorMessages: false, ...options || {} };
75
+ this.options = {
76
+ fullErrors: true,
77
+ applyDefaults: false,
78
+ errorMessages: false,
79
+ ...options || {}
80
+ };
50
81
  }
51
82
  setSchema(schema) {
52
83
  this.schema = schema;
@@ -56,12 +87,19 @@ var Cabidela = class {
56
87
  }
57
88
  throw(message, needle) {
58
89
  const error = `${message}${this.options.fullErrors && needle.absorvErrors !== true && needle.errors.size > 0 ? `: ${Array.from(needle.errors).join(", ")}` : ``}`;
59
- throw new Error(this.options.errorMessages ? needle.schema.errorMessage ?? error : error);
90
+ throw new Error(
91
+ this.options.errorMessages ? needle.schema.errorMessage ?? error : error
92
+ );
60
93
  }
61
94
  parseAdditionalProperties(needle, contextAdditionalProperties, contextEvaluatedProperties) {
62
95
  let matchCount = 0;
63
- const { metadata, resolvedObject } = resolvePayload(needle.path, needle.payload);
64
- const unevaluatedProperties = metadata.properties.difference(contextEvaluatedProperties);
96
+ const { metadata, resolvedObject } = resolvePayload(
97
+ needle.path,
98
+ needle.payload
99
+ );
100
+ const unevaluatedProperties = metadata.properties.difference(
101
+ contextEvaluatedProperties
102
+ );
65
103
  if (contextAdditionalProperties === false) {
66
104
  if (unevaluatedProperties.size > 0) {
67
105
  this.throw(
@@ -129,7 +167,10 @@ var Cabidela = class {
129
167
  );
130
168
  }
131
169
  if (needle.schema.hasOwnProperty("unevaluatedProperties")) {
132
- needle.evaluatedProperties = /* @__PURE__ */ new Set([...needle.evaluatedProperties, ...localEvaluatedProperties]);
170
+ needle.evaluatedProperties = /* @__PURE__ */ new Set([
171
+ ...needle.evaluatedProperties,
172
+ ...localEvaluatedProperties
173
+ ]);
133
174
  matchCount += this.parseAdditionalProperties(
134
175
  needle,
135
176
  needle.schema.unevaluatedProperties,
@@ -137,8 +178,13 @@ var Cabidela = class {
137
178
  );
138
179
  }
139
180
  if (needle.schema.hasOwnProperty("required")) {
140
- if (new Set(needle.schema.required).difference(needle.evaluatedProperties.union(localEvaluatedProperties)).size > 0) {
141
- this.throw(`required properties at '${pathToString(needle.path)}' is '${needle.schema.required}'`, needle);
181
+ if (new Set(needle.schema.required).difference(
182
+ needle.evaluatedProperties.union(localEvaluatedProperties)
183
+ ).size > 0) {
184
+ this.throw(
185
+ `required properties at '${pathToString(needle.path)}' is '${needle.schema.required}'`,
186
+ needle
187
+ );
142
188
  }
143
189
  }
144
190
  return matchCount ? true : false;
@@ -184,7 +230,10 @@ var Cabidela = class {
184
230
  return 1;
185
231
  }
186
232
  if (needle.schema.hasOwnProperty("allOf")) {
187
- const conditions = needle.schema.allOf.reduce((r, c) => Object.assign(r, c), {});
233
+ const conditions = needle.schema.allOf.reduce(
234
+ (r, c) => Object.assign(r, c),
235
+ {}
236
+ );
188
237
  try {
189
238
  this.parseSubSchema({
190
239
  ...needle,
@@ -199,7 +248,10 @@ var Cabidela = class {
199
248
  return 0;
200
249
  }
201
250
  }
202
- const { metadata, resolvedObject } = resolvePayload(needle.path, needle.payload);
251
+ const { metadata, resolvedObject } = resolvePayload(
252
+ needle.path,
253
+ needle.payload
254
+ );
203
255
  if (needle.schema.type === "array" && !metadata.types.has("binary") && !metadata.types.has("string")) {
204
256
  let matched = 0;
205
257
  for (let item in resolvedObject) {
@@ -224,7 +276,10 @@ var Cabidela = class {
224
276
  if (needle.schema.type == void 0) return 1;
225
277
  }
226
278
  } else {
227
- this.throw(`enum should be an array at '${pathToString(needle.path)}'`, needle);
279
+ this.throw(
280
+ `enum should be an array at '${pathToString(needle.path)}'`,
281
+ needle
282
+ );
228
283
  }
229
284
  }
230
285
  if (needle.schema.hasOwnProperty("type") && !metadata.types.has(needle.schema.type)) {
@@ -237,7 +292,10 @@ var Cabidela = class {
237
292
  switch (needle.schema.type) {
238
293
  case "string":
239
294
  if (needle.schema.hasOwnProperty("maxLength") && metadata.size > needle.schema.maxLength) {
240
- this.throw(`Length of '${pathToString(needle.path)}' must be <= ${needle.schema.maxLength}`, needle);
295
+ this.throw(
296
+ `Length of '${pathToString(needle.path)}' must be <= ${needle.schema.maxLength}`,
297
+ needle
298
+ );
241
299
  }
242
300
  if (needle.schema.hasOwnProperty("minLength") && metadata.size < needle.schema.minLength) {
243
301
  this.throw(
@@ -249,19 +307,34 @@ var Cabidela = class {
249
307
  case "number":
250
308
  case "integer":
251
309
  if (needle.schema.hasOwnProperty("minimum") && resolvedObject < needle.schema.minimum) {
252
- this.throw(`'${pathToString(needle.path)}' must be >= ${needle.schema.minimum}`, needle);
310
+ this.throw(
311
+ `'${pathToString(needle.path)}' must be >= ${needle.schema.minimum}`,
312
+ needle
313
+ );
253
314
  }
254
315
  if (needle.schema.hasOwnProperty("exclusiveMinimum") && resolvedObject <= needle.schema.exclusiveMinimum) {
255
- this.throw(`'${pathToString(needle.path)}' must be > ${needle.schema.exclusiveMinimum}`, needle);
316
+ this.throw(
317
+ `'${pathToString(needle.path)}' must be > ${needle.schema.exclusiveMinimum}`,
318
+ needle
319
+ );
256
320
  }
257
321
  if (needle.schema.hasOwnProperty("maximum") && resolvedObject > needle.schema.maximum) {
258
- this.throw(`'${pathToString(needle.path)}' must be <= ${needle.schema.maximum}`, needle);
322
+ this.throw(
323
+ `'${pathToString(needle.path)}' must be <= ${needle.schema.maximum}`,
324
+ needle
325
+ );
259
326
  }
260
327
  if (needle.schema.hasOwnProperty("exclusiveMaximum") && resolvedObject >= needle.schema.exclusiveMaximum) {
261
- this.throw(`'${pathToString(needle.path)}' must be < ${needle.schema.exclusiveMaximum}`, needle);
328
+ this.throw(
329
+ `'${pathToString(needle.path)}' must be < ${needle.schema.exclusiveMaximum}`,
330
+ needle
331
+ );
262
332
  }
263
333
  if (needle.schema.hasOwnProperty("multipleOf") && resolvedObject % needle.schema.multipleOf !== 0) {
264
- this.throw(`'${pathToString(needle.path)}' must be multiple of ${needle.schema.multipleOf}`, needle);
334
+ this.throw(
335
+ `'${pathToString(needle.path)}' must be multiple of ${needle.schema.multipleOf}`,
336
+ needle
337
+ );
265
338
  }
266
339
  break;
267
340
  }
@@ -297,7 +370,7 @@ var Cabidela = class {
297
370
  return true;
298
371
  }
299
372
  };
300
- export {
373
+ // Annotate the CommonJS export names for ESM import in node:
374
+ 0 && (module.exports = {
301
375
  Cabidela
302
- };
303
- //# sourceMappingURL=index.js.map
376
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,349 @@
1
+ // src/helpers.ts
2
+ var resolvePayload = (path, obj) => {
3
+ let resolvedObject = path.reduce(function(prev, curr) {
4
+ return prev ? prev[curr] : void 0;
5
+ }, obj);
6
+ return { metadata: getMetaData(resolvedObject), resolvedObject };
7
+ };
8
+ var pathToString = (path) => {
9
+ return path.length == 0 ? `.` : path.map((item) => typeof item === "number" ? `[${item}]` : `.${item}`).join("");
10
+ };
11
+ var getMetaData = (value) => {
12
+ let size = 0;
13
+ let types = /* @__PURE__ */ new Set([]);
14
+ let properties = /* @__PURE__ */ new Set([]);
15
+ if (value === null) {
16
+ types.add("null");
17
+ } else if (typeof value == "string") {
18
+ types.add("string");
19
+ size = value.length;
20
+ } else if (typeof value == "number") {
21
+ size = 1;
22
+ types.add("number");
23
+ if (Number.isInteger(value)) {
24
+ types.add("integer");
25
+ }
26
+ } else if (typeof value == "boolean") {
27
+ types.add("boolean");
28
+ size = 1;
29
+ } else if (Array.isArray(value)) {
30
+ size = value.length;
31
+ types.add("array");
32
+ if (value.find((item) => typeof item !== "number" && typeof item !== "string") == void 0) {
33
+ types.add("binary");
34
+ }
35
+ } else if (typeof value == "object") {
36
+ types.add("object");
37
+ size = Object.keys(value).length;
38
+ properties = new Set(Object.keys(value));
39
+ }
40
+ return { types, size, properties };
41
+ };
42
+
43
+ // src/index.ts
44
+ var Cabidela = class {
45
+ schema;
46
+ options;
47
+ constructor(schema, options) {
48
+ this.schema = schema;
49
+ this.options = {
50
+ fullErrors: true,
51
+ applyDefaults: false,
52
+ errorMessages: false,
53
+ ...options || {}
54
+ };
55
+ }
56
+ setSchema(schema) {
57
+ this.schema = schema;
58
+ }
59
+ setOptions(options) {
60
+ this.options = options;
61
+ }
62
+ throw(message, needle) {
63
+ const error = `${message}${this.options.fullErrors && needle.absorvErrors !== true && needle.errors.size > 0 ? `: ${Array.from(needle.errors).join(", ")}` : ``}`;
64
+ throw new Error(
65
+ this.options.errorMessages ? needle.schema.errorMessage ?? error : error
66
+ );
67
+ }
68
+ parseAdditionalProperties(needle, contextAdditionalProperties, contextEvaluatedProperties) {
69
+ let matchCount = 0;
70
+ const { metadata, resolvedObject } = resolvePayload(
71
+ needle.path,
72
+ needle.payload
73
+ );
74
+ const unevaluatedProperties = metadata.properties.difference(
75
+ contextEvaluatedProperties
76
+ );
77
+ if (contextAdditionalProperties === false) {
78
+ if (unevaluatedProperties.size > 0) {
79
+ this.throw(
80
+ `Additional or unevaluated properties '${Array.from(unevaluatedProperties).join(", ")}' at '${pathToString(needle.path)}' not allowed`,
81
+ {
82
+ ...needle,
83
+ schema: contextAdditionalProperties,
84
+ payload: resolvedObject
85
+ }
86
+ );
87
+ }
88
+ } else {
89
+ for (let property of unevaluatedProperties) {
90
+ if (this.parseSubSchema({
91
+ path: [property],
92
+ schema: contextAdditionalProperties,
93
+ payload: resolvedObject,
94
+ evaluatedProperties: /* @__PURE__ */ new Set(),
95
+ errors: /* @__PURE__ */ new Set()
96
+ })) {
97
+ matchCount++;
98
+ needle.evaluatedProperties.add(property);
99
+ }
100
+ }
101
+ }
102
+ return matchCount;
103
+ }
104
+ // Iterates through the properties of an "object" schema
105
+ parseObject(needle) {
106
+ if (needle.schema.hasOwnProperty("minProperties")) {
107
+ if (Object.keys(needle.payload).length < needle.schema.minProperties) {
108
+ this.throw(
109
+ `minProperties at '${pathToString(needle.path)}' is ${needle.schema.minProperties}, got ${Object.keys(needle.payload).length}`,
110
+ needle
111
+ );
112
+ }
113
+ }
114
+ if (needle.schema.hasOwnProperty("maxProperties")) {
115
+ if (Object.keys(needle.payload).length > needle.schema.maxProperties) {
116
+ this.throw(
117
+ `maxProperties at '${pathToString(needle.path)}' is ${needle.schema.minProperties}, got ${Object.keys(needle.payload).length}`,
118
+ needle
119
+ );
120
+ }
121
+ }
122
+ const localEvaluatedProperties = /* @__PURE__ */ new Set([]);
123
+ let matchCount = 0;
124
+ if (needle.schema.hasOwnProperty("properties")) {
125
+ for (let property in needle.schema.properties) {
126
+ if (this.parseSubSchema({
127
+ ...needle,
128
+ path: [...needle.path, property],
129
+ schema: needle.schema.properties[property]
130
+ })) {
131
+ localEvaluatedProperties.add(property);
132
+ matchCount++;
133
+ }
134
+ }
135
+ }
136
+ if (needle.schema.hasOwnProperty("additionalProperties")) {
137
+ matchCount += this.parseAdditionalProperties(
138
+ needle,
139
+ needle.schema.additionalProperties,
140
+ localEvaluatedProperties
141
+ );
142
+ }
143
+ if (needle.schema.hasOwnProperty("unevaluatedProperties")) {
144
+ needle.evaluatedProperties = /* @__PURE__ */ new Set([
145
+ ...needle.evaluatedProperties,
146
+ ...localEvaluatedProperties
147
+ ]);
148
+ matchCount += this.parseAdditionalProperties(
149
+ needle,
150
+ needle.schema.unevaluatedProperties,
151
+ needle.evaluatedProperties
152
+ );
153
+ }
154
+ if (needle.schema.hasOwnProperty("required")) {
155
+ if (new Set(needle.schema.required).difference(
156
+ needle.evaluatedProperties.union(localEvaluatedProperties)
157
+ ).size > 0) {
158
+ this.throw(
159
+ `required properties at '${pathToString(needle.path)}' is '${needle.schema.required}'`,
160
+ needle
161
+ );
162
+ }
163
+ }
164
+ return matchCount ? true : false;
165
+ }
166
+ parseList(list, needle, breakCondition) {
167
+ let rounds = 0;
168
+ for (let option in list) {
169
+ try {
170
+ rounds += this.parseSubSchema({
171
+ ...needle,
172
+ schema: { type: needle.schema.type, ...list[option] },
173
+ carryProperties: true,
174
+ absorvErrors: true
175
+ });
176
+ if (breakCondition && breakCondition(rounds)) break;
177
+ } catch (e) {
178
+ needle.errors.add(e.message);
179
+ }
180
+ }
181
+ return rounds;
182
+ }
183
+ // Parses a JSON Schema sub-schema object - reentrant
184
+ parseSubSchema(needle) {
185
+ if (needle.schema == void 0) {
186
+ this.throw(`No schema for path '${pathToString(needle.path)}'`, needle);
187
+ }
188
+ if (needle.schema.hasOwnProperty("oneOf")) {
189
+ if (this.parseList(needle.schema.oneOf, needle) !== 1) {
190
+ if (needle.path.length == 0) {
191
+ this.throw(`oneOf at '${pathToString(needle.path)}' not met`, needle);
192
+ }
193
+ return 0;
194
+ }
195
+ return 1;
196
+ }
197
+ if (needle.schema.hasOwnProperty("anyOf")) {
198
+ if (this.parseList(needle.schema.anyOf, needle, (r) => r !== 0) === 0) {
199
+ if (needle.path.length == 0) {
200
+ this.throw(`anyOf at '${pathToString(needle.path)}' not met`, needle);
201
+ }
202
+ return 0;
203
+ }
204
+ return 1;
205
+ }
206
+ if (needle.schema.hasOwnProperty("allOf")) {
207
+ const conditions = needle.schema.allOf.reduce(
208
+ (r, c) => Object.assign(r, c),
209
+ {}
210
+ );
211
+ try {
212
+ this.parseSubSchema({
213
+ ...needle,
214
+ schema: { type: needle.schema.type, ...conditions },
215
+ carryProperties: true
216
+ });
217
+ } catch (e) {
218
+ if (needle.path.length == 0) {
219
+ throw e;
220
+ }
221
+ needle.errors.add(e.message);
222
+ return 0;
223
+ }
224
+ }
225
+ const { metadata, resolvedObject } = resolvePayload(
226
+ needle.path,
227
+ needle.payload
228
+ );
229
+ if (needle.schema.type === "array" && !metadata.types.has("binary") && !metadata.types.has("string")) {
230
+ let matched = 0;
231
+ for (let item in resolvedObject) {
232
+ matched += this.parseSubSchema({
233
+ ...needle,
234
+ path: [...needle.path, item],
235
+ schema: needle.schema.items
236
+ });
237
+ }
238
+ return matched;
239
+ } else if (needle.schema.type === "object" || needle.schema.properties) {
240
+ return this.parseObject(needle) ? 1 : 0;
241
+ } else if (resolvedObject !== void 0) {
242
+ if (needle.schema.hasOwnProperty("enum")) {
243
+ if (Array.isArray(needle.schema.enum)) {
244
+ if (!needle.schema.enum.includes(resolvedObject)) {
245
+ this.throw(
246
+ `enum ${resolvedObject} not in ${needle.schema.enum.join(",")} at '${pathToString(needle.path)}'`,
247
+ needle
248
+ );
249
+ } else {
250
+ if (needle.schema.type == void 0) return 1;
251
+ }
252
+ } else {
253
+ this.throw(
254
+ `enum should be an array at '${pathToString(needle.path)}'`,
255
+ needle
256
+ );
257
+ }
258
+ }
259
+ if (needle.schema.hasOwnProperty("type") && !metadata.types.has(needle.schema.type)) {
260
+ this.throw(
261
+ `Type mismatch of '${pathToString(needle.path)}', '${needle.schema.type}' not in ${JSON.stringify(Array.from(metadata.types))}`,
262
+ needle
263
+ );
264
+ }
265
+ if (needle.schema !== true) {
266
+ switch (needle.schema.type) {
267
+ case "string":
268
+ if (needle.schema.hasOwnProperty("maxLength") && metadata.size > needle.schema.maxLength) {
269
+ this.throw(
270
+ `Length of '${pathToString(needle.path)}' must be <= ${needle.schema.maxLength}`,
271
+ needle
272
+ );
273
+ }
274
+ if (needle.schema.hasOwnProperty("minLength") && metadata.size < needle.schema.minLength) {
275
+ this.throw(
276
+ `Length of '${pathToString(needle.path)}' must be >= ${needle.schema.minLength} not met`,
277
+ needle
278
+ );
279
+ }
280
+ break;
281
+ case "number":
282
+ case "integer":
283
+ if (needle.schema.hasOwnProperty("minimum") && resolvedObject < needle.schema.minimum) {
284
+ this.throw(
285
+ `'${pathToString(needle.path)}' must be >= ${needle.schema.minimum}`,
286
+ needle
287
+ );
288
+ }
289
+ if (needle.schema.hasOwnProperty("exclusiveMinimum") && resolvedObject <= needle.schema.exclusiveMinimum) {
290
+ this.throw(
291
+ `'${pathToString(needle.path)}' must be > ${needle.schema.exclusiveMinimum}`,
292
+ needle
293
+ );
294
+ }
295
+ if (needle.schema.hasOwnProperty("maximum") && resolvedObject > needle.schema.maximum) {
296
+ this.throw(
297
+ `'${pathToString(needle.path)}' must be <= ${needle.schema.maximum}`,
298
+ needle
299
+ );
300
+ }
301
+ if (needle.schema.hasOwnProperty("exclusiveMaximum") && resolvedObject >= needle.schema.exclusiveMaximum) {
302
+ this.throw(
303
+ `'${pathToString(needle.path)}' must be < ${needle.schema.exclusiveMaximum}`,
304
+ needle
305
+ );
306
+ }
307
+ if (needle.schema.hasOwnProperty("multipleOf") && resolvedObject % needle.schema.multipleOf !== 0) {
308
+ this.throw(
309
+ `'${pathToString(needle.path)}' must be multiple of ${needle.schema.multipleOf}`,
310
+ needle
311
+ );
312
+ }
313
+ break;
314
+ }
315
+ }
316
+ if (needle.carryProperties) {
317
+ needle.evaluatedProperties.add(needle.path[needle.path.length - 1]);
318
+ }
319
+ return 1;
320
+ }
321
+ if (this.options.applyDefaults === true && needle.schema.hasOwnProperty("default")) {
322
+ needle.path.reduce(function(prev, curr, index) {
323
+ if (prev[curr] === void 0) {
324
+ prev[curr] = {};
325
+ }
326
+ if (index == needle.path.length - 1) {
327
+ prev[curr] = needle.schema.default;
328
+ needle.evaluatedProperties.add(needle.path[needle.path.length - 1]);
329
+ }
330
+ return prev ? prev[curr] : void 0;
331
+ }, needle.payload);
332
+ }
333
+ return 0;
334
+ }
335
+ validate(payload) {
336
+ const needle = {
337
+ errors: /* @__PURE__ */ new Set(),
338
+ evaluatedProperties: /* @__PURE__ */ new Set(),
339
+ path: [],
340
+ schema: this.schema,
341
+ payload
342
+ };
343
+ this.parseSubSchema(needle);
344
+ return true;
345
+ }
346
+ };
347
+ export {
348
+ Cabidela
349
+ };
package/package.json CHANGED
@@ -1,34 +1,44 @@
1
1
  {
2
2
  "name": "@cloudflare/cabidela",
3
- "version": "0.0.15",
4
- "type": "module",
3
+ "version": "0.0.17",
5
4
  "description": "Cabidela is a small, fast, eval-less, Cloudflare Workers compatible, dynamic JSON Schema validator",
6
5
  "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
8
8
  "author": "Celso Martinho <celso@cloudflare.com>",
9
- "license": "Apache 2.0",
9
+ "license": "Cloudflare",
10
10
  "scripts": {
11
11
  "test": "npm run test-cabidela",
12
12
  "test-all": "npm run test-cabidela && npm run test-ajv",
13
13
  "test-cabidela": "vitest run --dir tests --reporter=verbose",
14
14
  "test-ajv": "AJV=true vitest run --dir tests --reporter=verbose",
15
15
  "benchmark": "vitest bench --dir benchmarks --reporter=verbose --watch false",
16
- "build": "npm run build-tsc && npm run build-esbuild",
17
- "build-esbuild": "esbuild src/index.ts --bundle --outfile=dist/index.js --sourcemap --format=esm",
18
- "build-tsc": "tsc --declaration --emitDeclarationOnly --outDir ./dist --target esnext src/index.ts",
16
+ "build": "rm -rf dist/ && tsup src/index.ts --format cjs,esm --dts --config tsconfig.json",
19
17
  "dry-publish": "npm pack --dry-run"
20
18
  },
21
19
  "keywords": [
22
- "json-schema"
20
+ "json-schema",
21
+ "cloudflare",
22
+ "cloudflare workers"
23
23
  ],
24
24
  "files": [
25
- "dist/*"
25
+ "dist",
26
+ "LICENSE",
27
+ "README.md"
26
28
  ],
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/cloudflare/cabidela.git"
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/cloudflare/cabidela/issues"
35
+ },
27
36
  "devDependencies": {
37
+ "@types/node": "^22.13.1",
28
38
  "@vitest/ui": "^3.0.3",
29
39
  "ajv": "^8.17.1",
30
40
  "ajv-errors": "^3.0.0",
31
- "esbuild": "^0.24.2",
41
+ "tsup": "^8.3.6",
32
42
  "typescript": "^5.7.3",
33
43
  "vitest": "^3.0.3"
34
44
  }
package/dist/helpers.d.ts DELETED
@@ -1,13 +0,0 @@
1
- export type metaData = {
2
- types: Set<string>;
3
- size: number;
4
- properties: Set<string>;
5
- };
6
- export type resolvedResponse = {
7
- metadata: metaData;
8
- resolvedObject: any;
9
- };
10
- export declare const includesAll: (arr: Array<any>, values: Array<any>) => boolean;
11
- export declare const resolvePayload: (path: Array<string | number>, obj: any) => resolvedResponse;
12
- export declare const pathToString: (path: Array<string | number>) => string;
13
- export declare const getMetaData: (value: any) => metaData;
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/helpers.ts", "../src/index.ts"],
4
- "sourcesContent": ["export type metaData = {\n types: Set<string>;\n size: number;\n properties: Set<string>;\n};\n\nexport type resolvedResponse = {\n metadata: metaData;\n resolvedObject: any;\n};\n\nexport const includesAll = (arr: Array<any>, values: Array<any>) => {\n return values.every((v) => arr.includes(v));\n};\n\n/* Resolves a path in an object\n\n obj = {\n prompt: \"hello\",\n messages: [\n { role: \"system\", content: \"you are a helpful assistant\" },\n { role: \"user\", content: \"tell me a joke\" },\n ]\n }\n\n path = [\"messages\"]\n returns [\n { role: \"system\", content: \"you are a helpful assistant\" },\n { role: \"user\", content: \"tell me a joke\" },\n ]\n\n path = [\"messages\", 1, \"role\"]\n returns \"system\"\n\n path = [\"prompt\"]\n returns \"hello\"\n\n path = [\"invalid\", \"path\"]\n returns undefined\n\n */\n\nexport const resolvePayload = (path: Array<string | number>, obj: any): resolvedResponse => {\n let resolvedObject = path.reduce(function (prev, curr) {\n return prev ? prev[curr] : undefined;\n }, obj);\n\n return { metadata: getMetaData(resolvedObject), resolvedObject };\n};\n\nexport const pathToString = (path: Array<string | number>) => {\n return path.length == 0 ? `.` : path.map((item) => (typeof item === \"number\" ? `[${item}]` : `.${item}`)).join(\"\");\n};\n\n// https://json-schema.org/understanding-json-schema/reference/type\n\nexport const getMetaData = (value: any): metaData => {\n let size = 0;\n let types = new Set([]);\n let properties = new Set([]);\n if (value === null) {\n types.add(\"null\");\n } else if (typeof value == \"string\") {\n types.add(\"string\");\n size = value.length;\n } else if (typeof value == \"number\") {\n size = 1;\n types.add(\"number\");\n if (Number.isInteger(value)) {\n types.add(\"integer\");\n }\n } else if (typeof value == \"boolean\") {\n types.add(\"boolean\");\n size = 1;\n } else if (Array.isArray(value)) {\n size = value.length;\n types.add(\"array\");\n if (value.find((item) => typeof item !== \"number\" && typeof item !== \"string\") == undefined) {\n types.add(\"binary\");\n }\n } else if (typeof value == \"object\") {\n types.add(\"object\");\n size = Object.keys(value).length;\n properties = new Set(Object.keys(value));\n }\n return { types, size, properties };\n};\n", "import { resolvePayload, pathToString } from \"./helpers\";\n\nexport type CabidelaOptions = {\n applyDefaults?: boolean;\n errorMessages?: boolean;\n fullErrors?: boolean;\n};\n\nexport type SchemaNavigation = {\n path: Array<string>;\n schema: any;\n payload: any;\n evaluatedProperties?: Set<string>;\n carryProperties?: boolean;\n absorvErrors?: boolean;\n errors?: Set<string>;\n};\n\nexport class Cabidela {\n public schema: any;\n public options: CabidelaOptions;\n\n constructor(schema: any, options?: CabidelaOptions) {\n this.schema = schema;\n this.options = { fullErrors: true, applyDefaults: false, errorMessages: false, ...(options || {}) };\n }\n\n setSchema(schema: any) {\n this.schema = schema;\n }\n\n setOptions(options: CabidelaOptions) {\n this.options = options;\n }\n\n throw(message: string, needle: SchemaNavigation) {\n const error = `${message}${this.options.fullErrors && needle.absorvErrors !== true && needle.errors.size > 0 ? `: ${Array.from(needle.errors).join(\", \")}` : ``}`;\n throw new Error(this.options.errorMessages ? (needle.schema.errorMessage ?? error) : error);\n }\n\n parseAdditionalProperties(\n needle: SchemaNavigation,\n contextAdditionalProperties: any,\n contextEvaluatedProperties: Set<string>,\n ): number {\n let matchCount = 0;\n const { metadata, resolvedObject } = resolvePayload(needle.path, needle.payload);\n\n const unevaluatedProperties = metadata.properties.difference(contextEvaluatedProperties);\n\n // Setting the additionalProperties schema to false means no additional properties will be allowed.\n if (contextAdditionalProperties === false) {\n if (unevaluatedProperties.size > 0) {\n this.throw(\n `Additional or unevaluated properties '${Array.from(unevaluatedProperties).join(\", \")}' at '${pathToString(needle.path)}' not allowed`,\n {\n ...needle,\n schema: contextAdditionalProperties,\n payload: resolvedObject,\n },\n );\n }\n } else {\n for (let property of unevaluatedProperties) {\n if (\n this.parseSubSchema({\n path: [property],\n schema: contextAdditionalProperties,\n payload: resolvedObject,\n evaluatedProperties: new Set(),\n errors: new Set(),\n })\n ) {\n matchCount++;\n needle.evaluatedProperties.add(property);\n }\n }\n }\n return matchCount;\n }\n\n // Iterates through the properties of an \"object\" schema\n parseObject(needle: SchemaNavigation): boolean {\n if (needle.schema.hasOwnProperty(\"minProperties\")) {\n if (Object.keys(needle.payload).length < needle.schema.minProperties) {\n this.throw(\n `minProperties at '${pathToString(needle.path)}' is ${needle.schema.minProperties}, got ${Object.keys(needle.payload).length}`,\n needle,\n );\n }\n }\n\n if (needle.schema.hasOwnProperty(\"maxProperties\")) {\n if (Object.keys(needle.payload).length > needle.schema.maxProperties) {\n this.throw(\n `maxProperties at '${pathToString(needle.path)}' is ${needle.schema.minProperties}, got ${Object.keys(needle.payload).length}`,\n needle,\n );\n }\n }\n\n const localEvaluatedProperties = new Set([]);\n let matchCount: number = 0;\n\n if (needle.schema.hasOwnProperty(\"properties\")) {\n for (let property in needle.schema.properties) {\n if (\n this.parseSubSchema({\n ...needle,\n path: [...needle.path, property],\n schema: needle.schema.properties[property],\n })\n ) {\n localEvaluatedProperties.add(property);\n matchCount++;\n }\n }\n }\n\n // additionalProperties only recognizes properties declared in the same subschema as itself.\n if (needle.schema.hasOwnProperty(\"additionalProperties\")) {\n matchCount += this.parseAdditionalProperties(\n needle,\n needle.schema.additionalProperties,\n localEvaluatedProperties,\n );\n }\n\n // unevaluatedProperties keyword is similar to additionalProperties except that it can recognize properties declared in subschemas.\n if (needle.schema.hasOwnProperty(\"unevaluatedProperties\")) {\n needle.evaluatedProperties = new Set([...needle.evaluatedProperties, ...localEvaluatedProperties]);\n matchCount += this.parseAdditionalProperties(\n needle,\n needle.schema.unevaluatedProperties,\n needle.evaluatedProperties,\n );\n }\n\n // this has to be last\n if (needle.schema.hasOwnProperty(\"required\")) {\n if (\n new Set(needle.schema.required).difference(needle.evaluatedProperties.union(localEvaluatedProperties)).size > 0\n ) {\n this.throw(`required properties at '${pathToString(needle.path)}' is '${needle.schema.required}'`, needle);\n }\n }\n return matchCount ? true : false;\n }\n\n parseList(list: any, needle: SchemaNavigation, breakCondition?: Function) {\n let rounds = 0;\n for (let option in list) {\n try {\n rounds += this.parseSubSchema({\n ...needle,\n schema: { type: needle.schema.type, ...list[option] },\n carryProperties: true,\n absorvErrors: true,\n });\n if (breakCondition && breakCondition(rounds)) break;\n } catch (e) {\n needle.errors.add(e.message);\n }\n }\n return rounds;\n }\n\n // Parses a JSON Schema sub-schema object - reentrant\n parseSubSchema(needle: SchemaNavigation) {\n if (needle.schema == undefined) {\n this.throw(`No schema for path '${pathToString(needle.path)}'`, needle);\n }\n\n // To validate against oneOf, the given data must be valid against exactly one of the given subschemas.\n if (needle.schema.hasOwnProperty(\"oneOf\")) {\n if (this.parseList(needle.schema.oneOf, needle) !== 1) {\n if (needle.path.length == 0) {\n this.throw(`oneOf at '${pathToString(needle.path)}' not met`, needle);\n }\n return 0;\n }\n return 1;\n }\n\n // To validate against anyOf, the given data must be valid against any (one or more) of the given subschemas.\n if (needle.schema.hasOwnProperty(\"anyOf\")) {\n if (this.parseList(needle.schema.anyOf, needle, (r: number) => r !== 0) === 0) {\n if (needle.path.length == 0) {\n this.throw(`anyOf at '${pathToString(needle.path)}' not met`, needle);\n }\n return 0;\n }\n return 1;\n }\n\n // To validate against allOf, the given data must be valid against all of the given subschemas.\n if (needle.schema.hasOwnProperty(\"allOf\")) {\n const conditions = needle.schema.allOf.reduce((r: any, c: any) => Object.assign(r, c), {});\n try {\n this.parseSubSchema({\n ...needle,\n schema: { type: needle.schema.type, ...conditions },\n carryProperties: true,\n });\n } catch (e) {\n if (needle.path.length == 0) {\n throw e;\n }\n needle.errors.add(e.message);\n return 0;\n }\n }\n\n const { metadata, resolvedObject } = resolvePayload(needle.path, needle.payload);\n\n // array, but object is not binary\n if (needle.schema.type === \"array\" && !metadata.types.has(\"binary\") && !metadata.types.has(\"string\")) {\n let matched = 0;\n for (let item in resolvedObject) {\n matched += this.parseSubSchema({\n ...needle,\n path: [...needle.path, item],\n schema: needle.schema.items,\n });\n }\n return matched;\n } else if (needle.schema.type === \"object\" || needle.schema.properties) {\n return this.parseObject(needle) ? 1 : 0;\n } else if (resolvedObject !== undefined) {\n // This has to be before type checking\n if (needle.schema.hasOwnProperty(\"enum\")) {\n if (Array.isArray(needle.schema.enum)) {\n if (!needle.schema.enum.includes(resolvedObject)) {\n this.throw(\n `enum ${resolvedObject} not in ${needle.schema.enum.join(\",\")} at '${pathToString(needle.path)}'`,\n needle,\n );\n } else {\n // You can use enum even without a type, to accept values of different types.\n // If that's the case, then skip type checking below\n if (needle.schema.type == undefined) return 1;\n }\n } else {\n this.throw(`enum should be an array at '${pathToString(needle.path)}'`, needle);\n }\n }\n // This has to be after handling enum\n if (needle.schema.hasOwnProperty(\"type\") && !metadata.types.has(needle.schema.type)) {\n this.throw(\n `Type mismatch of '${pathToString(needle.path)}', '${needle.schema.type}' not in ${JSON.stringify(Array.from(metadata.types))}`,\n needle,\n );\n }\n /* If property === true, then it's declared validated no matter what the value is */\n if (needle.schema !== true) {\n /* Otherwise check schema type */\n switch (needle.schema.type) {\n case \"string\":\n if (needle.schema.hasOwnProperty(\"maxLength\") && metadata.size > needle.schema.maxLength) {\n this.throw(`Length of '${pathToString(needle.path)}' must be <= ${needle.schema.maxLength}`, needle);\n }\n if (needle.schema.hasOwnProperty(\"minLength\") && metadata.size < needle.schema.minLength) {\n this.throw(\n `Length of '${pathToString(needle.path)}' must be >= ${needle.schema.minLength} not met`,\n needle,\n );\n }\n break;\n case \"number\":\n case \"integer\":\n if (needle.schema.hasOwnProperty(\"minimum\") && resolvedObject < needle.schema.minimum) {\n this.throw(`'${pathToString(needle.path)}' must be >= ${needle.schema.minimum}`, needle);\n }\n if (needle.schema.hasOwnProperty(\"exclusiveMinimum\") && resolvedObject <= needle.schema.exclusiveMinimum) {\n this.throw(`'${pathToString(needle.path)}' must be > ${needle.schema.exclusiveMinimum}`, needle);\n }\n if (needle.schema.hasOwnProperty(\"maximum\") && resolvedObject > needle.schema.maximum) {\n this.throw(`'${pathToString(needle.path)}' must be <= ${needle.schema.maximum}`, needle);\n }\n if (needle.schema.hasOwnProperty(\"exclusiveMaximum\") && resolvedObject >= needle.schema.exclusiveMaximum) {\n this.throw(`'${pathToString(needle.path)}' must be < ${needle.schema.exclusiveMaximum}`, needle);\n }\n if (needle.schema.hasOwnProperty(\"multipleOf\") && resolvedObject % needle.schema.multipleOf !== 0) {\n this.throw(`'${pathToString(needle.path)}' must be multiple of ${needle.schema.multipleOf}`, needle);\n }\n break;\n }\n }\n if (needle.carryProperties) {\n needle.evaluatedProperties.add(needle.path[needle.path.length - 1]);\n }\n return 1;\n }\n // Apply defaults\n if (this.options.applyDefaults === true && needle.schema.hasOwnProperty(\"default\")) {\n needle.path.reduce(function (prev, curr, index) {\n // create objects as needed along the path, if they don't exist, so we can apply defaults at the end\n if (prev[curr] === undefined) {\n prev[curr] = {};\n }\n if (index == needle.path.length - 1) {\n prev[curr] = needle.schema.default;\n // defaults add to evaluatedProperties and can meet \"required\" constraints\n needle.evaluatedProperties.add(needle.path[needle.path.length - 1]);\n }\n return prev ? prev[curr] : undefined;\n }, needle.payload);\n }\n return 0;\n }\n\n validate(payload: any) {\n const needle: SchemaNavigation = {\n errors: new Set(),\n evaluatedProperties: new Set(),\n path: [],\n schema: this.schema,\n payload,\n };\n this.parseSubSchema(needle);\n return true;\n }\n}\n"],
5
- "mappings": ";AA0CO,IAAM,iBAAiB,CAAC,MAA8B,QAA+B;AAC1F,MAAI,iBAAiB,KAAK,OAAO,SAAU,MAAM,MAAM;AACrD,WAAO,OAAO,KAAK,IAAI,IAAI;AAAA,EAC7B,GAAG,GAAG;AAEN,SAAO,EAAE,UAAU,YAAY,cAAc,GAAG,eAAe;AACjE;AAEO,IAAM,eAAe,CAAC,SAAiC;AAC5D,SAAO,KAAK,UAAU,IAAI,MAAM,KAAK,IAAI,CAAC,SAAU,OAAO,SAAS,WAAW,IAAI,IAAI,MAAM,IAAI,IAAI,EAAG,EAAE,KAAK,EAAE;AACnH;AAIO,IAAM,cAAc,CAAC,UAAyB;AACnD,MAAI,OAAO;AACX,MAAI,QAAQ,oBAAI,IAAI,CAAC,CAAC;AACtB,MAAI,aAAa,oBAAI,IAAI,CAAC,CAAC;AAC3B,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,MAAM;AAAA,EAClB,WAAW,OAAO,SAAS,UAAU;AACnC,UAAM,IAAI,QAAQ;AAClB,WAAO,MAAM;AAAA,EACf,WAAW,OAAO,SAAS,UAAU;AACnC,WAAO;AACP,UAAM,IAAI,QAAQ;AAClB,QAAI,OAAO,UAAU,KAAK,GAAG;AAC3B,YAAM,IAAI,SAAS;AAAA,IACrB;AAAA,EACF,WAAW,OAAO,SAAS,WAAW;AACpC,UAAM,IAAI,SAAS;AACnB,WAAO;AAAA,EACT,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,WAAO,MAAM;AACb,UAAM,IAAI,OAAO;AACjB,QAAI,MAAM,KAAK,CAAC,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ,KAAK,QAAW;AAC3F,YAAM,IAAI,QAAQ;AAAA,IACpB;AAAA,EACF,WAAW,OAAO,SAAS,UAAU;AACnC,UAAM,IAAI,QAAQ;AAClB,WAAO,OAAO,KAAK,KAAK,EAAE;AAC1B,iBAAa,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,EACzC;AACA,SAAO,EAAE,OAAO,MAAM,WAAW;AACnC;;;ACpEO,IAAM,WAAN,MAAe;AAAA,EACb;AAAA,EACA;AAAA,EAEP,YAAY,QAAa,SAA2B;AAClD,SAAK,SAAS;AACd,SAAK,UAAU,EAAE,YAAY,MAAM,eAAe,OAAO,eAAe,OAAO,GAAI,WAAW,CAAC,EAAG;AAAA,EACpG;AAAA,EAEA,UAAU,QAAa;AACrB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW,SAA0B;AACnC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,SAAiB,QAA0B;AAC/C,UAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,QAAQ,cAAc,OAAO,iBAAiB,QAAQ,OAAO,OAAO,OAAO,IAAI,KAAK,MAAM,KAAK,OAAO,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE;AAC/J,UAAM,IAAI,MAAM,KAAK,QAAQ,gBAAiB,OAAO,OAAO,gBAAgB,QAAS,KAAK;AAAA,EAC5F;AAAA,EAEA,0BACE,QACA,6BACA,4BACQ;AACR,QAAI,aAAa;AACjB,UAAM,EAAE,UAAU,eAAe,IAAI,eAAe,OAAO,MAAM,OAAO,OAAO;AAE/E,UAAM,wBAAwB,SAAS,WAAW,WAAW,0BAA0B;AAGvF,QAAI,gCAAgC,OAAO;AACzC,UAAI,sBAAsB,OAAO,GAAG;AAClC,aAAK;AAAA,UACH,yCAAyC,MAAM,KAAK,qBAAqB,EAAE,KAAK,IAAI,CAAC,SAAS,aAAa,OAAO,IAAI,CAAC;AAAA,UACvH;AAAA,YACE,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS,YAAY,uBAAuB;AAC1C,YACE,KAAK,eAAe;AAAA,UAClB,MAAM,CAAC,QAAQ;AAAA,UACf,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,qBAAqB,oBAAI,IAAI;AAAA,UAC7B,QAAQ,oBAAI,IAAI;AAAA,QAClB,CAAC,GACD;AACA;AACA,iBAAO,oBAAoB,IAAI,QAAQ;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,YAAY,QAAmC;AAC7C,QAAI,OAAO,OAAO,eAAe,eAAe,GAAG;AACjD,UAAI,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,OAAO,OAAO,eAAe;AACpE,aAAK;AAAA,UACH,qBAAqB,aAAa,OAAO,IAAI,CAAC,QAAQ,OAAO,OAAO,aAAa,SAAS,OAAO,KAAK,OAAO,OAAO,EAAE,MAAM;AAAA,UAC5H;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,eAAe,eAAe,GAAG;AACjD,UAAI,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,OAAO,OAAO,eAAe;AACpE,aAAK;AAAA,UACH,qBAAqB,aAAa,OAAO,IAAI,CAAC,QAAQ,OAAO,OAAO,aAAa,SAAS,OAAO,KAAK,OAAO,OAAO,EAAE,MAAM;AAAA,UAC5H;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,2BAA2B,oBAAI,IAAI,CAAC,CAAC;AAC3C,QAAI,aAAqB;AAEzB,QAAI,OAAO,OAAO,eAAe,YAAY,GAAG;AAC9C,eAAS,YAAY,OAAO,OAAO,YAAY;AAC7C,YACE,KAAK,eAAe;AAAA,UAClB,GAAG;AAAA,UACH,MAAM,CAAC,GAAG,OAAO,MAAM,QAAQ;AAAA,UAC/B,QAAQ,OAAO,OAAO,WAAW,QAAQ;AAAA,QAC3C,CAAC,GACD;AACA,mCAAyB,IAAI,QAAQ;AACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,eAAe,sBAAsB,GAAG;AACxD,oBAAc,KAAK;AAAA,QACjB;AAAA,QACA,OAAO,OAAO;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,eAAe,uBAAuB,GAAG;AACzD,aAAO,sBAAsB,oBAAI,IAAI,CAAC,GAAG,OAAO,qBAAqB,GAAG,wBAAwB,CAAC;AACjG,oBAAc,KAAK;AAAA,QACjB;AAAA,QACA,OAAO,OAAO;AAAA,QACd,OAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,eAAe,UAAU,GAAG;AAC5C,UACE,IAAI,IAAI,OAAO,OAAO,QAAQ,EAAE,WAAW,OAAO,oBAAoB,MAAM,wBAAwB,CAAC,EAAE,OAAO,GAC9G;AACA,aAAK,MAAM,2BAA2B,aAAa,OAAO,IAAI,CAAC,SAAS,OAAO,OAAO,QAAQ,KAAK,MAAM;AAAA,MAC3G;AAAA,IACF;AACA,WAAO,aAAa,OAAO;AAAA,EAC7B;AAAA,EAEA,UAAU,MAAW,QAA0B,gBAA2B;AACxE,QAAI,SAAS;AACb,aAAS,UAAU,MAAM;AACvB,UAAI;AACF,kBAAU,KAAK,eAAe;AAAA,UAC5B,GAAG;AAAA,UACH,QAAQ,EAAE,MAAM,OAAO,OAAO,MAAM,GAAG,KAAK,MAAM,EAAE;AAAA,UACpD,iBAAiB;AAAA,UACjB,cAAc;AAAA,QAChB,CAAC;AACD,YAAI,kBAAkB,eAAe,MAAM,EAAG;AAAA,MAChD,SAAS,GAAG;AACV,eAAO,OAAO,IAAI,EAAE,OAAO;AAAA,MAC7B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,eAAe,QAA0B;AACvC,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,MAAM,uBAAuB,aAAa,OAAO,IAAI,CAAC,KAAK,MAAM;AAAA,IACxE;AAGA,QAAI,OAAO,OAAO,eAAe,OAAO,GAAG;AACzC,UAAI,KAAK,UAAU,OAAO,OAAO,OAAO,MAAM,MAAM,GAAG;AACrD,YAAI,OAAO,KAAK,UAAU,GAAG;AAC3B,eAAK,MAAM,aAAa,aAAa,OAAO,IAAI,CAAC,aAAa,MAAM;AAAA,QACtE;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,OAAO,eAAe,OAAO,GAAG;AACzC,UAAI,KAAK,UAAU,OAAO,OAAO,OAAO,QAAQ,CAAC,MAAc,MAAM,CAAC,MAAM,GAAG;AAC7E,YAAI,OAAO,KAAK,UAAU,GAAG;AAC3B,eAAK,MAAM,aAAa,aAAa,OAAO,IAAI,CAAC,aAAa,MAAM;AAAA,QACtE;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,OAAO,eAAe,OAAO,GAAG;AACzC,YAAM,aAAa,OAAO,OAAO,MAAM,OAAO,CAAC,GAAQ,MAAW,OAAO,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACzF,UAAI;AACF,aAAK,eAAe;AAAA,UAClB,GAAG;AAAA,UACH,QAAQ,EAAE,MAAM,OAAO,OAAO,MAAM,GAAG,WAAW;AAAA,UAClD,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH,SAAS,GAAG;AACV,YAAI,OAAO,KAAK,UAAU,GAAG;AAC3B,gBAAM;AAAA,QACR;AACA,eAAO,OAAO,IAAI,EAAE,OAAO;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,EAAE,UAAU,eAAe,IAAI,eAAe,OAAO,MAAM,OAAO,OAAO;AAG/E,QAAI,OAAO,OAAO,SAAS,WAAW,CAAC,SAAS,MAAM,IAAI,QAAQ,KAAK,CAAC,SAAS,MAAM,IAAI,QAAQ,GAAG;AACpG,UAAI,UAAU;AACd,eAAS,QAAQ,gBAAgB;AAC/B,mBAAW,KAAK,eAAe;AAAA,UAC7B,GAAG;AAAA,UACH,MAAM,CAAC,GAAG,OAAO,MAAM,IAAI;AAAA,UAC3B,QAAQ,OAAO,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,WAAW,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,YAAY;AACtE,aAAO,KAAK,YAAY,MAAM,IAAI,IAAI;AAAA,IACxC,WAAW,mBAAmB,QAAW;AAEvC,UAAI,OAAO,OAAO,eAAe,MAAM,GAAG;AACxC,YAAI,MAAM,QAAQ,OAAO,OAAO,IAAI,GAAG;AACrC,cAAI,CAAC,OAAO,OAAO,KAAK,SAAS,cAAc,GAAG;AAChD,iBAAK;AAAA,cACH,QAAQ,cAAc,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG,CAAC,QAAQ,aAAa,OAAO,IAAI,CAAC;AAAA,cAC9F;AAAA,YACF;AAAA,UACF,OAAO;AAGL,gBAAI,OAAO,OAAO,QAAQ,OAAW,QAAO;AAAA,UAC9C;AAAA,QACF,OAAO;AACL,eAAK,MAAM,+BAA+B,aAAa,OAAO,IAAI,CAAC,KAAK,MAAM;AAAA,QAChF;AAAA,MACF;AAEA,UAAI,OAAO,OAAO,eAAe,MAAM,KAAK,CAAC,SAAS,MAAM,IAAI,OAAO,OAAO,IAAI,GAAG;AACnF,aAAK;AAAA,UACH,qBAAqB,aAAa,OAAO,IAAI,CAAC,OAAO,OAAO,OAAO,IAAI,YAAY,KAAK,UAAU,MAAM,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,UAC7H;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,WAAW,MAAM;AAE1B,gBAAQ,OAAO,OAAO,MAAM;AAAA,UAC1B,KAAK;AACH,gBAAI,OAAO,OAAO,eAAe,WAAW,KAAK,SAAS,OAAO,OAAO,OAAO,WAAW;AACxF,mBAAK,MAAM,cAAc,aAAa,OAAO,IAAI,CAAC,gBAAgB,OAAO,OAAO,SAAS,IAAI,MAAM;AAAA,YACrG;AACA,gBAAI,OAAO,OAAO,eAAe,WAAW,KAAK,SAAS,OAAO,OAAO,OAAO,WAAW;AACxF,mBAAK;AAAA,gBACH,cAAc,aAAa,OAAO,IAAI,CAAC,gBAAgB,OAAO,OAAO,SAAS;AAAA,gBAC9E;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AACH,gBAAI,OAAO,OAAO,eAAe,SAAS,KAAK,iBAAiB,OAAO,OAAO,SAAS;AACrF,mBAAK,MAAM,IAAI,aAAa,OAAO,IAAI,CAAC,gBAAgB,OAAO,OAAO,OAAO,IAAI,MAAM;AAAA,YACzF;AACA,gBAAI,OAAO,OAAO,eAAe,kBAAkB,KAAK,kBAAkB,OAAO,OAAO,kBAAkB;AACxG,mBAAK,MAAM,IAAI,aAAa,OAAO,IAAI,CAAC,eAAe,OAAO,OAAO,gBAAgB,IAAI,MAAM;AAAA,YACjG;AACA,gBAAI,OAAO,OAAO,eAAe,SAAS,KAAK,iBAAiB,OAAO,OAAO,SAAS;AACrF,mBAAK,MAAM,IAAI,aAAa,OAAO,IAAI,CAAC,gBAAgB,OAAO,OAAO,OAAO,IAAI,MAAM;AAAA,YACzF;AACA,gBAAI,OAAO,OAAO,eAAe,kBAAkB,KAAK,kBAAkB,OAAO,OAAO,kBAAkB;AACxG,mBAAK,MAAM,IAAI,aAAa,OAAO,IAAI,CAAC,eAAe,OAAO,OAAO,gBAAgB,IAAI,MAAM;AAAA,YACjG;AACA,gBAAI,OAAO,OAAO,eAAe,YAAY,KAAK,iBAAiB,OAAO,OAAO,eAAe,GAAG;AACjG,mBAAK,MAAM,IAAI,aAAa,OAAO,IAAI,CAAC,yBAAyB,OAAO,OAAO,UAAU,IAAI,MAAM;AAAA,YACrG;AACA;AAAA,QACJ;AAAA,MACF;AACA,UAAI,OAAO,iBAAiB;AAC1B,eAAO,oBAAoB,IAAI,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC,CAAC;AAAA,MACpE;AACA,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,QAAQ,kBAAkB,QAAQ,OAAO,OAAO,eAAe,SAAS,GAAG;AAClF,aAAO,KAAK,OAAO,SAAU,MAAM,MAAM,OAAO;AAE9C,YAAI,KAAK,IAAI,MAAM,QAAW;AAC5B,eAAK,IAAI,IAAI,CAAC;AAAA,QAChB;AACA,YAAI,SAAS,OAAO,KAAK,SAAS,GAAG;AACnC,eAAK,IAAI,IAAI,OAAO,OAAO;AAE3B,iBAAO,oBAAoB,IAAI,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC,CAAC;AAAA,QACpE;AACA,eAAO,OAAO,KAAK,IAAI,IAAI;AAAA,MAC7B,GAAG,OAAO,OAAO;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,SAAc;AACrB,UAAM,SAA2B;AAAA,MAC/B,QAAQ,oBAAI,IAAI;AAAA,MAChB,qBAAqB,oBAAI,IAAI;AAAA,MAC7B,MAAM,CAAC;AAAA,MACP,QAAQ,KAAK;AAAA,MACb;AAAA,IACF;AACA,SAAK,eAAe,MAAM;AAC1B,WAAO;AAAA,EACT;AACF;",
6
- "names": []
7
- }