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 +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -2
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +34 -2
- package/dist/index.mjs.map +2 -2
- package/dist/middleware.d.mts +1 -0
- package/dist/middleware.d.ts +1 -0
- package/dist/middleware.d.ts.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/valid-array.d.mts +3 -0
- package/dist/valid-array.d.ts +3 -0
- package/dist/valid-array.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -7,5 +7,6 @@ export { createJsonRouter, type JsonRouter } from "./router";
|
|
|
7
7
|
export type { NumberArrayConfig, StringArrayConfig } from "./types";
|
|
8
8
|
export declare function body(name: string): ValidBase;
|
|
9
9
|
export declare function params(name: string): ValidBase;
|
|
10
|
+
export declare function query(name: string): ValidBase;
|
|
10
11
|
export declare function validArgument(obj: Record<string, unknown>, name: string): ValidBase;
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export { createJsonRouter, type JsonRouter } from "./router";
|
|
|
7
7
|
export type { NumberArrayConfig, StringArrayConfig } from "./types";
|
|
8
8
|
export declare function body(name: string): ValidBase;
|
|
9
9
|
export declare function params(name: string): ValidBase;
|
|
10
|
+
export declare function query(name: string): ValidBase;
|
|
10
11
|
export declare function validArgument(obj: Record<string, unknown>, name: string): ValidBase;
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpE,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAY5C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAG9C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAEnF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpE,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAY5C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAG9C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAG7C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAEnF"}
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,7 @@ __export(index_exports, {
|
|
|
24
24
|
body: () => body,
|
|
25
25
|
createJsonRouter: () => createJsonRouter,
|
|
26
26
|
params: () => params,
|
|
27
|
+
query: () => query,
|
|
27
28
|
validArgument: () => validArgument,
|
|
28
29
|
validErrorHandler: () => valid_error_handler_default,
|
|
29
30
|
validMiddleware: () => validMiddleware
|
|
@@ -353,6 +354,7 @@ var ValidArray = class {
|
|
|
353
354
|
_minLength;
|
|
354
355
|
_maxLength;
|
|
355
356
|
_elementValidator;
|
|
357
|
+
_csvSeparator;
|
|
356
358
|
constructor(value, name) {
|
|
357
359
|
this._value = value;
|
|
358
360
|
this._name = name;
|
|
@@ -388,6 +390,10 @@ var ValidArray = class {
|
|
|
388
390
|
this._maxLength = n;
|
|
389
391
|
return this;
|
|
390
392
|
}
|
|
393
|
+
csv(separator = ",") {
|
|
394
|
+
this._csvSeparator = separator;
|
|
395
|
+
return this;
|
|
396
|
+
}
|
|
391
397
|
ofNumbers(config) {
|
|
392
398
|
this._elementValidator = (val, index) => {
|
|
393
399
|
let num;
|
|
@@ -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": "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",
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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
|
}
|
package/dist/middleware.d.mts
CHANGED
|
@@ -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;
|
package/dist/middleware.d.ts
CHANGED
|
@@ -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;
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/router.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/valid-array.d.mts
CHANGED
|
@@ -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;
|
package/dist/valid-array.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|