UNPKG

@mmstack/form-validation

Version:

This is an internal library for providing localized validators :)

1 lines 60.6 kB
{"version":3,"file":"mmstack-form-validation.mjs","sources":["../../../../../packages/form/validation/src/lib/merge-validators.ts","../../../../../packages/form/validation/src/lib/array/max-length.ts","../../../../../packages/form/validation/src/lib/array/min-length.ts","../../../../../packages/form/validation/src/lib/array/index.ts","../../../../../packages/form/validation/src/lib/boolean/must-be-true.ts","../../../../../packages/form/validation/src/lib/boolean/index.ts","../../../../../packages/form/validation/src/lib/general/must-be.ts","../../../../../packages/form/validation/src/lib/general/not.ts","../../../../../packages/form/validation/src/lib/general/not-one-of.ts","../../../../../packages/form/validation/src/lib/general/one-of.ts","../../../../../packages/form/validation/src/lib/general/required.ts","../../../../../packages/form/validation/src/lib/general/index.ts","../../../../../packages/form/validation/src/lib/date/is-date.ts","../../../../../packages/form/validation/src/lib/date/max-date.ts","../../../../../packages/form/validation/src/lib/date/min-date.ts","../../../../../packages/form/validation/src/lib/date/util.ts","../../../../../packages/form/validation/src/lib/date/index.ts","../../../../../packages/form/validation/src/lib/number/integer.ts","../../../../../packages/form/validation/src/lib/number/is-number.ts","../../../../../packages/form/validation/src/lib/number/max.ts","../../../../../packages/form/validation/src/lib/number/min.ts","../../../../../packages/form/validation/src/lib/number/multiple-of.ts","../../../../../packages/form/validation/src/lib/number/index.ts","../../../../../packages/form/validation/src/lib/string/email.ts","../../../../../packages/form/validation/src/lib/string/is-string.ts","../../../../../packages/form/validation/src/lib/string/max-chars.ts","../../../../../packages/form/validation/src/lib/string/min-chars.ts","../../../../../packages/form/validation/src/lib/string/pattern.ts","../../../../../packages/form/validation/src/lib/string/trimmed.ts","../../../../../packages/form/validation/src/lib/string/uri.ts","../../../../../packages/form/validation/src/lib/string/index.ts","../../../../../packages/form/validation/src/lib/validators.ts","../../../../../packages/form/validation/src/mmstack-form-validation.ts"],"sourcesContent":["import { Validator } from './validator.type';\n\nconst INTERNAL_ERROR_MERGE_DELIM = '::INTERNAL_MMSTACK_MERGE_DELIM::';\n\nexport function defaultMergeMessage(errors: string[]): {\n error: string;\n tooltip: string;\n} {\n const first = errors.at(0);\n\n if (!first)\n return {\n error: '',\n tooltip: '',\n };\n\n if (errors.length === 1) {\n if (first.length > 60) {\n return {\n error: `${first.slice(0, 60)}...`,\n tooltip: first,\n };\n }\n\n return {\n error: first,\n tooltip: '',\n };\n }\n\n if (first.length > 40) {\n return {\n error: `${first.slice(0, 40)}..., +${errors.length - 1} issues`,\n tooltip: errors.join('\\n'),\n };\n }\n\n return {\n error: `${first}, +${errors.length - 1} issues`,\n tooltip: errors.join('\\n'),\n };\n}\n\nfunction toTooltipFn(\n merge: (errors: string[]) => string | { tooltip: string; error: string },\n) {\n return (errors: string[]) => {\n const result = merge(errors);\n if (typeof result === 'string') {\n return {\n error: result,\n tooltip: '',\n merged: errors.join(INTERNAL_ERROR_MERGE_DELIM),\n };\n }\n\n return result;\n };\n}\n\nexport function mergeValidators<T>(\n ...validators: Validator<T>[]\n): (value: T) => string[] {\n if (!validators.length) return () => [];\n\n return (value) => validators.map((val) => val(value)).filter(Boolean);\n}\n\ntype MergeFn<T> = ((value: T) => string) & {\n resolve: (mergedError: string) => {\n error: string;\n tooltip: string;\n };\n};\n\nexport function createMergeValidators(\n merge?: (errors: string[]) =>\n | string\n | {\n tooltip: string;\n error: string;\n },\n) {\n const mergeFn = merge ? toTooltipFn(merge) : defaultMergeMessage;\n\n return <T>(validators: Validator<T>[]) => {\n const validate = mergeValidators(...validators);\n\n const fn = ((value: T) =>\n validate(value).join(INTERNAL_ERROR_MERGE_DELIM)) as MergeFn<T>;\n\n fn.resolve = (mergedError: string) => {\n return mergeFn(mergedError.split(INTERNAL_ERROR_MERGE_DELIM));\n };\n\n return fn;\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMaxLengthMessageFactory(\n max: number,\n elementsLabel?: string,\n) {\n return `Max ${max} ${elementsLabel}`;\n}\n\nexport function createMaxLengthValidator(\n createMsg: (max: number, elementsLabel?: string) => string,\n): <T extends string | any[] | null>(\n max: number,\n elementsLabel?: string,\n) => Validator<T> {\n return (max, elementsLabel = 'items') => {\n const msg = createMsg(max, elementsLabel);\n return (value) => {\n const length = value?.length ?? 0;\n\n if (length > max) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMinLengthMessageFactory(\n min: number,\n elementsLabel?: string,\n) {\n return `Min ${min} ${elementsLabel}`;\n}\n\nexport function createMinLengthValidator(\n createMsg: (min: number, elementsLabel?: string) => string,\n): <T extends string | any[] | null>(\n min: number,\n elementsLabel?: string,\n) => Validator<T> {\n return (min, elementsLabel = 'items') => {\n const msg = createMsg(min, elementsLabel);\n return (value) => {\n const length = value?.length ?? 0;\n\n if (length < min) return msg;\n return '';\n };\n };\n}\n","import { createMergeValidators } from '../merge-validators';\nimport { Validator } from '../validator.type';\nimport {\n createMaxLengthValidator,\n defaultMaxLengthMessageFactory,\n} from './max-length';\nimport {\n createMinLengthValidator,\n defaultMinLengthMessageFactory,\n} from './min-length';\n\nexport type ArrayMessageFactories = {\n minLength: Parameters<typeof createMinLengthValidator>[0];\n maxLength: Parameters<typeof createMaxLengthValidator>[0];\n};\n\nconst DEFAULT_MESSAGES: ArrayMessageFactories = {\n minLength: defaultMinLengthMessageFactory,\n maxLength: defaultMaxLengthMessageFactory,\n};\n\nexport type ArrayValidatorOptions = {\n minLength?: number;\n maxLength?: number;\n elementsLabel?: string;\n};\n\nexport function createArrayValidators(\n factories?: Partial<ArrayMessageFactories>,\n merger = createMergeValidators(),\n) {\n const t = { ...DEFAULT_MESSAGES, ...factories };\n const base = {\n minLength: createMinLengthValidator(t.minLength),\n maxLength: createMaxLengthValidator(t.maxLength),\n };\n\n return {\n ...base,\n all: <T extends any[]>(opt: ArrayValidatorOptions) => {\n const validators: Validator<T>[] = [];\n\n if (opt.minLength !== undefined)\n validators.push(base.minLength(opt.minLength, opt.elementsLabel));\n if (opt.maxLength !== undefined)\n validators.push(base.maxLength(opt.maxLength, opt.elementsLabel));\n\n return merger(validators);\n },\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMustBeTreFactory() {\n return `Must be true`;\n}\n\nexport function createMustBeTrueValidator(\n createMsg: () => string,\n): () => Validator<boolean> {\n return () => {\n const msg = createMsg();\n return (value) => {\n if (value !== true) return msg;\n return '';\n };\n };\n}\n","import {\n createMustBeTrueValidator,\n defaultMustBeTreFactory,\n} from './must-be-true';\n\nexport type BooleanMessageFactories = {\n mustBeTrue: Parameters<typeof createMustBeTrueValidator>[0];\n};\n\nconst DEFAULT_MESSAGES: BooleanMessageFactories = {\n mustBeTrue: defaultMustBeTreFactory,\n};\n\nexport function createBooleanValidators(\n factories?: Partial<BooleanMessageFactories>,\n) {\n const t = { ...DEFAULT_MESSAGES, ...factories };\n\n return {\n mustBeTrue: createMustBeTrueValidator(t.mustBeTrue),\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMustBeMessageFactory(valueLabel: string) {\n return `Must be ${valueLabel}`;\n}\n\nexport function createMustBeValidator(\n createMessage: (valueLabel: string) => string,\n) {\n return <T>(\n value: T,\n valueLabel = `${value}`,\n matcher: (a: T, b: T) => boolean = Object.is,\n ): Validator<T> => {\n const msg = createMessage(valueLabel);\n\n return (currentValue) => {\n if (!matcher(value, currentValue)) return msg;\n return '';\n };\n };\n}\n\nexport function defaultMustBeEmptyMessageFactory() {\n return defaultMustBeMessageFactory('empty');\n}\n\nexport function createMustBeEmptyValidator(createMessage: () => string) {\n return <T>() => createMustBeValidator(createMessage)<T>(null as T);\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultNotMessageFactory(valueLabel: string) {\n return `Cannot be ${valueLabel}`;\n}\n\nexport function createNotValidator(\n createMessage: (valueLabel: string) => string,\n) {\n return <T>(\n value: T,\n valueLabel = `${value}`,\n matcher: (a: T, b: T) => boolean = Object.is,\n ): Validator<T> => {\n const msg = createMessage(valueLabel);\n\n return (currentValue) => {\n if (matcher(value, currentValue)) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultNotOneOfMessageFactory(values: string) {\n return `Cannot be one of: ${values}`;\n}\n\nfunction defaultToLabel<T>(value: T): string {\n return `${value}`;\n}\n\nexport function createNotOneOfValidator(\n createMessage: (values: string) => string,\n) {\n return <T>(\n values: T[],\n toLabel: (value: T) => string = defaultToLabel,\n identity: (a: T) => string = defaultToLabel,\n delimiter = ', ',\n ): Validator<T> => {\n const valuesLabel = values.map(toLabel).join(delimiter);\n const msg = createMessage(valuesLabel);\n\n const map = new Map(values.map((v) => [identity(v), v]));\n\n return (currentValue) => {\n if (map.has(identity(currentValue))) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultOneOfMessageFactory(values: string) {\n return `Must be one of: ${values}`;\n}\n\nfunction defaultToLabel<T>(value: T): string {\n return `${value}`;\n}\n\nexport function createOneOfValidator(\n createMessage: (values: string) => string,\n) {\n return <T>(\n values: T[],\n toLabel: (value: T) => string = defaultToLabel,\n identity: (a: T) => string = defaultToLabel,\n delimiter = ', ',\n ): Validator<T> => {\n const valuesLabel = values.map(toLabel).join(delimiter);\n const msg = createMessage(valuesLabel);\n\n const map = new Map(values.map((v) => [identity(v), v]));\n\n return (currentValue) => {\n if (!map.has(identity(currentValue))) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultRequiredMessageFactory(label = 'Field') {\n return `${label} is required`;\n}\n\nfunction requiredNumber(value: number) {\n return value !== null && value !== undefined;\n}\n\nexport function createRequiredValidator(\n createMsg: (label?: string) => string,\n): <T>(label?: string) => Validator<T> {\n return (label = 'Field') => {\n const msg = createMsg(label);\n\n return (value) => {\n if (typeof value === 'number' && !requiredNumber(value)) return msg;\n if (!value) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\nimport {\n createMustBeEmptyValidator,\n createMustBeValidator,\n defaultMustBeEmptyMessageFactory,\n defaultMustBeMessageFactory,\n} from './must-be';\nimport { createNotValidator, defaultNotMessageFactory } from './not';\nimport {\n createNotOneOfValidator,\n defaultNotOneOfMessageFactory,\n} from './not-one-of';\nimport { createOneOfValidator, defaultOneOfMessageFactory } from './one-of';\nimport {\n createRequiredValidator,\n defaultRequiredMessageFactory,\n} from './required';\n\nexport type GeneralMessageFactories = {\n required: Parameters<typeof createRequiredValidator>[0];\n mustBe: Parameters<typeof createMustBeValidator>[0];\n mustBeNull: Parameters<typeof createMustBeEmptyValidator>[0];\n not: Parameters<typeof createNotValidator>[0];\n oneOf: Parameters<typeof createOneOfValidator>[0];\n notOneOf: Parameters<typeof createNotOneOfValidator>[0];\n};\n\nconst DEFAULT_MESSAGES: GeneralMessageFactories = {\n required: defaultRequiredMessageFactory,\n mustBe: defaultMustBeMessageFactory,\n mustBeNull: defaultMustBeEmptyMessageFactory,\n not: defaultNotMessageFactory,\n oneOf: defaultOneOfMessageFactory,\n notOneOf: defaultNotOneOfMessageFactory,\n};\n\nexport function createGeneralValidators(\n factories?: Partial<GeneralMessageFactories>,\n) {\n const t = { ...DEFAULT_MESSAGES, ...factories };\n\n const mustBeNull = createMustBeEmptyValidator(t.mustBeNull);\n\n return {\n required: createRequiredValidator(t.required),\n mustBe: createMustBeValidator(t.mustBe),\n mustBeNull: createMustBeEmptyValidator(t.mustBeNull),\n not: createNotValidator(t.not),\n oneOf: <T>(\n values: T[],\n toLabel?: (value: T) => string,\n identity?: (a: T) => string,\n delimiter?: string,\n ): Validator<T> => {\n if (!values.length) return mustBeNull<T>();\n\n return createOneOfValidator(t.oneOf)(\n values,\n toLabel,\n identity,\n delimiter,\n );\n },\n notOneOf: createNotOneOfValidator(t.notOneOf),\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultIsDateMessageFactory() {\n return `Must be a valid date`;\n}\n\nexport function createIsDateValidator<TDate = Date>(\n createMsg: () => string,\n toDate: (date: TDate | string) => Date,\n): () => Validator<TDate | string | null> {\n return () => {\n const msg = createMsg();\n return (value) => {\n if (value === null) return '';\n\n const date = toDate(value);\n if (isNaN(date.getTime())) return msg;\n\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMaxDateMessageFactory(dateLabel: string) {\n return `Must be before ${dateLabel}`;\n}\n\nexport function createMaxDateValidator<TDate = Date>(\n createMsg: (dateLabel: string) => string,\n toDate: (date: TDate | string) => Date,\n formatDate: (date: Date, locale: string) => string,\n locale: string,\n): (date: TDate | string) => Validator<TDate | string | null> {\n return (date) => {\n const d = toDate(date);\n const matchTime = d.getTime();\n\n const msg = createMsg(formatDate(d, locale));\n return (value) => {\n if (value === null) return '';\n if (toDate(value).getTime() > matchTime) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMinDateMessageFactory(dateLabel: string) {\n return `Must be after ${dateLabel}`;\n}\n\nexport function createMinDateValidator<TDate = Date>(\n createMsg: (dateLabel: string) => string,\n toDate: (date: TDate | string) => Date,\n formatDate: (date: Date, locale: string) => string,\n locale: string,\n): (date: TDate | string) => Validator<TDate | string | null> {\n return (date) => {\n const d = toDate(date);\n const matchTime = d.getTime();\n\n const msg = createMsg(formatDate(d, locale));\n return (value) => {\n if (value === null) return '';\n if (toDate(value).getTime() < matchTime) return msg;\n return '';\n };\n };\n}\n","import { formatDate } from '@angular/common';\n\ntype LuxonDateTimeLike = {\n toJSDate(): Date;\n toUnixInteger(): number;\n};\n\ntype MomentDateTimeLike = {\n toDate(): Date;\n unix(): number;\n};\n\nfunction isLuxonLike(date: object): date is LuxonDateTimeLike {\n if (!date) return false;\n\n return (\n 'toJSDate' in date &&\n 'toUnixInteger' in date &&\n typeof date.toJSDate === 'function' &&\n typeof date.toUnixInteger === 'function'\n );\n}\n\nfunction isMomentLike(date: object): date is MomentDateTimeLike {\n if (!date) return false;\n return (\n 'toDate' in date &&\n 'unix' in date &&\n typeof date.toDate === 'function' &&\n typeof date.unix === 'function'\n );\n}\n\nexport function defaultToDate<TDate>(date: TDate | string): Date {\n if (date instanceof Date) return date;\n\n if (typeof date === 'string' || typeof date === 'number')\n return new Date(date);\n\n if (!date) return new Date();\n\n if (typeof date !== 'object')\n throw new Error('Date is not number, string, null, undefined or object');\n\n if (isMomentLike(date)) return date.toDate();\n\n if (isLuxonLike(date)) return date.toJSDate();\n\n return new Date();\n}\n\nexport function defaultFormatDate(\n date: Date,\n locale: string,\n format = 'mediumDate',\n) {\n return formatDate(date, format, locale);\n}\n","import { createGeneralValidators } from '../general';\nimport { createMergeValidators } from '../merge-validators';\nimport { Validator } from '../validator.type';\nimport { createIsDateValidator, defaultIsDateMessageFactory } from './is-date';\nimport {\n createMaxDateValidator,\n defaultMaxDateMessageFactory,\n} from './max-date';\nimport {\n createMinDateValidator,\n defaultMinDateMessageFactory,\n} from './min-date';\nimport { defaultFormatDate, defaultToDate } from './util';\n\nexport type DateMessageFactories = {\n min: Parameters<typeof createMinDateValidator>[0];\n max: Parameters<typeof createMaxDateValidator>[0];\n isDate: Parameters<typeof createIsDateValidator>[0];\n};\n\nconst DEFAULT_MESSAGES: DateMessageFactories = {\n min: defaultMinDateMessageFactory,\n max: defaultMaxDateMessageFactory,\n isDate: defaultIsDateMessageFactory,\n};\n\nexport type DateValidatorOptions = {\n required?: boolean;\n min?: Date | string;\n max?: Date | string;\n mustBe?: Date | string | null;\n not?: Date | string | null;\n oneOf?: (Date | string | null)[];\n notOneOf?: (Date | string | null)[];\n messageOptions?: {\n label?: string;\n };\n};\n\nexport function createDateValidators<TDate = Date>(\n factories?: Partial<DateMessageFactories>,\n toDate = defaultToDate<TDate>,\n formatDate = defaultFormatDate,\n locale = 'en-US',\n generalValidators = createGeneralValidators(),\n merger = createMergeValidators(),\n) {\n const t = { ...DEFAULT_MESSAGES, ...factories };\n const base = {\n min: createMinDateValidator(t.min, toDate, formatDate, locale),\n max: createMaxDateValidator(t.max, toDate, formatDate, locale),\n isDate: createIsDateValidator(t.isDate, toDate),\n };\n\n const toLabel = (d: TDate | null) =>\n d ? formatDate(toDate(d), locale) : 'null';\n\n return {\n ...base,\n all: (opt: DateValidatorOptions) => {\n const validators: Validator<TDate | null>[] = [];\n\n if (opt.required)\n validators.push(generalValidators.required(opt.messageOptions?.label));\n\n validators.push(base.isDate());\n\n if (opt.mustBe !== undefined) {\n if (opt.mustBe === null)\n validators.push(generalValidators.mustBeNull<TDate | null>());\n else {\n const d = toDate(opt.mustBe as TDate | string);\n const formatted = formatDate(d, locale);\n validators.push(\n generalValidators.mustBe<TDate | null>(\n d as TDate,\n formatted,\n (a, b) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n return toDate(a).getTime() === toDate(b).getTime();\n },\n ),\n );\n }\n }\n\n if (opt.not !== undefined) {\n if (opt.not === null)\n validators.push(generalValidators.not<TDate | null>(null));\n else {\n const d = toDate(opt.not as TDate);\n const formatted = formatDate(d, locale);\n validators.push(\n generalValidators.not<TDate | null>(\n d as TDate,\n formatted,\n (a, b) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n\n return toDate(a).getTime() === toDate(b).getTime();\n },\n ),\n );\n }\n }\n\n if (opt.min !== undefined) validators.push(base.min(opt.min as TDate));\n if (opt.max !== undefined) validators.push(base.max(opt.max as TDate));\n\n if (opt.oneOf) {\n const dates = opt.oneOf.map((d) => (d ? toDate(d as TDate) : null));\n\n validators.push(\n generalValidators.oneOf<TDate | null>(\n dates as TDate[],\n toLabel,\n (a) =>\n a === null || a === undefined\n ? 'null'\n : toDate(a).getTime().toString(),\n ),\n );\n }\n\n if (opt.notOneOf) {\n const dates = opt.notOneOf.map((d) => (d ? toDate(d as TDate) : null));\n validators.push(\n generalValidators.notOneOf<TDate | null>(\n dates as TDate[],\n toLabel,\n (a) =>\n a === null || a === undefined\n ? 'null'\n : toDate(a).getTime().toString(),\n ),\n );\n }\n\n return merger(validators as Validator<TDate | null>[]);\n },\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultIntegerMessageFactory() {\n return `Must be an integer`;\n}\n\nexport function createIntegerValidator(\n createMsg: () => string,\n): () => Validator<number | null> {\n return () => {\n const msg = createMsg();\n return (value) => {\n if (value === null) return '';\n if (!Number.isInteger(value)) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultIsNumberMessageFactory() {\n return `Must be a number`;\n}\n\nexport function createIsNumberValidator(\n createMsg: () => string,\n): () => Validator<number | null> {\n return () => {\n const msg = createMsg();\n return (value) => {\n if (value === null) return '';\n if (typeof value !== 'number' || isNaN(value)) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMaxMessageFactory(max: number) {\n return `Must be at most ${max}`;\n}\n\nexport function createMaxValidator(\n createMsg: (max: number) => string,\n): (max: number) => Validator<number | null> {\n return (max) => {\n const msg = createMsg(max);\n return (value) => {\n if (value === null) return '';\n if (value > max) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMinMessageFactory(min: number) {\n return `Must be at least ${min}`;\n}\n\nexport function createMinValidator(\n createMsg: (min: number) => string,\n): (min: number) => Validator<number | null> {\n return (min) => {\n const msg = createMsg(min);\n return (value) => {\n if (value === null) return '';\n if (value < min) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultMultipleOfMessageFactory(multipleOf: number) {\n return `Must be a multiple of ${multipleOf}`;\n}\n\nexport function createMultipleOfValidator(\n createMsg: (multipleOf: number) => string,\n): (multipleOf: number) => Validator<number | null> {\n return (multipleOf) => {\n const msg = createMsg(multipleOf);\n\n return (value) => {\n if (value === null) return '';\n if (value % multipleOf !== 0) return msg;\n return '';\n };\n };\n}\n","import { createGeneralValidators } from '../general';\nimport { createMergeValidators } from '../merge-validators';\nimport { Validator } from '../validator.type';\nimport {\n createIntegerValidator,\n defaultIntegerMessageFactory,\n} from './integer';\nimport {\n createIsNumberValidator,\n defaultIsNumberMessageFactory,\n} from './is-number';\nimport { createMaxValidator, defaultMaxMessageFactory } from './max';\nimport { createMinValidator, defaultMinMessageFactory } from './min';\nimport {\n createMultipleOfValidator,\n defaultMultipleOfMessageFactory,\n} from './multiple-of';\n\nexport type NumberMessageFactories = {\n min: Parameters<typeof createMinValidator>[0];\n max: Parameters<typeof createMaxValidator>[0];\n isNumber: Parameters<typeof createIsNumberValidator>[0];\n multipleOf: Parameters<typeof createMultipleOfValidator>[0];\n integer: Parameters<typeof createIntegerValidator>[0];\n};\n\nconst DEFAULT_MESSAGES: NumberMessageFactories = {\n min: defaultMinMessageFactory,\n max: defaultMaxMessageFactory,\n isNumber: defaultIsNumberMessageFactory,\n multipleOf: defaultMultipleOfMessageFactory,\n integer: defaultIntegerMessageFactory,\n};\n\nexport type NumberValidatorOptions = {\n min?: number;\n max?: number;\n integer?: boolean;\n multipleOf?: number;\n required?: boolean;\n mustBe?: number | null;\n not?: number | null;\n oneOf?: (number | null)[];\n notOneOf?: (number | null)[];\n messageOptions?: {\n label?: string;\n };\n};\n\nexport function createNumberValidators(\n factories?: Partial<NumberMessageFactories>,\n generalValidators = createGeneralValidators(),\n merger = createMergeValidators(),\n) {\n const t = { ...DEFAULT_MESSAGES, ...factories };\n\n const base = {\n min: createMinValidator(t.min),\n max: createMaxValidator(t.max),\n isNumber: createIsNumberValidator(t.isNumber),\n multipleOf: createMultipleOfValidator(t.multipleOf),\n integer: createIntegerValidator(t.integer),\n };\n\n return {\n ...base,\n all: (opt: NumberValidatorOptions) => {\n const validators: Validator<number | null>[] = [];\n\n if (opt.required)\n validators.push(generalValidators.required(opt.messageOptions?.label));\n\n validators.push(base.isNumber());\n\n if (opt.mustBe !== undefined)\n validators.push(generalValidators.mustBe(opt.mustBe));\n\n if (opt.not !== undefined)\n validators.push(generalValidators.not(opt.not));\n\n if (opt.integer) validators.push(base.integer());\n\n if (opt.min !== undefined) validators.push(base.min(opt.min));\n\n if (opt.max !== undefined) validators.push(base.max(opt.max));\n\n if (opt.multipleOf !== undefined)\n validators.push(base.multipleOf(opt.multipleOf));\n\n if (opt.oneOf) validators.push(generalValidators.oneOf(opt.oneOf));\n\n if (opt.notOneOf)\n validators.push(generalValidators.notOneOf(opt.notOneOf));\n\n return merger(validators);\n },\n };\n}\n","import { Validator } from '../validator.type';\n\nconst EMAIL_REGEXP =\n /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\nexport function defaultEmailMessageFactory() {\n return `Must be a valid email`;\n}\n\nexport function createEmailValidator(\n createMsg: () => string,\n): () => Validator<string | null> {\n return () => {\n const msg = createMsg();\n\n return (value) => {\n if (value === null) return '';\n if (!EMAIL_REGEXP.test(value)) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultIsStringMessageFactory() {\n return `Must be a string`;\n}\n\nexport function createIsStringValidator(\n createMsg: () => string,\n): () => Validator<string | null> {\n return () => {\n const msg = createMsg();\n return (value) => {\n if (value === null) return '';\n if (typeof value !== 'string') return msg;\n return '';\n };\n };\n}\n","import {\n createMaxLengthValidator as arrayCreateMaxValidator,\n defaultMaxLengthMessageFactory as arrayDefaultMessageFactory,\n} from '../array/max-length';\nimport { Validator } from '../validator.type';\n\nexport function defaultMaxLengthMessageFactory(max: number) {\n return arrayDefaultMessageFactory(max, 'characters');\n}\n\nexport function createMaxLengthValidator(\n createMsg: (max: number) => string,\n): (max: number) => Validator<string | null> {\n return arrayCreateMaxValidator((max) => createMsg(max));\n}\n","import {\n createMinLengthValidator as arrayCreateMinValidator,\n defaultMinLengthMessageFactory as arrayDefaultMessageFactory,\n} from '../array/min-length';\nimport { Validator } from '../validator.type';\n\nexport function defaultMinLengthMessageFactory(min: number) {\n return arrayDefaultMessageFactory(min, 'characters');\n}\n\nexport function createMinLengthValidator(\n createMsg: (min: number) => string,\n): (min: number) => Validator<string | null> {\n return arrayCreateMinValidator((min) => createMsg(min));\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultPatternMessageFactory(patternLabel: string) {\n return `Must match pattern ${patternLabel}`;\n}\n\nexport function createPatternValidator(\n createMsg: (patternLabel: string) => string,\n): (pattern: string | RegExp) => Validator<string | null> {\n return (pattern: string | RegExp) => {\n const regex = new RegExp(pattern);\n const msg = createMsg(regex.source);\n\n return (value) => {\n if (value === null) return '';\n if (!regex.test(value)) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nexport function defaultTrimmedMessageFactory() {\n return `Cannot contain leading or trailing whitespace`;\n}\n\nexport function createTrimmedValidator(\n createMsg: () => string,\n): () => Validator<string | null> {\n return () => {\n const msg = createMsg();\n\n return (value) => {\n if (value === null) return '';\n if (value.trim().length !== value.length) return msg;\n return '';\n };\n };\n}\n","import { Validator } from '../validator.type';\n\nconst URI_REGEXP = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/;\n\nexport function defaultURIMessageFactory() {\n return `Must be a valid URI`;\n}\n\nexport function createURIValidator(\n createMsg: () => string,\n): () => Validator<string | null> {\n return () => {\n const msg = createMsg();\n\n return (value) => {\n if (value === null) return '';\n if (!URI_REGEXP.test(value)) return msg;\n return '';\n };\n };\n}\n","import { createGeneralValidators } from '../general';\nimport { createMergeValidators } from '../merge-validators';\nimport { Validator } from '../validator.type';\nimport { createEmailValidator, defaultEmailMessageFactory } from './email';\nimport {\n createIsStringValidator,\n defaultIsStringMessageFactory,\n} from './is-string';\nimport {\n createMaxLengthValidator,\n defaultMaxLengthMessageFactory,\n} from './max-chars';\nimport {\n createMinLengthValidator,\n defaultMinLengthMessageFactory,\n} from './min-chars';\nimport {\n createPatternValidator,\n defaultPatternMessageFactory,\n} from './pattern';\nimport {\n createTrimmedValidator,\n defaultTrimmedMessageFactory,\n} from './trimmed';\nimport { createURIValidator, defaultURIMessageFactory } from './uri';\n\nexport type StringMessageFactories = {\n email: Parameters<typeof createEmailValidator>[0];\n uri: Parameters<typeof createURIValidator>[0];\n pattern: Parameters<typeof createPatternValidator>[0];\n trimmed: Parameters<typeof createTrimmedValidator>[0];\n isString: Parameters<typeof createIsStringValidator>[0];\n minLength: Parameters<typeof createMinLengthValidator>[0];\n maxLength: Parameters<typeof createMaxLengthValidator>[0];\n};\n\nconst DEFAULT_MESSAGES: StringMessageFactories = {\n email: defaultEmailMessageFactory,\n uri: defaultURIMessageFactory,\n pattern: defaultPatternMessageFactory,\n trimmed: defaultTrimmedMessageFactory,\n isString: defaultIsStringMessageFactory,\n minLength: defaultMinLengthMessageFactory,\n maxLength: defaultMaxLengthMessageFactory,\n};\n\nexport type StringValidatorOptions = {\n pattern?: RegExp | 'email' | 'uri' | Omit<string, 'email' | 'uri'>;\n trimmed?: boolean;\n minLength?: number;\n maxLength?: number;\n required?: boolean;\n mustBe?: string | null;\n not?: string | null;\n oneOf?: (string | null)[];\n notOneOf?: (string | null)[];\n messageOptions?: {\n label?: string;\n };\n};\n\nexport function createStringValidators(\n factories?: Partial<StringMessageFactories>,\n generalValidators = createGeneralValidators(),\n merger = createMergeValidators(),\n) {\n const t = { ...DEFAULT_MESSAGES, ...factories };\n\n const base = {\n email: createEmailValidator(t.email),\n uri: createURIValidator(t.uri),\n pattern: createPatternValidator(t.pattern),\n trimmed: createTrimmedValidator(t.trimmed),\n isString: createIsStringValidator(t.isString),\n minLength: createMinLengthValidator(t.minLength),\n maxLength: createMaxLengthValidator(t.maxLength),\n };\n\n return {\n ...base,\n all: (opt: StringValidatorOptions) => {\n const validators: Validator<string | null>[] = [];\n\n if (opt.required)\n validators.push(generalValidators.required(opt?.messageOptions?.label));\n\n validators.push(base.isString());\n\n if (opt.mustBe !== undefined)\n validators.push(generalValidators.mustBe(opt.mustBe));\n\n if (opt.not !== undefined)\n validators.push(generalValidators.not(opt.not));\n\n if (opt.trimmed) validators.push(base.trimmed());\n\n if (opt.minLength !== undefined)\n validators.push(base.minLength(opt.minLength));\n\n if (opt.maxLength) validators.push(base.maxLength(opt.maxLength));\n\n if (opt.pattern) {\n switch (opt.pattern) {\n case 'email':\n validators.push(base.email());\n break;\n case 'uri':\n validators.push(base.uri());\n break;\n default:\n validators.push(base.pattern(opt.pattern as RegExp | string));\n break;\n }\n }\n\n if (opt.oneOf) validators.push(generalValidators.oneOf(opt.oneOf));\n\n if (opt.notOneOf)\n validators.push(generalValidators.notOneOf(opt.notOneOf));\n\n return merger(validators);\n },\n };\n}\n","import {\n inject,\n InjectionToken,\n Injector,\n LOCALE_ID,\n Provider,\n} from '@angular/core';\nimport { createArrayValidators } from './array';\nimport { createBooleanValidators } from './boolean';\nimport { createDateValidators } from './date';\nimport { defaultFormatDate, defaultToDate } from './date/util';\nimport { createGeneralValidators } from './general';\nimport { createMergeValidators } from './merge-validators';\nimport { createNumberValidators } from './number';\nimport { createStringValidators } from './string';\n\ntype MessageFactories = {\n general: Parameters<typeof createGeneralValidators>[0];\n string: Parameters<typeof createStringValidators>[0];\n number: Parameters<typeof createNumberValidators>[0];\n date: Parameters<typeof createDateValidators>[0];\n array: Parameters<typeof createArrayValidators>[0];\n boolean: Parameters<typeof createBooleanValidators>[0];\n merge: Parameters<typeof createMergeValidators>[0];\n};\n\nexport type Validators<TDate = Date> = {\n general: ReturnType<typeof createGeneralValidators>;\n string: ReturnType<typeof createStringValidators>;\n number: ReturnType<typeof createNumberValidators>;\n date: ReturnType<typeof createDateValidators<TDate>>;\n array: ReturnType<typeof createArrayValidators>;\n boolean: ReturnType<typeof createBooleanValidators>;\n};\n\nconst token = new InjectionToken<Validators>('INTERNAL_MMSTACK_VALIDATORS');\n\nlet defaultValidators: Validators | null = null;\n\nfunction createDefaultValidators() {\n if (!defaultValidators) {\n defaultValidators = createValidators(\n {},\n defaultToDate,\n defaultFormatDate,\n 'en-US',\n );\n }\n\n return defaultValidators;\n}\n\nfunction createValidators<TDate = Date>(\n msg: Partial<MessageFactories> | void,\n toDate: (date: TDate | string) => Date,\n formatDate: (date: Date, locale: string) => string,\n locale: string,\n): Validators<TDate> {\n const general = createGeneralValidators(msg?.general);\n\n const merger = createMergeValidators(msg?.merge);\n\n return {\n general,\n string: createStringValidators(msg?.string, general, merger),\n number: createNumberValidators(msg?.number, general, merger),\n date: createDateValidators<TDate>(\n msg?.date,\n toDate,\n formatDate,\n locale,\n general,\n merger,\n ),\n array: createArrayValidators(msg?.array, merger),\n boolean: createBooleanValidators(msg?.boolean),\n };\n}\n\nexport function provideValidatorConfig<TDate = Date>(\n factory: (locale: string) => Partial<MessageFactories> | void | undefined,\n toDate: (date: TDate | string) => Date = defaultToDate<TDate>,\n formatDate: (date: Date, locale: string) => string = defaultFormatDate,\n): Provider {\n return {\n provide: token,\n useFactory: (locale: string) =>\n createValidators(factory(locale), toDate, formatDate, locale),\n deps: [LOCALE_ID],\n };\n}\n\nexport function injectValidators(injector?: Injector) {\n const validators = injector\n ? injector.get(token, null, {\n optional: true,\n })\n : inject(token, { optional: true });\n\n return validators ?? createDefaultValidators();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["defaultMaxLengthMessageFactory","createMaxLengthValidator","defaultMinLengthMessageFactory","createMinLengthValidator","DEFAULT_MESSAGES","defaultToLabel","arrayDefaultMessageFactory","arrayCreateMaxValidator","arrayCreateMinValidator"],"mappings":"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