validator-fns 1.8.1 → 1.8.3
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/cjs/index.js +127 -68
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +127 -66
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +15 -15
- package/package.json +14 -14
package/dist/cjs/index.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
3
|
function isObject(value) {
|
|
6
4
|
return Object.prototype.toString.call(value) === "[object Object]";
|
|
7
5
|
}
|
|
@@ -11,7 +9,10 @@ function hasOwnProperty(object, property) {
|
|
|
11
9
|
const formatPattern = /{(\w+)}/g;
|
|
12
10
|
function formatMessage(template, parameters) {
|
|
13
11
|
if (typeof template === "string") {
|
|
14
|
-
return template.replace(
|
|
12
|
+
return template.replace(
|
|
13
|
+
formatPattern,
|
|
14
|
+
(_, key) => String(parameters[key])
|
|
15
|
+
);
|
|
15
16
|
}
|
|
16
17
|
return template(parameters);
|
|
17
18
|
}
|
|
@@ -97,45 +98,64 @@ function createValidatorTest(test, message, getExtras) {
|
|
|
97
98
|
};
|
|
98
99
|
}
|
|
99
100
|
function required(message, nullable) {
|
|
100
|
-
return createValidatorTest(
|
|
101
|
+
return createValidatorTest(
|
|
102
|
+
(value) => nullable && value === null || value !== null && value !== void 0 && !(typeof value === "string" && value === "") && !(typeof value === "number" && Number.isNaN(value)) && !(value instanceof Date && Number.isNaN(value.valueOf())),
|
|
103
|
+
message
|
|
104
|
+
);
|
|
101
105
|
}
|
|
102
106
|
function getAmount(value) {
|
|
103
107
|
return typeof value === "string" || Array.isArray(value) ? value.length : value;
|
|
104
108
|
}
|
|
105
109
|
function max(limit, message, exclusive) {
|
|
106
|
-
return createValidatorTest(
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
110
|
+
return createValidatorTest(
|
|
111
|
+
(value) => {
|
|
112
|
+
const amount = getAmount(value);
|
|
113
|
+
return amount === void 0 || amount === null || value === "" || (exclusive ? amount < limit : amount <= limit);
|
|
114
|
+
},
|
|
115
|
+
message,
|
|
116
|
+
(value) => ({
|
|
117
|
+
max: limit,
|
|
118
|
+
limit,
|
|
119
|
+
amount: getAmount(value),
|
|
120
|
+
exclusive
|
|
121
|
+
})
|
|
122
|
+
);
|
|
115
123
|
}
|
|
116
124
|
function min(limit, message, exclusive) {
|
|
117
|
-
return createValidatorTest(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
return createValidatorTest(
|
|
126
|
+
(value) => {
|
|
127
|
+
const amount = getAmount(value);
|
|
128
|
+
return amount === void 0 || amount === null || value === "" || (exclusive ? amount > limit : amount >= limit);
|
|
129
|
+
},
|
|
130
|
+
message,
|
|
131
|
+
(value) => ({
|
|
132
|
+
min: limit,
|
|
133
|
+
limit,
|
|
134
|
+
amount: getAmount(value),
|
|
135
|
+
exclusive
|
|
136
|
+
})
|
|
137
|
+
);
|
|
126
138
|
}
|
|
127
139
|
function exact(limit, message) {
|
|
128
|
-
return createValidatorTest(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
140
|
+
return createValidatorTest(
|
|
141
|
+
(value) => {
|
|
142
|
+
const amount = getAmount(value);
|
|
143
|
+
return amount === void 0 || amount === null || value === "" || amount === limit;
|
|
144
|
+
},
|
|
145
|
+
message,
|
|
146
|
+
(value) => ({
|
|
147
|
+
amount: getAmount(value),
|
|
148
|
+
limit,
|
|
149
|
+
exact: limit
|
|
150
|
+
})
|
|
151
|
+
);
|
|
136
152
|
}
|
|
137
153
|
function oneOf(values, message) {
|
|
138
|
-
return createValidatorTest(
|
|
154
|
+
return createValidatorTest(
|
|
155
|
+
(value) => value === void 0 || value === null || values.includes(value) || value instanceof Date && values.some((x) => x.valueOf() === value.valueOf()),
|
|
156
|
+
message,
|
|
157
|
+
() => ({ values })
|
|
158
|
+
);
|
|
139
159
|
}
|
|
140
160
|
|
|
141
161
|
function parseArray(value) {
|
|
@@ -189,7 +209,10 @@ function array(config, ...tests) {
|
|
|
189
209
|
}
|
|
190
210
|
if (arrayValue && validateItem) {
|
|
191
211
|
for (const [index, item] of arrayValue.entries()) {
|
|
192
|
-
const result = await validateItem(
|
|
212
|
+
const result = await validateItem(
|
|
213
|
+
item,
|
|
214
|
+
field ? `${field}[${index}]` : `[${index}]`
|
|
215
|
+
);
|
|
193
216
|
if (result.state === "invalid") {
|
|
194
217
|
isValid = false;
|
|
195
218
|
errors.push({
|
|
@@ -231,7 +254,10 @@ function applyBooleanConfig(value, config) {
|
|
|
231
254
|
}
|
|
232
255
|
return parsedValue;
|
|
233
256
|
}
|
|
234
|
-
const boolean = createTypeValidatorTest(
|
|
257
|
+
const boolean = createTypeValidatorTest(
|
|
258
|
+
{ parser: parseBoolean },
|
|
259
|
+
applyBooleanConfig
|
|
260
|
+
);
|
|
235
261
|
|
|
236
262
|
const invalidDate = new Date("");
|
|
237
263
|
const isoDatePattern = /^(\d{4})(?:-([0-2]\d)(?:-([0-3]\d)(?:[ T]([0-2]\d):([0-5]\d)(?::([0-5]\d)(\.\d+)?(Z|[+-][0-2]\d:?[0-5]\d)?)?)?)?)?$/;
|
|
@@ -275,13 +301,17 @@ function parseDate(value) {
|
|
|
275
301
|
if (parts === null) {
|
|
276
302
|
return invalidDate;
|
|
277
303
|
}
|
|
278
|
-
const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(
|
|
304
|
+
const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(
|
|
305
|
+
(parse, index) => parse(parts[index])
|
|
306
|
+
);
|
|
279
307
|
const timezone = parts[8];
|
|
280
308
|
if (!timezone) {
|
|
281
309
|
return new Date(year, month, day, hour, minute, second, millisecond);
|
|
282
310
|
}
|
|
283
311
|
const minuteOffset = parseTimezone(timezone);
|
|
284
|
-
return new Date(
|
|
312
|
+
return new Date(
|
|
313
|
+
Date.UTC(year, month, day, hour, minute + minuteOffset, second, millisecond)
|
|
314
|
+
);
|
|
285
315
|
}
|
|
286
316
|
function applyDateConfig(value, config) {
|
|
287
317
|
let parsedValue = config.parser(value);
|
|
@@ -292,21 +322,32 @@ function applyDateConfig(value, config) {
|
|
|
292
322
|
}
|
|
293
323
|
function minDate(limit, message, exclusive) {
|
|
294
324
|
const parsedDate = parseDate(limit);
|
|
295
|
-
return createValidatorTest(
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
325
|
+
return createValidatorTest(
|
|
326
|
+
(value) => parsedDate !== null && parsedDate !== void 0 && (value === null || value === void 0 || value instanceof Date && (exclusive ? value > parsedDate : value >= parsedDate)),
|
|
327
|
+
message,
|
|
328
|
+
() => ({
|
|
329
|
+
min: parsedDate,
|
|
330
|
+
limit: parsedDate,
|
|
331
|
+
exclusive
|
|
332
|
+
})
|
|
333
|
+
);
|
|
300
334
|
}
|
|
301
335
|
function maxDate(limit, message, exclusive) {
|
|
302
336
|
const parsedDate = parseDate(limit);
|
|
303
|
-
return createValidatorTest(
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
337
|
+
return createValidatorTest(
|
|
338
|
+
(value) => parsedDate !== null && parsedDate !== void 0 && (value === null || value === void 0 || value instanceof Date && (exclusive ? value < parsedDate : value <= parsedDate)),
|
|
339
|
+
message,
|
|
340
|
+
() => ({
|
|
341
|
+
max: parsedDate,
|
|
342
|
+
limit: parsedDate,
|
|
343
|
+
exclusive
|
|
344
|
+
})
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
const date = createTypeValidatorTest(
|
|
348
|
+
{ parser: parseDate },
|
|
349
|
+
applyDateConfig
|
|
350
|
+
);
|
|
310
351
|
|
|
311
352
|
function parseNumber(value) {
|
|
312
353
|
if (value === null || value === void 0) {
|
|
@@ -330,17 +371,21 @@ function applyNumberConfig(value, config) {
|
|
|
330
371
|
}
|
|
331
372
|
if (config.round && typeof parsedValue === "number") {
|
|
332
373
|
switch (config.round) {
|
|
333
|
-
case "nearest":
|
|
374
|
+
case "nearest": {
|
|
334
375
|
parsedValue = Math.round(parsedValue);
|
|
335
376
|
break;
|
|
336
|
-
|
|
377
|
+
}
|
|
378
|
+
case "ceil": {
|
|
337
379
|
parsedValue = Math.ceil(parsedValue);
|
|
338
380
|
break;
|
|
339
|
-
|
|
381
|
+
}
|
|
382
|
+
case "floor": {
|
|
340
383
|
parsedValue = Math.floor(parsedValue);
|
|
341
384
|
break;
|
|
342
|
-
|
|
385
|
+
}
|
|
386
|
+
default: {
|
|
343
387
|
throw new Error(`Unknown round type: ${String(config.round)}`);
|
|
388
|
+
}
|
|
344
389
|
}
|
|
345
390
|
}
|
|
346
391
|
return parsedValue;
|
|
@@ -357,9 +402,12 @@ function integer(message) {
|
|
|
357
402
|
});
|
|
358
403
|
};
|
|
359
404
|
}
|
|
360
|
-
const number = createTypeValidatorTest(
|
|
361
|
-
|
|
362
|
-
|
|
405
|
+
const number = createTypeValidatorTest(
|
|
406
|
+
{
|
|
407
|
+
parser: parseNumber
|
|
408
|
+
},
|
|
409
|
+
applyNumberConfig
|
|
410
|
+
);
|
|
363
411
|
|
|
364
412
|
function object(properties) {
|
|
365
413
|
if (typeof properties !== "object" || properties === null) {
|
|
@@ -421,26 +469,37 @@ function applyStringConfig(value, config) {
|
|
|
421
469
|
return parsedValue;
|
|
422
470
|
}
|
|
423
471
|
function matches(pattern, message) {
|
|
424
|
-
return createValidatorTest(
|
|
472
|
+
return createValidatorTest(
|
|
473
|
+
(value) => value === void 0 || value === null || value === "" || typeof value === "string" && pattern.test(value),
|
|
474
|
+
message,
|
|
475
|
+
() => ({ pattern })
|
|
476
|
+
);
|
|
425
477
|
}
|
|
426
478
|
function email(message) {
|
|
427
479
|
return matches(emailPattern, message);
|
|
428
480
|
}
|
|
429
481
|
function url(message, protocols) {
|
|
430
|
-
return createValidatorTest(
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
482
|
+
return createValidatorTest(
|
|
483
|
+
(value) => {
|
|
484
|
+
try {
|
|
485
|
+
let url2;
|
|
486
|
+
if (value === void 0 || value === null || value === "" || typeof value === "string" && (url2 = new URL(value))) {
|
|
487
|
+
return !(url2 && protocols && !protocols.includes(url2.protocol));
|
|
488
|
+
}
|
|
489
|
+
} catch {
|
|
435
490
|
}
|
|
436
|
-
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
491
|
+
return false;
|
|
492
|
+
},
|
|
493
|
+
message,
|
|
494
|
+
() => ({ protocols })
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
const string = createTypeValidatorTest(
|
|
498
|
+
{
|
|
499
|
+
parser: parseString
|
|
500
|
+
},
|
|
501
|
+
applyStringConfig
|
|
502
|
+
);
|
|
444
503
|
|
|
445
504
|
exports.applyArrayConfig = applyArrayConfig;
|
|
446
505
|
exports.applyBooleanConfig = applyBooleanConfig;
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/shared.ts","../../src/arrays.ts","../../src/booleans.ts","../../src/dates.ts","../../src/numbers.ts","../../src/objects.ts","../../src/strings.ts"],"sourcesContent":["/**\n * From type-fest: https://github.com/sindresorhus/type-fest/blob/HEAD/source/except.d.ts\n * @internal\n */\ntype Except<ObjectType, KeysType extends keyof ObjectType> = Pick<\n ObjectType,\n Exclude<keyof ObjectType, KeysType>\n>;\n\nexport type ValidResult<T> = {\n /**\n * True if the original value is valid according to all validation tests\n * @deprecated Use `state` instead.\n */\n isValid: true;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'valid';\n /** The parsed value. Note that may be different than the original value. */\n value: T | null | undefined;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n};\n\nexport type InvalidResult<E> = {\n /**\n * True if the original value is valid according to all validation tests.\n * @deprecated Use `state` instead.\n */\n isValid: false;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'invalid';\n /** The parsed value. Note that may be different than the original value. */\n value: unknown;\n /** Error message if `state` is invalid. */\n message: string;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n /** Extra error details */\n errors?: E;\n};\n\n/**\n * The result of a validation.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorResult<T = any, E = any> =\n | ValidResult<T>\n | InvalidResult<E>;\n\n/**\n * Validation test function.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorTest<T = any, E = any> = (\n value?: unknown,\n field?: string\n) => Promise<ValidatorResult<T, E>>;\n\n/**\n * Extracts the generic error type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractError<T extends ValidatorTest> = T extends ValidatorTest<\n any,\n infer E\n>\n ? E\n : unknown;\n\n/**\n * Extracts the generic value type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractValue<T extends ValidatorTest> = T extends ValidatorTest<\n infer V\n>\n ? V\n : unknown;\n\n/**\n * Make a deep partial type.\n * @typeParam T any object type\n * @category Types\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n/**\n * Validation factory function.\n * @typeParam C The configuration type\n * @category Types\n */\nexport type ValidatorFactory<C, T, E> = (\n config?: Partial<C> | ValidatorTest,\n ...tests: ValidatorTest[]\n) => ValidatorTest<T, E>;\n\n/**\n * Base configuration type.\n * @typeParam T The target type.\n * @category Types\n */\nexport interface ConfigBase<T> {\n /** Parser to convert value into the designated type. */\n parser: (value: unknown) => T | null | undefined;\n /** Provide a fallback value in case the original value is undefined. */\n default?: T;\n}\n\nexport interface ValidatorMessageParameters<T> {\n value: T | null | undefined;\n field: string | undefined;\n}\n\n/**\n * Validation message. May be a plain string or a function that accepts arguments.\n * While using a string, values in squiggly brackets `{}` are replaced.\n * @category Types\n */\nexport type ValidatorMessage<\n T,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n> = string | ((parameters: P) => string);\n\n/**\n * Simple check for objects.\n * @param value Value to test\n */\nexport function isObject(value: unknown): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Safe hasOwnProperty check\n * @param obj Object to check\n * @param prop Property to look for\n */\nexport function hasOwnProperty(\n object: unknown,\n property: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\n/** @internal */\nconst formatPattern = /{(\\w+)}/g;\n\n/**\n * Formats a message using a squiggly bracket `{}` template.\n * @param template Message template as string or function\n * @param params Params to inject into template\n * @category Helpers\n */\nexport function formatMessage<T, P extends ValidatorMessageParameters<T>>(\n template: ValidatorMessage<T, P>,\n parameters: P\n): string {\n if (typeof template === 'string') {\n return template.replace(formatPattern, (_, key: string) =>\n String((parameters as Record<string, unknown>)[key])\n );\n }\n\n return template(parameters);\n}\n\n/**\n * Creates a valid result\n * @param value Parsed value\n * @param field Field name\n * @category Helpers\n */\nexport async function valid<T, E = never>({\n value,\n field,\n}: {\n value: T | null | undefined;\n field: string | undefined;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: true,\n state: 'valid',\n value,\n field,\n };\n}\n\n/**\n * Creates an invalid result.\n * @param message Error message\n * @param value Parsed value\n * @param field Field name\n * @param extras Extra message params\n * @category Helpers\n */\nexport async function invalid<T, E, P extends ValidatorMessageParameters<T>>({\n errors,\n field,\n message,\n value,\n extras,\n}: {\n message: ValidatorMessage<T, P>;\n value: unknown;\n field: string | undefined;\n errors?: E;\n extras?: Except<P, 'field' | 'value'>;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: false,\n state: 'invalid',\n message: formatMessage(message, { ...extras, value, field } as P),\n value,\n field,\n errors,\n };\n}\n\n/**\n * Creates a type validator.\n * @typeParam T The basic type for the final value to be validated.\n * @typeParam C The configuration type.\n * @param defaultParser Parser to convert value into type.\n * @param applyConfig Function that applies configuration to value.\n * @category Helpers\n */\nexport function createTypeValidatorTest<T, C extends ConfigBase<T>, E>(\n defaultConfig: C,\n applyConfig: (value: unknown, config: C) => T | null | undefined\n): ValidatorFactory<C, T, E> {\n return (config, ...tests) => {\n const cache: Record<string, ValidatorResult<T>> = {};\n let finalConfig = defaultConfig;\n let allTests = tests;\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...defaultConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n try {\n const parsedValue = applyConfig(value, finalConfig);\n const parsedValueString = String(parsedValue);\n if (hasOwnProperty(cache, parsedValueString)) {\n return cache[parsedValueString];\n }\n\n for (const validatorTest of allTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(parsedValue, field);\n if (result.state === 'invalid') {\n cache[parsedValueString] = result;\n return result;\n }\n }\n\n cache[parsedValueString] = await valid({ value: parsedValue, field });\n return cache[parsedValueString];\n } catch (error) {\n return invalid({\n message: error instanceof Error ? error.message : String(error),\n value,\n field,\n });\n }\n };\n };\n}\n\n/**\n * Captures basic validator test pattern\n * @param test Test function\n * @param message Error message\n * @param getExtras Optional extra fields for error message\n */\nexport function createValidatorTest<\n T = any,\n E = any,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n>(\n test: (value: unknown, field?: string) => boolean,\n message: ValidatorMessage<T, P>,\n getExtras?: (value: T | null | undefined) => Except<P, 'value' | 'field'>\n): ValidatorTest<T, E> {\n return async (value, field) => {\n if (test(value, field)) {\n return valid({ value: value as T, field });\n }\n\n return invalid({\n message,\n value,\n field,\n extras: getExtras ? getExtras(value as T) : undefined,\n });\n };\n}\n\n/**\n * Ensures a value is not undefined, null, empty string, NaN, nor invalid date.\n * @param message Error message\n * @param nullable Allow null values\n * @category Validation Tests\n */\nexport function required<T, P extends ValidatorMessageParameters<T>>(\n message: ValidatorMessage<T, P>,\n nullable?: boolean\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n (nullable && value === null) ||\n (value !== null &&\n value !== undefined &&\n !(typeof value === 'string' && value === '') &&\n !(typeof value === 'number' && Number.isNaN(value)) &&\n !(value instanceof Date && Number.isNaN(value.valueOf()))),\n message\n );\n}\n\nexport type SharedValueType = string | number | unknown[];\n\n/**\n * Extracts a numeric amount from value, i.e. string length, array length, or number.\n * @internal\n */\nfunction getAmount(value: SharedValueType | null | undefined) {\n return typeof value === 'string' || Array.isArray(value)\n ? value.length\n : value;\n}\n\nexport interface MaxValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n max: number;\n amount: number | null | undefined;\n limit: number;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function max(\n limit: number,\n message: ValidatorMessage<SharedValueType, MaxValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount < limit : amount <= limit)\n );\n },\n message,\n (value) => ({\n max: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface MinValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n min: number;\n limit: number;\n amount: number | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function min(\n limit: number,\n message: ValidatorMessage<SharedValueType, MinValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount > limit : amount >= limit)\n );\n },\n message,\n (value) => ({\n min: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface ExactValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n limit: number;\n amount: number | null | undefined;\n exact: number;\n}\n\n/**\n * Ensures a string, number, or array value is exactly a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @category Validation Tests\n */\nexport function exact(\n limit: number,\n message: ValidatorMessage<SharedValueType, ExactValidatorMessageParameters>\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n amount === limit\n );\n },\n message,\n (value) => ({\n amount: getAmount(value),\n limit,\n exact: limit,\n })\n );\n}\n\nexport interface OneOfValidatorMessageParameters<T>\n extends ValidatorMessageParameters<T> {\n values: readonly T[];\n}\n\n/**\n * Ensures a value is one in a predefined list.\n * @param values List of allowed values.\n * @param message Error message\n * @category Validation Tests\n */\nexport function oneOf<T extends string | number | boolean | Date>(\n values: readonly T[],\n message: ValidatorMessage<T, OneOfValidatorMessageParameters<T>>\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n values.includes(value as T) ||\n (value instanceof Date &&\n values.some((x) => x.valueOf() === value.valueOf())),\n message,\n () => ({ values })\n );\n}\n","import {\n ConfigBase,\n invalid,\n valid,\n ValidatorResult,\n ValidatorTest,\n} from './shared';\n\n/**\n * Invalid validation result for an item in the array\n * @category Types\n */\nexport interface ArrayItemValidatorResult {\n /** The index of the item in the original array */\n index: number;\n /** The error message if a simple type */\n message: string;\n /** The errors if an object or array */\n errors: unknown;\n}\n\n/**\n * Configuration for array validation.\n * @category Types\n */\nexport type ArrayConfig = ConfigBase<unknown[]>;\n\n/**\n * Parses a value into an array.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseArray(value: unknown): unknown[] | null | undefined {\n if (Array.isArray(value)) {\n return value as unknown[];\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const iterable = value as Iterable<unknown>;\n\n if (iterable[Symbol.iterator]) {\n return [...iterable];\n }\n\n return [];\n}\n\n/**\n * Applies a configuration to the array value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyArrayConfig<T>(\n config: ArrayConfig,\n value: unknown\n): T[] | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n parsedValue.length === 0)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue as T[];\n}\n\n/**\n * Validates an array. The first passed validator is used to validate individual\n * items. The remaining validators target the array itself.\n * @category Type Validators\n */\nexport function array<T>(\n config?: Partial<ArrayConfig> | ValidatorTest<T>,\n ...tests: ValidatorTest[]\n): ValidatorTest<T[], ArrayItemValidatorResult[]> {\n let allTests = tests;\n let finalConfig: ArrayConfig = {\n parser: parseArray,\n };\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...finalConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n const arrayValue = applyArrayConfig<T>(finalConfig, value);\n let arrayInvalidResult: ValidatorResult | undefined;\n let isValid = true;\n const errors: ArrayItemValidatorResult[] = [];\n const [validateItem, ...arrayTests] = allTests;\n\n for (const validatorTest of arrayTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(arrayValue, field);\n if (result.state === 'invalid') {\n isValid = false;\n arrayInvalidResult = result;\n break;\n }\n }\n\n if (arrayValue && validateItem) {\n for (const [index, item] of arrayValue.entries()) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validateItem(\n item,\n field ? `${field}[${index}]` : `[${index}]`\n );\n\n if (result.state === 'invalid') {\n isValid = false;\n errors.push({\n errors: result.errors,\n index,\n message: result.message,\n });\n }\n }\n }\n\n if (isValid) {\n return valid({\n value: arrayValue,\n field,\n });\n }\n\n return invalid({\n message:\n arrayInvalidResult?.state === 'invalid'\n ? arrayInvalidResult.message\n : '',\n value,\n field,\n errors,\n });\n };\n}\n","import { ConfigBase, createTypeValidatorTest } from './shared';\n\n/**\n * Parses a value into a boolean.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseBoolean(value: unknown): boolean | null | undefined {\n if (value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n return Boolean(value);\n}\n\n/**\n * Applies a configuration to the boolean value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyBooleanConfig(\n value: unknown,\n config: BooleanConfig\n): boolean | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Configuration for boolean validation.\n * @category Types\n */\nexport type BooleanConfig = ConfigBase<boolean>;\n\n/**\n * Validates a boolean value.\n * @category Type Validators\n */\nexport const boolean = createTypeValidatorTest(\n { parser: parseBoolean },\n applyBooleanConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** Badly formatted date for internal use. */\nexport const invalidDate = new Date('');\n\n/** @internal */\nconst isoDatePattern =\n /^(\\d{4})(?:-([0-2]\\d)(?:-([0-3]\\d)(?:[ T]([0-2]\\d):([0-5]\\d)(?::([0-5]\\d)(\\.\\d+)?(Z|[+-][0-2]\\d:?[0-5]\\d)?)?)?)?)?$/;\n\n/** @internal */\nconst timezonePattern = /^([+-])([0-2]\\d):?([0-5]\\d)$/;\n\n/**\n * Parses a timezone string.\n * @param timezone Timezone to parse\n * @internal\n */\nfunction parseTimezone(timezone: string): number {\n const parts = timezonePattern.exec(timezone);\n\n if (timezone === 'Z' || !parts) {\n return 0;\n }\n\n const [, sign, hour, minute] = parts;\n const multiplier = sign === '-' ? -1 : 1;\n const hoursInMinutes = Number.parseInt(hour, 10) * 60;\n const offset = hoursInMinutes + Number.parseInt(minute, 10);\n\n return multiplier * offset;\n}\n\nconst BASE = 10;\n\nconst dateParts = [\n // Skip\n () => 0,\n // Year\n (part = '0') => Number.parseInt(part, BASE),\n // Month\n (part = '1') => Number.parseInt(part, BASE) - 1,\n // Day\n (part = '1') => Number.parseInt(part, BASE),\n // Hour\n (part = '0') => Number.parseInt(part, BASE),\n // Minute\n (part = '0') => Number.parseInt(part, BASE),\n // Second\n (part = '0') => Number.parseInt(part, BASE),\n // Millisecond\n (part = '0') => Number.parseFloat(part) * 1e3,\n];\n\n/**\n * Parses a value into a date.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseDate(value: unknown): Date | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (typeof value === 'number') {\n return new Date(value);\n }\n\n if (typeof value !== 'string') {\n return invalidDate;\n }\n\n const parts = isoDatePattern.exec(value);\n\n if (parts === null) {\n return invalidDate;\n }\n\n const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(\n (parse, index) => parse(parts[index])\n );\n\n const timezone = parts[8];\n\n if (!timezone) {\n return new Date(year, month, day, hour, minute, second, millisecond);\n }\n\n const minuteOffset = parseTimezone(timezone);\n\n return new Date(\n Date.UTC(year, month, day, hour, minute + minuteOffset, second, millisecond)\n );\n}\n\n/**\n * Applies a configuration to the date value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyDateConfig(\n value: unknown,\n config: DateConfig\n): Date | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue.getTime()))\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\nexport type SharedDateValueType = Date | string | number;\n\nexport interface MinDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n min: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or after a date.\n * @param limit Minimum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function minDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MinDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date, null> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value > parsedDate : value >= parsedDate))),\n message,\n () => ({\n min: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\nexport interface MaxDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n max: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or before a date.\n * @param limit Maximum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function maxDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MaxDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value < parsedDate : value <= parsedDate))),\n message,\n () => ({\n max: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\n/**\n * Configuration for date validation.\n * @category Types\n */\nexport type DateConfig = ConfigBase<Date>;\n\n/**\n * Validates a date value.\n * @category Type Validators\n */\nexport const date = createTypeValidatorTest(\n { parser: parseDate },\n applyDateConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n invalid,\n valid,\n ValidatorMessage,\n ValidatorTest,\n} from './shared';\n\n/**\n * Parses a value into a number.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseNumber(value: unknown): number | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n if (typeof value === 'string') {\n return Number.parseFloat(value);\n }\n\n return Number.parseFloat(String(value));\n}\n\n/**\n * Applies a configuration to the number value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyNumberConfig(\n value: unknown,\n config: NumberConfig\n): number | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue))\n ) {\n parsedValue = config.default;\n }\n\n if (config.round && typeof parsedValue === 'number') {\n switch (config.round) {\n case 'nearest':\n parsedValue = Math.round(parsedValue);\n break;\n case 'ceil':\n parsedValue = Math.ceil(parsedValue);\n break;\n case 'floor':\n parsedValue = Math.floor(parsedValue);\n break;\n default:\n throw new Error(`Unknown round type: ${String(config.round)}`);\n }\n }\n\n return parsedValue;\n}\n\n/**\n * Ensures a number value is an integer.\n * @param message Error message\n * @category Validation Tests\n */\nexport function integer(\n message: ValidatorMessage<number>\n): ValidatorTest<number> {\n return async (value, field) => {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'number' &&\n Number.isFinite(value) &&\n Math.floor(value) === value)\n ) {\n return valid({ value, field });\n }\n\n return invalid({\n message,\n value,\n field,\n });\n };\n}\n\n/**\n * Configuration for number validation.\n * @category Types\n */\nexport interface NumberConfig extends ConfigBase<number> {\n /** Apply rounding mechanism before validation. */\n round?: 'nearest' | 'floor' | 'ceil';\n}\n\n/**\n * Validates a number value.\n * @category Type Validators\n */\nexport const number = createTypeValidatorTest(\n {\n parser: parseNumber,\n },\n applyNumberConfig\n);\n","import {\n DeepPartial,\n ExtractError,\n ExtractValue,\n hasOwnProperty,\n invalid,\n valid,\n ValidatorTest,\n} from './shared';\n\nexport type ObjectParameter = Record<string, ValidatorTest<unknown, unknown>>;\n\n/**\n * Validates an object.\n * @category Type Validators\n */\nexport function object<P extends ObjectParameter, K extends keyof P>(\n properties: P\n): ValidatorTest<\n DeepPartial<{ [K in keyof P]?: ExtractValue<P[K]> }>,\n DeepPartial<{ [K in keyof P]?: ExtractError<P[K]> }>\n> {\n if (typeof properties !== 'object' || properties === null) {\n throw new TypeError('`properties` must be a configuration object');\n }\n\n return async (values, field) => {\n const definedValues: { [K in keyof P]?: ExtractValue<P[K]> } =\n (values as { [K in keyof P]?: ExtractValue<P[K]> }) ?? {};\n const errors: { [K in keyof P]?: ExtractError<P[K]> } = {};\n const resolvedValues: { [K in keyof P]?: ExtractValue<P[K]> } = {};\n let isValid = true;\n\n for (const key in properties) {\n if (hasOwnProperty(properties, key)) {\n const validator = properties[key];\n const value = definedValues[key];\n /* eslint-disable no-await-in-loop */\n const result =\n typeof validator === 'function'\n ? await validator(value, key)\n : await invalid({ field: key, message: 'No validator set', value });\n /* eslint-enable no-await-in-loop */\n\n resolvedValues[key] = result.value as ExtractValue<P[K]>;\n\n if (result.state === 'invalid') {\n isValid = false;\n errors[key] = (result.message || result.errors) as ExtractError<P[K]>;\n }\n }\n }\n\n if (isValid) {\n return valid({ value: resolvedValues, field });\n }\n\n return invalid({\n message: '',\n value: values,\n field,\n errors,\n });\n };\n}\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n isObject,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** @internal */\nconst emailPattern =\n /^[\\w!#$%&'*+./=?^`{|}~-]+@[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?(?:\\.[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?)*$/;\n\n/**\n * Configuration for string validation.\n * @category Types\n */\nexport interface StringConfig extends ConfigBase<string> {\n /** Apply trim to string before validation. */\n trim?: boolean;\n}\n\n/**\n * Parses a value into a string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseString(value: unknown): string | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (isObject(value)) {\n throw new TypeError('Failed to parse value to string.');\n }\n\n return String(value);\n}\n\n/**\n * Applies a configuration to the string value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyStringConfig(\n value: unknown,\n config: StringConfig\n): string | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null || parsedValue === '')\n ) {\n parsedValue = config.default;\n }\n\n if (config.trim && typeof parsedValue === 'string') {\n parsedValue = parsedValue.trim();\n }\n\n return parsedValue;\n}\n\nexport interface MatchesValidatorMessageParameters\n extends ValidatorMessageParameters<string> {\n pattern: RegExp;\n}\n\n/**\n * Ensures a string value matches a pattern\n * @param pattern Pattern to match\n * @param message Error message\n * @category Validation Tests\n */\nexport function matches(\n pattern: RegExp,\n message: ValidatorMessage<string, MatchesValidatorMessageParameters>\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && pattern.test(value)),\n message,\n () => ({ pattern })\n );\n}\n\n/**\n * Ensures a string value matches an email pattern\n * @param message Error message\n * @category Validation Tests\n */\nexport function email(\n message: ValidatorMessage<string>\n): ValidatorTest<string> {\n return matches(emailPattern, message);\n}\n\n/**\n * Ensures a string value is a valid URL\n * @param message Error message\n * @param protocols Optional list of protocols to allow\n * @category Validation Tests\n */\nexport function url(\n message: ValidatorMessage<string>,\n protocols?: string[]\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) => {\n try {\n let url: URL | undefined;\n if (\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && (url = new URL(value)))\n ) {\n return !(url && protocols && !protocols.includes(url.protocol));\n }\n } catch {\n // Do nothing\n }\n\n return false;\n },\n message,\n () => ({ protocols })\n );\n}\n\n/**\n * Validates a string value.\n * @category Type Validators\n */\nexport const string = createTypeValidatorTest(\n {\n parser: parseString,\n },\n applyStringConfig\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/shared.ts","../../src/arrays.ts","../../src/booleans.ts","../../src/dates.ts","../../src/numbers.ts","../../src/objects.ts","../../src/strings.ts"],"sourcesContent":["/**\n * From type-fest: https://github.com/sindresorhus/type-fest/blob/HEAD/source/except.d.ts\n * @internal\n */\ntype Except<ObjectType, KeysType extends keyof ObjectType> = Pick<\n ObjectType,\n Exclude<keyof ObjectType, KeysType>\n>;\n\nexport type ValidResult<T> = {\n /**\n * True if the original value is valid according to all validation tests\n * @deprecated Use `state` instead.\n */\n isValid: true;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'valid';\n /** The parsed value. Note that may be different than the original value. */\n value: T | null | undefined;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n};\n\nexport type InvalidResult<E> = {\n /**\n * True if the original value is valid according to all validation tests.\n * @deprecated Use `state` instead.\n */\n isValid: false;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'invalid';\n /** The parsed value. Note that may be different than the original value. */\n value: unknown;\n /** Error message if `state` is invalid. */\n message: string;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n /** Extra error details */\n errors?: E;\n};\n\n/**\n * The result of a validation.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorResult<T = any, E = any> =\n | ValidResult<T>\n | InvalidResult<E>;\n\n/**\n * Validation test function.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorTest<T = any, E = any> = (\n value?: unknown,\n field?: string\n) => Promise<ValidatorResult<T, E>>;\n\n/**\n * Extracts the generic error type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractError<T extends ValidatorTest> = T extends ValidatorTest<\n any,\n infer E\n>\n ? E\n : unknown;\n\n/**\n * Extracts the generic value type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractValue<T extends ValidatorTest> = T extends ValidatorTest<\n infer V\n>\n ? V\n : unknown;\n\n/**\n * Make a deep partial type.\n * @typeParam T any object type\n * @category Types\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n/**\n * Validation factory function.\n * @typeParam C The configuration type\n * @category Types\n */\nexport type ValidatorFactory<C, T, E> = (\n config?: Partial<C> | ValidatorTest,\n ...tests: ValidatorTest[]\n) => ValidatorTest<T, E>;\n\n/**\n * Base configuration type.\n * @typeParam T The target type.\n * @category Types\n */\nexport interface ConfigBase<T> {\n /** Parser to convert value into the designated type. */\n parser: (value: unknown) => T | null | undefined;\n /** Provide a fallback value in case the original value is undefined. */\n default?: T;\n}\n\nexport interface ValidatorMessageParameters<T> {\n value: T | null | undefined;\n field: string | undefined;\n}\n\n/**\n * Validation message. May be a plain string or a function that accepts arguments.\n * While using a string, values in squiggly brackets `{}` are replaced.\n * @category Types\n */\nexport type ValidatorMessage<\n T,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n> = string | ((parameters: P) => string);\n\n/**\n * Simple check for objects.\n * @param value Value to test\n */\nexport function isObject(value: unknown): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Safe hasOwnProperty check\n * @param obj Object to check\n * @param prop Property to look for\n */\nexport function hasOwnProperty(\n object: unknown,\n property: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\n/** @internal */\nconst formatPattern = /{(\\w+)}/g;\n\n/**\n * Formats a message using a squiggly bracket `{}` template.\n * @param template Message template as string or function\n * @param params Params to inject into template\n * @category Helpers\n */\nexport function formatMessage<T, P extends ValidatorMessageParameters<T>>(\n template: ValidatorMessage<T, P>,\n parameters: P\n): string {\n if (typeof template === 'string') {\n return template.replace(formatPattern, (_, key: string) =>\n String((parameters as Record<string, unknown>)[key])\n );\n }\n\n return template(parameters);\n}\n\n/**\n * Creates a valid result\n * @param value Parsed value\n * @param field Field name\n * @category Helpers\n */\nexport async function valid<T, E = never>({\n value,\n field,\n}: {\n value: T | null | undefined;\n field: string | undefined;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: true,\n state: 'valid',\n value,\n field,\n };\n}\n\n/**\n * Creates an invalid result.\n * @param message Error message\n * @param value Parsed value\n * @param field Field name\n * @param extras Extra message params\n * @category Helpers\n */\nexport async function invalid<T, E, P extends ValidatorMessageParameters<T>>({\n errors,\n field,\n message,\n value,\n extras,\n}: {\n message: ValidatorMessage<T, P>;\n value: unknown;\n field: string | undefined;\n errors?: E;\n extras?: Except<P, 'field' | 'value'>;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: false,\n state: 'invalid',\n message: formatMessage(message, { ...extras, value, field } as P),\n value,\n field,\n errors,\n };\n}\n\n/**\n * Creates a type validator.\n * @typeParam T The basic type for the final value to be validated.\n * @typeParam C The configuration type.\n * @param defaultParser Parser to convert value into type.\n * @param applyConfig Function that applies configuration to value.\n * @category Helpers\n */\nexport function createTypeValidatorTest<T, C extends ConfigBase<T>, E>(\n defaultConfig: C,\n applyConfig: (value: unknown, config: C) => T | null | undefined\n): ValidatorFactory<C, T, E> {\n return (config, ...tests) => {\n const cache: Record<string, ValidatorResult<T>> = {};\n let finalConfig = defaultConfig;\n let allTests = tests;\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...defaultConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n try {\n const parsedValue = applyConfig(value, finalConfig);\n const parsedValueString = String(parsedValue);\n if (hasOwnProperty(cache, parsedValueString)) {\n return cache[parsedValueString];\n }\n\n for (const validatorTest of allTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(parsedValue, field);\n if (result.state === 'invalid') {\n cache[parsedValueString] = result;\n return result;\n }\n }\n\n cache[parsedValueString] = await valid({ value: parsedValue, field });\n return cache[parsedValueString];\n } catch (error) {\n return invalid({\n message: error instanceof Error ? error.message : String(error),\n value,\n field,\n });\n }\n };\n };\n}\n\n/**\n * Captures basic validator test pattern\n * @param test Test function\n * @param message Error message\n * @param getExtras Optional extra fields for error message\n */\nexport function createValidatorTest<\n T = any,\n E = any,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n>(\n test: (value: unknown, field?: string) => boolean,\n message: ValidatorMessage<T, P>,\n getExtras?: (value: T | null | undefined) => Except<P, 'value' | 'field'>\n): ValidatorTest<T, E> {\n return async (value, field) => {\n if (test(value, field)) {\n return valid({ value: value as T, field });\n }\n\n return invalid({\n message,\n value,\n field,\n extras: getExtras ? getExtras(value as T) : undefined,\n });\n };\n}\n\n/**\n * Ensures a value is not undefined, null, empty string, NaN, nor invalid date.\n * @param message Error message\n * @param nullable Allow null values\n * @category Validation Tests\n */\nexport function required<T, P extends ValidatorMessageParameters<T>>(\n message: ValidatorMessage<T, P>,\n nullable?: boolean\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n (nullable && value === null) ||\n (value !== null &&\n value !== undefined &&\n !(typeof value === 'string' && value === '') &&\n !(typeof value === 'number' && Number.isNaN(value)) &&\n !(value instanceof Date && Number.isNaN(value.valueOf()))),\n message\n );\n}\n\nexport type SharedValueType = string | number | unknown[];\n\n/**\n * Extracts a numeric amount from value, i.e. string length, array length, or number.\n * @internal\n */\nfunction getAmount(value: SharedValueType | null | undefined) {\n return typeof value === 'string' || Array.isArray(value)\n ? value.length\n : value;\n}\n\nexport interface MaxValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n max: number;\n amount: number | null | undefined;\n limit: number;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function max(\n limit: number,\n message: ValidatorMessage<SharedValueType, MaxValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount < limit : amount <= limit)\n );\n },\n message,\n (value) => ({\n max: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface MinValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n min: number;\n limit: number;\n amount: number | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function min(\n limit: number,\n message: ValidatorMessage<SharedValueType, MinValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount > limit : amount >= limit)\n );\n },\n message,\n (value) => ({\n min: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface ExactValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n limit: number;\n amount: number | null | undefined;\n exact: number;\n}\n\n/**\n * Ensures a string, number, or array value is exactly a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @category Validation Tests\n */\nexport function exact(\n limit: number,\n message: ValidatorMessage<SharedValueType, ExactValidatorMessageParameters>\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n amount === limit\n );\n },\n message,\n (value) => ({\n amount: getAmount(value),\n limit,\n exact: limit,\n })\n );\n}\n\nexport interface OneOfValidatorMessageParameters<T>\n extends ValidatorMessageParameters<T> {\n values: readonly T[];\n}\n\n/**\n * Ensures a value is one in a predefined list.\n * @param values List of allowed values.\n * @param message Error message\n * @category Validation Tests\n */\nexport function oneOf<T extends string | number | boolean | Date>(\n values: readonly T[],\n message: ValidatorMessage<T, OneOfValidatorMessageParameters<T>>\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n values.includes(value as T) ||\n (value instanceof Date &&\n values.some((x) => x.valueOf() === value.valueOf())),\n message,\n () => ({ values })\n );\n}\n","import {\n ConfigBase,\n invalid,\n valid,\n ValidatorResult,\n ValidatorTest,\n} from './shared';\n\n/**\n * Invalid validation result for an item in the array\n * @category Types\n */\nexport interface ArrayItemValidatorResult {\n /** The index of the item in the original array */\n index: number;\n /** The error message if a simple type */\n message: string;\n /** The errors if an object or array */\n errors: unknown;\n}\n\n/**\n * Configuration for array validation.\n * @category Types\n */\nexport type ArrayConfig = ConfigBase<unknown[]>;\n\n/**\n * Parses a value into an array.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseArray(value: unknown): unknown[] | null | undefined {\n if (Array.isArray(value)) {\n return value as unknown[];\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const iterable = value as Iterable<unknown>;\n\n if (iterable[Symbol.iterator]) {\n return [...iterable];\n }\n\n return [];\n}\n\n/**\n * Applies a configuration to the array value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyArrayConfig<T>(\n config: ArrayConfig,\n value: unknown\n): T[] | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n parsedValue.length === 0)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue as T[];\n}\n\n/**\n * Validates an array. The first passed validator is used to validate individual\n * items. The remaining validators target the array itself.\n * @category Type Validators\n */\nexport function array<T>(\n config?: Partial<ArrayConfig> | ValidatorTest<T>,\n ...tests: ValidatorTest[]\n): ValidatorTest<T[], ArrayItemValidatorResult[]> {\n let allTests = tests;\n let finalConfig: ArrayConfig = {\n parser: parseArray,\n };\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...finalConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n const arrayValue = applyArrayConfig<T>(finalConfig, value);\n let arrayInvalidResult: ValidatorResult | undefined;\n let isValid = true;\n const errors: ArrayItemValidatorResult[] = [];\n const [validateItem, ...arrayTests] = allTests;\n\n for (const validatorTest of arrayTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(arrayValue, field);\n if (result.state === 'invalid') {\n isValid = false;\n arrayInvalidResult = result;\n break;\n }\n }\n\n if (arrayValue && validateItem) {\n for (const [index, item] of arrayValue.entries()) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validateItem(\n item,\n field ? `${field}[${index}]` : `[${index}]`\n );\n\n if (result.state === 'invalid') {\n isValid = false;\n errors.push({\n errors: result.errors,\n index,\n message: result.message,\n });\n }\n }\n }\n\n if (isValid) {\n return valid({\n value: arrayValue,\n field,\n });\n }\n\n return invalid({\n message:\n arrayInvalidResult?.state === 'invalid'\n ? arrayInvalidResult.message\n : '',\n value,\n field,\n errors,\n });\n };\n}\n","import { ConfigBase, createTypeValidatorTest } from './shared';\n\n/**\n * Parses a value into a boolean.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseBoolean(value: unknown): boolean | null | undefined {\n if (value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n return Boolean(value);\n}\n\n/**\n * Applies a configuration to the boolean value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyBooleanConfig(\n value: unknown,\n config: BooleanConfig\n): boolean | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Configuration for boolean validation.\n * @category Types\n */\nexport type BooleanConfig = ConfigBase<boolean>;\n\n/**\n * Validates a boolean value.\n * @category Type Validators\n */\nexport const boolean = createTypeValidatorTest(\n { parser: parseBoolean },\n applyBooleanConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** Badly formatted date for internal use. */\nexport const invalidDate = new Date('');\n\n/** @internal */\nconst isoDatePattern =\n /^(\\d{4})(?:-([0-2]\\d)(?:-([0-3]\\d)(?:[ T]([0-2]\\d):([0-5]\\d)(?::([0-5]\\d)(\\.\\d+)?(Z|[+-][0-2]\\d:?[0-5]\\d)?)?)?)?)?$/;\n\n/** @internal */\nconst timezonePattern = /^([+-])([0-2]\\d):?([0-5]\\d)$/;\n\n/**\n * Parses a timezone string.\n * @param timezone Timezone to parse\n * @internal\n */\nfunction parseTimezone(timezone: string): number {\n const parts = timezonePattern.exec(timezone);\n\n if (timezone === 'Z' || !parts) {\n return 0;\n }\n\n const [, sign, hour, minute] = parts;\n const multiplier = sign === '-' ? -1 : 1;\n const hoursInMinutes = Number.parseInt(hour, 10) * 60;\n const offset = hoursInMinutes + Number.parseInt(minute, 10);\n\n return multiplier * offset;\n}\n\nconst BASE = 10;\n\nconst dateParts = [\n // Skip\n () => 0,\n // Year\n (part = '0') => Number.parseInt(part, BASE),\n // Month\n (part = '1') => Number.parseInt(part, BASE) - 1,\n // Day\n (part = '1') => Number.parseInt(part, BASE),\n // Hour\n (part = '0') => Number.parseInt(part, BASE),\n // Minute\n (part = '0') => Number.parseInt(part, BASE),\n // Second\n (part = '0') => Number.parseInt(part, BASE),\n // Millisecond\n (part = '0') => Number.parseFloat(part) * 1e3,\n];\n\n/**\n * Parses a value into a date.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseDate(value: unknown): Date | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (typeof value === 'number') {\n return new Date(value);\n }\n\n if (typeof value !== 'string') {\n return invalidDate;\n }\n\n const parts = isoDatePattern.exec(value);\n\n if (parts === null) {\n return invalidDate;\n }\n\n const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(\n (parse, index) => parse(parts[index])\n );\n\n const timezone = parts[8];\n\n if (!timezone) {\n return new Date(year, month, day, hour, minute, second, millisecond);\n }\n\n const minuteOffset = parseTimezone(timezone);\n\n return new Date(\n Date.UTC(year, month, day, hour, minute + minuteOffset, second, millisecond)\n );\n}\n\n/**\n * Applies a configuration to the date value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyDateConfig(\n value: unknown,\n config: DateConfig\n): Date | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue.getTime()))\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\nexport type SharedDateValueType = Date | string | number;\n\nexport interface MinDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n min: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or after a date.\n * @param limit Minimum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function minDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MinDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date, null> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value > parsedDate : value >= parsedDate))),\n message,\n () => ({\n min: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\nexport interface MaxDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n max: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or before a date.\n * @param limit Maximum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function maxDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MaxDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value < parsedDate : value <= parsedDate))),\n message,\n () => ({\n max: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\n/**\n * Configuration for date validation.\n * @category Types\n */\nexport type DateConfig = ConfigBase<Date>;\n\n/**\n * Validates a date value.\n * @category Type Validators\n */\nexport const date = createTypeValidatorTest(\n { parser: parseDate },\n applyDateConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n invalid,\n valid,\n ValidatorMessage,\n ValidatorTest,\n} from './shared';\n\n/**\n * Parses a value into a number.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseNumber(value: unknown): number | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n if (typeof value === 'string') {\n return Number.parseFloat(value);\n }\n\n return Number.parseFloat(String(value));\n}\n\n/**\n * Applies a configuration to the number value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyNumberConfig(\n value: unknown,\n config: NumberConfig\n): number | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue))\n ) {\n parsedValue = config.default;\n }\n\n if (config.round && typeof parsedValue === 'number') {\n switch (config.round) {\n case 'nearest': {\n parsedValue = Math.round(parsedValue);\n break;\n }\n case 'ceil': {\n parsedValue = Math.ceil(parsedValue);\n break;\n }\n case 'floor': {\n parsedValue = Math.floor(parsedValue);\n break;\n }\n default: {\n throw new Error(`Unknown round type: ${String(config.round)}`);\n }\n }\n }\n\n return parsedValue;\n}\n\n/**\n * Ensures a number value is an integer.\n * @param message Error message\n * @category Validation Tests\n */\nexport function integer(\n message: ValidatorMessage<number>\n): ValidatorTest<number> {\n return async (value, field) => {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'number' &&\n Number.isFinite(value) &&\n Math.floor(value) === value)\n ) {\n return valid({ value, field });\n }\n\n return invalid({\n message,\n value,\n field,\n });\n };\n}\n\n/**\n * Configuration for number validation.\n * @category Types\n */\nexport interface NumberConfig extends ConfigBase<number> {\n /** Apply rounding mechanism before validation. */\n round?: 'nearest' | 'floor' | 'ceil';\n}\n\n/**\n * Validates a number value.\n * @category Type Validators\n */\nexport const number = createTypeValidatorTest(\n {\n parser: parseNumber,\n },\n applyNumberConfig\n);\n","import {\n DeepPartial,\n ExtractError,\n ExtractValue,\n hasOwnProperty,\n invalid,\n valid,\n ValidatorTest,\n} from './shared';\n\nexport type ObjectParameter = Record<string, ValidatorTest<unknown, unknown>>;\n\n/**\n * Validates an object.\n * @category Type Validators\n */\nexport function object<P extends ObjectParameter, K extends keyof P>(\n properties: P\n): ValidatorTest<\n DeepPartial<{ [K in keyof P]?: ExtractValue<P[K]> }>,\n DeepPartial<{ [K in keyof P]?: ExtractError<P[K]> }>\n> {\n if (typeof properties !== 'object' || properties === null) {\n throw new TypeError('`properties` must be a configuration object');\n }\n\n return async (values, field) => {\n const definedValues: { [K in keyof P]?: ExtractValue<P[K]> } =\n (values as { [K in keyof P]?: ExtractValue<P[K]> }) ?? {};\n const errors: { [K in keyof P]?: ExtractError<P[K]> } = {};\n const resolvedValues: { [K in keyof P]?: ExtractValue<P[K]> } = {};\n let isValid = true;\n\n for (const key in properties) {\n if (hasOwnProperty(properties, key)) {\n const validator = properties[key];\n const value = definedValues[key];\n /* eslint-disable no-await-in-loop */\n const result =\n typeof validator === 'function'\n ? await validator(value, key)\n : await invalid({ field: key, message: 'No validator set', value });\n /* eslint-enable no-await-in-loop */\n\n resolvedValues[key] = result.value as ExtractValue<P[K]>;\n\n if (result.state === 'invalid') {\n isValid = false;\n errors[key] = (result.message || result.errors) as ExtractError<P[K]>;\n }\n }\n }\n\n if (isValid) {\n return valid({ value: resolvedValues, field });\n }\n\n return invalid({\n message: '',\n value: values,\n field,\n errors,\n });\n };\n}\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n isObject,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** @internal */\nconst emailPattern =\n /^[\\w!#$%&'*+./=?^`{|}~-]+@[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?(?:\\.[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?)*$/;\n\n/**\n * Configuration for string validation.\n * @category Types\n */\nexport interface StringConfig extends ConfigBase<string> {\n /** Apply trim to string before validation. */\n trim?: boolean;\n}\n\n/**\n * Parses a value into a string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseString(value: unknown): string | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (isObject(value)) {\n throw new TypeError('Failed to parse value to string.');\n }\n\n return String(value);\n}\n\n/**\n * Applies a configuration to the string value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyStringConfig(\n value: unknown,\n config: StringConfig\n): string | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null || parsedValue === '')\n ) {\n parsedValue = config.default;\n }\n\n if (config.trim && typeof parsedValue === 'string') {\n parsedValue = parsedValue.trim();\n }\n\n return parsedValue;\n}\n\nexport interface MatchesValidatorMessageParameters\n extends ValidatorMessageParameters<string> {\n pattern: RegExp;\n}\n\n/**\n * Ensures a string value matches a pattern\n * @param pattern Pattern to match\n * @param message Error message\n * @category Validation Tests\n */\nexport function matches(\n pattern: RegExp,\n message: ValidatorMessage<string, MatchesValidatorMessageParameters>\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && pattern.test(value)),\n message,\n () => ({ pattern })\n );\n}\n\n/**\n * Ensures a string value matches an email pattern\n * @param message Error message\n * @category Validation Tests\n */\nexport function email(\n message: ValidatorMessage<string>\n): ValidatorTest<string> {\n return matches(emailPattern, message);\n}\n\n/**\n * Ensures a string value is a valid URL\n * @param message Error message\n * @param protocols Optional list of protocols to allow\n * @category Validation Tests\n */\nexport function url(\n message: ValidatorMessage<string>,\n protocols?: string[]\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) => {\n try {\n let url: URL | undefined;\n if (\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && (url = new URL(value)))\n ) {\n return !(url && protocols && !protocols.includes(url.protocol));\n }\n } catch {\n // Do nothing\n }\n\n return false;\n },\n message,\n () => ({ protocols })\n );\n}\n\n/**\n * Validates a string value.\n * @category Type Validators\n */\nexport const string = createTypeValidatorTest(\n {\n parser: parseString,\n },\n applyStringConfig\n);\n"],"names":["url"],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -7,7 +7,10 @@ function hasOwnProperty(object, property) {
|
|
|
7
7
|
const formatPattern = /{(\w+)}/g;
|
|
8
8
|
function formatMessage(template, parameters) {
|
|
9
9
|
if (typeof template === "string") {
|
|
10
|
-
return template.replace(
|
|
10
|
+
return template.replace(
|
|
11
|
+
formatPattern,
|
|
12
|
+
(_, key) => String(parameters[key])
|
|
13
|
+
);
|
|
11
14
|
}
|
|
12
15
|
return template(parameters);
|
|
13
16
|
}
|
|
@@ -93,45 +96,64 @@ function createValidatorTest(test, message, getExtras) {
|
|
|
93
96
|
};
|
|
94
97
|
}
|
|
95
98
|
function required(message, nullable) {
|
|
96
|
-
return createValidatorTest(
|
|
99
|
+
return createValidatorTest(
|
|
100
|
+
(value) => nullable && value === null || value !== null && value !== void 0 && !(typeof value === "string" && value === "") && !(typeof value === "number" && Number.isNaN(value)) && !(value instanceof Date && Number.isNaN(value.valueOf())),
|
|
101
|
+
message
|
|
102
|
+
);
|
|
97
103
|
}
|
|
98
104
|
function getAmount(value) {
|
|
99
105
|
return typeof value === "string" || Array.isArray(value) ? value.length : value;
|
|
100
106
|
}
|
|
101
107
|
function max(limit, message, exclusive) {
|
|
102
|
-
return createValidatorTest(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
return createValidatorTest(
|
|
109
|
+
(value) => {
|
|
110
|
+
const amount = getAmount(value);
|
|
111
|
+
return amount === void 0 || amount === null || value === "" || (exclusive ? amount < limit : amount <= limit);
|
|
112
|
+
},
|
|
113
|
+
message,
|
|
114
|
+
(value) => ({
|
|
115
|
+
max: limit,
|
|
116
|
+
limit,
|
|
117
|
+
amount: getAmount(value),
|
|
118
|
+
exclusive
|
|
119
|
+
})
|
|
120
|
+
);
|
|
111
121
|
}
|
|
112
122
|
function min(limit, message, exclusive) {
|
|
113
|
-
return createValidatorTest(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
123
|
+
return createValidatorTest(
|
|
124
|
+
(value) => {
|
|
125
|
+
const amount = getAmount(value);
|
|
126
|
+
return amount === void 0 || amount === null || value === "" || (exclusive ? amount > limit : amount >= limit);
|
|
127
|
+
},
|
|
128
|
+
message,
|
|
129
|
+
(value) => ({
|
|
130
|
+
min: limit,
|
|
131
|
+
limit,
|
|
132
|
+
amount: getAmount(value),
|
|
133
|
+
exclusive
|
|
134
|
+
})
|
|
135
|
+
);
|
|
122
136
|
}
|
|
123
137
|
function exact(limit, message) {
|
|
124
|
-
return createValidatorTest(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
138
|
+
return createValidatorTest(
|
|
139
|
+
(value) => {
|
|
140
|
+
const amount = getAmount(value);
|
|
141
|
+
return amount === void 0 || amount === null || value === "" || amount === limit;
|
|
142
|
+
},
|
|
143
|
+
message,
|
|
144
|
+
(value) => ({
|
|
145
|
+
amount: getAmount(value),
|
|
146
|
+
limit,
|
|
147
|
+
exact: limit
|
|
148
|
+
})
|
|
149
|
+
);
|
|
132
150
|
}
|
|
133
151
|
function oneOf(values, message) {
|
|
134
|
-
return createValidatorTest(
|
|
152
|
+
return createValidatorTest(
|
|
153
|
+
(value) => value === void 0 || value === null || values.includes(value) || value instanceof Date && values.some((x) => x.valueOf() === value.valueOf()),
|
|
154
|
+
message,
|
|
155
|
+
() => ({ values })
|
|
156
|
+
);
|
|
135
157
|
}
|
|
136
158
|
|
|
137
159
|
function parseArray(value) {
|
|
@@ -185,7 +207,10 @@ function array(config, ...tests) {
|
|
|
185
207
|
}
|
|
186
208
|
if (arrayValue && validateItem) {
|
|
187
209
|
for (const [index, item] of arrayValue.entries()) {
|
|
188
|
-
const result = await validateItem(
|
|
210
|
+
const result = await validateItem(
|
|
211
|
+
item,
|
|
212
|
+
field ? `${field}[${index}]` : `[${index}]`
|
|
213
|
+
);
|
|
189
214
|
if (result.state === "invalid") {
|
|
190
215
|
isValid = false;
|
|
191
216
|
errors.push({
|
|
@@ -227,7 +252,10 @@ function applyBooleanConfig(value, config) {
|
|
|
227
252
|
}
|
|
228
253
|
return parsedValue;
|
|
229
254
|
}
|
|
230
|
-
const boolean = createTypeValidatorTest(
|
|
255
|
+
const boolean = createTypeValidatorTest(
|
|
256
|
+
{ parser: parseBoolean },
|
|
257
|
+
applyBooleanConfig
|
|
258
|
+
);
|
|
231
259
|
|
|
232
260
|
const invalidDate = new Date("");
|
|
233
261
|
const isoDatePattern = /^(\d{4})(?:-([0-2]\d)(?:-([0-3]\d)(?:[ T]([0-2]\d):([0-5]\d)(?::([0-5]\d)(\.\d+)?(Z|[+-][0-2]\d:?[0-5]\d)?)?)?)?)?$/;
|
|
@@ -271,13 +299,17 @@ function parseDate(value) {
|
|
|
271
299
|
if (parts === null) {
|
|
272
300
|
return invalidDate;
|
|
273
301
|
}
|
|
274
|
-
const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(
|
|
302
|
+
const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(
|
|
303
|
+
(parse, index) => parse(parts[index])
|
|
304
|
+
);
|
|
275
305
|
const timezone = parts[8];
|
|
276
306
|
if (!timezone) {
|
|
277
307
|
return new Date(year, month, day, hour, minute, second, millisecond);
|
|
278
308
|
}
|
|
279
309
|
const minuteOffset = parseTimezone(timezone);
|
|
280
|
-
return new Date(
|
|
310
|
+
return new Date(
|
|
311
|
+
Date.UTC(year, month, day, hour, minute + minuteOffset, second, millisecond)
|
|
312
|
+
);
|
|
281
313
|
}
|
|
282
314
|
function applyDateConfig(value, config) {
|
|
283
315
|
let parsedValue = config.parser(value);
|
|
@@ -288,21 +320,32 @@ function applyDateConfig(value, config) {
|
|
|
288
320
|
}
|
|
289
321
|
function minDate(limit, message, exclusive) {
|
|
290
322
|
const parsedDate = parseDate(limit);
|
|
291
|
-
return createValidatorTest(
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
323
|
+
return createValidatorTest(
|
|
324
|
+
(value) => parsedDate !== null && parsedDate !== void 0 && (value === null || value === void 0 || value instanceof Date && (exclusive ? value > parsedDate : value >= parsedDate)),
|
|
325
|
+
message,
|
|
326
|
+
() => ({
|
|
327
|
+
min: parsedDate,
|
|
328
|
+
limit: parsedDate,
|
|
329
|
+
exclusive
|
|
330
|
+
})
|
|
331
|
+
);
|
|
296
332
|
}
|
|
297
333
|
function maxDate(limit, message, exclusive) {
|
|
298
334
|
const parsedDate = parseDate(limit);
|
|
299
|
-
return createValidatorTest(
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
335
|
+
return createValidatorTest(
|
|
336
|
+
(value) => parsedDate !== null && parsedDate !== void 0 && (value === null || value === void 0 || value instanceof Date && (exclusive ? value < parsedDate : value <= parsedDate)),
|
|
337
|
+
message,
|
|
338
|
+
() => ({
|
|
339
|
+
max: parsedDate,
|
|
340
|
+
limit: parsedDate,
|
|
341
|
+
exclusive
|
|
342
|
+
})
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
const date = createTypeValidatorTest(
|
|
346
|
+
{ parser: parseDate },
|
|
347
|
+
applyDateConfig
|
|
348
|
+
);
|
|
306
349
|
|
|
307
350
|
function parseNumber(value) {
|
|
308
351
|
if (value === null || value === void 0) {
|
|
@@ -326,17 +369,21 @@ function applyNumberConfig(value, config) {
|
|
|
326
369
|
}
|
|
327
370
|
if (config.round && typeof parsedValue === "number") {
|
|
328
371
|
switch (config.round) {
|
|
329
|
-
case "nearest":
|
|
372
|
+
case "nearest": {
|
|
330
373
|
parsedValue = Math.round(parsedValue);
|
|
331
374
|
break;
|
|
332
|
-
|
|
375
|
+
}
|
|
376
|
+
case "ceil": {
|
|
333
377
|
parsedValue = Math.ceil(parsedValue);
|
|
334
378
|
break;
|
|
335
|
-
|
|
379
|
+
}
|
|
380
|
+
case "floor": {
|
|
336
381
|
parsedValue = Math.floor(parsedValue);
|
|
337
382
|
break;
|
|
338
|
-
|
|
383
|
+
}
|
|
384
|
+
default: {
|
|
339
385
|
throw new Error(`Unknown round type: ${String(config.round)}`);
|
|
386
|
+
}
|
|
340
387
|
}
|
|
341
388
|
}
|
|
342
389
|
return parsedValue;
|
|
@@ -353,9 +400,12 @@ function integer(message) {
|
|
|
353
400
|
});
|
|
354
401
|
};
|
|
355
402
|
}
|
|
356
|
-
const number = createTypeValidatorTest(
|
|
357
|
-
|
|
358
|
-
|
|
403
|
+
const number = createTypeValidatorTest(
|
|
404
|
+
{
|
|
405
|
+
parser: parseNumber
|
|
406
|
+
},
|
|
407
|
+
applyNumberConfig
|
|
408
|
+
);
|
|
359
409
|
|
|
360
410
|
function object(properties) {
|
|
361
411
|
if (typeof properties !== "object" || properties === null) {
|
|
@@ -417,26 +467,37 @@ function applyStringConfig(value, config) {
|
|
|
417
467
|
return parsedValue;
|
|
418
468
|
}
|
|
419
469
|
function matches(pattern, message) {
|
|
420
|
-
return createValidatorTest(
|
|
470
|
+
return createValidatorTest(
|
|
471
|
+
(value) => value === void 0 || value === null || value === "" || typeof value === "string" && pattern.test(value),
|
|
472
|
+
message,
|
|
473
|
+
() => ({ pattern })
|
|
474
|
+
);
|
|
421
475
|
}
|
|
422
476
|
function email(message) {
|
|
423
477
|
return matches(emailPattern, message);
|
|
424
478
|
}
|
|
425
479
|
function url(message, protocols) {
|
|
426
|
-
return createValidatorTest(
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
480
|
+
return createValidatorTest(
|
|
481
|
+
(value) => {
|
|
482
|
+
try {
|
|
483
|
+
let url2;
|
|
484
|
+
if (value === void 0 || value === null || value === "" || typeof value === "string" && (url2 = new URL(value))) {
|
|
485
|
+
return !(url2 && protocols && !protocols.includes(url2.protocol));
|
|
486
|
+
}
|
|
487
|
+
} catch {
|
|
431
488
|
}
|
|
432
|
-
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
489
|
+
return false;
|
|
490
|
+
},
|
|
491
|
+
message,
|
|
492
|
+
() => ({ protocols })
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
const string = createTypeValidatorTest(
|
|
496
|
+
{
|
|
497
|
+
parser: parseString
|
|
498
|
+
},
|
|
499
|
+
applyStringConfig
|
|
500
|
+
);
|
|
440
501
|
|
|
441
502
|
export { applyArrayConfig, applyBooleanConfig, applyDateConfig, applyNumberConfig, applyStringConfig, array, boolean, createTypeValidatorTest, createValidatorTest, date, email, exact, formatMessage, hasOwnProperty, integer, invalid, invalidDate, isObject, matches, max, maxDate, min, minDate, number, object, oneOf, parseArray, parseBoolean, parseDate, parseNumber, parseString, required, string, url, valid };
|
|
442
503
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/shared.ts","../../src/arrays.ts","../../src/booleans.ts","../../src/dates.ts","../../src/numbers.ts","../../src/objects.ts","../../src/strings.ts"],"sourcesContent":["/**\n * From type-fest: https://github.com/sindresorhus/type-fest/blob/HEAD/source/except.d.ts\n * @internal\n */\ntype Except<ObjectType, KeysType extends keyof ObjectType> = Pick<\n ObjectType,\n Exclude<keyof ObjectType, KeysType>\n>;\n\nexport type ValidResult<T> = {\n /**\n * True if the original value is valid according to all validation tests\n * @deprecated Use `state` instead.\n */\n isValid: true;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'valid';\n /** The parsed value. Note that may be different than the original value. */\n value: T | null | undefined;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n};\n\nexport type InvalidResult<E> = {\n /**\n * True if the original value is valid according to all validation tests.\n * @deprecated Use `state` instead.\n */\n isValid: false;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'invalid';\n /** The parsed value. Note that may be different than the original value. */\n value: unknown;\n /** Error message if `state` is invalid. */\n message: string;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n /** Extra error details */\n errors?: E;\n};\n\n/**\n * The result of a validation.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorResult<T = any, E = any> =\n | ValidResult<T>\n | InvalidResult<E>;\n\n/**\n * Validation test function.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorTest<T = any, E = any> = (\n value?: unknown,\n field?: string\n) => Promise<ValidatorResult<T, E>>;\n\n/**\n * Extracts the generic error type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractError<T extends ValidatorTest> = T extends ValidatorTest<\n any,\n infer E\n>\n ? E\n : unknown;\n\n/**\n * Extracts the generic value type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractValue<T extends ValidatorTest> = T extends ValidatorTest<\n infer V\n>\n ? V\n : unknown;\n\n/**\n * Make a deep partial type.\n * @typeParam T any object type\n * @category Types\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n/**\n * Validation factory function.\n * @typeParam C The configuration type\n * @category Types\n */\nexport type ValidatorFactory<C, T, E> = (\n config?: Partial<C> | ValidatorTest,\n ...tests: ValidatorTest[]\n) => ValidatorTest<T, E>;\n\n/**\n * Base configuration type.\n * @typeParam T The target type.\n * @category Types\n */\nexport interface ConfigBase<T> {\n /** Parser to convert value into the designated type. */\n parser: (value: unknown) => T | null | undefined;\n /** Provide a fallback value in case the original value is undefined. */\n default?: T;\n}\n\nexport interface ValidatorMessageParameters<T> {\n value: T | null | undefined;\n field: string | undefined;\n}\n\n/**\n * Validation message. May be a plain string or a function that accepts arguments.\n * While using a string, values in squiggly brackets `{}` are replaced.\n * @category Types\n */\nexport type ValidatorMessage<\n T,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n> = string | ((parameters: P) => string);\n\n/**\n * Simple check for objects.\n * @param value Value to test\n */\nexport function isObject(value: unknown): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Safe hasOwnProperty check\n * @param obj Object to check\n * @param prop Property to look for\n */\nexport function hasOwnProperty(\n object: unknown,\n property: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\n/** @internal */\nconst formatPattern = /{(\\w+)}/g;\n\n/**\n * Formats a message using a squiggly bracket `{}` template.\n * @param template Message template as string or function\n * @param params Params to inject into template\n * @category Helpers\n */\nexport function formatMessage<T, P extends ValidatorMessageParameters<T>>(\n template: ValidatorMessage<T, P>,\n parameters: P\n): string {\n if (typeof template === 'string') {\n return template.replace(formatPattern, (_, key: string) =>\n String((parameters as Record<string, unknown>)[key])\n );\n }\n\n return template(parameters);\n}\n\n/**\n * Creates a valid result\n * @param value Parsed value\n * @param field Field name\n * @category Helpers\n */\nexport async function valid<T, E = never>({\n value,\n field,\n}: {\n value: T | null | undefined;\n field: string | undefined;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: true,\n state: 'valid',\n value,\n field,\n };\n}\n\n/**\n * Creates an invalid result.\n * @param message Error message\n * @param value Parsed value\n * @param field Field name\n * @param extras Extra message params\n * @category Helpers\n */\nexport async function invalid<T, E, P extends ValidatorMessageParameters<T>>({\n errors,\n field,\n message,\n value,\n extras,\n}: {\n message: ValidatorMessage<T, P>;\n value: unknown;\n field: string | undefined;\n errors?: E;\n extras?: Except<P, 'field' | 'value'>;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: false,\n state: 'invalid',\n message: formatMessage(message, { ...extras, value, field } as P),\n value,\n field,\n errors,\n };\n}\n\n/**\n * Creates a type validator.\n * @typeParam T The basic type for the final value to be validated.\n * @typeParam C The configuration type.\n * @param defaultParser Parser to convert value into type.\n * @param applyConfig Function that applies configuration to value.\n * @category Helpers\n */\nexport function createTypeValidatorTest<T, C extends ConfigBase<T>, E>(\n defaultConfig: C,\n applyConfig: (value: unknown, config: C) => T | null | undefined\n): ValidatorFactory<C, T, E> {\n return (config, ...tests) => {\n const cache: Record<string, ValidatorResult<T>> = {};\n let finalConfig = defaultConfig;\n let allTests = tests;\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...defaultConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n try {\n const parsedValue = applyConfig(value, finalConfig);\n const parsedValueString = String(parsedValue);\n if (hasOwnProperty(cache, parsedValueString)) {\n return cache[parsedValueString];\n }\n\n for (const validatorTest of allTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(parsedValue, field);\n if (result.state === 'invalid') {\n cache[parsedValueString] = result;\n return result;\n }\n }\n\n cache[parsedValueString] = await valid({ value: parsedValue, field });\n return cache[parsedValueString];\n } catch (error) {\n return invalid({\n message: error instanceof Error ? error.message : String(error),\n value,\n field,\n });\n }\n };\n };\n}\n\n/**\n * Captures basic validator test pattern\n * @param test Test function\n * @param message Error message\n * @param getExtras Optional extra fields for error message\n */\nexport function createValidatorTest<\n T = any,\n E = any,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n>(\n test: (value: unknown, field?: string) => boolean,\n message: ValidatorMessage<T, P>,\n getExtras?: (value: T | null | undefined) => Except<P, 'value' | 'field'>\n): ValidatorTest<T, E> {\n return async (value, field) => {\n if (test(value, field)) {\n return valid({ value: value as T, field });\n }\n\n return invalid({\n message,\n value,\n field,\n extras: getExtras ? getExtras(value as T) : undefined,\n });\n };\n}\n\n/**\n * Ensures a value is not undefined, null, empty string, NaN, nor invalid date.\n * @param message Error message\n * @param nullable Allow null values\n * @category Validation Tests\n */\nexport function required<T, P extends ValidatorMessageParameters<T>>(\n message: ValidatorMessage<T, P>,\n nullable?: boolean\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n (nullable && value === null) ||\n (value !== null &&\n value !== undefined &&\n !(typeof value === 'string' && value === '') &&\n !(typeof value === 'number' && Number.isNaN(value)) &&\n !(value instanceof Date && Number.isNaN(value.valueOf()))),\n message\n );\n}\n\nexport type SharedValueType = string | number | unknown[];\n\n/**\n * Extracts a numeric amount from value, i.e. string length, array length, or number.\n * @internal\n */\nfunction getAmount(value: SharedValueType | null | undefined) {\n return typeof value === 'string' || Array.isArray(value)\n ? value.length\n : value;\n}\n\nexport interface MaxValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n max: number;\n amount: number | null | undefined;\n limit: number;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function max(\n limit: number,\n message: ValidatorMessage<SharedValueType, MaxValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount < limit : amount <= limit)\n );\n },\n message,\n (value) => ({\n max: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface MinValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n min: number;\n limit: number;\n amount: number | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function min(\n limit: number,\n message: ValidatorMessage<SharedValueType, MinValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount > limit : amount >= limit)\n );\n },\n message,\n (value) => ({\n min: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface ExactValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n limit: number;\n amount: number | null | undefined;\n exact: number;\n}\n\n/**\n * Ensures a string, number, or array value is exactly a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @category Validation Tests\n */\nexport function exact(\n limit: number,\n message: ValidatorMessage<SharedValueType, ExactValidatorMessageParameters>\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n amount === limit\n );\n },\n message,\n (value) => ({\n amount: getAmount(value),\n limit,\n exact: limit,\n })\n );\n}\n\nexport interface OneOfValidatorMessageParameters<T>\n extends ValidatorMessageParameters<T> {\n values: readonly T[];\n}\n\n/**\n * Ensures a value is one in a predefined list.\n * @param values List of allowed values.\n * @param message Error message\n * @category Validation Tests\n */\nexport function oneOf<T extends string | number | boolean | Date>(\n values: readonly T[],\n message: ValidatorMessage<T, OneOfValidatorMessageParameters<T>>\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n values.includes(value as T) ||\n (value instanceof Date &&\n values.some((x) => x.valueOf() === value.valueOf())),\n message,\n () => ({ values })\n );\n}\n","import {\n ConfigBase,\n invalid,\n valid,\n ValidatorResult,\n ValidatorTest,\n} from './shared';\n\n/**\n * Invalid validation result for an item in the array\n * @category Types\n */\nexport interface ArrayItemValidatorResult {\n /** The index of the item in the original array */\n index: number;\n /** The error message if a simple type */\n message: string;\n /** The errors if an object or array */\n errors: unknown;\n}\n\n/**\n * Configuration for array validation.\n * @category Types\n */\nexport type ArrayConfig = ConfigBase<unknown[]>;\n\n/**\n * Parses a value into an array.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseArray(value: unknown): unknown[] | null | undefined {\n if (Array.isArray(value)) {\n return value as unknown[];\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const iterable = value as Iterable<unknown>;\n\n if (iterable[Symbol.iterator]) {\n return [...iterable];\n }\n\n return [];\n}\n\n/**\n * Applies a configuration to the array value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyArrayConfig<T>(\n config: ArrayConfig,\n value: unknown\n): T[] | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n parsedValue.length === 0)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue as T[];\n}\n\n/**\n * Validates an array. The first passed validator is used to validate individual\n * items. The remaining validators target the array itself.\n * @category Type Validators\n */\nexport function array<T>(\n config?: Partial<ArrayConfig> | ValidatorTest<T>,\n ...tests: ValidatorTest[]\n): ValidatorTest<T[], ArrayItemValidatorResult[]> {\n let allTests = tests;\n let finalConfig: ArrayConfig = {\n parser: parseArray,\n };\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...finalConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n const arrayValue = applyArrayConfig<T>(finalConfig, value);\n let arrayInvalidResult: ValidatorResult | undefined;\n let isValid = true;\n const errors: ArrayItemValidatorResult[] = [];\n const [validateItem, ...arrayTests] = allTests;\n\n for (const validatorTest of arrayTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(arrayValue, field);\n if (result.state === 'invalid') {\n isValid = false;\n arrayInvalidResult = result;\n break;\n }\n }\n\n if (arrayValue && validateItem) {\n for (const [index, item] of arrayValue.entries()) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validateItem(\n item,\n field ? `${field}[${index}]` : `[${index}]`\n );\n\n if (result.state === 'invalid') {\n isValid = false;\n errors.push({\n errors: result.errors,\n index,\n message: result.message,\n });\n }\n }\n }\n\n if (isValid) {\n return valid({\n value: arrayValue,\n field,\n });\n }\n\n return invalid({\n message:\n arrayInvalidResult?.state === 'invalid'\n ? arrayInvalidResult.message\n : '',\n value,\n field,\n errors,\n });\n };\n}\n","import { ConfigBase, createTypeValidatorTest } from './shared';\n\n/**\n * Parses a value into a boolean.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseBoolean(value: unknown): boolean | null | undefined {\n if (value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n return Boolean(value);\n}\n\n/**\n * Applies a configuration to the boolean value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyBooleanConfig(\n value: unknown,\n config: BooleanConfig\n): boolean | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Configuration for boolean validation.\n * @category Types\n */\nexport type BooleanConfig = ConfigBase<boolean>;\n\n/**\n * Validates a boolean value.\n * @category Type Validators\n */\nexport const boolean = createTypeValidatorTest(\n { parser: parseBoolean },\n applyBooleanConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** Badly formatted date for internal use. */\nexport const invalidDate = new Date('');\n\n/** @internal */\nconst isoDatePattern =\n /^(\\d{4})(?:-([0-2]\\d)(?:-([0-3]\\d)(?:[ T]([0-2]\\d):([0-5]\\d)(?::([0-5]\\d)(\\.\\d+)?(Z|[+-][0-2]\\d:?[0-5]\\d)?)?)?)?)?$/;\n\n/** @internal */\nconst timezonePattern = /^([+-])([0-2]\\d):?([0-5]\\d)$/;\n\n/**\n * Parses a timezone string.\n * @param timezone Timezone to parse\n * @internal\n */\nfunction parseTimezone(timezone: string): number {\n const parts = timezonePattern.exec(timezone);\n\n if (timezone === 'Z' || !parts) {\n return 0;\n }\n\n const [, sign, hour, minute] = parts;\n const multiplier = sign === '-' ? -1 : 1;\n const hoursInMinutes = Number.parseInt(hour, 10) * 60;\n const offset = hoursInMinutes + Number.parseInt(minute, 10);\n\n return multiplier * offset;\n}\n\nconst BASE = 10;\n\nconst dateParts = [\n // Skip\n () => 0,\n // Year\n (part = '0') => Number.parseInt(part, BASE),\n // Month\n (part = '1') => Number.parseInt(part, BASE) - 1,\n // Day\n (part = '1') => Number.parseInt(part, BASE),\n // Hour\n (part = '0') => Number.parseInt(part, BASE),\n // Minute\n (part = '0') => Number.parseInt(part, BASE),\n // Second\n (part = '0') => Number.parseInt(part, BASE),\n // Millisecond\n (part = '0') => Number.parseFloat(part) * 1e3,\n];\n\n/**\n * Parses a value into a date.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseDate(value: unknown): Date | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (typeof value === 'number') {\n return new Date(value);\n }\n\n if (typeof value !== 'string') {\n return invalidDate;\n }\n\n const parts = isoDatePattern.exec(value);\n\n if (parts === null) {\n return invalidDate;\n }\n\n const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(\n (parse, index) => parse(parts[index])\n );\n\n const timezone = parts[8];\n\n if (!timezone) {\n return new Date(year, month, day, hour, minute, second, millisecond);\n }\n\n const minuteOffset = parseTimezone(timezone);\n\n return new Date(\n Date.UTC(year, month, day, hour, minute + minuteOffset, second, millisecond)\n );\n}\n\n/**\n * Applies a configuration to the date value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyDateConfig(\n value: unknown,\n config: DateConfig\n): Date | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue.getTime()))\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\nexport type SharedDateValueType = Date | string | number;\n\nexport interface MinDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n min: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or after a date.\n * @param limit Minimum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function minDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MinDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date, null> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value > parsedDate : value >= parsedDate))),\n message,\n () => ({\n min: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\nexport interface MaxDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n max: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or before a date.\n * @param limit Maximum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function maxDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MaxDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value < parsedDate : value <= parsedDate))),\n message,\n () => ({\n max: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\n/**\n * Configuration for date validation.\n * @category Types\n */\nexport type DateConfig = ConfigBase<Date>;\n\n/**\n * Validates a date value.\n * @category Type Validators\n */\nexport const date = createTypeValidatorTest(\n { parser: parseDate },\n applyDateConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n invalid,\n valid,\n ValidatorMessage,\n ValidatorTest,\n} from './shared';\n\n/**\n * Parses a value into a number.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseNumber(value: unknown): number | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n if (typeof value === 'string') {\n return Number.parseFloat(value);\n }\n\n return Number.parseFloat(String(value));\n}\n\n/**\n * Applies a configuration to the number value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyNumberConfig(\n value: unknown,\n config: NumberConfig\n): number | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue))\n ) {\n parsedValue = config.default;\n }\n\n if (config.round && typeof parsedValue === 'number') {\n switch (config.round) {\n case 'nearest':\n parsedValue = Math.round(parsedValue);\n break;\n case 'ceil':\n parsedValue = Math.ceil(parsedValue);\n break;\n case 'floor':\n parsedValue = Math.floor(parsedValue);\n break;\n default:\n throw new Error(`Unknown round type: ${String(config.round)}`);\n }\n }\n\n return parsedValue;\n}\n\n/**\n * Ensures a number value is an integer.\n * @param message Error message\n * @category Validation Tests\n */\nexport function integer(\n message: ValidatorMessage<number>\n): ValidatorTest<number> {\n return async (value, field) => {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'number' &&\n Number.isFinite(value) &&\n Math.floor(value) === value)\n ) {\n return valid({ value, field });\n }\n\n return invalid({\n message,\n value,\n field,\n });\n };\n}\n\n/**\n * Configuration for number validation.\n * @category Types\n */\nexport interface NumberConfig extends ConfigBase<number> {\n /** Apply rounding mechanism before validation. */\n round?: 'nearest' | 'floor' | 'ceil';\n}\n\n/**\n * Validates a number value.\n * @category Type Validators\n */\nexport const number = createTypeValidatorTest(\n {\n parser: parseNumber,\n },\n applyNumberConfig\n);\n","import {\n DeepPartial,\n ExtractError,\n ExtractValue,\n hasOwnProperty,\n invalid,\n valid,\n ValidatorTest,\n} from './shared';\n\nexport type ObjectParameter = Record<string, ValidatorTest<unknown, unknown>>;\n\n/**\n * Validates an object.\n * @category Type Validators\n */\nexport function object<P extends ObjectParameter, K extends keyof P>(\n properties: P\n): ValidatorTest<\n DeepPartial<{ [K in keyof P]?: ExtractValue<P[K]> }>,\n DeepPartial<{ [K in keyof P]?: ExtractError<P[K]> }>\n> {\n if (typeof properties !== 'object' || properties === null) {\n throw new TypeError('`properties` must be a configuration object');\n }\n\n return async (values, field) => {\n const definedValues: { [K in keyof P]?: ExtractValue<P[K]> } =\n (values as { [K in keyof P]?: ExtractValue<P[K]> }) ?? {};\n const errors: { [K in keyof P]?: ExtractError<P[K]> } = {};\n const resolvedValues: { [K in keyof P]?: ExtractValue<P[K]> } = {};\n let isValid = true;\n\n for (const key in properties) {\n if (hasOwnProperty(properties, key)) {\n const validator = properties[key];\n const value = definedValues[key];\n /* eslint-disable no-await-in-loop */\n const result =\n typeof validator === 'function'\n ? await validator(value, key)\n : await invalid({ field: key, message: 'No validator set', value });\n /* eslint-enable no-await-in-loop */\n\n resolvedValues[key] = result.value as ExtractValue<P[K]>;\n\n if (result.state === 'invalid') {\n isValid = false;\n errors[key] = (result.message || result.errors) as ExtractError<P[K]>;\n }\n }\n }\n\n if (isValid) {\n return valid({ value: resolvedValues, field });\n }\n\n return invalid({\n message: '',\n value: values,\n field,\n errors,\n });\n };\n}\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n isObject,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** @internal */\nconst emailPattern =\n /^[\\w!#$%&'*+./=?^`{|}~-]+@[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?(?:\\.[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?)*$/;\n\n/**\n * Configuration for string validation.\n * @category Types\n */\nexport interface StringConfig extends ConfigBase<string> {\n /** Apply trim to string before validation. */\n trim?: boolean;\n}\n\n/**\n * Parses a value into a string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseString(value: unknown): string | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (isObject(value)) {\n throw new TypeError('Failed to parse value to string.');\n }\n\n return String(value);\n}\n\n/**\n * Applies a configuration to the string value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyStringConfig(\n value: unknown,\n config: StringConfig\n): string | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null || parsedValue === '')\n ) {\n parsedValue = config.default;\n }\n\n if (config.trim && typeof parsedValue === 'string') {\n parsedValue = parsedValue.trim();\n }\n\n return parsedValue;\n}\n\nexport interface MatchesValidatorMessageParameters\n extends ValidatorMessageParameters<string> {\n pattern: RegExp;\n}\n\n/**\n * Ensures a string value matches a pattern\n * @param pattern Pattern to match\n * @param message Error message\n * @category Validation Tests\n */\nexport function matches(\n pattern: RegExp,\n message: ValidatorMessage<string, MatchesValidatorMessageParameters>\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && pattern.test(value)),\n message,\n () => ({ pattern })\n );\n}\n\n/**\n * Ensures a string value matches an email pattern\n * @param message Error message\n * @category Validation Tests\n */\nexport function email(\n message: ValidatorMessage<string>\n): ValidatorTest<string> {\n return matches(emailPattern, message);\n}\n\n/**\n * Ensures a string value is a valid URL\n * @param message Error message\n * @param protocols Optional list of protocols to allow\n * @category Validation Tests\n */\nexport function url(\n message: ValidatorMessage<string>,\n protocols?: string[]\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) => {\n try {\n let url: URL | undefined;\n if (\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && (url = new URL(value)))\n ) {\n return !(url && protocols && !protocols.includes(url.protocol));\n }\n } catch {\n // Do nothing\n }\n\n return false;\n },\n message,\n () => ({ protocols })\n );\n}\n\n/**\n * Validates a string value.\n * @category Type Validators\n */\nexport const string = createTypeValidatorTest(\n {\n parser: parseString,\n },\n applyStringConfig\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/shared.ts","../../src/arrays.ts","../../src/booleans.ts","../../src/dates.ts","../../src/numbers.ts","../../src/objects.ts","../../src/strings.ts"],"sourcesContent":["/**\n * From type-fest: https://github.com/sindresorhus/type-fest/blob/HEAD/source/except.d.ts\n * @internal\n */\ntype Except<ObjectType, KeysType extends keyof ObjectType> = Pick<\n ObjectType,\n Exclude<keyof ObjectType, KeysType>\n>;\n\nexport type ValidResult<T> = {\n /**\n * True if the original value is valid according to all validation tests\n * @deprecated Use `state` instead.\n */\n isValid: true;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'valid';\n /** The parsed value. Note that may be different than the original value. */\n value: T | null | undefined;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n};\n\nexport type InvalidResult<E> = {\n /**\n * True if the original value is valid according to all validation tests.\n * @deprecated Use `state` instead.\n */\n isValid: false;\n /** This is preferred to use over `isValid` as it works better for type guards. */\n state: 'invalid';\n /** The parsed value. Note that may be different than the original value. */\n value: unknown;\n /** Error message if `state` is invalid. */\n message: string;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string;\n /** Extra error details */\n errors?: E;\n};\n\n/**\n * The result of a validation.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorResult<T = any, E = any> =\n | ValidResult<T>\n | InvalidResult<E>;\n\n/**\n * Validation test function.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorTest<T = any, E = any> = (\n value?: unknown,\n field?: string\n) => Promise<ValidatorResult<T, E>>;\n\n/**\n * Extracts the generic error type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractError<T extends ValidatorTest> = T extends ValidatorTest<\n any,\n infer E\n>\n ? E\n : unknown;\n\n/**\n * Extracts the generic value type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractValue<T extends ValidatorTest> = T extends ValidatorTest<\n infer V\n>\n ? V\n : unknown;\n\n/**\n * Make a deep partial type.\n * @typeParam T any object type\n * @category Types\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n/**\n * Validation factory function.\n * @typeParam C The configuration type\n * @category Types\n */\nexport type ValidatorFactory<C, T, E> = (\n config?: Partial<C> | ValidatorTest,\n ...tests: ValidatorTest[]\n) => ValidatorTest<T, E>;\n\n/**\n * Base configuration type.\n * @typeParam T The target type.\n * @category Types\n */\nexport interface ConfigBase<T> {\n /** Parser to convert value into the designated type. */\n parser: (value: unknown) => T | null | undefined;\n /** Provide a fallback value in case the original value is undefined. */\n default?: T;\n}\n\nexport interface ValidatorMessageParameters<T> {\n value: T | null | undefined;\n field: string | undefined;\n}\n\n/**\n * Validation message. May be a plain string or a function that accepts arguments.\n * While using a string, values in squiggly brackets `{}` are replaced.\n * @category Types\n */\nexport type ValidatorMessage<\n T,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n> = string | ((parameters: P) => string);\n\n/**\n * Simple check for objects.\n * @param value Value to test\n */\nexport function isObject(value: unknown): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Safe hasOwnProperty check\n * @param obj Object to check\n * @param prop Property to look for\n */\nexport function hasOwnProperty(\n object: unknown,\n property: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\n/** @internal */\nconst formatPattern = /{(\\w+)}/g;\n\n/**\n * Formats a message using a squiggly bracket `{}` template.\n * @param template Message template as string or function\n * @param params Params to inject into template\n * @category Helpers\n */\nexport function formatMessage<T, P extends ValidatorMessageParameters<T>>(\n template: ValidatorMessage<T, P>,\n parameters: P\n): string {\n if (typeof template === 'string') {\n return template.replace(formatPattern, (_, key: string) =>\n String((parameters as Record<string, unknown>)[key])\n );\n }\n\n return template(parameters);\n}\n\n/**\n * Creates a valid result\n * @param value Parsed value\n * @param field Field name\n * @category Helpers\n */\nexport async function valid<T, E = never>({\n value,\n field,\n}: {\n value: T | null | undefined;\n field: string | undefined;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: true,\n state: 'valid',\n value,\n field,\n };\n}\n\n/**\n * Creates an invalid result.\n * @param message Error message\n * @param value Parsed value\n * @param field Field name\n * @param extras Extra message params\n * @category Helpers\n */\nexport async function invalid<T, E, P extends ValidatorMessageParameters<T>>({\n errors,\n field,\n message,\n value,\n extras,\n}: {\n message: ValidatorMessage<T, P>;\n value: unknown;\n field: string | undefined;\n errors?: E;\n extras?: Except<P, 'field' | 'value'>;\n}): Promise<ValidatorResult<T, E>> {\n return {\n isValid: false,\n state: 'invalid',\n message: formatMessage(message, { ...extras, value, field } as P),\n value,\n field,\n errors,\n };\n}\n\n/**\n * Creates a type validator.\n * @typeParam T The basic type for the final value to be validated.\n * @typeParam C The configuration type.\n * @param defaultParser Parser to convert value into type.\n * @param applyConfig Function that applies configuration to value.\n * @category Helpers\n */\nexport function createTypeValidatorTest<T, C extends ConfigBase<T>, E>(\n defaultConfig: C,\n applyConfig: (value: unknown, config: C) => T | null | undefined\n): ValidatorFactory<C, T, E> {\n return (config, ...tests) => {\n const cache: Record<string, ValidatorResult<T>> = {};\n let finalConfig = defaultConfig;\n let allTests = tests;\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...defaultConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n try {\n const parsedValue = applyConfig(value, finalConfig);\n const parsedValueString = String(parsedValue);\n if (hasOwnProperty(cache, parsedValueString)) {\n return cache[parsedValueString];\n }\n\n for (const validatorTest of allTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(parsedValue, field);\n if (result.state === 'invalid') {\n cache[parsedValueString] = result;\n return result;\n }\n }\n\n cache[parsedValueString] = await valid({ value: parsedValue, field });\n return cache[parsedValueString];\n } catch (error) {\n return invalid({\n message: error instanceof Error ? error.message : String(error),\n value,\n field,\n });\n }\n };\n };\n}\n\n/**\n * Captures basic validator test pattern\n * @param test Test function\n * @param message Error message\n * @param getExtras Optional extra fields for error message\n */\nexport function createValidatorTest<\n T = any,\n E = any,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n>(\n test: (value: unknown, field?: string) => boolean,\n message: ValidatorMessage<T, P>,\n getExtras?: (value: T | null | undefined) => Except<P, 'value' | 'field'>\n): ValidatorTest<T, E> {\n return async (value, field) => {\n if (test(value, field)) {\n return valid({ value: value as T, field });\n }\n\n return invalid({\n message,\n value,\n field,\n extras: getExtras ? getExtras(value as T) : undefined,\n });\n };\n}\n\n/**\n * Ensures a value is not undefined, null, empty string, NaN, nor invalid date.\n * @param message Error message\n * @param nullable Allow null values\n * @category Validation Tests\n */\nexport function required<T, P extends ValidatorMessageParameters<T>>(\n message: ValidatorMessage<T, P>,\n nullable?: boolean\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n (nullable && value === null) ||\n (value !== null &&\n value !== undefined &&\n !(typeof value === 'string' && value === '') &&\n !(typeof value === 'number' && Number.isNaN(value)) &&\n !(value instanceof Date && Number.isNaN(value.valueOf()))),\n message\n );\n}\n\nexport type SharedValueType = string | number | unknown[];\n\n/**\n * Extracts a numeric amount from value, i.e. string length, array length, or number.\n * @internal\n */\nfunction getAmount(value: SharedValueType | null | undefined) {\n return typeof value === 'string' || Array.isArray(value)\n ? value.length\n : value;\n}\n\nexport interface MaxValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n max: number;\n amount: number | null | undefined;\n limit: number;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function max(\n limit: number,\n message: ValidatorMessage<SharedValueType, MaxValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount < limit : amount <= limit)\n );\n },\n message,\n (value) => ({\n max: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface MinValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n min: number;\n limit: number;\n amount: number | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function min(\n limit: number,\n message: ValidatorMessage<SharedValueType, MinValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount > limit : amount >= limit)\n );\n },\n message,\n (value) => ({\n min: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n })\n );\n}\n\nexport interface ExactValidatorMessageParameters\n extends ValidatorMessageParameters<SharedValueType> {\n limit: number;\n amount: number | null | undefined;\n exact: number;\n}\n\n/**\n * Ensures a string, number, or array value is exactly a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @category Validation Tests\n */\nexport function exact(\n limit: number,\n message: ValidatorMessage<SharedValueType, ExactValidatorMessageParameters>\n): ValidatorTest<SharedValueType> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n amount === limit\n );\n },\n message,\n (value) => ({\n amount: getAmount(value),\n limit,\n exact: limit,\n })\n );\n}\n\nexport interface OneOfValidatorMessageParameters<T>\n extends ValidatorMessageParameters<T> {\n values: readonly T[];\n}\n\n/**\n * Ensures a value is one in a predefined list.\n * @param values List of allowed values.\n * @param message Error message\n * @category Validation Tests\n */\nexport function oneOf<T extends string | number | boolean | Date>(\n values: readonly T[],\n message: ValidatorMessage<T, OneOfValidatorMessageParameters<T>>\n): ValidatorTest<T> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n values.includes(value as T) ||\n (value instanceof Date &&\n values.some((x) => x.valueOf() === value.valueOf())),\n message,\n () => ({ values })\n );\n}\n","import {\n ConfigBase,\n invalid,\n valid,\n ValidatorResult,\n ValidatorTest,\n} from './shared';\n\n/**\n * Invalid validation result for an item in the array\n * @category Types\n */\nexport interface ArrayItemValidatorResult {\n /** The index of the item in the original array */\n index: number;\n /** The error message if a simple type */\n message: string;\n /** The errors if an object or array */\n errors: unknown;\n}\n\n/**\n * Configuration for array validation.\n * @category Types\n */\nexport type ArrayConfig = ConfigBase<unknown[]>;\n\n/**\n * Parses a value into an array.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseArray(value: unknown): unknown[] | null | undefined {\n if (Array.isArray(value)) {\n return value as unknown[];\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const iterable = value as Iterable<unknown>;\n\n if (iterable[Symbol.iterator]) {\n return [...iterable];\n }\n\n return [];\n}\n\n/**\n * Applies a configuration to the array value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyArrayConfig<T>(\n config: ArrayConfig,\n value: unknown\n): T[] | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n parsedValue.length === 0)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue as T[];\n}\n\n/**\n * Validates an array. The first passed validator is used to validate individual\n * items. The remaining validators target the array itself.\n * @category Type Validators\n */\nexport function array<T>(\n config?: Partial<ArrayConfig> | ValidatorTest<T>,\n ...tests: ValidatorTest[]\n): ValidatorTest<T[], ArrayItemValidatorResult[]> {\n let allTests = tests;\n let finalConfig: ArrayConfig = {\n parser: parseArray,\n };\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...finalConfig,\n ...config,\n };\n }\n }\n\n return async (value, field) => {\n const arrayValue = applyArrayConfig<T>(finalConfig, value);\n let arrayInvalidResult: ValidatorResult | undefined;\n let isValid = true;\n const errors: ArrayItemValidatorResult[] = [];\n const [validateItem, ...arrayTests] = allTests;\n\n for (const validatorTest of arrayTests) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validatorTest(arrayValue, field);\n if (result.state === 'invalid') {\n isValid = false;\n arrayInvalidResult = result;\n break;\n }\n }\n\n if (arrayValue && validateItem) {\n for (const [index, item] of arrayValue.entries()) {\n // eslint-disable-next-line no-await-in-loop\n const result = await validateItem(\n item,\n field ? `${field}[${index}]` : `[${index}]`\n );\n\n if (result.state === 'invalid') {\n isValid = false;\n errors.push({\n errors: result.errors,\n index,\n message: result.message,\n });\n }\n }\n }\n\n if (isValid) {\n return valid({\n value: arrayValue,\n field,\n });\n }\n\n return invalid({\n message:\n arrayInvalidResult?.state === 'invalid'\n ? arrayInvalidResult.message\n : '',\n value,\n field,\n errors,\n });\n };\n}\n","import { ConfigBase, createTypeValidatorTest } from './shared';\n\n/**\n * Parses a value into a boolean.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseBoolean(value: unknown): boolean | null | undefined {\n if (value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n return Boolean(value);\n}\n\n/**\n * Applies a configuration to the boolean value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyBooleanConfig(\n value: unknown,\n config: BooleanConfig\n): boolean | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Configuration for boolean validation.\n * @category Types\n */\nexport type BooleanConfig = ConfigBase<boolean>;\n\n/**\n * Validates a boolean value.\n * @category Type Validators\n */\nexport const boolean = createTypeValidatorTest(\n { parser: parseBoolean },\n applyBooleanConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** Badly formatted date for internal use. */\nexport const invalidDate = new Date('');\n\n/** @internal */\nconst isoDatePattern =\n /^(\\d{4})(?:-([0-2]\\d)(?:-([0-3]\\d)(?:[ T]([0-2]\\d):([0-5]\\d)(?::([0-5]\\d)(\\.\\d+)?(Z|[+-][0-2]\\d:?[0-5]\\d)?)?)?)?)?$/;\n\n/** @internal */\nconst timezonePattern = /^([+-])([0-2]\\d):?([0-5]\\d)$/;\n\n/**\n * Parses a timezone string.\n * @param timezone Timezone to parse\n * @internal\n */\nfunction parseTimezone(timezone: string): number {\n const parts = timezonePattern.exec(timezone);\n\n if (timezone === 'Z' || !parts) {\n return 0;\n }\n\n const [, sign, hour, minute] = parts;\n const multiplier = sign === '-' ? -1 : 1;\n const hoursInMinutes = Number.parseInt(hour, 10) * 60;\n const offset = hoursInMinutes + Number.parseInt(minute, 10);\n\n return multiplier * offset;\n}\n\nconst BASE = 10;\n\nconst dateParts = [\n // Skip\n () => 0,\n // Year\n (part = '0') => Number.parseInt(part, BASE),\n // Month\n (part = '1') => Number.parseInt(part, BASE) - 1,\n // Day\n (part = '1') => Number.parseInt(part, BASE),\n // Hour\n (part = '0') => Number.parseInt(part, BASE),\n // Minute\n (part = '0') => Number.parseInt(part, BASE),\n // Second\n (part = '0') => Number.parseInt(part, BASE),\n // Millisecond\n (part = '0') => Number.parseFloat(part) * 1e3,\n];\n\n/**\n * Parses a value into a date.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseDate(value: unknown): Date | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (typeof value === 'number') {\n return new Date(value);\n }\n\n if (typeof value !== 'string') {\n return invalidDate;\n }\n\n const parts = isoDatePattern.exec(value);\n\n if (parts === null) {\n return invalidDate;\n }\n\n const [, year, month, day, hour, minute, second, millisecond] = dateParts.map(\n (parse, index) => parse(parts[index])\n );\n\n const timezone = parts[8];\n\n if (!timezone) {\n return new Date(year, month, day, hour, minute, second, millisecond);\n }\n\n const minuteOffset = parseTimezone(timezone);\n\n return new Date(\n Date.UTC(year, month, day, hour, minute + minuteOffset, second, millisecond)\n );\n}\n\n/**\n * Applies a configuration to the date value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyDateConfig(\n value: unknown,\n config: DateConfig\n): Date | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue.getTime()))\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\nexport type SharedDateValueType = Date | string | number;\n\nexport interface MinDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n min: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or after a date.\n * @param limit Minimum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function minDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MinDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date, null> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value > parsedDate : value >= parsedDate))),\n message,\n () => ({\n min: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\nexport interface MaxDateValidatorMessageParameters\n extends ValidatorMessageParameters<Date> {\n max: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean;\n}\n\n/**\n * Ensures a date value is on or before a date.\n * @param limit Maximum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function maxDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MaxDateValidatorMessageParameters>,\n exclusive?: boolean\n): ValidatorTest<Date> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value < parsedDate : value <= parsedDate))),\n message,\n () => ({\n max: parsedDate,\n limit: parsedDate,\n exclusive,\n })\n );\n}\n\n/**\n * Configuration for date validation.\n * @category Types\n */\nexport type DateConfig = ConfigBase<Date>;\n\n/**\n * Validates a date value.\n * @category Type Validators\n */\nexport const date = createTypeValidatorTest(\n { parser: parseDate },\n applyDateConfig\n);\n","import {\n ConfigBase,\n createTypeValidatorTest,\n invalid,\n valid,\n ValidatorMessage,\n ValidatorTest,\n} from './shared';\n\n/**\n * Parses a value into a number.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseNumber(value: unknown): number | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n if (typeof value === 'string') {\n return Number.parseFloat(value);\n }\n\n return Number.parseFloat(String(value));\n}\n\n/**\n * Applies a configuration to the number value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyNumberConfig(\n value: unknown,\n config: NumberConfig\n): number | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue))\n ) {\n parsedValue = config.default;\n }\n\n if (config.round && typeof parsedValue === 'number') {\n switch (config.round) {\n case 'nearest': {\n parsedValue = Math.round(parsedValue);\n break;\n }\n case 'ceil': {\n parsedValue = Math.ceil(parsedValue);\n break;\n }\n case 'floor': {\n parsedValue = Math.floor(parsedValue);\n break;\n }\n default: {\n throw new Error(`Unknown round type: ${String(config.round)}`);\n }\n }\n }\n\n return parsedValue;\n}\n\n/**\n * Ensures a number value is an integer.\n * @param message Error message\n * @category Validation Tests\n */\nexport function integer(\n message: ValidatorMessage<number>\n): ValidatorTest<number> {\n return async (value, field) => {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'number' &&\n Number.isFinite(value) &&\n Math.floor(value) === value)\n ) {\n return valid({ value, field });\n }\n\n return invalid({\n message,\n value,\n field,\n });\n };\n}\n\n/**\n * Configuration for number validation.\n * @category Types\n */\nexport interface NumberConfig extends ConfigBase<number> {\n /** Apply rounding mechanism before validation. */\n round?: 'nearest' | 'floor' | 'ceil';\n}\n\n/**\n * Validates a number value.\n * @category Type Validators\n */\nexport const number = createTypeValidatorTest(\n {\n parser: parseNumber,\n },\n applyNumberConfig\n);\n","import {\n DeepPartial,\n ExtractError,\n ExtractValue,\n hasOwnProperty,\n invalid,\n valid,\n ValidatorTest,\n} from './shared';\n\nexport type ObjectParameter = Record<string, ValidatorTest<unknown, unknown>>;\n\n/**\n * Validates an object.\n * @category Type Validators\n */\nexport function object<P extends ObjectParameter, K extends keyof P>(\n properties: P\n): ValidatorTest<\n DeepPartial<{ [K in keyof P]?: ExtractValue<P[K]> }>,\n DeepPartial<{ [K in keyof P]?: ExtractError<P[K]> }>\n> {\n if (typeof properties !== 'object' || properties === null) {\n throw new TypeError('`properties` must be a configuration object');\n }\n\n return async (values, field) => {\n const definedValues: { [K in keyof P]?: ExtractValue<P[K]> } =\n (values as { [K in keyof P]?: ExtractValue<P[K]> }) ?? {};\n const errors: { [K in keyof P]?: ExtractError<P[K]> } = {};\n const resolvedValues: { [K in keyof P]?: ExtractValue<P[K]> } = {};\n let isValid = true;\n\n for (const key in properties) {\n if (hasOwnProperty(properties, key)) {\n const validator = properties[key];\n const value = definedValues[key];\n /* eslint-disable no-await-in-loop */\n const result =\n typeof validator === 'function'\n ? await validator(value, key)\n : await invalid({ field: key, message: 'No validator set', value });\n /* eslint-enable no-await-in-loop */\n\n resolvedValues[key] = result.value as ExtractValue<P[K]>;\n\n if (result.state === 'invalid') {\n isValid = false;\n errors[key] = (result.message || result.errors) as ExtractError<P[K]>;\n }\n }\n }\n\n if (isValid) {\n return valid({ value: resolvedValues, field });\n }\n\n return invalid({\n message: '',\n value: values,\n field,\n errors,\n });\n };\n}\n","import {\n ConfigBase,\n createTypeValidatorTest,\n createValidatorTest,\n isObject,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared';\n\n/** @internal */\nconst emailPattern =\n /^[\\w!#$%&'*+./=?^`{|}~-]+@[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?(?:\\.[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?)*$/;\n\n/**\n * Configuration for string validation.\n * @category Types\n */\nexport interface StringConfig extends ConfigBase<string> {\n /** Apply trim to string before validation. */\n trim?: boolean;\n}\n\n/**\n * Parses a value into a string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseString(value: unknown): string | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (isObject(value)) {\n throw new TypeError('Failed to parse value to string.');\n }\n\n return String(value);\n}\n\n/**\n * Applies a configuration to the string value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyStringConfig(\n value: unknown,\n config: StringConfig\n): string | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null || parsedValue === '')\n ) {\n parsedValue = config.default;\n }\n\n if (config.trim && typeof parsedValue === 'string') {\n parsedValue = parsedValue.trim();\n }\n\n return parsedValue;\n}\n\nexport interface MatchesValidatorMessageParameters\n extends ValidatorMessageParameters<string> {\n pattern: RegExp;\n}\n\n/**\n * Ensures a string value matches a pattern\n * @param pattern Pattern to match\n * @param message Error message\n * @category Validation Tests\n */\nexport function matches(\n pattern: RegExp,\n message: ValidatorMessage<string, MatchesValidatorMessageParameters>\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && pattern.test(value)),\n message,\n () => ({ pattern })\n );\n}\n\n/**\n * Ensures a string value matches an email pattern\n * @param message Error message\n * @category Validation Tests\n */\nexport function email(\n message: ValidatorMessage<string>\n): ValidatorTest<string> {\n return matches(emailPattern, message);\n}\n\n/**\n * Ensures a string value is a valid URL\n * @param message Error message\n * @param protocols Optional list of protocols to allow\n * @category Validation Tests\n */\nexport function url(\n message: ValidatorMessage<string>,\n protocols?: string[]\n): ValidatorTest<string> {\n return createValidatorTest(\n (value) => {\n try {\n let url: URL | undefined;\n if (\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && (url = new URL(value)))\n ) {\n return !(url && protocols && !protocols.includes(url.protocol));\n }\n } catch {\n // Do nothing\n }\n\n return false;\n },\n message,\n () => ({ protocols })\n );\n}\n\n/**\n * Validates a string value.\n * @category Type Validators\n */\nexport const string = createTypeValidatorTest(\n {\n parser: parseString,\n },\n applyStringConfig\n);\n"],"names":["url"],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
type ValidResult<T> = {
|
|
2
2
|
/**
|
|
3
3
|
* True if the original value is valid according to all validation tests
|
|
4
4
|
* @deprecated Use `state` instead.
|
|
@@ -11,7 +11,7 @@ declare type ValidResult<T> = {
|
|
|
11
11
|
/** Field name if provided. Automatically provided if using object validation. */
|
|
12
12
|
field?: string;
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
type InvalidResult<E> = {
|
|
15
15
|
/**
|
|
16
16
|
* True if the original value is valid according to all validation tests.
|
|
17
17
|
* @deprecated Use `state` instead.
|
|
@@ -33,31 +33,31 @@ declare type InvalidResult<E> = {
|
|
|
33
33
|
* @typeParam T The value type
|
|
34
34
|
* @category Types
|
|
35
35
|
*/
|
|
36
|
-
|
|
36
|
+
type ValidatorResult<T = any, E = any> = ValidResult<T> | InvalidResult<E>;
|
|
37
37
|
/**
|
|
38
38
|
* Validation test function.
|
|
39
39
|
* @typeParam T The value type
|
|
40
40
|
* @category Types
|
|
41
41
|
*/
|
|
42
|
-
|
|
42
|
+
type ValidatorTest<T = any, E = any> = (value?: unknown, field?: string) => Promise<ValidatorResult<T, E>>;
|
|
43
43
|
/**
|
|
44
44
|
* Extracts the generic error type from a ValidatorTest.
|
|
45
45
|
* @typeParam T a ValidatorTest
|
|
46
46
|
* @category Types
|
|
47
47
|
*/
|
|
48
|
-
|
|
48
|
+
type ExtractError<T extends ValidatorTest> = T extends ValidatorTest<any, infer E> ? E : unknown;
|
|
49
49
|
/**
|
|
50
50
|
* Extracts the generic value type from a ValidatorTest.
|
|
51
51
|
* @typeParam T a ValidatorTest
|
|
52
52
|
* @category Types
|
|
53
53
|
*/
|
|
54
|
-
|
|
54
|
+
type ExtractValue<T extends ValidatorTest> = T extends ValidatorTest<infer V> ? V : unknown;
|
|
55
55
|
/**
|
|
56
56
|
* Make a deep partial type.
|
|
57
57
|
* @typeParam T any object type
|
|
58
58
|
* @category Types
|
|
59
59
|
*/
|
|
60
|
-
|
|
60
|
+
type DeepPartial<T> = {
|
|
61
61
|
[P in keyof T]?: DeepPartial<T[P]>;
|
|
62
62
|
};
|
|
63
63
|
/**
|
|
@@ -65,7 +65,7 @@ declare type DeepPartial<T> = {
|
|
|
65
65
|
* @typeParam C The configuration type
|
|
66
66
|
* @category Types
|
|
67
67
|
*/
|
|
68
|
-
|
|
68
|
+
type ValidatorFactory<C, T, E> = (config?: Partial<C> | ValidatorTest, ...tests: ValidatorTest[]) => ValidatorTest<T, E>;
|
|
69
69
|
/**
|
|
70
70
|
* Base configuration type.
|
|
71
71
|
* @typeParam T The target type.
|
|
@@ -86,7 +86,7 @@ interface ValidatorMessageParameters<T> {
|
|
|
86
86
|
* While using a string, values in squiggly brackets `{}` are replaced.
|
|
87
87
|
* @category Types
|
|
88
88
|
*/
|
|
89
|
-
|
|
89
|
+
type ValidatorMessage<T, P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>> = string | ((parameters: P) => string);
|
|
90
90
|
/**
|
|
91
91
|
* Simple check for objects.
|
|
92
92
|
* @param value Value to test
|
|
@@ -153,7 +153,7 @@ declare function createValidatorTest<T = any, E = any, P extends ValidatorMessag
|
|
|
153
153
|
* @category Validation Tests
|
|
154
154
|
*/
|
|
155
155
|
declare function required<T, P extends ValidatorMessageParameters<T>>(message: ValidatorMessage<T, P>, nullable?: boolean): ValidatorTest<T>;
|
|
156
|
-
|
|
156
|
+
type SharedValueType = string | number | unknown[];
|
|
157
157
|
interface MaxValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {
|
|
158
158
|
max: number;
|
|
159
159
|
amount: number | null | undefined;
|
|
@@ -221,7 +221,7 @@ interface ArrayItemValidatorResult {
|
|
|
221
221
|
* Configuration for array validation.
|
|
222
222
|
* @category Types
|
|
223
223
|
*/
|
|
224
|
-
|
|
224
|
+
type ArrayConfig = ConfigBase<unknown[]>;
|
|
225
225
|
/**
|
|
226
226
|
* Parses a value into an array.
|
|
227
227
|
* @param value Value to parse
|
|
@@ -259,7 +259,7 @@ declare function applyBooleanConfig(value: unknown, config: BooleanConfig): bool
|
|
|
259
259
|
* Configuration for boolean validation.
|
|
260
260
|
* @category Types
|
|
261
261
|
*/
|
|
262
|
-
|
|
262
|
+
type BooleanConfig = ConfigBase<boolean>;
|
|
263
263
|
/**
|
|
264
264
|
* Validates a boolean value.
|
|
265
265
|
* @category Type Validators
|
|
@@ -281,7 +281,7 @@ declare function parseDate(value: unknown): Date | null | undefined;
|
|
|
281
281
|
* @category Helpers
|
|
282
282
|
*/
|
|
283
283
|
declare function applyDateConfig(value: unknown, config: DateConfig): Date | null | undefined;
|
|
284
|
-
|
|
284
|
+
type SharedDateValueType = Date | string | number;
|
|
285
285
|
interface MinDateValidatorMessageParameters extends ValidatorMessageParameters<Date> {
|
|
286
286
|
min: Date | null | undefined;
|
|
287
287
|
limit: Date | null | undefined;
|
|
@@ -312,7 +312,7 @@ declare function maxDate(limit: SharedDateValueType, message: ValidatorMessage<D
|
|
|
312
312
|
* Configuration for date validation.
|
|
313
313
|
* @category Types
|
|
314
314
|
*/
|
|
315
|
-
|
|
315
|
+
type DateConfig = ConfigBase<Date>;
|
|
316
316
|
/**
|
|
317
317
|
* Validates a date value.
|
|
318
318
|
* @category Type Validators
|
|
@@ -352,7 +352,7 @@ interface NumberConfig extends ConfigBase<number> {
|
|
|
352
352
|
*/
|
|
353
353
|
declare const number: ValidatorFactory<NumberConfig, number, unknown>;
|
|
354
354
|
|
|
355
|
-
|
|
355
|
+
type ObjectParameter = Record<string, ValidatorTest<unknown, unknown>>;
|
|
356
356
|
/**
|
|
357
357
|
* Validates an object.
|
|
358
358
|
* @category Type Validators
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "validator-fns",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.3",
|
|
4
4
|
"description": "Small asynchronous validation library",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -53,25 +53,25 @@
|
|
|
53
53
|
"prepare": "husky install"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@types/node": "18.
|
|
57
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
58
|
-
"@typescript-eslint/parser": "5.
|
|
59
|
-
"c8": "7.
|
|
60
|
-
"esbuild": "0.14
|
|
61
|
-
"eslint": "8.
|
|
56
|
+
"@types/node": "18.11.9",
|
|
57
|
+
"@typescript-eslint/eslint-plugin": "5.43.0",
|
|
58
|
+
"@typescript-eslint/parser": "5.43.0",
|
|
59
|
+
"c8": "7.12.0",
|
|
60
|
+
"esbuild": "0.15.14",
|
|
61
|
+
"eslint": "8.27.0",
|
|
62
62
|
"eslint-config-prettier": "8.5.0",
|
|
63
|
-
"eslint-plugin-unicorn": "
|
|
64
|
-
"husky": "8.0.
|
|
63
|
+
"eslint-plugin-unicorn": "44.0.2",
|
|
64
|
+
"husky": "8.0.2",
|
|
65
65
|
"lint-staged": "13.0.3",
|
|
66
66
|
"npm-run-all": "4.1.5",
|
|
67
67
|
"prettier": "2.7.1",
|
|
68
68
|
"rimraf": "3.0.2",
|
|
69
|
-
"rollup": "
|
|
70
|
-
"rollup-plugin-dts": "
|
|
71
|
-
"rollup-plugin-esbuild": "
|
|
69
|
+
"rollup": "3.3.0",
|
|
70
|
+
"rollup-plugin-dts": "5.0.0",
|
|
71
|
+
"rollup-plugin-esbuild": "5.0.0",
|
|
72
72
|
"rollup-plugin-filesize": "9.1.2",
|
|
73
|
-
"ts-node": "10.
|
|
74
|
-
"typescript": "4.
|
|
73
|
+
"ts-node": "10.9.1",
|
|
74
|
+
"typescript": "4.9.3",
|
|
75
75
|
"uvu": "0.5.6"
|
|
76
76
|
},
|
|
77
77
|
"repository": "github:smonn/validator-fns",
|