express5-valid 1.1.0 → 1.3.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;
@@ -452,6 +458,23 @@ var ValidArray = class {
452
458
  };
453
459
  return this;
454
460
  }
461
+ ofEnum(allowedValues) {
462
+ this._elementValidator = (val, index) => {
463
+ if (typeof val !== "string" && typeof val !== "number") {
464
+ this.elementError("INVALID_TYPE", "must be a string or number", index, { expected: "string|number" });
465
+ }
466
+ if (!allowedValues.includes(val)) {
467
+ this.elementError(
468
+ "INVALID_ENUM_VALUE",
469
+ `must be one of: ${allowedValues.join(", ")}`,
470
+ index,
471
+ { allowed: [...allowedValues] }
472
+ );
473
+ }
474
+ return val;
475
+ };
476
+ return this;
477
+ }
455
478
  ofBooleans() {
456
479
  this._elementValidator = (val, index) => {
457
480
  if (typeof val === "boolean") {
@@ -505,6 +528,9 @@ var ValidArray = class {
505
528
  }
506
529
  return null;
507
530
  }
531
+ if (this._csvSeparator !== void 0 && typeof val === "string") {
532
+ val = val.split(this._csvSeparator).filter((s) => s !== "");
533
+ }
508
534
  if (!Array.isArray(val)) {
509
535
  this.error("INVALID_TYPE", "must be an array", { expected: "array" });
510
536
  }
@@ -978,7 +1004,8 @@ function getContext() {
978
1004
  function validMiddleware(req, _res, next) {
979
1005
  const context = {
980
1006
  body: req.body,
981
- params: req.params
1007
+ params: req.params,
1008
+ query: req.query
982
1009
  };
983
1010
  requestStorage.run(context, next);
984
1011
  }
@@ -1007,7 +1034,8 @@ function wrapHandler(handler) {
1007
1034
  return async (req, res, next) => {
1008
1035
  const context = {
1009
1036
  body: req.body,
1010
- params: req.params
1037
+ params: req.params,
1038
+ query: req.query
1011
1039
  };
1012
1040
  requestStorage.run(context, async () => {
1013
1041
  try {
@@ -1072,6 +1100,10 @@ function params(name) {
1072
1100
  const ctx = getContext();
1073
1101
  return validArgument(ctx.params, name);
1074
1102
  }
1103
+ function query(name) {
1104
+ const ctx = getContext();
1105
+ return validArgument(ctx.query, name);
1106
+ }
1075
1107
  function validArgument(obj, name) {
1076
1108
  return new ValidBase(obj[name], name);
1077
1109
  }
@@ -1081,6 +1113,7 @@ function validArgument(obj, name) {
1081
1113
  body,
1082
1114
  createJsonRouter,
1083
1115
  params,
1116
+ query,
1084
1117
  validArgument,
1085
1118
  validErrorHandler,
1086
1119
  validMiddleware
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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-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 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\";\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}\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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",
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 ofEnum<V extends string | number>(allowedValues: readonly V[]): ValidArray<V, ArrayNullability<V, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (typeof val !== 'string' && typeof val !== 'number') {\r\n this.elementError('INVALID_TYPE', 'must be a string or number', index, { expected: 'string|number' });\r\n }\r\n if (!allowedValues.includes(val as V)) {\r\n this.elementError(\r\n 'INVALID_ENUM_VALUE',\r\n `must be one of: ${allowedValues.join(', ')}`,\r\n index,\r\n { allowed: [...allowedValues] },\r\n );\r\n }\r\n return val as V;\r\n };\r\n return this as unknown as ValidArray<V, ArrayNullability<V, 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,OAAkC,eAAoE;AAClG,SAAK,oBAAoB,CAAC,KAAc,UAAkB;AACtD,UAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAAU;AACpD,aAAK,aAAa,gBAAgB,8BAA8B,OAAO,EAAE,UAAU,gBAAgB,CAAC;AAAA,MACxG;AACA,UAAI,CAAC,cAAc,SAAS,GAAQ,GAAG;AACnC,aAAK;AAAA,UACD;AAAA,UACA,mBAAmB,cAAc,KAAK,IAAI,CAAC;AAAA,UAC3C;AAAA,UACA,EAAE,SAAS,CAAC,GAAG,aAAa,EAAE;AAAA,QAClC;AAAA,MACJ;AACA,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;;;AC7PA,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
6
  "names": ["params", "params", "params", "EMAIL_REGEX", "URL_REGEX", "params", "params", "params", "isRealCalendarDate", "params", "params", "params"]
7
7
  }
package/dist/index.mjs CHANGED
@@ -321,6 +321,7 @@ var ValidArray = class {
321
321
  _minLength;
322
322
  _maxLength;
323
323
  _elementValidator;
324
+ _csvSeparator;
324
325
  constructor(value, name) {
325
326
  this._value = value;
326
327
  this._name = name;
@@ -356,6 +357,10 @@ var ValidArray = class {
356
357
  this._maxLength = n;
357
358
  return this;
358
359
  }
360
+ csv(separator = ",") {
361
+ this._csvSeparator = separator;
362
+ return this;
363
+ }
359
364
  ofNumbers(config) {
360
365
  this._elementValidator = (val, index) => {
361
366
  let num;
@@ -420,6 +425,23 @@ var ValidArray = class {
420
425
  };
421
426
  return this;
422
427
  }
428
+ ofEnum(allowedValues) {
429
+ this._elementValidator = (val, index) => {
430
+ if (typeof val !== "string" && typeof val !== "number") {
431
+ this.elementError("INVALID_TYPE", "must be a string or number", index, { expected: "string|number" });
432
+ }
433
+ if (!allowedValues.includes(val)) {
434
+ this.elementError(
435
+ "INVALID_ENUM_VALUE",
436
+ `must be one of: ${allowedValues.join(", ")}`,
437
+ index,
438
+ { allowed: [...allowedValues] }
439
+ );
440
+ }
441
+ return val;
442
+ };
443
+ return this;
444
+ }
423
445
  ofBooleans() {
424
446
  this._elementValidator = (val, index) => {
425
447
  if (typeof val === "boolean") {
@@ -473,6 +495,9 @@ var ValidArray = class {
473
495
  }
474
496
  return null;
475
497
  }
498
+ if (this._csvSeparator !== void 0 && typeof val === "string") {
499
+ val = val.split(this._csvSeparator).filter((s) => s !== "");
500
+ }
476
501
  if (!Array.isArray(val)) {
477
502
  this.error("INVALID_TYPE", "must be an array", { expected: "array" });
478
503
  }
@@ -946,7 +971,8 @@ function getContext() {
946
971
  function validMiddleware(req, _res, next) {
947
972
  const context = {
948
973
  body: req.body,
949
- params: req.params
974
+ params: req.params,
975
+ query: req.query
950
976
  };
951
977
  requestStorage.run(context, next);
952
978
  }
@@ -975,7 +1001,8 @@ function wrapHandler(handler) {
975
1001
  return async (req, res, next) => {
976
1002
  const context = {
977
1003
  body: req.body,
978
- params: req.params
1004
+ params: req.params,
1005
+ query: req.query
979
1006
  };
980
1007
  requestStorage.run(context, async () => {
981
1008
  try {
@@ -1040,6 +1067,10 @@ function params(name) {
1040
1067
  const ctx = getContext();
1041
1068
  return validArgument(ctx.params, name);
1042
1069
  }
1070
+ function query(name) {
1071
+ const ctx = getContext();
1072
+ return validArgument(ctx.query, name);
1073
+ }
1043
1074
  function validArgument(obj, name) {
1044
1075
  return new ValidBase(obj[name], name);
1045
1076
  }
@@ -1048,6 +1079,7 @@ export {
1048
1079
  body,
1049
1080
  createJsonRouter,
1050
1081
  params,
1082
+ query,
1051
1083
  validArgument,
1052
1084
  valid_error_handler_default as validErrorHandler,
1053
1085
  validMiddleware
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../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", "../src/index.ts"],
4
- "sourcesContent": ["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\";\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}\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", "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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["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 ofEnum<V extends string | number>(allowedValues: readonly V[]): ValidArray<V, ArrayNullability<V, N>> {\r\n this._elementValidator = (val: unknown, index: number) => {\r\n if (typeof val !== 'string' && typeof val !== 'number') {\r\n this.elementError('INVALID_TYPE', 'must be a string or number', index, { expected: 'string|number' });\r\n }\r\n if (!allowedValues.includes(val as V)) {\r\n this.elementError(\r\n 'INVALID_ENUM_VALUE',\r\n `must be one of: ${allowedValues.join(', ')}`,\r\n index,\r\n { allowed: [...allowedValues] },\r\n );\r\n }\r\n return val as V;\r\n };\r\n return this as unknown as ValidArray<V, ArrayNullability<V, 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", "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"],
5
+ "mappings": "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",
6
6
  "names": ["params", "params", "params", "EMAIL_REGEX", "URL_REGEX", "params", "params", "params", "isRealCalendarDate", "params", "params", "params"]
7
7
  }
@@ -3,6 +3,7 @@ import type { Request, Response, NextFunction } from "express";
3
3
  export interface RequestContext {
4
4
  body: unknown;
5
5
  params: Record<string, unknown>;
6
+ query: Record<string, unknown>;
6
7
  }
7
8
  export declare const requestStorage: AsyncLocalStorage<RequestContext>;
8
9
  export declare function getContext(): RequestContext;
@@ -3,6 +3,7 @@ import type { Request, Response, NextFunction } from "express";
3
3
  export interface RequestContext {
4
4
  body: unknown;
5
5
  params: Record<string, unknown>;
6
+ query: Record<string, unknown>;
6
7
  }
7
8
  export declare const requestStorage: AsyncLocalStorage<RequestContext>;
8
9
  export declare function getContext(): RequestContext;
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAEtE,wBAAgB,UAAU,IAAI,cAAc,CAM3C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAOtF"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAEtE,wBAAgB,UAAU,IAAI,cAAc,CAM3C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAQtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAGlF,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAC/E,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACtF,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACvF,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACtF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACxF,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACzF,MAAM,EAAE,MAAM,CAAC;CAClB;AA8BD,wBAAgB,gBAAgB,IAAI,UAAU,CA4B7C"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAGlF,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAC/E,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACtF,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACvF,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACtF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACxF,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;IACzF,MAAM,EAAE,MAAM,CAAC;CAClB;AA+BD,wBAAgB,gBAAgB,IAAI,UAAU,CA4B7C"}
@@ -10,6 +10,7 @@ export default class ValidArray<T = unknown, N = T[] | undefined> {
10
10
  private _minLength;
11
11
  private _maxLength;
12
12
  private _elementValidator;
13
+ private _csvSeparator;
13
14
  constructor(value: unknown, name: string);
14
15
  private error;
15
16
  private elementError;
@@ -18,8 +19,10 @@ export default class ValidArray<T = unknown, N = T[] | undefined> {
18
19
  default(v: T[]): ValidArray<T, Exclude<N, undefined>>;
19
20
  minLength(n: number): this;
20
21
  maxLength(n: number): this;
22
+ csv(separator?: string): this;
21
23
  ofNumbers(config?: NumberArrayConfig): ValidArray<number, ArrayNullability<number, N>>;
22
24
  ofStrings(config?: StringArrayConfig): ValidArray<string, ArrayNullability<string, N>>;
25
+ ofEnum<V extends string | number>(allowedValues: readonly V[]): ValidArray<V, ArrayNullability<V, N>>;
23
26
  ofBooleans(): ValidArray<boolean, ArrayNullability<boolean, N>>;
24
27
  ofObjects<O>(validator: ObjectArrayValidator<O>): ValidArray<O, ArrayNullability<O, N>>;
25
28
  get value(): N;
@@ -10,6 +10,7 @@ export default class ValidArray<T = unknown, N = T[] | undefined> {
10
10
  private _minLength;
11
11
  private _maxLength;
12
12
  private _elementValidator;
13
+ private _csvSeparator;
13
14
  constructor(value: unknown, name: string);
14
15
  private error;
15
16
  private elementError;
@@ -18,8 +19,10 @@ export default class ValidArray<T = unknown, N = T[] | undefined> {
18
19
  default(v: T[]): ValidArray<T, Exclude<N, undefined>>;
19
20
  minLength(n: number): this;
20
21
  maxLength(n: number): this;
22
+ csv(separator?: string): this;
21
23
  ofNumbers(config?: NumberArrayConfig): ValidArray<number, ArrayNullability<number, N>>;
22
24
  ofStrings(config?: StringArrayConfig): ValidArray<string, ArrayNullability<string, N>>;
25
+ ofEnum<V extends string | number>(allowedValues: readonly V[]): ValidArray<V, ArrayNullability<V, N>>;
23
26
  ofBooleans(): ValidArray<boolean, ArrayNullability<boolean, N>>;
24
27
  ofObjects<O>(validator: ObjectArrayValidator<O>): ValidArray<O, ArrayNullability<O, N>>;
25
28
  get value(): N;
@@ -1 +1 @@
1
- {"version":3,"file":"valid-array.d.ts","sourceRoot":"","sources":["../src/valid-array.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpE,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;AAKzF,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,SAAS,GAC3C,CAAC,EAAE,GAAG,SAAS,GACf,CAAC,SAAS,IAAI,GACV,CAAC,EAAE,GAAG,IAAI,GACV,CAAC,EAAE,CAAC;AAEd,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS;IAC5D,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,iBAAiB,CAAyD;gBAEtE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM;IAKxC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IASpB,IAAI,QAAQ,IAAI,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAGnD;IAED,IAAI,QAAQ,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAGtC;IAED,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAKrD,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK1B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK1B,SAAS,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAsCtF,SAAS,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAkCtF,UAAU,IAAI,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAgB/D,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAwBvF,IAAI,KAAK,IAAI,CAAC,CA6Cb;CACJ"}
1
+ {"version":3,"file":"valid-array.d.ts","sourceRoot":"","sources":["../src/valid-array.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpE,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;AAKzF,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,SAAS,GAC3C,CAAC,EAAE,GAAG,SAAS,GACf,CAAC,SAAS,IAAI,GACV,CAAC,EAAE,GAAG,IAAI,GACV,CAAC,EAAE,CAAC;AAEd,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS;IAC5D,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,iBAAiB,CAAyD;IAClF,OAAO,CAAC,aAAa,CAAqB;gBAE9B,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM;IAKxC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IASpB,IAAI,QAAQ,IAAI,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAGnD;IAED,IAAI,QAAQ,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAGtC;IAED,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAKrD,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK1B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK1B,GAAG,CAAC,SAAS,GAAE,MAAY,GAAG,IAAI;IAKlC,SAAS,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAsCtF,SAAS,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAkCtF,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAkBrG,UAAU,IAAI,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAgB/D,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAwBvF,IAAI,KAAK,IAAI,CAAC,CAmDb;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express5-valid",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "Type-safe validation helpers and JSON router for Express 5",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",