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 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
@@ -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": "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",
6
+ "names": ["params", "params", "params", "EMAIL_REGEX", "URL_REGEX", "params", "params", "params", "isRealCalendarDate", "params", "params", "params"]
7
7
  }