adaptform 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/plugins/FieldPlugin.ts","../src/core/types/FieldType.ts","../src/core/types/BooleanType.ts","../src/core/utils/luxon-loader.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import {PluginOptions} from \"@core/options\";\nimport Field from \"@core/fields/Field\";\n\nexport interface FieldPlugin<T = any> {\n pluginOptions?: PluginOptions\n\n init?(field: Field<T>): void\n\n toRawValue?(value: any, field: Field<T>): any\n\n toValueClear?(value: any, field: Field<T>): any\n}\n\nexport abstract class BasePlugin<T = any> implements FieldPlugin<T> {\n pluginOptions: PluginOptions\n\n constructor(pluginOptions: PluginOptions = {}) {\n this.pluginOptions = {\n priority: 0,\n ...pluginOptions\n }\n }\n}","import {FieldOptions} from \"@core/options\";\nimport Form from \"@core/Form\";\n\n\nexport default abstract class FieldType<T, O extends FieldOptions = FieldOptions> {\n options: O\n\n constructor(options: O) {\n this.options = {\n isRequired: true,\n messages: {},\n ...options\n } as O\n }\n\n abstract cast(rawValue: any): T | null\n\n abstract validate(value: T, form?: Form): string[]\n\n abstract getTypeName(): string\n}","import FieldType from \"@core/types/FieldType\";\nimport {BooleanOptions} from \"@core/options\";\n\nexport class BooleanType extends FieldType<boolean, BooleanOptions> {\n cast(rawValue: any): boolean | null {\n if (rawValue === null || rawValue === undefined) return null\n if (typeof rawValue === 'boolean') return rawValue\n\n if (typeof rawValue === 'string') {\n if (rawValue === 'true' || rawValue === '1') return true\n if (rawValue === 'false' || rawValue === '0') return false\n }\n\n if (typeof rawValue === 'number') {\n if (rawValue === 1) return true\n if (rawValue === 0) return false\n }\n\n return null\n }\n\n validate(value: boolean): string[] {\n const errors: string[] = []\n\n if (this.options.mustBeTrue && value !== true) {\n errors.push(this.options.messages?.mustBeTrue ?? 'Значение должно быть true')\n }\n\n if (this.options.mustBeFalse && value !== false) {\n errors.push(this.options.messages?.mustBeFalse ?? 'Значение должно быть false')\n }\n\n return errors\n }\n\n getTypeName(): string {\n return 'логическое значение'\n }\n}","let DateTimeConstructor: any = null\nlet isLoading = false\nlet loadError: Error | null = null\nlet loadPromise: Promise<any> | null = null\n\nexport function getDateTimeConstructor(): any {\n if (DateTimeConstructor) {\n return DateTimeConstructor\n }\n\n if (loadError) {\n throw loadError\n }\n\n if (isLoading) {\n throw new Error(\n 'Luxon is still loading. Please await initLuxon() first.'\n )\n }\n\n throw new Error(\n 'Luxon is not initialized. Install: npm install luxon'\n )\n}\n\nexport function initLuxon(): Promise<any> {\n if (DateTimeConstructor) {\n return Promise.resolve(DateTimeConstructor)\n }\n\n if (loadPromise) {\n return loadPromise\n }\n\n isLoading = true\n loadPromise = (async () => {\n try {\n const luxon = await import('luxon')\n DateTimeConstructor = luxon.DateTime\n return DateTimeConstructor\n } catch (error) {\n loadError = new Error(\n 'DateLuxonType requires the \"luxon\" package to be installed.\\n' +\n 'Install: npm install luxon'\n )\n throw loadError\n } finally {\n isLoading = false\n }\n })()\n\n return loadPromise\n}\n\nexport function isLuxonAvailable(): boolean {\n return DateTimeConstructor !== null\n}\n\nexport function resetLuxon(): void {\n DateTimeConstructor = null\n isLoading = false\n loadError = null\n loadPromise = null\n}\n\ninitLuxon().catch(() => {})"]}
1
+ {"version":3,"sources":["../src/core/fields/Field.ts","../src/core/fields/ArrayField.ts","../src/core/fields/ArrayFormField.ts","../src/core/Form.ts","../src/core/plugins/FieldPlugin.ts","../src/core/plugins/MaskPlugin.ts","../src/core/types/FieldType.ts","../src/core/types/StringType.ts","../src/core/types/NumberType.ts","../src/core/types/DecimalType.ts","../src/core/types/BooleanType.ts","../src/core/types/DateType.ts"],"names":["form"],"mappings":"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","file":"index.cjs","sourcesContent":["import {FieldOptions} from \"@core/options\";\nimport {FieldType} from \"@core/types/FieldType\";\nimport {Form} from \"@core/Form\";\ntype FieldTypeConstructor<T, O extends FieldOptions = FieldOptions> = new (options: O) => FieldType<T, O>\n\nexport class Field<T = any, O extends FieldOptions = FieldOptions> {\n protected _rawValue: any = null\n protected _valueClear: T | null = null\n protected filed_type: FieldType<T, O>\n protected defaultValue: T | null\n protected _errors: string[] = []\n\n isValid: boolean | null = null\n isTouched: boolean = false\n\n constructor(\n TypeConstructor: FieldTypeConstructor<T, O>,\n defaultValue?: T | null,\n options?: O | null,\n ) {\n this.filed_type = new TypeConstructor(options ?? {} as O)\n this.defaultValue = defaultValue ?? null\n\n for (const plugin of this.options.plugins ?? []) {\n plugin.init?.(this)\n }\n\n if (defaultValue !== undefined && defaultValue !== null) {\n this.rawValue = defaultValue\n } else {\n this._rawValue = null\n this._valueClear = null\n this.isValid = null\n }\n }\n\n // ========== Геттеры/сеттеры ==========\n\n protected get plugins() {\n return [...(this.options.plugins ?? [])].sort((a, b) => {\n return (a.pluginOptions?.priority ?? 0) - (b.pluginOptions?.priority ?? 0)\n })\n }\n\n get options() {\n return this.filed_type.options\n }\n\n set options(options: O) {\n let cur_options = this.filed_type.options\n this.filed_type.options = Object.assign(cur_options, options)\n }\n\n get rawValue(): T | null {\n return this._rawValue\n }\n\n set rawValue(input: any) {\n let rawValue = input\n\n for (const plugin of this.plugins) {\n if (plugin.toRawValue) {\n rawValue = plugin.toRawValue(rawValue, this)\n }\n }\n\n let valueClear = rawValue\n\n for (const plugin of this.plugins) {\n if (plugin.toValueClear) {\n valueClear = plugin.toValueClear(valueClear, this)\n }\n }\n\n this._rawValue = rawValue\n this._valueClear = this.filed_type.cast(valueClear)\n\n this._errors = []\n this.isTouched = true\n this.checkAndSetValid()\n }\n\n get errors(): string[] {\n return this._errors\n }\n\n get error(): string {\n return this._errors[0] ?? ''\n }\n\n set error(message: string | null) {\n if (message) {\n this._errors = [message]\n } else {\n this._errors = []\n }\n this.isValid = message ? false : null\n }\n\n get valueClear(): any {\n return this._valueClear\n }\n\n // ========== Валидация ==========\n\n private isRequired(form?: Form): boolean {\n let isRequired\n if (typeof this.options.isRequired === 'function') {\n isRequired = this.options.isRequired(form ?? null)\n } else {\n isRequired = this.options.isRequired ?? false\n }\n\n return isRequired\n }\n\n checkValid(form?: Form): boolean {\n this._errors = []\n\n // 1. Проверка на пустоту и обязательность\n if (this.isEmpty) {\n if (this.isRequired(form)) {\n this._errors.push(this.options.messages?.isRequired ?? 'Поле обязательно для заполнения')\n return false\n }\n return true\n }\n\n // 2. Проверка, что значение привелось к нужному типу\n if (this._valueClear === null) {\n this._errors.push(\n this.options.messages?.type ??\n `Ожидается ${this.filed_type.getTypeName()}`\n )\n return false\n }\n\n // 3. Специфичная валидация типа\n const typeErrors = this.filed_type.validate(this._valueClear, form)\n if (typeErrors.length > 0) {\n this._errors.push(...typeErrors)\n return false\n }\n\n // 4. Кастомная валидация\n if (this.options.validate) {\n const result = this.options.validate(this._valueClear, form)\n if (result === false) {\n this._errors.push(this.options.messages?.validate ?? 'Значение не прошло валидацию')\n return false\n }\n if (typeof result === 'string') {\n this._errors.push(result)\n return false\n }\n }\n\n return true\n }\n\n checkAndSetValid(form?: Form): boolean {\n this.isValid = this.checkValid(form)\n return this.isValid\n }\n\n get isEmpty(): boolean {\n let isEmpty = false\n if (this._rawValue === null || this._rawValue === undefined) isEmpty = true\n else if (this._rawValue === '') isEmpty = true\n else if (Array.isArray(this._rawValue) && this._rawValue.length === 0) isEmpty = true\n return isEmpty\n }\n\n // ========== Вспомогательные методы ==========\n\n reset(): void {\n if (this.defaultValue !== null && this.defaultValue !== undefined) {\n this.rawValue = this.defaultValue\n this.isValid = true\n } else {\n this._rawValue = null\n this._valueClear = null\n this.isValid = null\n }\n this._errors = []\n this.isTouched = false\n }\n}","import {ArrayFieldOptions} from \"@core/options\";\nimport {Field} from \"@core/fields/Field\";\nimport {Form} from \"@core/Form\";\n\nexport class ArrayField<T = any> {\n protected options: ArrayFieldOptions\n protected _items: Field<T>[] = []\n protected _errors: string[] = []\n\n isTouched: boolean = false\n\n constructor(\n protected factory: (value?: T) => Field<T>,\n options: ArrayFieldOptions = {},\n initial: T[] = []\n ) {\n this.options = {\n isRequired: true,\n messages: {},\n ...options\n } as ArrayFieldOptions\n this._items = initial.map(v => this.factory(v))\n }\n\n // ===== value =====\n\n set itemsValue(items: T[]) {\n this.clear()\n\n for (const i of items) {\n this.add(i, false)\n }\n\n this.checkValid()\n }\n\n get itemsValue(): T[] {\n return this._items.map(i => i.valueClear)\n }\n\n get items(): Field<T>[] {\n return this._items\n }\n\n // ===== actions =====\n\n add(value?: T, force_check?: boolean): Field<T> {\n const field = this.factory(value)\n this.isTouched = true\n this._items.push(field)\n\n if (force_check) this.checkValid()\n\n return field\n }\n\n remove(index: number): void {\n this._items.splice(index, 1)\n this.checkValid()\n }\n\n clear(): void {\n this._items = []\n this.checkValid()\n }\n\n // ===== validation =====\n\n private isRequired(form?: Form): boolean {\n let isRequired\n if (typeof this.options.isRequired === 'function') {\n isRequired = this.options.isRequired(form ?? null)\n } else {\n isRequired = this.options.isRequired ?? false\n }\n\n return isRequired\n }\n\n checkValid(form?: Form): boolean {\n this._errors = []\n\n if (this.isRequired(form) && this._items.length === 0) {\n this._errors.push(\n this.options.messages?.isRequired ??\n \"Добавьте хотя бы один элемент\"\n )\n return false\n }\n\n if (this.options.minItems != null && this._items.length < this.options.minItems) {\n this._errors.push(\n this.options.messages?.minItems ??\n `Значений должно быть не меньше ${this.options.minItems}`\n )\n return false\n }\n\n if (this.options.maxItems != null && this._items.length > this.options.maxItems) {\n this._errors.push(\n this.options.messages?.maxItems ??\n `Значений должно быть не больше ${this.options.maxItems}`\n )\n return false\n }\n\n let valid = true\n\n for (const field of this._items) {\n const ok = field.checkAndSetValid(form)\n if (!ok) valid = false\n }\n\n if (this.options.validate) {\n const result = this.options.validate(this._items, form)\n\n if (result === false) {\n this._errors.push(\n this.options.messages?.validate ?? \"Ошибка валидации\"\n )\n return false\n }\n\n if (typeof result === \"string\") {\n this._errors.push(result)\n return false\n }\n }\n\n return valid && this._errors.length === 0\n }\n\n checkAndSetValid(form?: Form): boolean {\n return this.checkValid(form)\n }\n\n get isValid(): boolean {\n return (\n this._errors.length === 0 &&\n this._items.every(i => i.isValid === true)\n )\n }\n\n get error(): string {\n return this._errors[0] ?? ''\n }\n\n set error(message: string | null) {\n if (message) {\n this._errors = [message]\n } else {\n this._errors = []\n }\n }\n\n get errors(): string[] {\n return this._errors\n }\n\n reset(): void {\n this._items.forEach(i => i.reset())\n this._errors = []\n this.isTouched = false\n }\n}","import {Form} from \"@core/Form\";\nimport {ArrayFormFieldOptions} from \"@core/options\";\n\nexport class ArrayFormField<T extends Form = Form> {\n private _forms: T[] = []\n private _errors: string[] = []\n\n isTouched: boolean = false\n\n constructor(\n private FormConstructor: new () => T,\n private options: ArrayFormFieldOptions = {},\n initial: any[] = []\n ) {\n this._forms = initial.map(data => {\n const form = new this.FormConstructor()\n form.fields = data\n return form\n })\n }\n\n\n // ===== value =====\n\n set forms(forms: any[]) {\n this.clear()\n\n for (const f of forms) {\n this.add(f, false)\n }\n\n this.checkValid()\n }\n\n get forms(): Form[] {\n return this._forms\n }\n\n get formsFieldsValue(): any[] {\n return this._forms.map(i => i.fieldsValue)\n }\n\n // ===== actions =====\n\n add(data?: any, force_check?: boolean): T {\n const form = new this.FormConstructor()\n\n if (data) form.fields = data\n\n this.isTouched = true\n this._forms.push(form)\n\n if (force_check) this.checkValid()\n\n return form\n }\n\n remove(index: number): void {\n this._forms.splice(index, 1)\n this.checkValid()\n }\n\n clear(): void {\n this._forms = []\n this.checkValid()\n }\n\n reset(): void {\n this._forms.forEach(f => f.reset())\n this._errors = []\n this.isTouched = false\n }\n\n // ===== validation =====\n\n private isRequired(form?: Form): boolean {\n let isRequired\n if (typeof this.options.isRequired === 'function') {\n isRequired = this.options.isRequired(form ?? null)\n } else {\n isRequired = this.options.isRequired ?? false\n }\n\n return isRequired\n }\n\n checkValid(form?: Form): boolean {\n this._errors = []\n\n if (this.isRequired(form) && this.forms.length === 0) {\n this._errors.push(\n this.options.messages?.isRequired ??\n \"Добавьте хотя бы один элемент\"\n )\n return false\n }\n\n if (this.options.minForms != null && this._forms.length < this.options.minForms) {\n this._errors.push(\n this.options.messages?.minForms ??\n `Значений должно быть не меньше ${this.options.minForms}`\n )\n return false\n }\n\n if (this.options.maxForms != null && this._forms.length > this.options.maxForms) {\n this._errors.push(\n this.options.messages?.maxForms ??\n `Значений должно быть не больше ${this.options.maxForms}`\n )\n return false\n }\n\n let valid = true\n\n for (const form of this.forms) {\n const ok = form.checkValid(form)\n if (!ok) valid = false\n }\n\n if (this.options.validate) {\n const result = this.options.validate(this.forms, form)\n\n if (result === false) {\n this._errors.push(\n this.options.messages?.validate ??\n \"Ошибка валидации\"\n )\n return false\n }\n\n if (typeof result === \"string\") {\n this._errors.push(result)\n return false\n }\n }\n\n return valid && this._errors.length === 0\n }\n\n checkAndSetValid(form?: Form): boolean {\n return this.checkValid(form)\n }\n\n get isValid(): boolean {\n return (\n this._errors.length === 0 &&\n this._forms.every(i => i.checkValid() === true)\n )\n }\n\n get errors(): string[] {\n return this._errors\n }\n\n get error(): string {\n return this._errors[0] ?? ''\n }\n\n set error(message: string | null) {\n if (message) {\n this._errors = [message]\n } else {\n this._errors = []\n }\n }\n}","import {Field} from \"@core/fields/Field\";\nimport {ArrayField} from \"@core/fields/ArrayField\";\nimport {ArrayFormField} from \"@core/fields/ArrayFormField\";\n\nexport abstract class Form {\n private _globalErrors: Record<string, string> = {}\n\n protected get _fields(): Record<string, Field<any> | ArrayField<any> | ArrayFormField<any>> {\n const fields: Record<string, Field<any> | ArrayField<any> | ArrayFormField<any>> = {}\n\n for (const key of Object.keys(this)) {\n const property = (this as any)[key]\n if (property instanceof Field || property instanceof ArrayField || property instanceof ArrayFormField) {\n fields[key] = property\n }\n }\n\n return fields\n }\n\n checkValid(form?: this): boolean { // ✅ Form → this\n let isFormValid = true\n const fields = this._fields\n\n for (const key of Object.keys(fields)) {\n const field = fields[key]\n if (!field.checkAndSetValid(form ?? this)) {\n isFormValid = false\n }\n }\n\n return isFormValid\n }\n\n get fieldsValue(): Record<string, any> {\n const data: Record<string, any> = {}\n const fields = this._fields\n\n for (const key of Object.keys(fields)) {\n let valueClear = null\n const field = fields[key]\n if (field instanceof Field) valueClear = field.valueClear\n else if (field instanceof ArrayField) valueClear = field.itemsValue\n else if (field instanceof ArrayFormField) valueClear = field.formsFieldsValue\n else console.error(`Invalid field \"${key}\" type`)\n data[key] = valueClear\n }\n\n return data\n }\n\n set fields(data: Record<string, any>) {\n const fields = this._fields\n\n for (const key of Object.keys(data)) {\n const field = fields[key]\n if (field) {\n if (field instanceof Field) field.rawValue = data[key]\n else if (field instanceof ArrayField) field.itemsValue = data[key]\n else if (field instanceof ArrayFormField) field.forms = data[key]\n else console.error(`Invalid field \"${key}\" type`)\n }\n }\n }\n\n get allErrors(): Record<string, string[]> {\n const errors: Record<string, string[]> = {}\n const fields = this._fields\n\n for (const key of Object.keys(fields)) {\n const fieldErrors = fields[key].errors\n if (fieldErrors.length > 0) {\n errors[key] = fieldErrors\n }\n }\n\n // Добавляем глобальные ошибки\n for (const key of Object.keys(this._globalErrors)) {\n if (!errors[key]) {\n errors[key] = []\n }\n errors[key].push(this._globalErrors[key])\n }\n\n return errors\n }\n\n get globalErrors(): Record<string, string> {\n return {...this._globalErrors}\n }\n\n set errors(errors: Record<string, string>) {\n const fields = this._fields\n this._globalErrors = {}\n\n for (const key of Object.keys(errors)) {\n const keys = key.split('.')\n const cleanKey = keys.length > 1 ? keys[1] : key\n\n if (cleanKey in fields && fields[cleanKey]) {\n fields[cleanKey].error = errors[key]\n } else {\n this._globalErrors[key] = errors[key]\n }\n }\n }\n\n setGlobalError(key: string, message: string): void {\n this._globalErrors[key] = message\n }\n\n clearGlobalErrors(): void {\n this._globalErrors = {}\n }\n\n reset(): void {\n const fields = this._fields\n for (const key of Object.keys(fields)) {\n fields[key].reset()\n }\n this._globalErrors = {}\n }\n\n get isTouched(): boolean {\n const fields = this._fields\n for (const key of Object.keys(fields)) {\n if (fields[key].isTouched) return true\n }\n return false\n }\n\n // Проверить, валидна ли форма\n get isValid(): boolean {\n const fields = this._fields\n for (const key of Object.keys(fields)) {\n if (fields[key].isValid !== true) return false\n }\n return Object.keys(this._globalErrors).length === 0\n }\n\n // Получить все значения в виде FormData (для отправки на сервер)\n toFormData(): FormData {\n const formData = new FormData()\n const data = this.fieldsValue\n\n for (const [key, value] of Object.entries(data)) {\n if (value instanceof Date) {\n formData.append(key, value.toISOString())\n } else if (value !== null && value !== undefined) {\n formData.append(key, String(value))\n }\n }\n\n return formData\n }\n\n // Получить все значения в виде JSON\n toJSON(): Record<string, any> {\n const data = this.fieldsValue\n\n // Преобразуем даты в строки для JSON\n const json: Record<string, any> = {}\n for (const [key, value] of Object.entries(data)) {\n if (value instanceof Date) {\n json[key] = value.toISOString()\n } else {\n json[key] = value\n }\n }\n\n return json\n }\n}","import {PluginOptions} from \"@core/options\";\nimport {Field} from \"@core/fields/Field\";\n\nexport interface FieldPlugin<T = any> {\n pluginOptions?: PluginOptions\n\n init?(field: Field<T>): void\n\n toRawValue?(value: any, field: Field<T>): any\n\n toValueClear?(value: any, field: Field<T>): any\n}\n\nexport abstract class BasePlugin<T = any> implements FieldPlugin<T> {\n pluginOptions: PluginOptions\n\n constructor(pluginOptions: PluginOptions = {}) {\n this.pluginOptions = {\n priority: 0,\n ...pluginOptions\n }\n }\n}","import {BasePlugin} from \"@core/plugins/FieldPlugin\";\nimport {MaskPluginOptions, PluginOptions} from \"@core/options\";\nimport {Field} from \"@core/fields\";\n\ninterface MaskPart {\n char: string // символ для отображения\n isPlaceholder: boolean // true если это заполнитель (можно вводить)\n isEscaped: boolean // true если символ экранирован (попадает в rawValue)\n replacementValue?: string // фиксированная замена\n allowedChars?: string // разрешенные символы (вместо сложного паттерна)\n transformOnMatch?: string // во что преобразовать при совпадении\n transformOnMismatch?: string // во что преобразовать при несовпадении\n defaultValue?: string\n pushToNext?: boolean // если true, отправить символ в следующий placeholder\n}\n\nexport class MaskPlugin extends BasePlugin {\n private config: MaskPluginOptions\n private maskParts: MaskPart[] = []\n\n constructor(config: MaskPluginOptions, pluginOptions?: PluginOptions) {\n super(pluginOptions)\n this.config = config\n }\n\n init(field: Field<any>): void {\n this.parseMask()\n }\n\n toRawValue(value: string, field: Field): string {\n return this.applyMask(value)\n }\n\n toValueClear(value: string, field: Field): string {\n return this.removeMask(value)\n }\n\n private parseMask(): void {\n this.maskParts = []\n let i = 0\n let escaped = false\n\n while (i < this.config.maskFormat.length) {\n const char = this.config.maskFormat[i]\n\n // Проверяем на экранирование\n if (char === '/' && !escaped) {\n escaped = true\n i++\n continue\n }\n\n if (char === this.config.maskPlaceholder &&\n i + 1 < this.config.maskFormat.length &&\n this.config.maskFormat[i + 1] === '{' &&\n !escaped) {\n\n const openBracket = i + 1\n const closeBracket = this.config.maskFormat.indexOf('}', openBracket)\n\n if (closeBracket !== -1 && closeBracket > openBracket + 1) {\n const configString = this.config.maskFormat.substring(openBracket + 1, closeBracket).trim()\n\n if (configString.includes('>')) {\n const parts = configString.split('>')\n const allowedChars = parts[0].trim()\n const replacementOnMatch = parts[1]?.trim() || ''\n\n // Проверяем на >> (pushToNext)\n let replacementOnMismatch = parts[2]?.trim() || ''\n let pushToNext = false\n\n if (parts.length > 2 && parts[2] === '' && parts[3] !== undefined) {\n // Синтаксис: allowedChars > match > > pushValue\n pushToNext = true\n replacementOnMismatch = parts[3]?.trim() || ''\n } else if (replacementOnMismatch === '' && parts.length > 3) {\n // Синтаксис: allowedChars > match > > pushValue\n pushToNext = true\n replacementOnMismatch = parts[3]?.trim() || ''\n }\n\n this.maskParts.push({\n char: replacementOnMatch || this.config.maskPlaceholder,\n isPlaceholder: true,\n isEscaped: escaped,\n allowedChars: allowedChars,\n transformOnMatch: replacementOnMatch,\n transformOnMismatch: replacementOnMismatch,\n defaultValue: replacementOnMatch,\n pushToNext: pushToNext\n })\n } else {\n this.maskParts.push({\n char: configString,\n isPlaceholder: true,\n isEscaped: escaped,\n replacementValue: configString,\n defaultValue: configString\n })\n }\n\n escaped = false\n i = closeBracket + 1\n continue\n }\n }\n\n const isPlaceholder = char === this.config.maskPlaceholder\n this.maskParts.push({\n char: char,\n isPlaceholder: isPlaceholder,\n isEscaped: escaped\n })\n\n escaped = false\n i++\n }\n }\n\n private applyMask(value: string): string {\n if (typeof value !== 'string' || !value) return ''\n\n let result = ''\n let inputIndex = 0\n\n for (let maskIndex = 0; maskIndex < this.maskParts.length; maskIndex++) {\n const part = this.maskParts[maskIndex]\n\n if (inputIndex >= value.length) {\n if (part.replacementValue) {\n result += part.replacementValue\n continue\n }\n if (part.transformOnMatch) {\n result += part.transformOnMatch\n continue\n }\n break\n }\n\n const inputChar = value[inputIndex]\n\n if (part.isPlaceholder) {\n if (part.replacementValue) {\n result += part.replacementValue\n inputIndex++\n } else if (part.allowedChars) {\n if (part.allowedChars.includes(inputChar)) {\n // Символ разрешен - заменяем на matchReplacement\n result += part.transformOnMatch || inputChar\n inputIndex++\n } else if (part.pushToNext) {\n // Символ не разрешен, но pushToNext = true\n // Вставляем mismatchReplacement, а символ идет дальше\n result += part.transformOnMismatch || this.config.maskPlaceholder\n // НЕ сдвигаем inputIndex - символ обработается в следующем placeholder\n } else if (part.transformOnMismatch !== undefined) {\n // Обычная замена при несовпадении\n result += part.transformOnMismatch || this.config.maskPlaceholder\n inputIndex++\n } else {\n result += this.config.maskPlaceholder\n }\n } else {\n // Обычный placeholder\n if (this.config.digitPattern.test(inputChar)) {\n result += inputChar\n inputIndex++\n } else if (inputChar === this.config.maskPlaceholder) {\n result += this.config.maskPlaceholder\n inputIndex++\n } else {\n inputIndex++\n maskIndex--\n }\n }\n } else {\n // Литерал\n if (inputChar === part.char) {\n result += part.char\n inputIndex++\n } else if (this.config.digitPattern.test(inputChar)) {\n result += part.char\n } else {\n result += part.char\n }\n }\n }\n\n return result\n }\n\n private removeMask(value: string): string {\n if (typeof value !== 'string' || !value) return ''\n\n let result = ''\n let inputIndex = 0\n\n for (let maskIndex = 0; maskIndex < this.maskParts.length; maskIndex++) {\n const part = this.maskParts[maskIndex]\n\n if (inputIndex >= value.length) {\n if (part.replacementValue) {\n result += part.replacementValue\n } else if (part.transformOnMatch) {\n result += part.transformOnMatch\n }\n continue\n }\n\n const inputChar = value[inputIndex]\n\n if (part.isPlaceholder) {\n if (part.replacementValue) {\n result += part.replacementValue\n } else if (part.allowedChars) {\n if (part.allowedChars.includes(inputChar)) {\n result += part.transformOnMatch || inputChar\n } else if (part.pushToNext) {\n // Вставляем mismatchReplacement, символ идет дальше\n result += part.transformOnMismatch || ''\n // НЕ сдвигаем inputIndex\n continue\n } else {\n result += part.transformOnMatch || ''\n }\n } else {\n if (inputChar !== this.config.maskPlaceholder &&\n this.config.digitPattern.test(inputChar)) {\n result += inputChar\n }\n }\n inputIndex++\n } else if (part.isEscaped) {\n result += part.char\n if (inputChar === part.char) inputIndex++\n } else {\n if (inputChar === part.char) inputIndex++\n }\n }\n\n return result\n }\n}","import {FieldOptions} from \"@core/options\";\nimport {Form} from \"@core/Form\";\n\nexport abstract class FieldType<T, O extends FieldOptions = FieldOptions> {\n options: O\n\n constructor(options: O) {\n this.options = {\n isRequired: true,\n messages: {},\n ...options\n } as O\n }\n\n abstract cast(rawValue: any): T | null\n\n abstract validate(value: T, form?: Form): string[]\n\n abstract getTypeName(): string\n}","import {FieldType} from \"@core/types/FieldType\";\nimport {StringOptions} from \"@core/options\";\n\nexport class StringType extends FieldType<string, StringOptions> {\n cast(rawValue: any): string | null {\n if (rawValue === null || rawValue === undefined) return null\n if (typeof rawValue === 'string') return rawValue\n return String(rawValue)\n }\n\n validate(value: string): string[] {\n const errors: string[] = []\n\n if (this.options.minLength != null && value.length < this.options.minLength) {\n errors.push(\n this.options.messages?.minLength ??\n `Минимальная длина ${this.options.minLength} символов`\n )\n }\n\n if (this.options.maxLength != null && value.length > this.options.maxLength) {\n errors.push(\n this.options.messages?.maxLength ??\n `Максимальная длина ${this.options.maxLength} символов`\n )\n }\n\n if (this.options.pattern != null && !this.options.pattern.test(value)) {\n errors.push(this.options.messages?.pattern ?? 'Неверный формат')\n }\n\n return errors\n }\n\n getTypeName(): string {\n return 'строка'\n }\n}","import {FieldType} from \"@core/types/FieldType\";\nimport {NumberOptions} from \"@core/options\";\n\nexport class NumberType extends FieldType<number, NumberOptions> {\n cast(rawValue: any): number | null {\n if (rawValue === null || rawValue === undefined) return null\n if (typeof rawValue === 'number' && !isNaN(rawValue)) return rawValue\n\n if (typeof rawValue === 'string') {\n const num = Number(rawValue)\n return isNaN(num) ? null : num\n }\n\n return null\n }\n\n validate(value: number): string[] {\n const errors: string[] = []\n\n if (!Number.isInteger(value)) {\n errors.push(this.options.messages?.invalid ?? 'Значение должно быть целым числом')\n }\n\n if (this.options.gt != null && value <= this.options.gt) {\n errors.push(\n this.options.messages?.gt ??\n `Значение должно быть больше ${this.options.gt}`\n )\n }\n\n if (this.options.ge != null && value < this.options.ge) {\n errors.push(\n this.options.messages?.ge ??\n `Значение должно быть не менее ${this.options.ge}`\n )\n }\n\n if (this.options.lt != null && value >= this.options.lt) {\n errors.push(\n this.options.messages?.lt ??\n `Значение должно быть меньше ${this.options.lt}`\n )\n }\n\n if (this.options.le != null && value > this.options.le) {\n errors.push(\n this.options.messages?.le ??\n `Значение должно быть не более ${this.options.le}`\n )\n }\n\n return errors\n }\n\n getTypeName(): string {\n return 'число'\n }\n}","import {FieldType} from \"@core/types/FieldType\";\nimport {DecimalOptions} from \"@core/options\";\n\nexport class DecimalType extends FieldType<number | string, DecimalOptions> {\n constructor(options: DecimalOptions = {} as DecimalOptions) {\n super({\n decimalPlaces: 2,\n maxDigits: 8,\n ...options\n } as DecimalOptions)\n }\n\n cast(rawValue: any): number | string | null {\n if (rawValue === null || rawValue === undefined) return null\n\n if (typeof rawValue === 'string') {\n return this.castString(rawValue)\n }\n\n if (typeof rawValue === 'number' && !isNaN(rawValue)) {\n return rawValue\n }\n\n return null\n }\n\n private castString(value: string): string | null {\n const trimmed = value.trim()\n\n if (!trimmed) return null\n\n // Заменяем запятую на точку\n const normalized = trimmed.replace(',', '.')\n\n // Проверяем, что строка похожа на число\n if (!this.isValidNumberString(normalized)) {\n return null\n }\n\n return normalized\n }\n\n validate(value: number | string): string[] {\n const errors: string[] = []\n value = typeof value === 'number' ? this.numberToString(value) : value\n\n // Проверяем, что строка соответствует формату числа\n if (!this.isValidNumberString(value)) {\n errors.push(this.options.messages?.invalid ?? 'Пример: 1.00')\n return errors\n }\n\n const maxDigits = this.options.maxDigits || 8\n const decimalPlaces = this.options.decimalPlaces || 2\n const maxIntDigits = maxDigits - decimalPlaces\n\n // Разбираем строку на части\n const isNegative = value.startsWith('-')\n const normalizedValue = isNegative ? value.substring(1) : value\n const parts = normalizedValue.split('.')\n const intPart = parts[0]\n const decPart = parts.length > 1 ? parts[1] : ''\n\n // Проверка на точку в конце (пользователь ещё вводит)\n if (normalizedValue.endsWith('.')) {\n // Проверяем только целую часть\n if (intPart.length > maxIntDigits) {\n errors.push(\n this.options.messages?.maxDigits ??\n `Максимальное количество знаков перед запятой ${maxIntDigits}`\n )\n }\n return errors\n }\n\n // Проверка целой части\n if (intPart.length === 0) {\n errors.push(this.options.messages?.invalid ?? 'Пример: 1.00')\n return errors\n }\n\n if (intPart.length > maxIntDigits) {\n errors.push(\n this.options.messages?.maxDigits ??\n `Максимальное количество знаков перед запятой ${maxIntDigits}`\n )\n }\n\n // Проверка десятичной части\n if (parts.length === 2) {\n // Общее количество знаков\n if (intPart.length + decPart.length > maxDigits) {\n errors.push(\n this.options.messages?.maxDigits ??\n `Максимальное количество знаков ${maxDigits}`\n )\n }\n\n // Количество знаков после запятой\n if (decPart.length === 0) {\n errors.push(\n this.options.messages?.invalid ??\n 'После точки должен быть минимум 1 знак'\n )\n } else if (decPart.length > decimalPlaces) {\n errors.push(\n this.options.messages?.decimalPlaces ??\n `Максимальное количество знаков после запятой ${decimalPlaces}`\n )\n }\n }\n\n // Если есть ошибки формата — дальше не проверяем\n if (errors.length > 0) return errors\n\n // Проверка min/max (только если значение не в процессе ввода)\n if (!value.endsWith('.')) {\n const numValue = parseFloat(value)\n\n if (!isNaN(numValue)) {\n if (this.options.gt != null && numValue <= this.options.gt) {\n errors.push(\n this.options.messages?.gt ??\n `Значение должно быть больше ${this.options.gt}`\n )\n }\n\n if (this.options.ge != null && numValue < this.options.ge) {\n errors.push(\n this.options.messages?.ge ??\n `Значение должно быть не менее ${this.options.ge}`\n )\n }\n\n if (this.options.lt != null && numValue >= this.options.lt) {\n errors.push(\n this.options.messages?.lt ??\n `Значение должно быть меньше ${this.options.lt}`\n )\n }\n\n if (this.options.le != null && numValue > this.options.le) {\n errors.push(\n this.options.messages?.le ??\n `Значение должно быть не более ${this.options.le}`\n )\n }\n }\n }\n\n return errors\n }\n\n private isValidNumberString(value: string): boolean {\n // Разрешаем: 123, 123.45, -123.45, 123.\n const pattern = /^-?\\d+\\.?\\d*$/\n\n // Проверяем, что нет больше одной точки\n const dotCount = (value.match(/\\./g) || []).length\n if (dotCount > 1) return false\n\n // Проверяем формат\n return pattern.test(value)\n }\n\n private numberToString(value: number): string {\n const decimalPlaces = this.options.decimalPlaces\n\n return value.toFixed(decimalPlaces)\n }\n\n getTypeName(): string {\n return 'десятичное число'\n }\n}","import {FieldType} from \"@core/types/FieldType\";\nimport {BooleanOptions} from \"@core/options\";\n\nexport class BooleanType extends FieldType<boolean, BooleanOptions> {\n cast(rawValue: any): boolean | null {\n if (rawValue === null || rawValue === undefined) return null\n if (typeof rawValue === 'boolean') return rawValue\n\n if (typeof rawValue === 'string') {\n if (rawValue === 'true' || rawValue === '1') return true\n if (rawValue === 'false' || rawValue === '0') return false\n }\n\n if (typeof rawValue === 'number') {\n if (rawValue === 1) return true\n if (rawValue === 0) return false\n }\n\n return null\n }\n\n validate(value: boolean): string[] {\n const errors: string[] = []\n\n if (this.options.mustBeTrue && value !== true) {\n errors.push(this.options.messages?.mustBeTrue ?? 'Значение должно быть true')\n }\n\n if (this.options.mustBeFalse && value !== false) {\n errors.push(this.options.messages?.mustBeFalse ?? 'Значение должно быть false')\n }\n\n return errors\n }\n\n getTypeName(): string {\n return 'логическое значение'\n }\n}","import {FieldType} from \"@core/types/FieldType\";\nimport {DateOptions} from \"@core/options\";\n\nexport class DateType extends FieldType<Date, DateOptions> {\n constructor(options: DateOptions = {}) {\n super(options)\n }\n\n cast(rawValue: any): Date | null {\n if (rawValue === null || rawValue === undefined) return null\n\n if (rawValue instanceof Date) {\n return isNaN(rawValue.getTime()) ? null : rawValue\n }\n\n if (typeof rawValue === 'string') {\n const date = new Date(rawValue)\n return isNaN(date.getTime()) ? null : date\n }\n\n return null\n }\n\n validate(value: Date): string[] {\n const errors: string[] = []\n\n if (isNaN(value.getTime())) {\n errors.push(this.options.messages?.invalid ?? 'Неверная дата')\n return errors\n }\n\n if (this.options.minDate) {\n if (!this.compareDates(value, this.options.minDate, 'min')) {\n errors.push(\n this.options.messages?.minDate ??\n `Дата должна быть не ранее ${this.options.minDate!.toLocaleDateString()}`\n )\n }\n }\n\n if (this.options.maxDate) {\n if (!this.compareDates(value, this.options.maxDate, 'max')) {\n errors.push(\n this.options.messages?.maxDate ??\n `Дата должна быть не позднее ${this.options.maxDate!.toLocaleDateString()}`\n )\n }\n }\n\n return errors\n }\n\n getTypeName(): string {\n return this.options.isDatetime ? 'дата и время' : 'дата'\n }\n\n // Сравнение дат с учётом времени\n private compareDates(value: Date, boundary: Date, type: 'min' | 'max'): boolean {\n if (this.options.isDatetime) {\n // Если время важно — сравниваем точно\n if (type === 'min') {\n return value >= boundary // value должен быть >= minDate\n } else {\n return value <= boundary // value должен быть <= maxDate\n }\n } else {\n // Если время не важно — сравниваем только даты\n const valueDate = this.toDateOnly(value)\n const boundaryDate = this.toDateOnly(boundary)\n\n if (type === 'min') {\n return valueDate >= boundaryDate\n } else {\n return valueDate <= boundaryDate\n }\n }\n }\n\n private toDateOnly(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n }\n}"]}
package/dist/index.d.cts CHANGED
@@ -1,225 +1,38 @@
1
- interface FieldPlugin<T = any> {
2
- pluginOptions?: PluginOptions;
3
- init?(field: Field<T>): void;
4
- toRawValue?(value: any, field: Field<T>): any;
5
- toValueClear?(value: any, field: Field<T>): any;
6
- }
7
- declare abstract class BasePlugin<T = any> implements FieldPlugin<T> {
8
- pluginOptions: PluginOptions;
9
- constructor(pluginOptions?: PluginOptions);
10
- }
11
-
12
- interface messagesOptions {
13
- isRequired?: string;
14
- validate?: string;
15
- type?: string;
16
- invalid?: string;
17
- }
18
- interface messagesStringOptions extends messagesOptions {
19
- minLength?: string;
20
- maxLength?: string;
21
- pattern?: string;
22
- }
23
- interface messagesNumberOptions extends messagesOptions {
24
- gt?: string;
25
- ge?: string;
26
- lt?: string;
27
- le?: string;
28
- }
29
- interface messagesBooleanOptions extends messagesOptions {
30
- mustBeTrue?: string;
31
- mustBeFalse?: string;
32
- }
33
- interface messagesDateOptions extends messagesOptions {
34
- minDate?: string;
35
- maxDate?: string;
36
- }
37
- interface messagesDateLuxonOptions extends messagesOptions {
38
- minDate?: string;
39
- maxDate?: string;
40
- }
41
- interface messagesDecimalOptions extends messagesOptions {
42
- gt?: string;
43
- ge?: string;
44
- lt?: string;
45
- le?: string;
46
- decimalPlaces?: string;
47
- maxDigits?: string;
48
- }
49
- interface messagesArrayFieldOptions extends messagesOptions {
50
- minItems?: string;
51
- maxItems?: string;
52
- }
53
- interface messagesArrayFormFieldOptions extends messagesOptions {
54
- minForms?: string;
55
- maxForms?: string;
56
- }
57
- interface FieldOptions {
58
- isRequired?: boolean | ((form?: any) => boolean);
59
- messages?: messagesOptions;
60
- validate?: (value: any, form?: any) => boolean | string;
61
- plugins?: FieldPlugin[];
62
- }
63
- interface StringOptions extends FieldOptions {
64
- minLength?: number;
65
- maxLength?: number;
66
- pattern?: RegExp;
67
- messages?: messagesStringOptions;
68
- }
69
- interface NumberOptions extends FieldOptions {
70
- gt?: number;
71
- ge?: number;
72
- lt?: number;
73
- le?: number;
74
- messages?: messagesNumberOptions;
75
- }
76
- interface BooleanOptions extends FieldOptions {
77
- mustBeTrue?: boolean;
78
- mustBeFalse?: boolean;
79
- messages?: messagesBooleanOptions;
80
- }
81
- interface DateOptions extends FieldOptions {
82
- minDate?: Date;
83
- maxDate?: Date;
84
- isDatetime?: boolean;
85
- messages?: messagesDateOptions;
86
- }
87
- interface DateLuxonOptions extends FieldOptions {
88
- minDate?: any;
89
- maxDate?: any;
90
- inputFormat?: string;
91
- outputFormat?: string;
92
- isDatetime?: boolean;
93
- messages?: messagesDateLuxonOptions;
94
- }
95
- interface DecimalOptions extends FieldOptions {
96
- gt?: number;
97
- ge?: number;
98
- lt?: number;
99
- le?: number;
100
- decimalPlaces?: number;
101
- maxDigits?: number;
102
- messages?: messagesDecimalOptions;
103
- }
104
- interface ArrayFieldOptions {
105
- isRequired?: boolean | ((form?: any) => boolean);
106
- messages?: messagesArrayFieldOptions;
107
- validate?: (value: any[], form?: any) => boolean | string;
108
- minItems?: number;
109
- maxItems?: number;
110
- }
111
- interface ArrayFormFieldOptions {
112
- isRequired?: boolean | ((form?: any) => boolean);
113
- messages?: messagesArrayFormFieldOptions;
114
- validate?: (value: any[], form?: any) => boolean | string;
115
- minForms?: number;
116
- maxForms?: number;
117
- }
118
- interface PluginOptions {
119
- priority?: number;
120
- }
121
- interface MaskPluginOptions {
122
- maskFormat: string;
123
- maskPlaceholder: string;
124
- digitPattern: RegExp;
125
- }
126
-
127
- declare abstract class FieldType<T, O extends FieldOptions = FieldOptions> {
128
- options: O;
129
- constructor(options: O);
130
- abstract cast(rawValue: any): T | null;
131
- abstract validate(value: T, form?: Form): string[];
132
- abstract getTypeName(): string;
133
- }
134
-
135
- type FieldTypeConstructor<T, O extends FieldOptions = FieldOptions> = new (options: O) => FieldType<T, O>;
136
- declare class Field<T = any, O extends FieldOptions = FieldOptions> {
137
- protected _rawValue: any;
138
- protected _valueClear: T | null;
139
- protected filed_type: FieldType<T, O>;
140
- protected defaultValue: T | null;
141
- protected _errors: string[];
142
- isValid: boolean | null;
143
- isTouched: boolean;
144
- constructor(TypeConstructor: FieldTypeConstructor<T, O>, defaultValue?: T | null, options?: O | null);
145
- protected get plugins(): FieldPlugin<any>[];
146
- get options(): O;
147
- set options(options: O);
148
- get rawValue(): T | null;
149
- set rawValue(input: any);
150
- get errors(): string[];
151
- get error(): string;
152
- set error(message: string | null);
153
- get valueClear(): any;
154
- private isRequired;
155
- checkValid(form?: Form): boolean;
156
- checkAndSetValid(form?: Form): boolean;
157
- get isEmpty(): boolean;
158
- reset(): void;
159
- }
160
-
161
- declare class ArrayField<T = any> {
162
- protected factory: (value?: T) => Field<T>;
163
- protected options: ArrayFieldOptions;
164
- protected _items: Field<T>[];
165
- protected _errors: string[];
166
- isTouched: boolean;
167
- constructor(factory: (value?: T) => Field<T>, options?: ArrayFieldOptions, initial?: T[]);
168
- set itemsValue(items: T[]);
169
- get itemsValue(): T[];
170
- get items(): Field<T>[];
171
- add(value?: T, force_check?: boolean): Field<T>;
172
- remove(index: number): void;
173
- clear(): void;
174
- private isRequired;
175
- checkValid(form?: Form): boolean;
176
- checkAndSetValid(form?: Form): boolean;
177
- get isValid(): boolean;
178
- get error(): string;
179
- set error(message: string | null);
180
- get errors(): string[];
181
- reset(): void;
1
+ import { B as BasePlugin, M as MaskPluginOptions, P as PluginOptions, F as Field, a as FieldType, S as StringOptions, N as NumberOptions, D as DecimalOptions, b as BooleanOptions, c as DateOptions } from './Form-DOdrOtbT.cjs';
2
+ export { o as ArrayField, A as ArrayFieldOptions, p as ArrayFormField, n as ArrayFormFieldOptions, l as FieldOptions, q as FieldPlugin, d as Form, j as messagesArrayFieldOptions, k as messagesArrayFormFieldOptions, g as messagesBooleanOptions, h as messagesDateOptions, i as messagesDecimalOptions, f as messagesNumberOptions, m as messagesOptions, e as messagesStringOptions } from './Form-DOdrOtbT.cjs';
3
+
4
+ declare class MaskPlugin extends BasePlugin {
5
+ private config;
6
+ private maskParts;
7
+ constructor(config: MaskPluginOptions, pluginOptions?: PluginOptions);
8
+ init(field: Field<any>): void;
9
+ toRawValue(value: string, field: Field): string;
10
+ toValueClear(value: string, field: Field): string;
11
+ private parseMask;
12
+ private applyMask;
13
+ private removeMask;
14
+ }
15
+
16
+ declare class StringType extends FieldType<string, StringOptions> {
17
+ cast(rawValue: any): string | null;
18
+ validate(value: string): string[];
19
+ getTypeName(): string;
182
20
  }
183
21
 
184
- declare class ArrayFormField<T extends Form = Form> {
185
- private FormConstructor;
186
- private options;
187
- private _forms;
188
- private _errors;
189
- isTouched: boolean;
190
- constructor(FormConstructor: new () => T, options?: ArrayFormFieldOptions, initial?: any[]);
191
- set forms(forms: any[]);
192
- get forms(): Form[];
193
- get formsFieldsValue(): any[];
194
- add(data?: any, force_check?: boolean): T;
195
- remove(index: number): void;
196
- clear(): void;
197
- reset(): void;
198
- private isRequired;
199
- checkValid(form?: Form): boolean;
200
- checkAndSetValid(form?: Form): boolean;
201
- get isValid(): boolean;
202
- get errors(): string[];
203
- get error(): string;
204
- set error(message: string | null);
22
+ declare class NumberType extends FieldType<number, NumberOptions> {
23
+ cast(rawValue: any): number | null;
24
+ validate(value: number): string[];
25
+ getTypeName(): string;
205
26
  }
206
27
 
207
- declare abstract class Form {
208
- private _globalErrors;
209
- protected get _fields(): Record<string, Field<any> | ArrayField<any> | ArrayFormField<any>>;
210
- checkValid(form?: this): boolean;
211
- get fieldsValue(): Record<string, any>;
212
- set fields(data: Record<string, any>);
213
- get allErrors(): Record<string, string[]>;
214
- get globalErrors(): Record<string, string>;
215
- set errors(errors: Record<string, string>);
216
- setGlobalError(key: string, message: string): void;
217
- clearGlobalErrors(): void;
218
- reset(): void;
219
- get isTouched(): boolean;
220
- get isValid(): boolean;
221
- toFormData(): FormData;
222
- toJSON(): Record<string, any>;
28
+ declare class DecimalType extends FieldType<number | string, DecimalOptions> {
29
+ constructor(options?: DecimalOptions);
30
+ cast(rawValue: any): number | string | null;
31
+ private castString;
32
+ validate(value: number | string): string[];
33
+ private isValidNumberString;
34
+ private numberToString;
35
+ getTypeName(): string;
223
36
  }
224
37
 
225
38
  declare class BooleanType extends FieldType<boolean, BooleanOptions> {
@@ -228,9 +41,13 @@ declare class BooleanType extends FieldType<boolean, BooleanOptions> {
228
41
  getTypeName(): string;
229
42
  }
230
43
 
231
- declare function getDateTimeConstructor(): any;
232
- declare function initLuxon(): Promise<any>;
233
- declare function isLuxonAvailable(): boolean;
234
- declare function resetLuxon(): void;
44
+ declare class DateType extends FieldType<Date, DateOptions> {
45
+ constructor(options?: DateOptions);
46
+ cast(rawValue: any): Date | null;
47
+ validate(value: Date): string[];
48
+ getTypeName(): string;
49
+ private compareDates;
50
+ private toDateOnly;
51
+ }
235
52
 
236
- export { type ArrayFieldOptions, type ArrayFormFieldOptions, BasePlugin, type BooleanOptions, BooleanType, type DateLuxonOptions, type DateOptions, type DecimalOptions, type FieldOptions, type FieldPlugin, type MaskPluginOptions, type NumberOptions, type PluginOptions, type StringOptions, getDateTimeConstructor, initLuxon, isLuxonAvailable, type messagesArrayFieldOptions, type messagesArrayFormFieldOptions, type messagesBooleanOptions, type messagesDateLuxonOptions, type messagesDateOptions, type messagesDecimalOptions, type messagesNumberOptions, type messagesOptions, type messagesStringOptions, resetLuxon };
53
+ export { BasePlugin, BooleanOptions, BooleanType, DateOptions, DateType, DecimalOptions, DecimalType, Field, FieldType, MaskPlugin, MaskPluginOptions, NumberOptions, NumberType, PluginOptions, StringOptions, StringType };