validator-fns 1.8.2 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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
  }
@@ -217,11 +215,9 @@ function array(config, ...tests) {
217
215
  );
218
216
  if (result.state === "invalid") {
219
217
  isValid = false;
220
- errors.push({
221
- errors: result.errors,
222
- index,
223
- message: result.message
224
- });
218
+ errors.push(result.message || result.errors);
219
+ } else {
220
+ errors.push(null);
225
221
  }
226
222
  }
227
223
  }
@@ -261,7 +257,7 @@ const boolean = createTypeValidatorTest(
261
257
  applyBooleanConfig
262
258
  );
263
259
 
264
- const invalidDate = new Date("");
260
+ const invalidDate = /* @__PURE__ */ new Date("");
265
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)?)?)?)?)?$/;
266
262
  const timezonePattern = /^([+-])([0-2]\d):?([0-5]\d)$/;
267
263
  function parseTimezone(timezone) {
@@ -277,13 +273,21 @@ function parseTimezone(timezone) {
277
273
  }
278
274
  const BASE = 10;
279
275
  const dateParts = [
276
+ // Skip
280
277
  () => 0,
278
+ // Year
281
279
  (part = "0") => Number.parseInt(part, BASE),
280
+ // Month
282
281
  (part = "1") => Number.parseInt(part, BASE) - 1,
282
+ // Day
283
283
  (part = "1") => Number.parseInt(part, BASE),
284
+ // Hour
284
285
  (part = "0") => Number.parseInt(part, BASE),
286
+ // Minute
285
287
  (part = "0") => Number.parseInt(part, BASE),
288
+ // Second
286
289
  (part = "0") => Number.parseInt(part, BASE),
290
+ // Millisecond
287
291
  (part = "0") => Number.parseFloat(part) * 1e3
288
292
  ];
289
293
  function parseDate(value) {
@@ -373,17 +377,21 @@ function applyNumberConfig(value, config) {
373
377
  }
374
378
  if (config.round && typeof parsedValue === "number") {
375
379
  switch (config.round) {
376
- case "nearest":
380
+ case "nearest": {
377
381
  parsedValue = Math.round(parsedValue);
378
382
  break;
379
- case "ceil":
383
+ }
384
+ case "ceil": {
380
385
  parsedValue = Math.ceil(parsedValue);
381
386
  break;
382
- case "floor":
387
+ }
388
+ case "floor": {
383
389
  parsedValue = Math.floor(parsedValue);
384
390
  break;
385
- default:
391
+ }
392
+ default: {
386
393
  throw new Error(`Unknown round type: ${String(config.round)}`);
394
+ }
387
395
  }
388
396
  }
389
397
  return parsedValue;
@@ -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":["url"],"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 object Object to check\n * @param property 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 parameters 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<\n T,\n E,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n>({\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>>(\n defaultConfig: C,\n applyConfig: (value: unknown, config: C) => T | null | undefined\n): ValidatorFactory<C, T, string> {\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 type ArrayItemValidatorResult<E = unknown> = null | string | E;\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, E>(\n config?: Partial<ArrayConfig> | ValidatorTest<T, E>,\n ...tests: ValidatorTest[]\n): ValidatorTest<T[], string | ArrayItemValidatorResult<E>[]> {\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(result.message || result.errors);\n } else {\n errors.push(null);\n }\n }\n }\n\n if (isValid) {\n return valid({\n value: arrayValue,\n field,\n });\n }\n\n return invalid<T[], ArrayItemValidatorResult<E>[]>({\n message:\n arrayInvalidResult?.state === 'invalid'\n ? arrayInvalidResult.message\n : '',\n value,\n field,\n errors: errors as ArrayItemValidatorResult<E>[],\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 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<\n P extends ObjectParameter,\n V extends { [K in keyof P]?: ExtractValue<P[K]> },\n E extends { [K in keyof P]?: ExtractError<P[K]> }\n>(properties: P): ValidatorTest<V, E> {\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 = (values ?? {}) as V;\n const errors = {} as E;\n const resolvedValues = {} as V;\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 V[Extract<keyof P, string>];\n\n if (result.state === 'invalid') {\n isValid = false;\n errors[key] = (result.message || result.errors) as E[Extract<\n keyof P,\n string\n >];\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
@@ -213,11 +213,9 @@ function array(config, ...tests) {
213
213
  );
214
214
  if (result.state === "invalid") {
215
215
  isValid = false;
216
- errors.push({
217
- errors: result.errors,
218
- index,
219
- message: result.message
220
- });
216
+ errors.push(result.message || result.errors);
217
+ } else {
218
+ errors.push(null);
221
219
  }
222
220
  }
223
221
  }
@@ -257,7 +255,7 @@ const boolean = createTypeValidatorTest(
257
255
  applyBooleanConfig
258
256
  );
259
257
 
260
- const invalidDate = new Date("");
258
+ const invalidDate = /* @__PURE__ */ new Date("");
261
259
  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)?)?)?)?)?$/;
