express5-valid 1.0.1 → 1.2.0
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/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +222 -2
- package/dist/index.js.map +4 -4
- package/dist/index.mjs +221 -2
- package/dist/index.mjs.map +4 -4
- package/dist/middleware.d.mts +1 -0
- package/dist/middleware.d.ts +1 -0
- package/dist/middleware.d.ts.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/valid-array.d.mts +2 -0
- package/dist/valid-array.d.ts +2 -0
- package/dist/valid-array.d.ts.map +1 -1
- package/dist/valid-base.d.mts +4 -0
- package/dist/valid-base.d.ts +4 -0
- package/dist/valid-base.d.ts.map +1 -1
- package/dist/valid-iso-date.d.mts +22 -0
- package/dist/valid-iso-date.d.ts +22 -0
- package/dist/valid-iso-date.d.ts.map +1 -0
- package/dist/valid-wall-time.d.mts +18 -0
- package/dist/valid-wall-time.d.ts +18 -0
- package/dist/valid-wall-time.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -7,5 +7,6 @@ export { createJsonRouter, type JsonRouter } from "./router";
|
|
|
7
7
|
export type { NumberArrayConfig, StringArrayConfig } from "./types";
|
|
8
8
|
export declare function body(name: string): ValidBase;
|
|
9
9
|
export declare function params(name: string): ValidBase;
|
|
10
|
+
export declare function query(name: string): ValidBase;
|
|
10
11
|
export declare function validArgument(obj: Record<string, unknown>, name: string): ValidBase;
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export { createJsonRouter, type JsonRouter } from "./router";
|
|
|
7
7
|
export type { NumberArrayConfig, StringArrayConfig } from "./types";
|
|
8
8
|
export declare function body(name: string): ValidBase;
|
|
9
9
|
export declare function params(name: string): ValidBase;
|
|
10
|
+
export declare function query(name: string): ValidBase;
|
|
10
11
|
export declare function validArgument(obj: Record<string, unknown>, name: string): ValidBase;
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpE,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAY5C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAG9C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAEnF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpE,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAY5C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAG9C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAG7C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAEnF"}
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,7 @@ __export(index_exports, {
|
|
|
24
24
|
body: () => body,
|
|
25
25
|
createJsonRouter: () => createJsonRouter,
|
|
26
26
|
params: () => params,
|
|
27
|
+
query: () => query,
|
|
27
28
|
validArgument: () => validArgument,
|
|
28
29
|
validErrorHandler: () => valid_error_handler_default,
|
|
29
30
|
validMiddleware: () => validMiddleware
|
|
@@ -353,6 +354,7 @@ var ValidArray = class {
|
|
|
353
354
|
_minLength;
|
|
354
355
|
_maxLength;
|
|
355
356
|
_elementValidator;
|
|
357
|
+
_csvSeparator;
|
|
356
358
|
constructor(value, name) {
|
|
357
359
|
this._value = value;
|
|
358
360
|
this._name = name;
|
|
@@ -388,6 +390,10 @@ var ValidArray = class {
|
|
|
388
390
|
this._maxLength = n;
|
|
389
391
|
return this;
|
|
390
392
|
}
|
|
393
|
+
csv(separator = ",") {
|
|
394
|
+
this._csvSeparator = separator;
|
|
395
|
+
return this;
|
|
396
|
+
}
|
|
391
397
|
ofNumbers(config) {
|
|
392
398
|
this._elementValidator = (val, index) => {
|
|
393
399
|
let num;
|
|
@@ -505,6 +511,9 @@ var ValidArray = class {
|
|
|
505
511
|
}
|
|
506
512
|
return null;
|
|
507
513
|
}
|
|
514
|
+
if (this._csvSeparator !== void 0 && typeof val === "string") {
|
|
515
|
+
val = val.split(this._csvSeparator).filter((s) => s !== "");
|
|
516
|
+
}
|
|
508
517
|
if (!Array.isArray(val)) {
|
|
509
518
|
this.error("INVALID_TYPE", "must be an array", { expected: "array" });
|
|
510
519
|
}
|
|
@@ -613,6 +622,204 @@ var ValidDate = class {
|
|
|
613
622
|
}
|
|
614
623
|
};
|
|
615
624
|
|
|
625
|
+
// src/valid-iso-date.ts
|
|
626
|
+
var ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
627
|
+
function isRealCalendarDate(yyyy_mm_dd) {
|
|
628
|
+
const parts = yyyy_mm_dd.split("-").map(Number);
|
|
629
|
+
const y = parts[0];
|
|
630
|
+
const m = parts[1];
|
|
631
|
+
const d = parts[2];
|
|
632
|
+
const dt = new Date(Date.UTC(y, m - 1, d));
|
|
633
|
+
return dt.getUTCFullYear() === y && dt.getUTCMonth() === m - 1 && dt.getUTCDate() === d;
|
|
634
|
+
}
|
|
635
|
+
function todayIsoDate() {
|
|
636
|
+
const d = /* @__PURE__ */ new Date();
|
|
637
|
+
return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}-${String(d.getUTCDate()).padStart(2, "0")}`;
|
|
638
|
+
}
|
|
639
|
+
var ValidIsoDate = class {
|
|
640
|
+
_value;
|
|
641
|
+
_name;
|
|
642
|
+
_isRequired = false;
|
|
643
|
+
_isNullable = false;
|
|
644
|
+
_default;
|
|
645
|
+
_min;
|
|
646
|
+
_max;
|
|
647
|
+
_isPast = false;
|
|
648
|
+
_isFuture = false;
|
|
649
|
+
constructor(value, name) {
|
|
650
|
+
this._value = value;
|
|
651
|
+
this._name = name;
|
|
652
|
+
}
|
|
653
|
+
error(code, details, params2 = {}) {
|
|
654
|
+
throw new ArgError(`${this._name}`, code, details, params2);
|
|
655
|
+
}
|
|
656
|
+
get required() {
|
|
657
|
+
this._isRequired = true;
|
|
658
|
+
return this;
|
|
659
|
+
}
|
|
660
|
+
get nullable() {
|
|
661
|
+
this._isNullable = true;
|
|
662
|
+
return this;
|
|
663
|
+
}
|
|
664
|
+
default(v) {
|
|
665
|
+
this._default = v;
|
|
666
|
+
return this;
|
|
667
|
+
}
|
|
668
|
+
min(date) {
|
|
669
|
+
this._min = date;
|
|
670
|
+
return this;
|
|
671
|
+
}
|
|
672
|
+
max(date) {
|
|
673
|
+
this._max = date;
|
|
674
|
+
return this;
|
|
675
|
+
}
|
|
676
|
+
get past() {
|
|
677
|
+
this._isPast = true;
|
|
678
|
+
return this;
|
|
679
|
+
}
|
|
680
|
+
get future() {
|
|
681
|
+
this._isFuture = true;
|
|
682
|
+
return this;
|
|
683
|
+
}
|
|
684
|
+
get value() {
|
|
685
|
+
let val = this._value;
|
|
686
|
+
if (val === void 0 && this._default !== void 0) {
|
|
687
|
+
val = this._default;
|
|
688
|
+
}
|
|
689
|
+
if (val === void 0) {
|
|
690
|
+
if (this._isRequired) {
|
|
691
|
+
this.error("REQUIRED", "is required");
|
|
692
|
+
}
|
|
693
|
+
return void 0;
|
|
694
|
+
}
|
|
695
|
+
if (val === null) {
|
|
696
|
+
if (!this._isNullable) {
|
|
697
|
+
this.error("NOT_NULLABLE", "cannot be null");
|
|
698
|
+
}
|
|
699
|
+
return null;
|
|
700
|
+
}
|
|
701
|
+
if (typeof val !== "string") {
|
|
702
|
+
this.error("INVALID_TYPE", "must be a string YYYY-MM-DD", { expected: "iso-date" });
|
|
703
|
+
}
|
|
704
|
+
const s = val.trim();
|
|
705
|
+
if (!ISO_DATE_RE.test(s)) {
|
|
706
|
+
this.error("INVALID_ISO_DATE", "must match YYYY-MM-DD");
|
|
707
|
+
}
|
|
708
|
+
if (!isRealCalendarDate(s)) {
|
|
709
|
+
this.error("INVALID_DATE", "is not a valid calendar date");
|
|
710
|
+
}
|
|
711
|
+
const today = todayIsoDate();
|
|
712
|
+
if (this._isPast && !(s < today)) {
|
|
713
|
+
this.error("DATE_NOT_PAST", "must be in the past");
|
|
714
|
+
}
|
|
715
|
+
if (this._isFuture && !(s > today)) {
|
|
716
|
+
this.error("DATE_NOT_FUTURE", "must be in the future");
|
|
717
|
+
}
|
|
718
|
+
if (this._min !== void 0 && s < this._min) {
|
|
719
|
+
this.error("DATE_MIN", `must be on or after ${this._min}`, { min: this._min });
|
|
720
|
+
}
|
|
721
|
+
if (this._max !== void 0 && s > this._max) {
|
|
722
|
+
this.error("DATE_MAX", `must be on or before ${this._max}`, { max: this._max });
|
|
723
|
+
}
|
|
724
|
+
return s;
|
|
725
|
+
}
|
|
726
|
+
};
|
|
727
|
+
|
|
728
|
+
// src/valid-wall-time.ts
|
|
729
|
+
var WALL_TIME_RE = /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/;
|
|
730
|
+
var TZ_SUFFIX_RE = /(Z|[+-]\d{2}:\d{2})$/;
|
|
731
|
+
function isRealCalendarDate2(year, month, day) {
|
|
732
|
+
const dt = new Date(Date.UTC(year, month - 1, day));
|
|
733
|
+
return dt.getUTCFullYear() === year && dt.getUTCMonth() === month - 1 && dt.getUTCDate() === day;
|
|
734
|
+
}
|
|
735
|
+
var ValidWallTime = class {
|
|
736
|
+
_value;
|
|
737
|
+
_name;
|
|
738
|
+
_isRequired = false;
|
|
739
|
+
_isNullable = false;
|
|
740
|
+
_default;
|
|
741
|
+
_min;
|
|
742
|
+
_max;
|
|
743
|
+
constructor(value, name) {
|
|
744
|
+
this._value = value;
|
|
745
|
+
this._name = name;
|
|
746
|
+
}
|
|
747
|
+
error(code, details, params2 = {}) {
|
|
748
|
+
throw new ArgError(`${this._name}`, code, details, params2);
|
|
749
|
+
}
|
|
750
|
+
get required() {
|
|
751
|
+
this._isRequired = true;
|
|
752
|
+
return this;
|
|
753
|
+
}
|
|
754
|
+
get nullable() {
|
|
755
|
+
this._isNullable = true;
|
|
756
|
+
return this;
|
|
757
|
+
}
|
|
758
|
+
default(v) {
|
|
759
|
+
this._default = v;
|
|
760
|
+
return this;
|
|
761
|
+
}
|
|
762
|
+
min(t) {
|
|
763
|
+
this._min = t;
|
|
764
|
+
return this;
|
|
765
|
+
}
|
|
766
|
+
max(t) {
|
|
767
|
+
this._max = t;
|
|
768
|
+
return this;
|
|
769
|
+
}
|
|
770
|
+
get value() {
|
|
771
|
+
let val = this._value;
|
|
772
|
+
if (val === void 0 && this._default !== void 0) {
|
|
773
|
+
val = this._default;
|
|
774
|
+
}
|
|
775
|
+
if (val === void 0) {
|
|
776
|
+
if (this._isRequired) {
|
|
777
|
+
this.error("REQUIRED", "is required");
|
|
778
|
+
}
|
|
779
|
+
return void 0;
|
|
780
|
+
}
|
|
781
|
+
if (val === null) {
|
|
782
|
+
if (!this._isNullable) {
|
|
783
|
+
this.error("NOT_NULLABLE", "cannot be null");
|
|
784
|
+
}
|
|
785
|
+
return null;
|
|
786
|
+
}
|
|
787
|
+
if (typeof val !== "string") {
|
|
788
|
+
this.error("INVALID_TYPE", "must be a string YYYY-MM-DDTHH:mm[:ss]", { expected: "wall-time" });
|
|
789
|
+
}
|
|
790
|
+
const s = val.trim();
|
|
791
|
+
if (TZ_SUFFIX_RE.test(s)) {
|
|
792
|
+
this.error("WALL_TIME_HAS_OFFSET", "must not include a timezone offset (Z or \xB1hh:mm)");
|
|
793
|
+
}
|
|
794
|
+
const m = WALL_TIME_RE.exec(s);
|
|
795
|
+
if (!m) {
|
|
796
|
+
this.error("INVALID_WALL_TIME", "must match YYYY-MM-DDTHH:mm[:ss]");
|
|
797
|
+
}
|
|
798
|
+
const ymd = m[1];
|
|
799
|
+
const hhStr = m[2];
|
|
800
|
+
const mmStr = m[3];
|
|
801
|
+
const ssStr = m[4];
|
|
802
|
+
const parts = ymd.split("-").map(Number);
|
|
803
|
+
const year = parts[0];
|
|
804
|
+
const month = parts[1];
|
|
805
|
+
const day = parts[2];
|
|
806
|
+
const hh = Number(hhStr);
|
|
807
|
+
const mm = Number(mmStr);
|
|
808
|
+
const ss = ssStr !== void 0 ? Number(ssStr) : 0;
|
|
809
|
+
if (hh > 23 || mm > 59 || ss > 59 || !isRealCalendarDate2(year, month, day)) {
|
|
810
|
+
this.error("INVALID_DATE", "is not a valid calendar date/time");
|
|
811
|
+
}
|
|
812
|
+
const normalized = `${ymd}T${String(hh).padStart(2, "0")}:${String(mm).padStart(2, "0")}:${String(ss).padStart(2, "0")}`;
|
|
813
|
+
if (this._min !== void 0 && normalized < this._min) {
|
|
814
|
+
this.error("WALL_TIME_MIN", `must be on or after ${this._min}`, { min: this._min });
|
|
815
|
+
}
|
|
816
|
+
if (this._max !== void 0 && normalized > this._max) {
|
|
817
|
+
this.error("WALL_TIME_MAX", `must be on or before ${this._max}`, { max: this._max });
|
|
818
|
+
}
|
|
819
|
+
return normalized;
|
|
820
|
+
}
|
|
821
|
+
};
|
|
822
|
+
|
|
616
823
|
// src/valid-enum.ts
|
|
617
824
|
var ValidEnum = class {
|
|
618
825
|
_value;
|
|
@@ -753,6 +960,12 @@ var ValidBase = class {
|
|
|
753
960
|
get date() {
|
|
754
961
|
return new ValidDate(this._value, this._name);
|
|
755
962
|
}
|
|
963
|
+
get isoDate() {
|
|
964
|
+
return new ValidIsoDate(this._value, this._name);
|
|
965
|
+
}
|
|
966
|
+
get wallTime() {
|
|
967
|
+
return new ValidWallTime(this._value, this._name);
|
|
968
|
+
}
|
|
756
969
|
enum(allowedValues) {
|
|
757
970
|
return new ValidEnum(this._value, this._name, allowedValues);
|
|
758
971
|
}
|
|
@@ -774,7 +987,8 @@ function getContext() {
|
|
|
774
987
|
function validMiddleware(req, _res, next) {
|
|
775
988
|
const context = {
|
|
776
989
|
body: req.body,
|
|
777
|
-
params: req.params
|
|
990
|
+
params: req.params,
|
|
991
|
+
query: req.query
|
|
778
992
|
};
|
|
779
993
|
requestStorage.run(context, next);
|
|
780
994
|
}
|
|
@@ -803,7 +1017,8 @@ function wrapHandler(handler) {
|
|
|
803
1017
|
return async (req, res, next) => {
|
|
804
1018
|
const context = {
|
|
805
1019
|
body: req.body,
|
|
806
|
-
params: req.params
|
|
1020
|
+
params: req.params,
|
|
1021
|
+
query: req.query
|
|
807
1022
|
};
|
|
808
1023
|
requestStorage.run(context, async () => {
|
|
809
1024
|
try {
|
|
@@ -868,6 +1083,10 @@ function params(name) {
|
|
|
868
1083
|
const ctx = getContext();
|
|
869
1084
|
return validArgument(ctx.params, name);
|
|
870
1085
|
}
|
|
1086
|
+
function query(name) {
|
|
1087
|
+
const ctx = getContext();
|
|
1088
|
+
return validArgument(ctx.query, name);
|
|
1089
|
+
}
|
|
871
1090
|
function validArgument(obj, name) {
|
|
872
1091
|
return new ValidBase(obj[name], name);
|
|
873
1092
|
}
|
|
@@ -877,6 +1096,7 @@ function validArgument(obj, name) {
|
|
|
877
1096
|
body,
|
|
878
1097
|
createJsonRouter,
|
|
879
1098
|
params,
|
|
1099
|
+
query,
|
|
880
1100
|
validArgument,
|
|
881
1101
|
validErrorHandler,
|
|
882
1102
|
validMiddleware
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/arg-error.ts", "../src/valid-number.ts", "../src/valid-string.ts", "../src/valid-boolean.ts", "../src/valid-array.ts", "../src/valid-date.ts", "../src/valid-enum.ts", "../src/valid-object.ts", "../src/valid-base.ts", "../src/middleware.ts", "../src/valid-error-handler.ts", "../src/router.ts"],
|
|
4
|
-
"sourcesContent": ["import ArgError from \"./arg-error\";\r\nimport ValidBase from \"./valid-base\";\r\nimport { getContext } from \"./middleware\";\r\n\r\nexport { ArgError };\r\nexport { validMiddleware } from \"./middleware\";\r\nexport { default as validErrorHandler } from \"./valid-error-handler\";\r\nexport { createJsonRouter, type JsonRouter } from \"./router\";\r\nexport type { NumberArrayConfig, StringArrayConfig } from \"./types\";\r\n\r\nexport function body(name: string): ValidBase {\r\n const ctx = getContext();\r\n if (ctx.body === undefined) {\r\n throw new ArgError('body', 'BODY_UNDEFINED', 'body must be defined');\r\n }\r\n if (ctx.body === null) {\r\n throw new ArgError('body', 'BODY_NULL', 'body must not be null');\r\n }\r\n if (Array.isArray(ctx.body)) {\r\n throw new ArgError('body', 'BODY_ARRAY', 'body must not be an array');\r\n }\r\n return validArgument(ctx.body as Record<string, unknown>, name);\r\n}\r\n\r\nexport function params(name: string): ValidBase {\r\n const ctx = getContext();\r\n return validArgument(ctx.params, name);\r\n}\r\n\r\nexport function validArgument(obj: Record<string, unknown>, name: string): ValidBase {\r\n return new ValidBase(obj[name], name);\r\n}\r\n", "export interface ErrorParams {\r\n [key: string]: unknown;\r\n}\r\n\r\nexport default class ArgError extends Error {\r\n field: string;\r\n code: string;\r\n details: string;\r\n params: ErrorParams;\r\n\r\n constructor(field: string, code: string, details: string, params: ErrorParams = {}) {\r\n super(`${field} ${details}`);\r\n this.field = field;\r\n this.code = code;\r\n this.details = details;\r\n this.params = params;\r\n }\r\n\r\n get msg(): string {\r\n return this.details;\r\n }\r\n}", "import ArgError, { type ErrorParams } from \"./arg-error\";\n\nexport default class ValidNumber<T = number | undefined> {\n private _value: unknown;\n private _name: string;\n private _isRequired = false;\n private _isNullable = false;\n private _default: number | undefined;\n private _min: number | undefined;\n private _max: number | undefined;\n private _isInteger = false;\n private _isPositive = false;\n private _isNegative = false;\n private _oneOf: number[] | undefined;\n\n constructor(value: unknown, name: string) {\n this._value = value;\n this._name = name;\n }\n\n private error(code: string, details: string, params: ErrorParams = {}): never {\n throw new ArgError(`${this._name}`, code, details, params);\n }\n\n get required(): ValidNumber<Exclude<T, undefined>> {\n this._isRequired = true;\n return this as unknown as ValidNumber<Exclude<T, undefined>>;\n }\n\n get nullable(): ValidNumber<T | null> {\n this._isNullable = true;\n return this as unknown as ValidNumber<T | null>;\n }\n\n default(v: number): ValidNumber<Exclude<T, undefined>> {\n this._default = v;\n return this as unknown as ValidNumber<Exclude<T, undefined>>;\n }\n\n min(n: number): this {\n this._min = n;\n return this;\n }\n\n max(n: number): this {\n this._max = n;\n return this;\n }\n\n get integer(): this {\n this._isInteger = true;\n return this;\n }\n\n get positive(): this {\n this._isPositive = true;\n return this;\n }\n\n get negative(): this {\n this._isNegative = true;\n return this;\n }\n\n between(min: number, max: number): this {\n this._min = min;\n this._max = max;\n return this;\n }\n\n oneOf(values: number[]): this {\n this._oneOf = values;\n return this;\n }\n\n get value(): T {\n let val = this._value;\n\n // Apply default if undefined\n if (val === undefined && this._default !== undefined) {\n val = this._default;\n }\n\n // Check undefined\n if (val === undefined) {\n if (this._isRequired) {\n this.error('REQUIRED', 'is required');\n }\n return undefined as T;\n }\n\n // Check null\n if (val === null) {\n if (!this._isNullable) {\n this.error('NOT_NULLABLE', 'cannot be null');\n }\n return null as T;\n }\n\n // Parse number\n let num: number;\n if (typeof val === 'number') {\n num = val;\n } else if (typeof val === 'string') {\n num = parseFloat(val);\n } else {\n this.error('INVALID_TYPE', 'must be a number', { expected: 'number' });\n }\n\n if (isNaN(num)) {\n this.error('INVALID_NUMBER', 'must be a valid number');\n }\n\n // Validations\n if (this._isInteger && !Number.isInteger(num)) {\n this.error('NOT_INTEGER', 'must be an integer');\n }\n\n if (this._isPositive && num <= 0) {\n this.error('NOT_POSITIVE', 'must be positive');\n }\n\n if (this._isNegative && num >= 0) {\n this.error('NOT_NEGATIVE', 'must be negative');\n }\n\n if (this._min !== undefined && num < this._min) {\n this.error('MIN_VALUE', `must be at least ${this._min}`, { min: this._min });\n }\n\n if (this._max !== undefined && num > this._max) {\n this.error('MAX_VALUE', `must be at most ${this._max}`, { max: this._max });\n }\n\n if (this._oneOf !== undefined && !this._oneOf.includes(num)) {\n this.error('NOT_IN_LIST', `must be one of: ${this._oneOf.join(', ')}`, { allowed: this._oneOf });\n }\n\n return num as T;\n }\n}\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\n\r\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\nconst URL_REGEX = /^https?:\\/\\/.+/;\r\n\r\nexport default class ValidString<T = string | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: string | undefined;\r\n private _minLength: number | undefined;\r\n private _maxLength: number | undefined;\r\n private _pattern: RegExp | undefined;\r\n private _isEmail = false;\r\n private _isUrl = false;\r\n private _shouldTrim = false;\r\n private _toLowercase = false;\r\n private _toUppercase = false;\r\n private _oneOf: string[] | undefined;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n get required(): ValidString<Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidString<Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidString<T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidString<T | null>;\r\n }\r\n\r\n default(v: string): ValidString<Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidString<Exclude<T, undefined>>;\r\n }\r\n\r\n minLength(n: number): this {\r\n this._minLength = n;\r\n return this;\r\n }\r\n\r\n maxLength(n: number): this {\r\n this._maxLength = n;\r\n return this;\r\n }\r\n\r\n pattern(regex: RegExp): this {\r\n this._pattern = regex;\r\n return this;\r\n }\r\n\r\n get email(): this {\r\n this._isEmail = true;\r\n return this;\r\n }\r\n\r\n get url(): this {\r\n this._isUrl = true;\r\n return this;\r\n }\r\n\r\n get trim(): this {\r\n this._shouldTrim = true;\r\n return this;\r\n }\r\n\r\n get lowercase(): this {\r\n this._toLowercase = true;\r\n return this;\r\n }\r\n\r\n get uppercase(): this {\r\n this._toUppercase = true;\r\n return this;\r\n }\r\n\r\n oneOf(values: string[]): this {\r\n this._oneOf = values;\r\n return this;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Must be string\r\n if (typeof val !== 'string') {\r\n this.error('INVALID_TYPE', 'must be a string', { expected: 'string' });\r\n }\r\n\r\n let str = val;\r\n\r\n // Transformations\r\n if (this._shouldTrim) {\r\n str = str.trim();\r\n }\r\n\r\n if (this._toLowercase) {\r\n str = str.toLowerCase();\r\n }\r\n\r\n if (this._toUppercase) {\r\n str = str.toUpperCase();\r\n }\r\n\r\n // Validations\r\n if (this._minLength !== undefined && str.length < this._minLength) {\r\n this.error('MIN_LENGTH', `must be at least ${this._minLength} characters`, { min: this._minLength });\r\n }\r\n\r\n if (this._maxLength !== undefined && str.length > this._maxLength) {\r\n this.error('MAX_LENGTH', `must be at most ${this._maxLength} characters`, { max: this._maxLength });\r\n }\r\n\r\n if (this._pattern !== undefined && !this._pattern.test(str)) {\r\n this.error('PATTERN_MISMATCH', 'does not match required pattern');\r\n }\r\n\r\n if (this._isEmail && !EMAIL_REGEX.test(str)) {\r\n this.error('INVALID_EMAIL', 'must be a valid email');\r\n }\r\n\r\n if (this._isUrl && !URL_REGEX.test(str)) {\r\n this.error('INVALID_URL', 'must be a valid URL');\r\n }\r\n\r\n if (this._oneOf !== undefined && !this._oneOf.includes(str)) {\r\n this.error('NOT_IN_LIST', `must be one of: ${this._oneOf.join(', ')}`, { allowed: this._oneOf });\r\n }\r\n\r\n return str as T;\r\n }\r\n}\r\n", "import ArgError from \"./arg-error\";\r\n\r\nexport default class ValidBoolean<T = boolean | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: boolean | undefined;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string): never {\r\n throw new ArgError(`${this._name}`, code, details);\r\n }\r\n\r\n get required(): ValidBoolean<Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidBoolean<Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidBoolean<T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidBoolean<T | null>;\r\n }\r\n\r\n default(v: boolean): ValidBoolean<Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidBoolean<Exclude<T, undefined>>;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Parse boolean\r\n let bool: boolean;\r\n if (typeof val === 'boolean') {\r\n bool = val;\r\n } else if (val === 'true' || val === 1) {\r\n bool = true;\r\n } else if (val === 'false' || val === 0) {\r\n bool = false;\r\n } else {\r\n this.error('INVALID_TYPE', 'must be a boolean');\r\n }\r\n\r\n return bool as T;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\nimport type { NumberArrayConfig, StringArrayConfig } from \"./types\";\r\n\r\nexport type ObjectArrayValidator<T> = (obj: Record<string, unknown>, index: number) => T;\r\n\r\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\nconst URL_REGEX = /^https?:\\/\\/.+/;\r\n\r\ntype ArrayNullability<T, N> = N extends undefined\r\n ? T[] | undefined\r\n : N extends null\r\n ? T[] | null\r\n : T[];\r\n\r\nexport default class ValidArray<T = unknown, N = T[] | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: unknown[] | undefined;\r\n private _minLength: number | undefined;\r\n private _maxLength: number | undefined;\r\n private _elementValidator: ((val: unknown, index: number) => unknown) | undefined;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n private elementError(code: string, details: string, index: number, params: ErrorParams = {}): never {\r\n throw new ArgError(\r\n `${this._name}`,\r\n 'ARRAY_ELEMENT',\r\n `element at index ${index} ${details}`,\r\n { index, code, ...params }\r\n );\r\n }\r\n\r\n get required(): ValidArray<T, Exclude<N, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidArray<T, Exclude<N, undefined>>;\r\n }\r\n\r\n get nullable(): ValidArray<T, N | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidArray<T, N | null>;\r\n }\r\n\r\n default(v: T[]): ValidArray<T, Exclude<N, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidArray<T, Exclude<N, undefined>>;\r\n }\r\n\r\n minLength(n: number): this {\r\n this._minLength = n;\r\n return this;\r\n }\r\n\r\n maxLength(n: number): this {\r\n this._maxLength = n;\r\n return this;\r\n }\r\n\r\n ofNumbers(config?: NumberArrayConfig): ValidArray<number, ArrayNullability<number, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n let num: number;\r\n if (typeof val === 'number') {\r\n num = val;\r\n } else if (typeof val === 'string') {\r\n num = parseFloat(val);\r\n } else {\r\n this.elementError('INVALID_TYPE', 'must be a number', index, { expected: 'number' });\r\n }\r\n\r\n if (isNaN(num)) {\r\n this.elementError('INVALID_NUMBER', 'must be a valid number', index);\r\n }\r\n\r\n if (config) {\r\n if (config.integer && !Number.isInteger(num)) {\r\n this.elementError('NOT_INTEGER', 'must be an integer', index);\r\n }\r\n if (config.positive && num <= 0) {\r\n this.elementError('NOT_POSITIVE', 'must be positive', index);\r\n }\r\n if (config.negative && num >= 0) {\r\n this.elementError('NOT_NEGATIVE', 'must be negative', index);\r\n }\r\n if (config.min !== undefined && num < config.min) {\r\n this.elementError('MIN_VALUE', `must be at least ${config.min}`, index, { min: config.min });\r\n }\r\n if (config.max !== undefined && num > config.max) {\r\n this.elementError('MAX_VALUE', `must be at most ${config.max}`, index, { max: config.max });\r\n }\r\n }\r\n\r\n return num;\r\n };\r\n return this as unknown as ValidArray<number, ArrayNullability<number, N>>;\r\n }\r\n\r\n ofStrings(config?: StringArrayConfig): ValidArray<string, ArrayNullability<string, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (typeof val !== 'string') {\r\n this.elementError('INVALID_TYPE', 'must be a string', index, { expected: 'string' });\r\n }\r\n\r\n let str = val;\r\n\r\n if (config) {\r\n if (config.trim) {\r\n str = str.trim();\r\n }\r\n if (config.minLength !== undefined && str.length < config.minLength) {\r\n this.elementError('MIN_LENGTH', `must be at least ${config.minLength} characters`, index, { min: config.minLength });\r\n }\r\n if (config.maxLength !== undefined && str.length > config.maxLength) {\r\n this.elementError('MAX_LENGTH', `must be at most ${config.maxLength} characters`, index, { max: config.maxLength });\r\n }\r\n if (config.pattern && !config.pattern.test(str)) {\r\n this.elementError('PATTERN_MISMATCH', 'does not match required pattern', index);\r\n }\r\n if (config.email && !EMAIL_REGEX.test(str)) {\r\n this.elementError('INVALID_EMAIL', 'must be a valid email', index);\r\n }\r\n if (config.url && !URL_REGEX.test(str)) {\r\n this.elementError('INVALID_URL', 'must be a valid URL', index);\r\n }\r\n }\r\n\r\n return str;\r\n };\r\n return this as unknown as ValidArray<string, ArrayNullability<string, N>>;\r\n }\r\n\r\n ofBooleans(): ValidArray<boolean, ArrayNullability<boolean, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (typeof val === 'boolean') {\r\n return val;\r\n }\r\n if (val === 'true' || val === 1) {\r\n return true;\r\n }\r\n if (val === 'false' || val === 0) {\r\n return false;\r\n }\r\n this.elementError('INVALID_TYPE', 'must be a boolean', index, { expected: 'boolean' });\r\n };\r\n return this as unknown as ValidArray<boolean, ArrayNullability<boolean, N>>;\r\n }\r\n\r\n ofObjects<O>(validator: ObjectArrayValidator<O>): ValidArray<O, ArrayNullability<O, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (val === null || typeof val !== 'object' || Array.isArray(val)) {\r\n this.elementError('INVALID_TYPE', 'must be an object', index, { expected: 'object' });\r\n }\r\n\r\n try {\r\n return validator(val as Record<string, unknown>, index);\r\n } catch (e) {\r\n if (e instanceof ArgError) {\r\n // Re-throw with nested field path including index\r\n throw new ArgError(\r\n `${this._name}[${index}].${e.field}`,\r\n e.code,\r\n e.details,\r\n e.params\r\n );\r\n }\r\n throw e;\r\n }\r\n };\r\n return this as unknown as ValidArray<O, ArrayNullability<O, N>>;\r\n }\r\n\r\n get value(): N {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as N;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as N;\r\n }\r\n\r\n // Must be array\r\n if (!Array.isArray(val)) {\r\n this.error('INVALID_TYPE', 'must be an array', { expected: 'array' });\r\n }\r\n\r\n // Length validations\r\n if (this._minLength !== undefined && val.length < this._minLength) {\r\n this.error('ARRAY_MIN_LENGTH', `must have at least ${this._minLength} elements`, { min: this._minLength });\r\n }\r\n\r\n if (this._maxLength !== undefined && val.length > this._maxLength) {\r\n this.error('ARRAY_MAX_LENGTH', `must have at most ${this._maxLength} elements`, { max: this._maxLength });\r\n }\r\n\r\n // Validate elements\r\n if (this._elementValidator) {\r\n const validated = val.map((item, index) => this._elementValidator!(item, index));\r\n return validated as N;\r\n }\r\n\r\n return val as N;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\n\r\nexport default class ValidDate<T = Date | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: Date | undefined;\r\n private _min: Date | undefined;\r\n private _max: Date | undefined;\r\n private _isPast = false;\r\n private _isFuture = false;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n get required(): ValidDate<Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidDate<Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidDate<T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidDate<T | null>;\r\n }\r\n\r\n default(v: Date): ValidDate<Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidDate<Exclude<T, undefined>>;\r\n }\r\n\r\n min(date: Date): this {\r\n this._min = date;\r\n return this;\r\n }\r\n\r\n max(date: Date): this {\r\n this._max = date;\r\n return this;\r\n }\r\n\r\n get past(): this {\r\n this._isPast = true;\r\n return this;\r\n }\r\n\r\n get future(): this {\r\n this._isFuture = true;\r\n return this;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Parse date\r\n let date: Date;\r\n if (val instanceof Date) {\r\n date = val;\r\n } else if (typeof val === 'string' || typeof val === 'number') {\r\n date = new Date(val);\r\n } else {\r\n this.error('INVALID_TYPE', 'must be a date', { expected: 'date' });\r\n }\r\n\r\n if (isNaN(date.getTime())) {\r\n this.error('INVALID_DATE', 'must be a valid date');\r\n }\r\n\r\n const now = new Date();\r\n\r\n // Validations\r\n if (this._isPast && date >= now) {\r\n this.error('DATE_NOT_PAST', 'must be in the past');\r\n }\r\n\r\n if (this._isFuture && date <= now) {\r\n this.error('DATE_NOT_FUTURE', 'must be in the future');\r\n }\r\n\r\n if (this._min !== undefined && date < this._min) {\r\n this.error('DATE_MIN', `must be after ${this._min.toISOString()}`, { min: this._min.toISOString() });\r\n }\r\n\r\n if (this._max !== undefined && date > this._max) {\r\n this.error('DATE_MAX', `must be before ${this._max.toISOString()}`, { max: this._max.toISOString() });\r\n }\r\n\r\n return date as T;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\n\r\nexport default class ValidEnum<V extends string | number, T = V | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _allowedValues: V[];\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: V | undefined;\r\n\r\n constructor(value: unknown, name: string, allowedValues: V[]) {\r\n this._value = value;\r\n this._name = name;\r\n this._allowedValues = allowedValues;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n get required(): ValidEnum<V, Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidEnum<V, Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidEnum<V, T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidEnum<V, T | null>;\r\n }\r\n\r\n default(v: V): ValidEnum<V, Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidEnum<V, Exclude<T, undefined>>;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Check if value is in allowed values\r\n if (!this._allowedValues.includes(val as V)) {\r\n this.error('NOT_IN_LIST', `must be one of: ${this._allowedValues.join(', ')}`, { allowed: this._allowedValues });\r\n }\r\n\r\n return val as T;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\n\nexport type ObjectValidator<T> = (obj: Record<string, unknown>) => T;\n\nexport default class ValidObject<T, N = T | undefined> {\n private _value: unknown;\n private _name: string;\n private _validator: ObjectValidator<T>;\n private _isRequired = false;\n private _isNullable = false;\n private _default: T | undefined;\n\n constructor(value: unknown, name: string, validator: ObjectValidator<T>) {\n this._value = value;\n this._name = name;\n this._validator = validator;\n }\n\n private error(code: string, details: string, params: ErrorParams = {}): never {\n throw new ArgError(`${this._name}`, code, details, params);\n }\n\n get required(): ValidObject<T, Exclude<N, undefined>> {\n this._isRequired = true;\n return this as unknown as ValidObject<T, Exclude<N, undefined>>;\n }\n\n get nullable(): ValidObject<T, N | null> {\n this._isNullable = true;\n return this as unknown as ValidObject<T, N | null>;\n }\n\n default(v: T): ValidObject<T, Exclude<N, undefined>> {\n this._default = v;\n return this as unknown as ValidObject<T, Exclude<N, undefined>>;\n }\n\n get value(): N {\n let val = this._value;\n\n // Apply default if undefined\n if (val === undefined && this._default !== undefined) {\n val = this._default;\n }\n\n // Check undefined\n if (val === undefined) {\n if (this._isRequired) {\n this.error('REQUIRED', 'is required');\n }\n return undefined as N;\n }\n\n // Check null\n if (val === null) {\n if (!this._isNullable) {\n this.error('NOT_NULLABLE', 'cannot be null');\n }\n return null as N;\n }\n\n // Must be object (not array, not null)\n if (typeof val !== 'object' || Array.isArray(val)) {\n this.error('INVALID_TYPE', 'must be an object', { expected: 'object' });\n }\n\n // Run custom validator\n try {\n const validated = this._validator(val as Record<string, unknown>);\n return validated as unknown as N;\n } catch (e) {\n if (e instanceof ArgError) {\n // Re-throw with nested field path\n throw new ArgError(\n `${this._name}.${e.field}`,\n e.code,\n e.details,\n e.params\n );\n }\n throw e;\n }\n }\n}\n", "import ValidNumber from \"./valid-number\";\r\nimport ValidString from \"./valid-string\";\r\nimport ValidBoolean from \"./valid-boolean\";\r\nimport ValidArray from \"./valid-array\";\r\nimport ValidDate from \"./valid-date\";\r\nimport ValidEnum from \"./valid-enum\";\r\nimport ValidObject, { type ObjectValidator } from \"./valid-object\";\r\n\r\nexport default class ValidBase {\r\n private _value: unknown;\r\n private _name: string;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n get number(): ValidNumber {\r\n return new ValidNumber(this._value, this._name);\r\n }\r\n\r\n get string(): ValidString {\r\n return new ValidString(this._value, this._name);\r\n }\r\n\r\n get boolean(): ValidBoolean {\r\n return new ValidBoolean(this._value, this._name);\r\n }\r\n\r\n get array(): ValidArray {\r\n return new ValidArray(this._value, this._name);\r\n }\r\n\r\n get date(): ValidDate {\r\n return new ValidDate(this._value, this._name);\r\n }\r\n\r\n enum<V extends string | number>(allowedValues: V[]): ValidEnum<V> {\r\n return new ValidEnum<V>(this._value, this._name, allowedValues);\r\n }\r\n\r\n object<T>(validator: ObjectValidator<T>): ValidObject<T> {\r\n return new ValidObject<T>(this._value, this._name, validator);\r\n }\r\n}\r\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { Request, Response, NextFunction } from \"express\";\n\nexport interface RequestContext {\n body: unknown;\n params: Record<string, unknown>;\n}\n\nexport const requestStorage = new AsyncLocalStorage<RequestContext>();\n\nexport function getContext(): RequestContext {\n const ctx = requestStorage.getStore();\n if (!ctx) {\n throw new Error('body/params must be called inside validMiddleware context');\n }\n return ctx;\n}\n\nexport function validMiddleware(req: Request, _res: Response, next: NextFunction): void {\n const context: RequestContext = {\n body: req.body,\n params: req.params as Record<string, unknown>,\n };\n\n requestStorage.run(context, next);\n}\n\n", "import { ErrorRequestHandler } from \"express\";\r\nimport ArgError from \"./arg-error\";\r\n\r\nconst validErrorHandler: ErrorRequestHandler = (error, req, res, next) => {\r\n if (error instanceof ArgError) {\r\n res.status(400).json({\r\n error: error.message,\r\n code: 400,\r\n errorCode: error.code,\r\n params: error.params,\r\n field: error.field,\r\n url: req.originalUrl,\r\n message: error.msg\r\n });\r\n } else {\r\n next(error);\r\n }\r\n};\r\n\r\nexport default validErrorHandler;", "import { Router, Request, Response, NextFunction, RequestHandler } from 'express';\nimport { requestStorage, RequestContext } from './middleware';\n\ntype JsonHandler = (req: Request, res: Response) => unknown | Promise<unknown>;\ntype Middleware = RequestHandler;\n\nexport interface JsonRouter {\n get: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n post: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n put: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n patch: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n delete: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n router: Router;\n}\n\nfunction wrapHandler(handler: JsonHandler) {\n return async (req: Request, res: Response, next: NextFunction) => {\n // Cr\u00E9er le contexte ici, quand les params sont disponibles\n const context: RequestContext = {\n body: req.body,\n params: req.params as Record<string, unknown>,\n };\n\n requestStorage.run(context, async () => {\n try {\n const result = await handler(req, res);\n\n if (res.headersSent) {\n return;\n }\n\n if (result === undefined || result === null) {\n res.status(204).end();\n } else {\n res.json(result);\n }\n } catch (error) {\n next(error);\n }\n });\n };\n}\n\nexport function createJsonRouter(): JsonRouter {\n const expressRouter = Router();\n\n const jsonRouter: JsonRouter = {\n router: expressRouter,\n get: (path, handler, ...middlewares) => {\n expressRouter.get(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n post: (path, handler, ...middlewares) => {\n expressRouter.post(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n put: (path, handler, ...middlewares) => {\n expressRouter.put(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n patch: (path, handler, ...middlewares) => {\n expressRouter.patch(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n delete: (path, handler, ...middlewares) => {\n expressRouter.delete(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n };\n\n return jsonRouter;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["params", "params", "params", "EMAIL_REGEX", "URL_REGEX", "params", "params", "params", "params"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/arg-error.ts", "../src/valid-number.ts", "../src/valid-string.ts", "../src/valid-boolean.ts", "../src/valid-array.ts", "../src/valid-date.ts", "../src/valid-iso-date.ts", "../src/valid-wall-time.ts", "../src/valid-enum.ts", "../src/valid-object.ts", "../src/valid-base.ts", "../src/middleware.ts", "../src/valid-error-handler.ts", "../src/router.ts"],
|
|
4
|
+
"sourcesContent": ["import ArgError from \"./arg-error\";\r\nimport ValidBase from \"./valid-base\";\r\nimport { getContext } from \"./middleware\";\r\n\r\nexport { ArgError };\r\nexport { validMiddleware } from \"./middleware\";\r\nexport { default as validErrorHandler } from \"./valid-error-handler\";\r\nexport { createJsonRouter, type JsonRouter } from \"./router\";\r\nexport type { NumberArrayConfig, StringArrayConfig } from \"./types\";\r\n\r\nexport function body(name: string): ValidBase {\r\n const ctx = getContext();\r\n if (ctx.body === undefined) {\r\n throw new ArgError('body', 'BODY_UNDEFINED', 'body must be defined');\r\n }\r\n if (ctx.body === null) {\r\n throw new ArgError('body', 'BODY_NULL', 'body must not be null');\r\n }\r\n if (Array.isArray(ctx.body)) {\r\n throw new ArgError('body', 'BODY_ARRAY', 'body must not be an array');\r\n }\r\n return validArgument(ctx.body as Record<string, unknown>, name);\r\n}\r\n\r\nexport function params(name: string): ValidBase {\r\n const ctx = getContext();\r\n return validArgument(ctx.params, name);\r\n}\r\n\r\nexport function query(name: string): ValidBase {\r\n const ctx = getContext();\r\n return validArgument(ctx.query, name);\r\n}\r\n\r\nexport function validArgument(obj: Record<string, unknown>, name: string): ValidBase {\r\n return new ValidBase(obj[name], name);\r\n}\r\n", "export interface ErrorParams {\r\n [key: string]: unknown;\r\n}\r\n\r\nexport default class ArgError extends Error {\r\n field: string;\r\n code: string;\r\n details: string;\r\n params: ErrorParams;\r\n\r\n constructor(field: string, code: string, details: string, params: ErrorParams = {}) {\r\n super(`${field} ${details}`);\r\n this.field = field;\r\n this.code = code;\r\n this.details = details;\r\n this.params = params;\r\n }\r\n\r\n get msg(): string {\r\n return this.details;\r\n }\r\n}", "import ArgError, { type ErrorParams } from \"./arg-error\";\n\nexport default class ValidNumber<T = number | undefined> {\n private _value: unknown;\n private _name: string;\n private _isRequired = false;\n private _isNullable = false;\n private _default: number | undefined;\n private _min: number | undefined;\n private _max: number | undefined;\n private _isInteger = false;\n private _isPositive = false;\n private _isNegative = false;\n private _oneOf: number[] | undefined;\n\n constructor(value: unknown, name: string) {\n this._value = value;\n this._name = name;\n }\n\n private error(code: string, details: string, params: ErrorParams = {}): never {\n throw new ArgError(`${this._name}`, code, details, params);\n }\n\n get required(): ValidNumber<Exclude<T, undefined>> {\n this._isRequired = true;\n return this as unknown as ValidNumber<Exclude<T, undefined>>;\n }\n\n get nullable(): ValidNumber<T | null> {\n this._isNullable = true;\n return this as unknown as ValidNumber<T | null>;\n }\n\n default(v: number): ValidNumber<Exclude<T, undefined>> {\n this._default = v;\n return this as unknown as ValidNumber<Exclude<T, undefined>>;\n }\n\n min(n: number): this {\n this._min = n;\n return this;\n }\n\n max(n: number): this {\n this._max = n;\n return this;\n }\n\n get integer(): this {\n this._isInteger = true;\n return this;\n }\n\n get positive(): this {\n this._isPositive = true;\n return this;\n }\n\n get negative(): this {\n this._isNegative = true;\n return this;\n }\n\n between(min: number, max: number): this {\n this._min = min;\n this._max = max;\n return this;\n }\n\n oneOf(values: number[]): this {\n this._oneOf = values;\n return this;\n }\n\n get value(): T {\n let val = this._value;\n\n // Apply default if undefined\n if (val === undefined && this._default !== undefined) {\n val = this._default;\n }\n\n // Check undefined\n if (val === undefined) {\n if (this._isRequired) {\n this.error('REQUIRED', 'is required');\n }\n return undefined as T;\n }\n\n // Check null\n if (val === null) {\n if (!this._isNullable) {\n this.error('NOT_NULLABLE', 'cannot be null');\n }\n return null as T;\n }\n\n // Parse number\n let num: number;\n if (typeof val === 'number') {\n num = val;\n } else if (typeof val === 'string') {\n num = parseFloat(val);\n } else {\n this.error('INVALID_TYPE', 'must be a number', { expected: 'number' });\n }\n\n if (isNaN(num)) {\n this.error('INVALID_NUMBER', 'must be a valid number');\n }\n\n // Validations\n if (this._isInteger && !Number.isInteger(num)) {\n this.error('NOT_INTEGER', 'must be an integer');\n }\n\n if (this._isPositive && num <= 0) {\n this.error('NOT_POSITIVE', 'must be positive');\n }\n\n if (this._isNegative && num >= 0) {\n this.error('NOT_NEGATIVE', 'must be negative');\n }\n\n if (this._min !== undefined && num < this._min) {\n this.error('MIN_VALUE', `must be at least ${this._min}`, { min: this._min });\n }\n\n if (this._max !== undefined && num > this._max) {\n this.error('MAX_VALUE', `must be at most ${this._max}`, { max: this._max });\n }\n\n if (this._oneOf !== undefined && !this._oneOf.includes(num)) {\n this.error('NOT_IN_LIST', `must be one of: ${this._oneOf.join(', ')}`, { allowed: this._oneOf });\n }\n\n return num as T;\n }\n}\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\n\r\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\nconst URL_REGEX = /^https?:\\/\\/.+/;\r\n\r\nexport default class ValidString<T = string | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: string | undefined;\r\n private _minLength: number | undefined;\r\n private _maxLength: number | undefined;\r\n private _pattern: RegExp | undefined;\r\n private _isEmail = false;\r\n private _isUrl = false;\r\n private _shouldTrim = false;\r\n private _toLowercase = false;\r\n private _toUppercase = false;\r\n private _oneOf: string[] | undefined;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n get required(): ValidString<Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidString<Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidString<T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidString<T | null>;\r\n }\r\n\r\n default(v: string): ValidString<Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidString<Exclude<T, undefined>>;\r\n }\r\n\r\n minLength(n: number): this {\r\n this._minLength = n;\r\n return this;\r\n }\r\n\r\n maxLength(n: number): this {\r\n this._maxLength = n;\r\n return this;\r\n }\r\n\r\n pattern(regex: RegExp): this {\r\n this._pattern = regex;\r\n return this;\r\n }\r\n\r\n get email(): this {\r\n this._isEmail = true;\r\n return this;\r\n }\r\n\r\n get url(): this {\r\n this._isUrl = true;\r\n return this;\r\n }\r\n\r\n get trim(): this {\r\n this._shouldTrim = true;\r\n return this;\r\n }\r\n\r\n get lowercase(): this {\r\n this._toLowercase = true;\r\n return this;\r\n }\r\n\r\n get uppercase(): this {\r\n this._toUppercase = true;\r\n return this;\r\n }\r\n\r\n oneOf(values: string[]): this {\r\n this._oneOf = values;\r\n return this;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Must be string\r\n if (typeof val !== 'string') {\r\n this.error('INVALID_TYPE', 'must be a string', { expected: 'string' });\r\n }\r\n\r\n let str = val;\r\n\r\n // Transformations\r\n if (this._shouldTrim) {\r\n str = str.trim();\r\n }\r\n\r\n if (this._toLowercase) {\r\n str = str.toLowerCase();\r\n }\r\n\r\n if (this._toUppercase) {\r\n str = str.toUpperCase();\r\n }\r\n\r\n // Validations\r\n if (this._minLength !== undefined && str.length < this._minLength) {\r\n this.error('MIN_LENGTH', `must be at least ${this._minLength} characters`, { min: this._minLength });\r\n }\r\n\r\n if (this._maxLength !== undefined && str.length > this._maxLength) {\r\n this.error('MAX_LENGTH', `must be at most ${this._maxLength} characters`, { max: this._maxLength });\r\n }\r\n\r\n if (this._pattern !== undefined && !this._pattern.test(str)) {\r\n this.error('PATTERN_MISMATCH', 'does not match required pattern');\r\n }\r\n\r\n if (this._isEmail && !EMAIL_REGEX.test(str)) {\r\n this.error('INVALID_EMAIL', 'must be a valid email');\r\n }\r\n\r\n if (this._isUrl && !URL_REGEX.test(str)) {\r\n this.error('INVALID_URL', 'must be a valid URL');\r\n }\r\n\r\n if (this._oneOf !== undefined && !this._oneOf.includes(str)) {\r\n this.error('NOT_IN_LIST', `must be one of: ${this._oneOf.join(', ')}`, { allowed: this._oneOf });\r\n }\r\n\r\n return str as T;\r\n }\r\n}\r\n", "import ArgError from \"./arg-error\";\r\n\r\nexport default class ValidBoolean<T = boolean | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: boolean | undefined;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string): never {\r\n throw new ArgError(`${this._name}`, code, details);\r\n }\r\n\r\n get required(): ValidBoolean<Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidBoolean<Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidBoolean<T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidBoolean<T | null>;\r\n }\r\n\r\n default(v: boolean): ValidBoolean<Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidBoolean<Exclude<T, undefined>>;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Parse boolean\r\n let bool: boolean;\r\n if (typeof val === 'boolean') {\r\n bool = val;\r\n } else if (val === 'true' || val === 1) {\r\n bool = true;\r\n } else if (val === 'false' || val === 0) {\r\n bool = false;\r\n } else {\r\n this.error('INVALID_TYPE', 'must be a boolean');\r\n }\r\n\r\n return bool as T;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\nimport type { NumberArrayConfig, StringArrayConfig } from \"./types\";\r\n\r\nexport type ObjectArrayValidator<T> = (obj: Record<string, unknown>, index: number) => T;\r\n\r\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\nconst URL_REGEX = /^https?:\\/\\/.+/;\r\n\r\ntype ArrayNullability<T, N> = N extends undefined\r\n ? T[] | undefined\r\n : N extends null\r\n ? T[] | null\r\n : T[];\r\n\r\nexport default class ValidArray<T = unknown, N = T[] | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: unknown[] | undefined;\r\n private _minLength: number | undefined;\r\n private _maxLength: number | undefined;\r\n private _elementValidator: ((val: unknown, index: number) => unknown) | undefined;\r\n private _csvSeparator: string | undefined;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n private elementError(code: string, details: string, index: number, params: ErrorParams = {}): never {\r\n throw new ArgError(\r\n `${this._name}`,\r\n 'ARRAY_ELEMENT',\r\n `element at index ${index} ${details}`,\r\n { index, code, ...params }\r\n );\r\n }\r\n\r\n get required(): ValidArray<T, Exclude<N, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidArray<T, Exclude<N, undefined>>;\r\n }\r\n\r\n get nullable(): ValidArray<T, N | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidArray<T, N | null>;\r\n }\r\n\r\n default(v: T[]): ValidArray<T, Exclude<N, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidArray<T, Exclude<N, undefined>>;\r\n }\r\n\r\n minLength(n: number): this {\r\n this._minLength = n;\r\n return this;\r\n }\r\n\r\n maxLength(n: number): this {\r\n this._maxLength = n;\r\n return this;\r\n }\r\n\r\n csv(separator: string = ','): this {\r\n this._csvSeparator = separator;\r\n return this;\r\n }\r\n\r\n ofNumbers(config?: NumberArrayConfig): ValidArray<number, ArrayNullability<number, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n let num: number;\r\n if (typeof val === 'number') {\r\n num = val;\r\n } else if (typeof val === 'string') {\r\n num = parseFloat(val);\r\n } else {\r\n this.elementError('INVALID_TYPE', 'must be a number', index, { expected: 'number' });\r\n }\r\n\r\n if (isNaN(num)) {\r\n this.elementError('INVALID_NUMBER', 'must be a valid number', index);\r\n }\r\n\r\n if (config) {\r\n if (config.integer && !Number.isInteger(num)) {\r\n this.elementError('NOT_INTEGER', 'must be an integer', index);\r\n }\r\n if (config.positive && num <= 0) {\r\n this.elementError('NOT_POSITIVE', 'must be positive', index);\r\n }\r\n if (config.negative && num >= 0) {\r\n this.elementError('NOT_NEGATIVE', 'must be negative', index);\r\n }\r\n if (config.min !== undefined && num < config.min) {\r\n this.elementError('MIN_VALUE', `must be at least ${config.min}`, index, { min: config.min });\r\n }\r\n if (config.max !== undefined && num > config.max) {\r\n this.elementError('MAX_VALUE', `must be at most ${config.max}`, index, { max: config.max });\r\n }\r\n }\r\n\r\n return num;\r\n };\r\n return this as unknown as ValidArray<number, ArrayNullability<number, N>>;\r\n }\r\n\r\n ofStrings(config?: StringArrayConfig): ValidArray<string, ArrayNullability<string, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (typeof val !== 'string') {\r\n this.elementError('INVALID_TYPE', 'must be a string', index, { expected: 'string' });\r\n }\r\n\r\n let str = val;\r\n\r\n if (config) {\r\n if (config.trim) {\r\n str = str.trim();\r\n }\r\n if (config.minLength !== undefined && str.length < config.minLength) {\r\n this.elementError('MIN_LENGTH', `must be at least ${config.minLength} characters`, index, { min: config.minLength });\r\n }\r\n if (config.maxLength !== undefined && str.length > config.maxLength) {\r\n this.elementError('MAX_LENGTH', `must be at most ${config.maxLength} characters`, index, { max: config.maxLength });\r\n }\r\n if (config.pattern && !config.pattern.test(str)) {\r\n this.elementError('PATTERN_MISMATCH', 'does not match required pattern', index);\r\n }\r\n if (config.email && !EMAIL_REGEX.test(str)) {\r\n this.elementError('INVALID_EMAIL', 'must be a valid email', index);\r\n }\r\n if (config.url && !URL_REGEX.test(str)) {\r\n this.elementError('INVALID_URL', 'must be a valid URL', index);\r\n }\r\n }\r\n\r\n return str;\r\n };\r\n return this as unknown as ValidArray<string, ArrayNullability<string, N>>;\r\n }\r\n\r\n ofBooleans(): ValidArray<boolean, ArrayNullability<boolean, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (typeof val === 'boolean') {\r\n return val;\r\n }\r\n if (val === 'true' || val === 1) {\r\n return true;\r\n }\r\n if (val === 'false' || val === 0) {\r\n return false;\r\n }\r\n this.elementError('INVALID_TYPE', 'must be a boolean', index, { expected: 'boolean' });\r\n };\r\n return this as unknown as ValidArray<boolean, ArrayNullability<boolean, N>>;\r\n }\r\n\r\n ofObjects<O>(validator: ObjectArrayValidator<O>): ValidArray<O, ArrayNullability<O, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (val === null || typeof val !== 'object' || Array.isArray(val)) {\r\n this.elementError('INVALID_TYPE', 'must be an object', index, { expected: 'object' });\r\n }\r\n\r\n try {\r\n return validator(val as Record<string, unknown>, index);\r\n } catch (e) {\r\n if (e instanceof ArgError) {\r\n // Re-throw with nested field path including index\r\n throw new ArgError(\r\n `${this._name}[${index}].${e.field}`,\r\n e.code,\r\n e.details,\r\n e.params\r\n );\r\n }\r\n throw e;\r\n }\r\n };\r\n return this as unknown as ValidArray<O, ArrayNullability<O, N>>;\r\n }\r\n\r\n get value(): N {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as N;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as N;\r\n }\r\n\r\n // CSV: split a string input into an array on the configured separator.\r\n // Filter empty segments so `?p=` becomes [] and trailing `,` is tolerated.\r\n if (this._csvSeparator !== undefined && typeof val === 'string') {\r\n val = val.split(this._csvSeparator).filter((s) => s !== '');\r\n }\r\n\r\n // Must be array\r\n if (!Array.isArray(val)) {\r\n this.error('INVALID_TYPE', 'must be an array', { expected: 'array' });\r\n }\r\n\r\n // Length validations\r\n if (this._minLength !== undefined && val.length < this._minLength) {\r\n this.error('ARRAY_MIN_LENGTH', `must have at least ${this._minLength} elements`, { min: this._minLength });\r\n }\r\n\r\n if (this._maxLength !== undefined && val.length > this._maxLength) {\r\n this.error('ARRAY_MAX_LENGTH', `must have at most ${this._maxLength} elements`, { max: this._maxLength });\r\n }\r\n\r\n // Validate elements\r\n if (this._elementValidator) {\r\n const validated = val.map((item, index) => this._elementValidator!(item, index));\r\n return validated as N;\r\n }\r\n\r\n return val as N;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\n\r\nexport default class ValidDate<T = Date | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: Date | undefined;\r\n private _min: Date | undefined;\r\n private _max: Date | undefined;\r\n private _isPast = false;\r\n private _isFuture = false;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n get required(): ValidDate<Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidDate<Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidDate<T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidDate<T | null>;\r\n }\r\n\r\n default(v: Date): ValidDate<Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidDate<Exclude<T, undefined>>;\r\n }\r\n\r\n min(date: Date): this {\r\n this._min = date;\r\n return this;\r\n }\r\n\r\n max(date: Date): this {\r\n this._max = date;\r\n return this;\r\n }\r\n\r\n get past(): this {\r\n this._isPast = true;\r\n return this;\r\n }\r\n\r\n get future(): this {\r\n this._isFuture = true;\r\n return this;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Parse date\r\n let date: Date;\r\n if (val instanceof Date) {\r\n date = val;\r\n } else if (typeof val === 'string' || typeof val === 'number') {\r\n date = new Date(val);\r\n } else {\r\n this.error('INVALID_TYPE', 'must be a date', { expected: 'date' });\r\n }\r\n\r\n if (isNaN(date.getTime())) {\r\n this.error('INVALID_DATE', 'must be a valid date');\r\n }\r\n\r\n const now = new Date();\r\n\r\n // Validations\r\n if (this._isPast && date >= now) {\r\n this.error('DATE_NOT_PAST', 'must be in the past');\r\n }\r\n\r\n if (this._isFuture && date <= now) {\r\n this.error('DATE_NOT_FUTURE', 'must be in the future');\r\n }\r\n\r\n if (this._min !== undefined && date < this._min) {\r\n this.error('DATE_MIN', `must be after ${this._min.toISOString()}`, { min: this._min.toISOString() });\r\n }\r\n\r\n if (this._max !== undefined && date > this._max) {\r\n this.error('DATE_MAX', `must be before ${this._max.toISOString()}`, { max: this._max.toISOString() });\r\n }\r\n\r\n return date as T;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\n\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nfunction isRealCalendarDate(yyyy_mm_dd: string): boolean {\n const parts = yyyy_mm_dd.split('-').map(Number);\n const y = parts[0]!;\n const m = parts[1]!;\n const d = parts[2]!;\n const dt = new Date(Date.UTC(y, m - 1, d));\n return dt.getUTCFullYear() === y && dt.getUTCMonth() === m - 1 && dt.getUTCDate() === d;\n}\n\nfunction todayIsoDate(): string {\n const d = new Date();\n return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, '0')}-${String(d.getUTCDate()).padStart(2, '0')}`;\n}\n\n// Jour calendaire pur (YYYY-MM-DD) \u2014 retourne une string, jamais un Date,\n// pour \u00E9viter toute interpr\u00E9tation de fuseau. Les bornes/comparaisons utilisent\n// l'ordre lexicographique qui co\u00EFncide avec l'ordre chronologique pour ISO 8601.\nexport default class ValidIsoDate<T = string | undefined> {\n private _value: unknown;\n private _name: string;\n private _isRequired = false;\n private _isNullable = false;\n private _default: string | undefined;\n private _min: string | undefined;\n private _max: string | undefined;\n private _isPast = false;\n private _isFuture = false;\n\n constructor(value: unknown, name: string) {\n this._value = value;\n this._name = name;\n }\n\n private error(code: string, details: string, params: ErrorParams = {}): never {\n throw new ArgError(`${this._name}`, code, details, params);\n }\n\n get required(): ValidIsoDate<Exclude<T, undefined>> {\n this._isRequired = true;\n return this as unknown as ValidIsoDate<Exclude<T, undefined>>;\n }\n\n get nullable(): ValidIsoDate<T | null> {\n this._isNullable = true;\n return this as unknown as ValidIsoDate<T | null>;\n }\n\n default(v: string): ValidIsoDate<Exclude<T, undefined>> {\n this._default = v;\n return this as unknown as ValidIsoDate<Exclude<T, undefined>>;\n }\n\n min(date: string): this {\n this._min = date;\n return this;\n }\n\n max(date: string): this {\n this._max = date;\n return this;\n }\n\n get past(): this {\n this._isPast = true;\n return this;\n }\n\n get future(): this {\n this._isFuture = true;\n return this;\n }\n\n get value(): T {\n let val = this._value;\n\n // Apply default if undefined\n if (val === undefined && this._default !== undefined) {\n val = this._default;\n }\n\n // Check undefined\n if (val === undefined) {\n if (this._isRequired) {\n this.error('REQUIRED', 'is required');\n }\n return undefined as T;\n }\n\n // Check null\n if (val === null) {\n if (!this._isNullable) {\n this.error('NOT_NULLABLE', 'cannot be null');\n }\n return null as T;\n }\n\n if (typeof val !== 'string') {\n this.error('INVALID_TYPE', 'must be a string YYYY-MM-DD', { expected: 'iso-date' });\n }\n\n const s = (val as string).trim();\n if (!ISO_DATE_RE.test(s)) {\n this.error('INVALID_ISO_DATE', 'must match YYYY-MM-DD');\n }\n if (!isRealCalendarDate(s)) {\n this.error('INVALID_DATE', 'is not a valid calendar date');\n }\n\n const today = todayIsoDate();\n\n if (this._isPast && !(s < today)) {\n this.error('DATE_NOT_PAST', 'must be in the past');\n }\n\n if (this._isFuture && !(s > today)) {\n this.error('DATE_NOT_FUTURE', 'must be in the future');\n }\n\n if (this._min !== undefined && s < this._min) {\n this.error('DATE_MIN', `must be on or after ${this._min}`, { min: this._min });\n }\n\n if (this._max !== undefined && s > this._max) {\n this.error('DATE_MAX', `must be on or before ${this._max}`, { max: this._max });\n }\n\n return s as T;\n }\n}\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\n\n// Accepte secondes optionnelles ; normalise vers HH:mm:ss.\nconst WALL_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?$/;\n\n// D\u00E9tecte un suffixe de fuseau interdit : Z, +hh:mm, -hh:mm.\nconst TZ_SUFFIX_RE = /(Z|[+-]\\d{2}:\\d{2})$/;\n\nfunction isRealCalendarDate(year: number, month: number, day: number): boolean {\n const dt = new Date(Date.UTC(year, month - 1, day));\n return dt.getUTCFullYear() === year && dt.getUTCMonth() === month - 1 && dt.getUTCDate() === day;\n}\n\n// Date+heure \"naive\" (sans fuseau) \u2014 YYYY-MM-DDTHH:mm[:ss]. Retourne une string\n// normalis\u00E9e en HH:mm:ss. Refuse explicitement tout suffixe de fuseau (Z ou\n// \u00B1hh:mm) : un wall time avec offset est s\u00E9mantiquement un instant et doit\n// passer par .date \u00E0 la place. Ordre lexicographique = chronologique.\nexport default class ValidWallTime<T = string | undefined> {\n private _value: unknown;\n private _name: string;\n private _isRequired = false;\n private _isNullable = false;\n private _default: string | undefined;\n private _min: string | undefined;\n private _max: string | undefined;\n\n constructor(value: unknown, name: string) {\n this._value = value;\n this._name = name;\n }\n\n private error(code: string, details: string, params: ErrorParams = {}): never {\n throw new ArgError(`${this._name}`, code, details, params);\n }\n\n get required(): ValidWallTime<Exclude<T, undefined>> {\n this._isRequired = true;\n return this as unknown as ValidWallTime<Exclude<T, undefined>>;\n }\n\n get nullable(): ValidWallTime<T | null> {\n this._isNullable = true;\n return this as unknown as ValidWallTime<T | null>;\n }\n\n default(v: string): ValidWallTime<Exclude<T, undefined>> {\n this._default = v;\n return this as unknown as ValidWallTime<Exclude<T, undefined>>;\n }\n\n min(t: string): this {\n this._min = t;\n return this;\n }\n\n max(t: string): this {\n this._max = t;\n return this;\n }\n\n get value(): T {\n let val = this._value;\n\n if (val === undefined && this._default !== undefined) {\n val = this._default;\n }\n\n if (val === undefined) {\n if (this._isRequired) {\n this.error('REQUIRED', 'is required');\n }\n return undefined as T;\n }\n\n if (val === null) {\n if (!this._isNullable) {\n this.error('NOT_NULLABLE', 'cannot be null');\n }\n return null as T;\n }\n\n if (typeof val !== 'string') {\n this.error('INVALID_TYPE', 'must be a string YYYY-MM-DDTHH:mm[:ss]', { expected: 'wall-time' });\n }\n\n const s = (val as string).trim();\n\n if (TZ_SUFFIX_RE.test(s)) {\n this.error('WALL_TIME_HAS_OFFSET', 'must not include a timezone offset (Z or \u00B1hh:mm)');\n }\n\n const m = WALL_TIME_RE.exec(s);\n if (!m) {\n this.error('INVALID_WALL_TIME', 'must match YYYY-MM-DDTHH:mm[:ss]');\n }\n\n const ymd = m[1]!;\n const hhStr = m[2]!;\n const mmStr = m[3]!;\n const ssStr = m[4];\n const parts = ymd.split('-').map(Number);\n const year = parts[0]!;\n const month = parts[1]!;\n const day = parts[2]!;\n const hh = Number(hhStr);\n const mm = Number(mmStr);\n const ss = ssStr !== undefined ? Number(ssStr) : 0;\n\n if (hh > 23 || mm > 59 || ss > 59 || !isRealCalendarDate(year, month, day)) {\n this.error('INVALID_DATE', 'is not a valid calendar date/time');\n }\n\n // Normalise : toujours HH:mm:ss en sortie.\n const normalized = `${ymd}T${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}`;\n\n if (this._min !== undefined && normalized < this._min) {\n this.error('WALL_TIME_MIN', `must be on or after ${this._min}`, { min: this._min });\n }\n\n if (this._max !== undefined && normalized > this._max) {\n this.error('WALL_TIME_MAX', `must be on or before ${this._max}`, { max: this._max });\n }\n\n return normalized as T;\n }\n}\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\r\n\r\nexport default class ValidEnum<V extends string | number, T = V | undefined> {\r\n private _value: unknown;\r\n private _name: string;\r\n private _allowedValues: V[];\r\n private _isRequired = false;\r\n private _isNullable = false;\r\n private _default: V | undefined;\r\n\r\n constructor(value: unknown, name: string, allowedValues: V[]) {\r\n this._value = value;\r\n this._name = name;\r\n this._allowedValues = allowedValues;\r\n }\r\n\r\n private error(code: string, details: string, params: ErrorParams = {}): never {\r\n throw new ArgError(`${this._name}`, code, details, params);\r\n }\r\n\r\n get required(): ValidEnum<V, Exclude<T, undefined>> {\r\n this._isRequired = true;\r\n return this as unknown as ValidEnum<V, Exclude<T, undefined>>;\r\n }\r\n\r\n get nullable(): ValidEnum<V, T | null> {\r\n this._isNullable = true;\r\n return this as unknown as ValidEnum<V, T | null>;\r\n }\r\n\r\n default(v: V): ValidEnum<V, Exclude<T, undefined>> {\r\n this._default = v;\r\n return this as unknown as ValidEnum<V, Exclude<T, undefined>>;\r\n }\r\n\r\n get value(): T {\r\n let val = this._value;\r\n\r\n // Apply default if undefined\r\n if (val === undefined && this._default !== undefined) {\r\n val = this._default;\r\n }\r\n\r\n // Check undefined\r\n if (val === undefined) {\r\n if (this._isRequired) {\r\n this.error('REQUIRED', 'is required');\r\n }\r\n return undefined as T;\r\n }\r\n\r\n // Check null\r\n if (val === null) {\r\n if (!this._isNullable) {\r\n this.error('NOT_NULLABLE', 'cannot be null');\r\n }\r\n return null as T;\r\n }\r\n\r\n // Check if value is in allowed values\r\n if (!this._allowedValues.includes(val as V)) {\r\n this.error('NOT_IN_LIST', `must be one of: ${this._allowedValues.join(', ')}`, { allowed: this._allowedValues });\r\n }\r\n\r\n return val as T;\r\n }\r\n}\r\n", "import ArgError, { type ErrorParams } from \"./arg-error\";\n\nexport type ObjectValidator<T> = (obj: Record<string, unknown>) => T;\n\nexport default class ValidObject<T, N = T | undefined> {\n private _value: unknown;\n private _name: string;\n private _validator: ObjectValidator<T>;\n private _isRequired = false;\n private _isNullable = false;\n private _default: T | undefined;\n\n constructor(value: unknown, name: string, validator: ObjectValidator<T>) {\n this._value = value;\n this._name = name;\n this._validator = validator;\n }\n\n private error(code: string, details: string, params: ErrorParams = {}): never {\n throw new ArgError(`${this._name}`, code, details, params);\n }\n\n get required(): ValidObject<T, Exclude<N, undefined>> {\n this._isRequired = true;\n return this as unknown as ValidObject<T, Exclude<N, undefined>>;\n }\n\n get nullable(): ValidObject<T, N | null> {\n this._isNullable = true;\n return this as unknown as ValidObject<T, N | null>;\n }\n\n default(v: T): ValidObject<T, Exclude<N, undefined>> {\n this._default = v;\n return this as unknown as ValidObject<T, Exclude<N, undefined>>;\n }\n\n get value(): N {\n let val = this._value;\n\n // Apply default if undefined\n if (val === undefined && this._default !== undefined) {\n val = this._default;\n }\n\n // Check undefined\n if (val === undefined) {\n if (this._isRequired) {\n this.error('REQUIRED', 'is required');\n }\n return undefined as N;\n }\n\n // Check null\n if (val === null) {\n if (!this._isNullable) {\n this.error('NOT_NULLABLE', 'cannot be null');\n }\n return null as N;\n }\n\n // Must be object (not array, not null)\n if (typeof val !== 'object' || Array.isArray(val)) {\n this.error('INVALID_TYPE', 'must be an object', { expected: 'object' });\n }\n\n // Run custom validator\n try {\n const validated = this._validator(val as Record<string, unknown>);\n return validated as unknown as N;\n } catch (e) {\n if (e instanceof ArgError) {\n // Re-throw with nested field path\n throw new ArgError(\n `${this._name}.${e.field}`,\n e.code,\n e.details,\n e.params\n );\n }\n throw e;\n }\n }\n}\n", "import ValidNumber from \"./valid-number\";\r\nimport ValidString from \"./valid-string\";\r\nimport ValidBoolean from \"./valid-boolean\";\r\nimport ValidArray from \"./valid-array\";\r\nimport ValidDate from \"./valid-date\";\r\nimport ValidIsoDate from \"./valid-iso-date\";\r\nimport ValidWallTime from \"./valid-wall-time\";\r\nimport ValidEnum from \"./valid-enum\";\r\nimport ValidObject, { type ObjectValidator } from \"./valid-object\";\r\n\r\nexport default class ValidBase {\r\n private _value: unknown;\r\n private _name: string;\r\n\r\n constructor(value: unknown, name: string) {\r\n this._value = value;\r\n this._name = name;\r\n }\r\n\r\n get number(): ValidNumber {\r\n return new ValidNumber(this._value, this._name);\r\n }\r\n\r\n get string(): ValidString {\r\n return new ValidString(this._value, this._name);\r\n }\r\n\r\n get boolean(): ValidBoolean {\r\n return new ValidBoolean(this._value, this._name);\r\n }\r\n\r\n get array(): ValidArray {\r\n return new ValidArray(this._value, this._name);\r\n }\r\n\r\n get date(): ValidDate {\r\n return new ValidDate(this._value, this._name);\r\n }\r\n\r\n get isoDate(): ValidIsoDate {\r\n return new ValidIsoDate(this._value, this._name);\r\n }\r\n\r\n get wallTime(): ValidWallTime {\r\n return new ValidWallTime(this._value, this._name);\r\n }\r\n\r\n enum<V extends string | number>(allowedValues: V[]): ValidEnum<V> {\r\n return new ValidEnum<V>(this._value, this._name, allowedValues);\r\n }\r\n\r\n object<T>(validator: ObjectValidator<T>): ValidObject<T> {\r\n return new ValidObject<T>(this._value, this._name, validator);\r\n }\r\n}\r\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { Request, Response, NextFunction } from \"express\";\n\nexport interface RequestContext {\n body: unknown;\n params: Record<string, unknown>;\n query: Record<string, unknown>;\n}\n\nexport const requestStorage = new AsyncLocalStorage<RequestContext>();\n\nexport function getContext(): RequestContext {\n const ctx = requestStorage.getStore();\n if (!ctx) {\n throw new Error('body/params must be called inside validMiddleware context');\n }\n return ctx;\n}\n\nexport function validMiddleware(req: Request, _res: Response, next: NextFunction): void {\n const context: RequestContext = {\n body: req.body,\n params: req.params as Record<string, unknown>,\n query: req.query as Record<string, unknown>,\n };\n\n requestStorage.run(context, next);\n}\n\n", "import { ErrorRequestHandler } from \"express\";\r\nimport ArgError from \"./arg-error\";\r\n\r\nconst validErrorHandler: ErrorRequestHandler = (error, req, res, next) => {\r\n if (error instanceof ArgError) {\r\n res.status(400).json({\r\n error: error.message,\r\n code: 400,\r\n errorCode: error.code,\r\n params: error.params,\r\n field: error.field,\r\n url: req.originalUrl,\r\n message: error.msg\r\n });\r\n } else {\r\n next(error);\r\n }\r\n};\r\n\r\nexport default validErrorHandler;", "import { Router, Request, Response, NextFunction, RequestHandler } from 'express';\nimport { requestStorage, RequestContext } from './middleware';\n\ntype JsonHandler = (req: Request, res: Response) => unknown | Promise<unknown>;\ntype Middleware = RequestHandler;\n\nexport interface JsonRouter {\n get: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n post: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n put: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n patch: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n delete: (path: string, handler: JsonHandler, ...middlewares: Middleware[]) => JsonRouter;\n router: Router;\n}\n\nfunction wrapHandler(handler: JsonHandler) {\n return async (req: Request, res: Response, next: NextFunction) => {\n // Cr\u00E9er le contexte ici, quand les params sont disponibles\n const context: RequestContext = {\n body: req.body,\n params: req.params as Record<string, unknown>,\n query: req.query as Record<string, unknown>,\n };\n\n requestStorage.run(context, async () => {\n try {\n const result = await handler(req, res);\n\n if (res.headersSent) {\n return;\n }\n\n if (result === undefined || result === null) {\n res.status(204).end();\n } else {\n res.json(result);\n }\n } catch (error) {\n next(error);\n }\n });\n };\n}\n\nexport function createJsonRouter(): JsonRouter {\n const expressRouter = Router();\n\n const jsonRouter: JsonRouter = {\n router: expressRouter,\n get: (path, handler, ...middlewares) => {\n expressRouter.get(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n post: (path, handler, ...middlewares) => {\n expressRouter.post(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n put: (path, handler, ...middlewares) => {\n expressRouter.put(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n patch: (path, handler, ...middlewares) => {\n expressRouter.patch(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n delete: (path, handler, ...middlewares) => {\n expressRouter.delete(path, ...middlewares, wrapHandler(handler));\n return jsonRouter;\n },\n };\n\n return jsonRouter;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIA,IAAqB,WAArB,cAAsC,MAAM;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,OAAe,MAAc,SAAiBA,UAAsB,CAAC,GAAG;AAChF,UAAM,GAAG,KAAK,IAAI,OAAO,EAAE;AAC3B,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAASA;AAAA,EAClB;AAAA,EAEA,IAAI,MAAc;AACd,WAAO,KAAK;AAAA,EAChB;AACJ;;;ACnBA,IAAqB,cAArB,MAAyD;AAAA,EAC7C;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EAER,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEQ,MAAM,MAAc,SAAiBC,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,WAA+C;AAC/C,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAkC;AAClC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAA+C;AACnD,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,GAAiB;AACjB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,GAAiB;AACjB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,UAAgB;AAChB,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAiB;AACjB,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAiB;AACjB,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,KAAa,KAAmB;AACpC,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,QAAwB;AAC1B,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAGA,QAAI;AACJ,QAAI,OAAO,QAAQ,UAAU;AACzB,YAAM;AAAA,IACV,WAAW,OAAO,QAAQ,UAAU;AAChC,YAAM,WAAW,GAAG;AAAA,IACxB,OAAO;AACH,WAAK,MAAM,gBAAgB,oBAAoB,EAAE,UAAU,SAAS,CAAC;AAAA,IACzE;AAEA,QAAI,MAAM,GAAG,GAAG;AACZ,WAAK,MAAM,kBAAkB,wBAAwB;AAAA,IACzD;AAGA,QAAI,KAAK,cAAc,CAAC,OAAO,UAAU,GAAG,GAAG;AAC3C,WAAK,MAAM,eAAe,oBAAoB;AAAA,IAClD;AAEA,QAAI,KAAK,eAAe,OAAO,GAAG;AAC9B,WAAK,MAAM,gBAAgB,kBAAkB;AAAA,IACjD;AAEA,QAAI,KAAK,eAAe,OAAO,GAAG;AAC9B,WAAK,MAAM,gBAAgB,kBAAkB;AAAA,IACjD;AAEA,QAAI,KAAK,SAAS,UAAa,MAAM,KAAK,MAAM;AAC5C,WAAK,MAAM,aAAa,oBAAoB,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC;AAAA,IAC/E;AAEA,QAAI,KAAK,SAAS,UAAa,MAAM,KAAK,MAAM;AAC5C,WAAK,MAAM,aAAa,mBAAmB,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC;AAAA,IAC9E;AAEA,QAAI,KAAK,WAAW,UAAa,CAAC,KAAK,OAAO,SAAS,GAAG,GAAG;AACzD,WAAK,MAAM,eAAe,mBAAmB,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;AAAA,IACnG;AAEA,WAAO;AAAA,EACX;AACJ;;;AC1IA,IAAM,cAAc;AACpB,IAAM,YAAY;AAElB,IAAqB,cAArB,MAAyD;AAAA,EAC7C;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf;AAAA,EAER,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEQ,MAAM,MAAc,SAAiBC,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,WAA+C;AAC/C,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAkC;AAClC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAA+C;AACnD,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,GAAiB;AACvB,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,GAAiB;AACvB,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,OAAqB;AACzB,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAc;AACd,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,MAAY;AACZ,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,OAAa;AACb,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,YAAkB;AAClB,SAAK,eAAe;AACpB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,YAAkB;AAClB,SAAK,eAAe;AACpB,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,QAAwB;AAC1B,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAGA,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,MAAM,gBAAgB,oBAAoB,EAAE,UAAU,SAAS,CAAC;AAAA,IACzE;AAEA,QAAI,MAAM;AAGV,QAAI,KAAK,aAAa;AAClB,YAAM,IAAI,KAAK;AAAA,IACnB;AAEA,QAAI,KAAK,cAAc;AACnB,YAAM,IAAI,YAAY;AAAA,IAC1B;AAEA,QAAI,KAAK,cAAc;AACnB,YAAM,IAAI,YAAY;AAAA,IAC1B;AAGA,QAAI,KAAK,eAAe,UAAa,IAAI,SAAS,KAAK,YAAY;AAC/D,WAAK,MAAM,cAAc,oBAAoB,KAAK,UAAU,eAAe,EAAE,KAAK,KAAK,WAAW,CAAC;AAAA,IACvG;AAEA,QAAI,KAAK,eAAe,UAAa,IAAI,SAAS,KAAK,YAAY;AAC/D,WAAK,MAAM,cAAc,mBAAmB,KAAK,UAAU,eAAe,EAAE,KAAK,KAAK,WAAW,CAAC;AAAA,IACtG;AAEA,QAAI,KAAK,aAAa,UAAa,CAAC,KAAK,SAAS,KAAK,GAAG,GAAG;AACzD,WAAK,MAAM,oBAAoB,iCAAiC;AAAA,IACpE;AAEA,QAAI,KAAK,YAAY,CAAC,YAAY,KAAK,GAAG,GAAG;AACzC,WAAK,MAAM,iBAAiB,uBAAuB;AAAA,IACvD;AAEA,QAAI,KAAK,UAAU,CAAC,UAAU,KAAK,GAAG,GAAG;AACrC,WAAK,MAAM,eAAe,qBAAqB;AAAA,IACnD;AAEA,QAAI,KAAK,WAAW,UAAa,CAAC,KAAK,OAAO,SAAS,GAAG,GAAG;AACzD,WAAK,MAAM,eAAe,mBAAmB,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;AAAA,IACnG;AAEA,WAAO;AAAA,EACX;AACJ;;;AC/JA,IAAqB,eAArB,MAA2D;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EAER,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEQ,MAAM,MAAc,SAAwB;AAChD,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,OAAO;AAAA,EACrD;AAAA,EAEA,IAAI,WAAgD;AAChD,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAmC;AACnC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAAiD;AACrD,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAGA,QAAI;AACJ,QAAI,OAAO,QAAQ,WAAW;AAC1B,aAAO;AAAA,IACX,WAAW,QAAQ,UAAU,QAAQ,GAAG;AACpC,aAAO;AAAA,IACX,WAAW,QAAQ,WAAW,QAAQ,GAAG;AACrC,aAAO;AAAA,IACX,OAAO;AACH,WAAK,MAAM,gBAAgB,mBAAmB;AAAA,IAClD;AAEA,WAAO;AAAA,EACX;AACJ;;;AClEA,IAAMC,eAAc;AACpB,IAAMC,aAAY;AAQlB,IAAqB,aAArB,MAAkE;AAAA,EACtD;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEQ,MAAM,MAAc,SAAiBC,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEQ,aAAa,MAAc,SAAiB,OAAeA,UAAsB,CAAC,GAAU;AAChG,UAAM,IAAI;AAAA,MACN,GAAG,KAAK,KAAK;AAAA,MACb;AAAA,MACA,oBAAoB,KAAK,IAAI,OAAO;AAAA,MACpC,EAAE,OAAO,MAAM,GAAGA,QAAO;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEA,IAAI,WAAiD;AACjD,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAoC;AACpC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAA8C;AAClD,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,GAAiB;AACvB,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,GAAiB;AACvB,SAAK,aAAa;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,YAAoB,KAAW;AAC/B,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,QAA6E;AACnF,SAAK,oBAAoB,CAAC,KAAc,UAAkB;AACtD,UAAI;AACJ,UAAI,OAAO,QAAQ,UAAU;AACzB,cAAM;AAAA,MACV,WAAW,OAAO,QAAQ,UAAU;AAChC,cAAM,WAAW,GAAG;AAAA,MACxB,OAAO;AACH,aAAK,aAAa,gBAAgB,oBAAoB,OAAO,EAAE,UAAU,SAAS,CAAC;AAAA,MACvF;AAEA,UAAI,MAAM,GAAG,GAAG;AACZ,aAAK,aAAa,kBAAkB,0BAA0B,KAAK;AAAA,MACvE;AAEA,UAAI,QAAQ;AACR,YAAI,OAAO,WAAW,CAAC,OAAO,UAAU,GAAG,GAAG;AAC1C,eAAK,aAAa,eAAe,sBAAsB,KAAK;AAAA,QAChE;AACA,YAAI,OAAO,YAAY,OAAO,GAAG;AAC7B,eAAK,aAAa,gBAAgB,oBAAoB,KAAK;AAAA,QAC/D;AACA,YAAI,OAAO,YAAY,OAAO,GAAG;AAC7B,eAAK,aAAa,gBAAgB,oBAAoB,KAAK;AAAA,QAC/D;AACA,YAAI,OAAO,QAAQ,UAAa,MAAM,OAAO,KAAK;AAC9C,eAAK,aAAa,aAAa,oBAAoB,OAAO,GAAG,IAAI,OAAO,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA,QAC/F;AACA,YAAI,OAAO,QAAQ,UAAa,MAAM,OAAO,KAAK;AAC9C,eAAK,aAAa,aAAa,mBAAmB,OAAO,GAAG,IAAI,OAAO,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA,QAC9F;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,QAA6E;AACnF,SAAK,oBAAoB,CAAC,KAAc,UAAkB;AACtD,UAAI,OAAO,QAAQ,UAAU;AACzB,aAAK,aAAa,gBAAgB,oBAAoB,OAAO,EAAE,UAAU,SAAS,CAAC;AAAA,MACvF;AAEA,UAAI,MAAM;AAEV,UAAI,QAAQ;AACR,YAAI,OAAO,MAAM;AACb,gBAAM,IAAI,KAAK;AAAA,QACnB;AACA,YAAI,OAAO,cAAc,UAAa,IAAI,SAAS,OAAO,WAAW;AACjE,eAAK,aAAa,cAAc,oBAAoB,OAAO,SAAS,eAAe,OAAO,EAAE,KAAK,OAAO,UAAU,CAAC;AAAA,QACvH;AACA,YAAI,OAAO,cAAc,UAAa,IAAI,SAAS,OAAO,WAAW;AACjE,eAAK,aAAa,cAAc,mBAAmB,OAAO,SAAS,eAAe,OAAO,EAAE,KAAK,OAAO,UAAU,CAAC;AAAA,QACtH;AACA,YAAI,OAAO,WAAW,CAAC,OAAO,QAAQ,KAAK,GAAG,GAAG;AAC7C,eAAK,aAAa,oBAAoB,mCAAmC,KAAK;AAAA,QAClF;AACA,YAAI,OAAO,SAAS,CAACF,aAAY,KAAK,GAAG,GAAG;AACxC,eAAK,aAAa,iBAAiB,yBAAyB,KAAK;AAAA,QACrE;AACA,YAAI,OAAO,OAAO,CAACC,WAAU,KAAK,GAAG,GAAG;AACpC,eAAK,aAAa,eAAe,uBAAuB,KAAK;AAAA,QACjE;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EAEA,aAAgE;AAC5D,SAAK,oBAAoB,CAAC,KAAc,UAAkB;AACtD,UAAI,OAAO,QAAQ,WAAW;AAC1B,eAAO;AAAA,MACX;AACA,UAAI,QAAQ,UAAU,QAAQ,GAAG;AAC7B,eAAO;AAAA,MACX;AACA,UAAI,QAAQ,WAAW,QAAQ,GAAG;AAC9B,eAAO;AAAA,MACX;AACA,WAAK,aAAa,gBAAgB,qBAAqB,OAAO,EAAE,UAAU,UAAU,CAAC;AAAA,IACzF;AACA,WAAO;AAAA,EACX;AAAA,EAEA,UAAa,WAA2E;AACpF,SAAK,oBAAoB,CAAC,KAAc,UAAkB;AACtD,UAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AAC/D,aAAK,aAAa,gBAAgB,qBAAqB,OAAO,EAAE,UAAU,SAAS,CAAC;AAAA,MACxF;AAEA,UAAI;AACA,eAAO,UAAU,KAAgC,KAAK;AAAA,MAC1D,SAAS,GAAG;AACR,YAAI,aAAa,UAAU;AAEvB,gBAAM,IAAI;AAAA,YACN,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,KAAK;AAAA,YAClC,EAAE;AAAA,YACF,EAAE;AAAA,YACF,EAAE;AAAA,UACN;AAAA,QACJ;AACA,cAAM;AAAA,MACV;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAIA,QAAI,KAAK,kBAAkB,UAAa,OAAO,QAAQ,UAAU;AAC7D,YAAM,IAAI,MAAM,KAAK,aAAa,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,IAC9D;AAGA,QAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACrB,WAAK,MAAM,gBAAgB,oBAAoB,EAAE,UAAU,QAAQ,CAAC;AAAA,IACxE;AAGA,QAAI,KAAK,eAAe,UAAa,IAAI,SAAS,KAAK,YAAY;AAC/D,WAAK,MAAM,oBAAoB,sBAAsB,KAAK,UAAU,aAAa,EAAE,KAAK,KAAK,WAAW,CAAC;AAAA,IAC7G;AAEA,QAAI,KAAK,eAAe,UAAa,IAAI,SAAS,KAAK,YAAY;AAC/D,WAAK,MAAM,oBAAoB,qBAAqB,KAAK,UAAU,aAAa,EAAE,KAAK,KAAK,WAAW,CAAC;AAAA,IAC5G;AAGA,QAAI,KAAK,mBAAmB;AACxB,YAAM,YAAY,IAAI,IAAI,CAAC,MAAM,UAAU,KAAK,kBAAmB,MAAM,KAAK,CAAC;AAC/E,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AACJ;;;AC3OA,IAAqB,YAArB,MAAqD;AAAA,EACzC;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EAEpB,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEQ,MAAM,MAAc,SAAiBE,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,WAA6C;AAC7C,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAgC;AAChC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAA2C;AAC/C,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,MAAkB;AAClB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,MAAkB;AAClB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,OAAa;AACb,SAAK,UAAU;AACf,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,SAAe;AACf,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAGA,QAAI;AACJ,QAAI,eAAe,MAAM;AACrB,aAAO;AAAA,IACX,WAAW,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAAU;AAC3D,aAAO,IAAI,KAAK,GAAG;AAAA,IACvB,OAAO;AACH,WAAK,MAAM,gBAAgB,kBAAkB,EAAE,UAAU,OAAO,CAAC;AAAA,IACrE;AAEA,QAAI,MAAM,KAAK,QAAQ,CAAC,GAAG;AACvB,WAAK,MAAM,gBAAgB,sBAAsB;AAAA,IACrD;AAEA,UAAM,MAAM,oBAAI,KAAK;AAGrB,QAAI,KAAK,WAAW,QAAQ,KAAK;AAC7B,WAAK,MAAM,iBAAiB,qBAAqB;AAAA,IACrD;AAEA,QAAI,KAAK,aAAa,QAAQ,KAAK;AAC/B,WAAK,MAAM,mBAAmB,uBAAuB;AAAA,IACzD;AAEA,QAAI,KAAK,SAAS,UAAa,OAAO,KAAK,MAAM;AAC7C,WAAK,MAAM,YAAY,iBAAiB,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,YAAY,EAAE,CAAC;AAAA,IACvG;AAEA,QAAI,KAAK,SAAS,UAAa,OAAO,KAAK,MAAM;AAC7C,WAAK,MAAM,YAAY,kBAAkB,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,YAAY,EAAE,CAAC;AAAA,IACxG;AAEA,WAAO;AAAA,EACX;AACJ;;;AClHA,IAAM,cAAc;AAEpB,SAAS,mBAAmB,YAA6B;AACrD,QAAM,QAAQ,WAAW,MAAM,GAAG,EAAE,IAAI,MAAM;AAC9C,QAAM,IAAI,MAAM,CAAC;AACjB,QAAM,IAAI,MAAM,CAAC;AACjB,QAAM,IAAI,MAAM,CAAC;AACjB,QAAM,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;AACzC,SAAO,GAAG,eAAe,MAAM,KAAK,GAAG,YAAY,MAAM,IAAI,KAAK,GAAG,WAAW,MAAM;AAC1F;AAEA,SAAS,eAAuB;AAC5B,QAAM,IAAI,oBAAI,KAAK;AACnB,SAAO,GAAG,EAAE,eAAe,CAAC,IAAI,OAAO,EAAE,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAC3H;AAKA,IAAqB,eAArB,MAA0D;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EAEpB,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEQ,MAAM,MAAc,SAAiBC,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,WAAgD;AAChD,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAmC;AACnC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAAgD;AACpD,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,MAAoB;AACpB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,MAAoB;AACpB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,OAAa;AACb,SAAK,UAAU;AACf,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,SAAe;AACf,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAEA,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,MAAM,gBAAgB,+BAA+B,EAAE,UAAU,WAAW,CAAC;AAAA,IACtF;AAEA,UAAM,IAAK,IAAe,KAAK;AAC/B,QAAI,CAAC,YAAY,KAAK,CAAC,GAAG;AACtB,WAAK,MAAM,oBAAoB,uBAAuB;AAAA,IAC1D;AACA,QAAI,CAAC,mBAAmB,CAAC,GAAG;AACxB,WAAK,MAAM,gBAAgB,8BAA8B;AAAA,IAC7D;AAEA,UAAM,QAAQ,aAAa;AAE3B,QAAI,KAAK,WAAW,EAAE,IAAI,QAAQ;AAC9B,WAAK,MAAM,iBAAiB,qBAAqB;AAAA,IACrD;AAEA,QAAI,KAAK,aAAa,EAAE,IAAI,QAAQ;AAChC,WAAK,MAAM,mBAAmB,uBAAuB;AAAA,IACzD;AAEA,QAAI,KAAK,SAAS,UAAa,IAAI,KAAK,MAAM;AAC1C,WAAK,MAAM,YAAY,uBAAuB,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC;AAAA,IACjF;AAEA,QAAI,KAAK,SAAS,UAAa,IAAI,KAAK,MAAM;AAC1C,WAAK,MAAM,YAAY,wBAAwB,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC;AAAA,IAClF;AAEA,WAAO;AAAA,EACX;AACJ;;;ACjIA,IAAM,eAAe;AAGrB,IAAM,eAAe;AAErB,SAASC,oBAAmB,MAAc,OAAe,KAAsB;AAC3E,QAAM,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;AAClD,SAAO,GAAG,eAAe,MAAM,QAAQ,GAAG,YAAY,MAAM,QAAQ,KAAK,GAAG,WAAW,MAAM;AACjG;AAMA,IAAqB,gBAArB,MAA2D;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEQ,MAAM,MAAc,SAAiBC,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,WAAiD;AACjD,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAoC;AACpC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAAiD;AACrD,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,GAAiB;AACjB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,GAAiB;AACjB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAEf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAEA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAEA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAEA,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,MAAM,gBAAgB,0CAA0C,EAAE,UAAU,YAAY,CAAC;AAAA,IAClG;AAEA,UAAM,IAAK,IAAe,KAAK;AAE/B,QAAI,aAAa,KAAK,CAAC,GAAG;AACtB,WAAK,MAAM,wBAAwB,qDAAkD;AAAA,IACzF;AAEA,UAAM,IAAI,aAAa,KAAK,CAAC;AAC7B,QAAI,CAAC,GAAG;AACJ,WAAK,MAAM,qBAAqB,kCAAkC;AAAA,IACtE;AAEA,UAAM,MAAM,EAAE,CAAC;AACf,UAAM,QAAQ,EAAE,CAAC;AACjB,UAAM,QAAQ,EAAE,CAAC;AACjB,UAAM,QAAQ,EAAE,CAAC;AACjB,UAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AACvC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,KAAK,OAAO,KAAK;AACvB,UAAM,KAAK,OAAO,KAAK;AACvB,UAAM,KAAK,UAAU,SAAY,OAAO,KAAK,IAAI;AAEjD,QAAI,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,CAACD,oBAAmB,MAAM,OAAO,GAAG,GAAG;AACxE,WAAK,MAAM,gBAAgB,mCAAmC;AAAA,IAClE;AAGA,UAAM,aAAa,GAAG,GAAG,IAAI,OAAO,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAEtH,QAAI,KAAK,SAAS,UAAa,aAAa,KAAK,MAAM;AACnD,WAAK,MAAM,iBAAiB,uBAAuB,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC;AAAA,IACtF;AAEA,QAAI,KAAK,SAAS,UAAa,aAAa,KAAK,MAAM;AACnD,WAAK,MAAM,iBAAiB,wBAAwB,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC;AAAA,IACvF;AAEA,WAAO;AAAA,EACX;AACJ;;;AC3HA,IAAqB,YAArB,MAA6E;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EAER,YAAY,OAAgB,MAAc,eAAoB;AAC1D,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,iBAAiB;AAAA,EAC1B;AAAA,EAEQ,MAAM,MAAc,SAAiBE,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,WAAgD;AAChD,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAmC;AACnC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAA2C;AAC/C,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAGA,QAAI,CAAC,KAAK,eAAe,SAAS,GAAQ,GAAG;AACzC,WAAK,MAAM,eAAe,mBAAmB,KAAK,eAAe,KAAK,IAAI,CAAC,IAAI,EAAE,SAAS,KAAK,eAAe,CAAC;AAAA,IACnH;AAEA,WAAO;AAAA,EACX;AACJ;;;AC9DA,IAAqB,cAArB,MAAuD;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EAER,YAAY,OAAgB,MAAc,WAA+B;AACrE,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,aAAa;AAAA,EACtB;AAAA,EAEQ,MAAM,MAAc,SAAiBC,UAAsB,CAAC,GAAU;AAC1E,UAAM,IAAI,SAAS,GAAG,KAAK,KAAK,IAAI,MAAM,SAASA,OAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,WAAkD;AAClD,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAqC;AACrC,SAAK,cAAc;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,GAA6C;AACjD,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAW;AACX,QAAI,MAAM,KAAK;AAGf,QAAI,QAAQ,UAAa,KAAK,aAAa,QAAW;AAClD,YAAM,KAAK;AAAA,IACf;AAGA,QAAI,QAAQ,QAAW;AACnB,UAAI,KAAK,aAAa;AAClB,aAAK,MAAM,YAAY,aAAa;AAAA,MACxC;AACA,aAAO;AAAA,IACX;AAGA,QAAI,QAAQ,MAAM;AACd,UAAI,CAAC,KAAK,aAAa;AACnB,aAAK,MAAM,gBAAgB,gBAAgB;AAAA,MAC/C;AACA,aAAO;AAAA,IACX;AAGA,QAAI,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AAC/C,WAAK,MAAM,gBAAgB,qBAAqB,EAAE,UAAU,SAAS,CAAC;AAAA,IAC1E;AAGA,QAAI;AACA,YAAM,YAAY,KAAK,WAAW,GAA8B;AAChE,aAAO;AAAA,IACX,SAAS,GAAG;AACR,UAAI,aAAa,UAAU;AAEvB,cAAM,IAAI;AAAA,UACN,GAAG,KAAK,KAAK,IAAI,EAAE,KAAK;AAAA,UACxB,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,QACN;AAAA,MACJ;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AACJ;;;ACzEA,IAAqB,YAArB,MAA+B;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YAAY,OAAgB,MAAc;AACtC,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAI,SAAsB;AACtB,WAAO,IAAI,YAAY,KAAK,QAAQ,KAAK,KAAK;AAAA,EAClD;AAAA,EAEA,IAAI,SAAsB;AACtB,WAAO,IAAI,YAAY,KAAK,QAAQ,KAAK,KAAK;AAAA,EAClD;AAAA,EAEA,IAAI,UAAwB;AACxB,WAAO,IAAI,aAAa,KAAK,QAAQ,KAAK,KAAK;AAAA,EACnD;AAAA,EAEA,IAAI,QAAoB;AACpB,WAAO,IAAI,WAAW,KAAK,QAAQ,KAAK,KAAK;AAAA,EACjD;AAAA,EAEA,IAAI,OAAkB;AAClB,WAAO,IAAI,UAAU,KAAK,QAAQ,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,IAAI,UAAwB;AACxB,WAAO,IAAI,aAAa,KAAK,QAAQ,KAAK,KAAK;AAAA,EACnD;AAAA,EAEA,IAAI,WAA0B;AAC1B,WAAO,IAAI,cAAc,KAAK,QAAQ,KAAK,KAAK;AAAA,EACpD;AAAA,EAEA,KAAgC,eAAkC;AAC9D,WAAO,IAAI,UAAa,KAAK,QAAQ,KAAK,OAAO,aAAa;AAAA,EAClE;AAAA,EAEA,OAAU,WAA+C;AACrD,WAAO,IAAI,YAAe,KAAK,QAAQ,KAAK,OAAO,SAAS;AAAA,EAChE;AACJ;;;ACtDA,8BAAkC;AAS3B,IAAM,iBAAiB,IAAI,0CAAkC;AAE7D,SAAS,aAA6B;AACzC,QAAM,MAAM,eAAe,SAAS;AACpC,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC/E;AACA,SAAO;AACX;AAEO,SAAS,gBAAgB,KAAc,MAAgB,MAA0B;AACpF,QAAM,UAA0B;AAAA,IAC5B,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI;AAAA,EACf;AAEA,iBAAe,IAAI,SAAS,IAAI;AACpC;;;ACxBA,IAAM,oBAAyC,CAAC,OAAO,KAAK,KAAK,SAAS;AACtE,MAAI,iBAAiB,UAAU;AAC3B,QAAI,OAAO,GAAG,EAAE,KAAK;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,MACb,KAAK,IAAI;AAAA,MACT,SAAS,MAAM;AAAA,IACnB,CAAC;AAAA,EACL,OAAO;AACH,SAAK,KAAK;AAAA,EACd;AACJ;AAEA,IAAO,8BAAQ;;;ACnBf,qBAAwE;AAexE,SAAS,YAAY,SAAsB;AACvC,SAAO,OAAO,KAAc,KAAe,SAAuB;AAE9D,UAAM,UAA0B;AAAA,MAC5B,MAAM,IAAI;AAAA,MACV,QAAQ,IAAI;AAAA,MACZ,OAAO,IAAI;AAAA,IACf;AAEA,mBAAe,IAAI,SAAS,YAAY;AACpC,UAAI;AACA,cAAM,SAAS,MAAM,QAAQ,KAAK,GAAG;AAErC,YAAI,IAAI,aAAa;AACjB;AAAA,QACJ;AAEA,YAAI,WAAW,UAAa,WAAW,MAAM;AACzC,cAAI,OAAO,GAAG,EAAE,IAAI;AAAA,QACxB,OAAO;AACH,cAAI,KAAK,MAAM;AAAA,QACnB;AAAA,MACJ,SAAS,OAAO;AACZ,aAAK,KAAK;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AAEO,SAAS,mBAA+B;AAC3C,QAAM,oBAAgB,uBAAO;AAE7B,QAAM,aAAyB;AAAA,IAC3B,QAAQ;AAAA,IACR,KAAK,CAAC,MAAM,YAAY,gBAAgB;AACpC,oBAAc,IAAI,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC;AAC5D,aAAO;AAAA,IACX;AAAA,IACA,MAAM,CAAC,MAAM,YAAY,gBAAgB;AACrC,oBAAc,KAAK,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC;AAC7D,aAAO;AAAA,IACX;AAAA,IACA,KAAK,CAAC,MAAM,YAAY,gBAAgB;AACpC,oBAAc,IAAI,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC;AAC5D,aAAO;AAAA,IACX;AAAA,IACA,OAAO,CAAC,MAAM,YAAY,gBAAgB;AACtC,oBAAc,MAAM,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC;AAC9D,aAAO;AAAA,IACX;AAAA,IACA,QAAQ,CAAC,MAAM,YAAY,gBAAgB;AACvC,oBAAc,OAAO,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC;AAC/D,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO;AACX;;;Ad9DO,SAAS,KAAK,MAAyB;AAC1C,QAAM,MAAM,WAAW;AACvB,MAAI,IAAI,SAAS,QAAW;AACxB,UAAM,IAAI,SAAS,QAAQ,kBAAkB,sBAAsB;AAAA,EACvE;AACA,MAAI,IAAI,SAAS,MAAM;AACnB,UAAM,IAAI,SAAS,QAAQ,aAAa,uBAAuB;AAAA,EACnE;AACA,MAAI,MAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,UAAM,IAAI,SAAS,QAAQ,cAAc,2BAA2B;AAAA,EACxE;AACA,SAAO,cAAc,IAAI,MAAiC,IAAI;AAClE;AAEO,SAAS,OAAO,MAAyB;AAC5C,QAAM,MAAM,WAAW;AACvB,SAAO,cAAc,IAAI,QAAQ,IAAI;AACzC;AAEO,SAAS,MAAM,MAAyB;AAC3C,QAAM,MAAM,WAAW;AACvB,SAAO,cAAc,IAAI,OAAO,IAAI;AACxC;AAEO,SAAS,cAAc,KAA8B,MAAyB;AACjF,SAAO,IAAI,UAAU,IAAI,IAAI,GAAG,IAAI;AACxC;",
|
|
6
|
+
"names": ["params", "params", "params", "EMAIL_REGEX", "URL_REGEX", "params", "params", "params", "isRealCalendarDate", "params", "params", "params"]
|
|
7
7
|
}
|