262
260
  const timezonePattern = /^([+-])([0-2]\d):?([0-5]\d)$/;
263
261
  function parseTimezone(timezone) {
@@ -273,13 +271,21 @@ function parseTimezone(timezone) {
273
271
  }
274
272
  const BASE = 10;
275
273
  const dateParts = [
274
+ // Skip
276
275
  () => 0,
276
+ // Year
277
277
  (part = "0") => Number.parseInt(part, BASE),
278
+ // Month
278
279
  (part = "1") => Number.parseInt(part, BASE) - 1,
280
+ // Day
279
281
  (part = "1") => Number.parseInt(part, BASE),
282
+ // Hour
280
283
  (part = "0") => Number.parseInt(part, BASE),
284
+ // Minute
281
285
  (part = "0") => Number.parseInt(part, BASE),
286
+ // Second
282
287
  (part = "0") => Number.parseInt(part, BASE),
288
+ // Millisecond
283
289
  (part = "0") => Number.parseFloat(part) * 1e3
284
290
  ];
285
291
  function parseDate(value) {
@@ -369,17 +375,21 @@ function applyNumberConfig(value, config) {
369
375
  }
370
376
  if (config.round && typeof parsedValue === "number") {
371
377
  switch (config.round) {
372
- case "nearest":
378
+ case "nearest": {
373
379
  parsedValue = Math.round(parsedValue);
374
380
  break;
375
- case "ceil":
381
+ }
382
+ case "ceil": {
376
383
  parsedValue = Math.ceil(parsedValue);
377
384
  break;
378
- case "floor":
385
+ }
386
+ case "floor": {
379
387
  parsedValue = Math.floor(parsedValue);
380
388
  break;
381
- default:
389
+ }
390
+ default: {
382
391
  throw new Error(`Unknown round type: ${String(config.round)}`);
392
+ }
383
393
  }
384
394
  }
385
395
  return parsedValue;
@@ -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":["url"],"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 object Object to check\n * @param property 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 parameters 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<\n T,\n E,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>\n>({\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>>(\n defaultConfig: C,\n applyConfig: (value: unknown, config: C) => T | null | undefined\n): ValidatorFactory<C, T, string> {\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 type ArrayItemValidatorResult<E = unknown> = null | string | E;\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, E>(\n config?: Partial<ArrayConfig> | ValidatorTest<T, E>,\n ...tests: ValidatorTest[]\n): ValidatorTest<T[], string | ArrayItemValidatorResult<E>[]> {\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(result.message || result.errors);\n } else {\n errors.push(null);\n }\n }\n }\n\n if (isValid) {\n return valid({\n value: arrayValue,\n field,\n });\n }\n\n return invalid<T[], ArrayItemValidatorResult<E>[]>({\n message:\n arrayInvalidResult?.state === 'invalid'\n ? arrayInvalidResult.message\n : '',\n value,\n field,\n errors: errors as ArrayItemValidatorResult<E>[],\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 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<\n P extends ObjectParameter,\n V extends { [K in keyof P]?: ExtractValue<P[K]> },\n E extends { [K in keyof P]?: ExtractError<P[K]> }\n>(properties: P): ValidatorTest<V, E> {\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 = (values ?? {}) as V;\n const errors = {} as E;\n const resolvedValues = {} as V;\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 V[Extract<keyof P, string>];\n\n if (result.state === 'invalid') {\n isValid = false;\n errors[key] = (result.message || result.errors) as E[Extract<\n keyof P,\n string\n >];\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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"}
@@ -1,4 +1,4 @@
1
- declare type ValidResult<T> = {
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
- declare type InvalidResult<E> = {
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
- declare type ValidatorResult<T = any, E = any> = ValidResult<T> | InvalidResult<E>;
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
- declare type ValidatorTest<T = any, E = any> = (value?: unknown, field?: string) => Promise<ValidatorResult<T, E>>;
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
- declare type ExtractError<T extends ValidatorTest> = T extends ValidatorTest<any, infer E> ? E : unknown;
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
- declare type ExtractValue<T extends ValidatorTest> = T extends ValidatorTest<infer V> ? V : unknown;
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
- declare type DeepPartial<T> = {
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
- declare type ValidatorFactory<C, T, E> = (config?: Partial<C> | ValidatorTest, ...tests: ValidatorTest[]) => ValidatorTest<T, E>;
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
- declare type ValidatorMessage<T, P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>> = string | ((parameters: P) => string);
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
@@ -94,14 +94,14 @@ declare type ValidatorMessage<T, P extends ValidatorMessageParameters<T> = Valid
94
94
  declare function isObject(value: unknown): boolean;
95
95
  /**
96
96
  * Safe hasOwnProperty check
97
- * @param obj Object to check
98
- * @param prop Property to look for
97
+ * @param object Object to check
98
+ * @param property Property to look for
99
99
  */
100
100
  declare function hasOwnProperty(object: unknown, property: string | number | symbol): boolean;
101
101
  /**
102
102
  * Formats a message using a squiggly bracket `{}` template.
103
103
  * @param template Message template as string or function
104
- * @param params Params to inject into template
104
+ * @param parameters Params to inject into template
105
105
  * @category Helpers
106
106
  */
107
107
  declare function formatMessage<T, P extends ValidatorMessageParameters<T>>(template: ValidatorMessage<T, P>, parameters: P): string;
@@ -123,7 +123,7 @@ declare function valid<T, E = never>({ value, field, }: {
123
123
  * @param extras Extra message params
124
124
  * @category Helpers
125
125
  */
126
- declare function invalid<T, E, P extends ValidatorMessageParameters<T>>({ errors, field, message, value, extras, }: {
126
+ declare function invalid<T, E, P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>>({ errors, field, message, value, extras, }: {
127
127
  message: ValidatorMessage<T, P>;
128
128
  value: unknown;
129
129
  field: string | undefined;
@@ -138,7 +138,7 @@ declare function invalid<T, E, P extends ValidatorMessageParameters<T>>({ errors
138
138
  * @param applyConfig Function that applies configuration to value.
139
139
  * @category Helpers
140
140
  */
141
- declare function createTypeValidatorTest<T, C extends ConfigBase<T>, E>(defaultConfig: C, applyConfig: (value: unknown, config: C) => T | null | undefined): ValidatorFactory<C, T, E>;
141
+ declare function createTypeValidatorTest<T, C extends ConfigBase<T>>(defaultConfig: C, applyConfig: (value: unknown, config: C) => T | null | undefined): ValidatorFactory<C, T, string>;
142
142
  /**
143
143
  * Captures basic validator test pattern
144
144
  * @param test Test function
@@ -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
- declare type SharedValueType = string | number | unknown[];
156
+ type SharedValueType = string | number | unknown[];
157
157
  interface MaxValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {
158
158
  max: number;
159
159
  amount: number | null | undefined;
@@ -209,19 +209,12 @@ declare function oneOf<T extends string | number | boolean | Date>(values: reado
209
209
  * Invalid validation result for an item in the array
210
210
  * @category Types
211
211
  */
212
- interface ArrayItemValidatorResult {
213
- /** The index of the item in the original array */
214
- index: number;
215
- /** The error message if a simple type */
216
- message: string;
217
- /** The errors if an object or array */
218
- errors: unknown;
219
- }
212
+ type ArrayItemValidatorResult<E = unknown> = null | string | E;
220
213
  /**
221
214
  * Configuration for array validation.
222
215
  * @category Types
223
216
  */
224
- declare type ArrayConfig = ConfigBase<unknown[]>;
217
+ type ArrayConfig = ConfigBase<unknown[]>;
225
218
  /**
226
219
  * Parses a value into an array.
227
220
  * @param value Value to parse
@@ -240,7 +233,7 @@ declare function applyArrayConfig<T>(config: ArrayConfig, value: unknown): T[] |
240
233
  * items. The remaining validators target the array itself.
241
234
  * @category Type Validators
242
235
  */
243
- declare function array<T>(config?: Partial<ArrayConfig> | ValidatorTest<T>, ...tests: ValidatorTest[]): ValidatorTest<T[], ArrayItemValidatorResult[]>;
236
+ declare function array<T, E>(config?: Partial<ArrayConfig> | ValidatorTest<T, E>, ...tests: ValidatorTest[]): ValidatorTest<T[], string | ArrayItemValidatorResult<E>[]>;
244
237
 
245
238
  /**
246
239
  * Parses a value into a boolean.
@@ -259,12 +252,12 @@ declare function applyBooleanConfig(value: unknown, config: BooleanConfig): bool
259
252
  * Configuration for boolean validation.
260
253
  * @category Types
261
254
  */
262
- declare type BooleanConfig = ConfigBase<boolean>;
255
+ type BooleanConfig = ConfigBase<boolean>;
263
256
  /**
264
257
  * Validates a boolean value.
265
258
  * @category Type Validators
266
259
  */
267
- declare const boolean: ValidatorFactory<BooleanConfig, boolean, unknown>;
260
+ declare const boolean: ValidatorFactory<BooleanConfig, boolean, string>;
268
261
 
269
262
  /** Badly formatted date for internal use. */
270
263
  declare const invalidDate: Date;
@@ -281,7 +274,7 @@ declare function parseDate(value: unknown): Date | null | undefined;
281
274
  * @category Helpers
282
275
  */
283
276
  declare function applyDateConfig(value: unknown, config: DateConfig): Date | null | undefined;
284
- declare type SharedDateValueType = Date | string | number;
277
+ type SharedDateValueType = Date | string | number;
285
278
  interface MinDateValidatorMessageParameters extends ValidatorMessageParameters<Date> {
286
279
  min: Date | null | undefined;
287
280
  limit: Date | null | undefined;
@@ -312,12 +305,12 @@ declare function maxDate(limit: SharedDateValueType, message: ValidatorMessage<D
312
305
  * Configuration for date validation.
313
306
  * @category Types
314
307
  */
315
- declare type DateConfig = ConfigBase<Date>;
308
+ type DateConfig = ConfigBase<Date>;
316
309
  /**
317
310
  * Validates a date value.
318
311
  * @category Type Validators
319
312
  */
320
- declare const date: ValidatorFactory<DateConfig, Date, unknown>;
313
+ declare const date: ValidatorFactory<DateConfig, Date, string>;
321
314
 
322
315
  /**
323
316
  * Parses a value into a number.
@@ -350,18 +343,18 @@ interface NumberConfig extends ConfigBase<number> {
350
343
  * Validates a number value.
351
344
  * @category Type Validators
352
345
  */
353
- declare const number: ValidatorFactory<NumberConfig, number, unknown>;
346
+ declare const number: ValidatorFactory<NumberConfig, number, string>;
354
347
 
355
- declare type ObjectParameter = Record<string, ValidatorTest<unknown, unknown>>;
348
+ type ObjectParameter = Record<string, ValidatorTest<unknown, unknown>>;
356
349
  /**
357
350
  * Validates an object.
358
351
  * @category Type Validators
359
352
  */
360
- declare function object<P extends ObjectParameter, K extends keyof P>(properties: P): ValidatorTest<DeepPartial<{
353
+ declare function object<P extends ObjectParameter, V extends {
361
354
  [K in keyof P]?: ExtractValue<P[K]>;
362
- }>, DeepPartial<{
355
+ }, E extends {
363
356
  [K in keyof P]?: ExtractError<P[K]>;
364
- }>>;
357
+ }>(properties: P): ValidatorTest<V, E>;
365
358
 
366
359
  /**
367
360
  * Configuration for string validation.
@@ -411,6 +404,6 @@ declare function url(message: ValidatorMessage<string>, protocols?: string[]): V
411
404
  * Validates a string value.
412
405
  * @category Type Validators
413
406
  */
414
- declare const string: ValidatorFactory<StringConfig, string, unknown>;
407
+ declare const string: ValidatorFactory<StringConfig, string, string>;
415
408
 
416
409
  export { ArrayConfig, ArrayItemValidatorResult, BooleanConfig, ConfigBase, DateConfig, DeepPartial, ExactValidatorMessageParameters, ExtractError, ExtractValue, InvalidResult, MatchesValidatorMessageParameters, MaxDateValidatorMessageParameters, MaxValidatorMessageParameters, MinDateValidatorMessageParameters, MinValidatorMessageParameters, NumberConfig, ObjectParameter as ObjectParam, OneOfValidatorMessageParameters, SharedDateValueType, SharedValueType, StringConfig, ValidResult, ValidatorFactory, ValidatorMessage, ValidatorMessageParameters, ValidatorResult, ValidatorTest, 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "validator-fns",
3
- "version": "1.8.2",
3
+ "version": "1.9.0",
4
4
  "description": "Small asynchronous validation library",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -40,38 +40,26 @@
40
40
  "node": ">=12",
41
41
  "npm": ">=6"
42
42
  },
43
- "scripts": {
44
- "clean": "rimraf dist",
45
- "check": "tsc --noEmit",
46
- "build": "rollup -c",
47
- "lint": "eslint --ext ts .",
48
- "format": "prettier --write .",
49
- "test": "uvu -r ts-node/register test",
50
- "coverage": "c8 --include=src --exclude=src/index.ts npm test",
51
- "report": "c8 report --reporter=text-lcov > coverage/lcov.info",
52
- "prepublishOnly": "run-s clean lint check test build",
53
- "prepare": "husky install"
54
- },
55
43
  "devDependencies": {
56
- "@types/node": "18.7.23",
57
- "@typescript-eslint/eslint-plugin": "5.38.1",
58
- "@typescript-eslint/parser": "5.38.1",
44
+ "@types/node": "18.11.18",
45
+ "@typescript-eslint/eslint-plugin": "5.49.0",
46
+ "@typescript-eslint/parser": "5.49.0",
59
47
  "c8": "7.12.0",
60
- "esbuild": "0.15.9",
61
- "eslint": "8.24.0",
62
- "eslint-config-prettier": "8.5.0",
63
- "eslint-plugin-unicorn": "43.0.2",
64
- "husky": "8.0.1",
65
- "lint-staged": "13.0.3",
48
+ "esbuild": "0.17.5",
49
+ "eslint": "8.33.0",
50
+ "eslint-config-prettier": "8.6.0",
51
+ "eslint-plugin-unicorn": "45.0.2",
52
+ "husky": "8.0.3",
53
+ "lint-staged": "13.1.0",
66
54
  "npm-run-all": "4.1.5",
67
- "prettier": "2.7.1",
68
- "rimraf": "3.0.2",
69
- "rollup": "2.79.1",
70
- "rollup-plugin-dts": "4.2.2",
71
- "rollup-plugin-esbuild": "4.10.1",
55
+ "prettier": "2.8.3",
56
+ "rimraf": "4.1.2",
57
+ "rollup": "3.12.0",
58
+ "rollup-plugin-dts": "5.1.1",
59
+ "rollup-plugin-esbuild": "5.0.0",
72
60
  "rollup-plugin-filesize": "9.1.2",
73
61
  "ts-node": "10.9.1",
74
- "typescript": "4.8.4",
62
+ "typescript": "4.9.5",
75
63
  "uvu": "0.5.6"
76
64
  },
77
65
  "repository": "github:smonn/validator-fns",
@@ -80,5 +68,15 @@
80
68
  "lint-staged": {
81
69
  "*.ts": "eslint --cache --fix",
82
70
  "*.{js,css,md}": "prettier --write"
71
+ },
72
+ "scripts": {
73
+ "clean": "rimraf dist",
74
+ "check": "tsc --noEmit",
75
+ "build": "rollup -c",
76
+ "lint": "eslint --ext ts .",
77
+ "format": "prettier --write .",
78
+ "test": "uvu -r ts-node/register test",
79
+ "coverage": "c8 --include=src --exclude=src/index.ts npm test",
80
+ "report": "c8 report --reporter=text-lcov > coverage/lcov.info"
83
81
  }
84
- }
82
+ }