adaptform 2.0.4 → 2.1.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/CHANGELOG.md CHANGED
@@ -0,0 +1,152 @@
1
+ # Changelog
2
+
3
+ [English](CHANGELOG.md) · [Русский](CHANGELOG.ru.md)
4
+
5
+ All notable changes to AdaptForm are documented here. The `2.1.0` section is prepared for release; it remains unreleased until the maintainer publishes it.
6
+
7
+ **[Interactive demo](https://arhimen.github.io/AdaptForm/)** · [Demo source](https://github.com/ArhiMEN/AdaptForm/tree/master/demo) · [Documentation](https://github.com/ArhiMEN/AdaptForm/blob/master/README.md)
8
+
9
+ ## [2.1.0] - Unreleased
10
+
11
+ ### Added
12
+
13
+ - Prepare gated npm publication after successful `master` CI, using the version in `package.json` and either npm Trusted Publisher or a repository-scoped npm secret; activation awaits authentication setup.
14
+
15
+ - Add English/Russian demo localization with persistent language selection and language-specific documentation links, preserving entered values and validation state.
16
+ - Add complete Russian companion documentation, changelog, release tracking, repository instructions, and license information alongside the English originals.
17
+
18
+ - Add a browser-based interactive playground covering field validation, conditional requirements, field state, arrays, nested forms, server-error handling, serialization, and input masks.
19
+ - Add a GitHub Actions workflow to build and deploy the playground to GitHub Pages from `v2.1.0` and `master`.
20
+ - Add dedicated demo type-checking and production-build commands, and run both as part of CI.
21
+ - Add automated npm package-content verification to ensure required ESM, CommonJS, and TypeScript declaration files are present while development sources and tests stay out of the published package.
22
+ - Export `ErrorsSchema` from the public package entry point.
23
+ - Infer `Form.fieldsValue` from declared `Field`, `ArrayField`, and `ArrayFormField` properties.
24
+
25
+ ### Changed
26
+
27
+ - Configure ESLint for TypeScript source, tests, and demo code; run linting and dependency audits in CI on Node.js 22.
28
+ - Upgrade Vitest, Vite, ESLint, and TypeScript lint tooling; pin patched transitive dependency versions and align the lockfile.
29
+ - Replace the machine-specific absolute Vitest alias with a portable project-relative path.
30
+ - Batch direct field values before form-level validation so conditional-required rules can inspect the complete form state without invoking those direct field validators twice.
31
+ - Add `Form.setFields(data, validate?)` and `Field.setRawValue(value, validate?)` for controlled assignment with optional deferred validation.
32
+ - Make reset behavior explicit: field defaults are restored without running custom validators, errors are cleared, and validity remains unset until validation runs again.
33
+ - Clear stale server errors recursively when a new error payload is assigned.
34
+ - Revalidate collections after mutations, avoid hidden repeated validation when reading `ArrayFormField.isValid`, ignore invalid removal indices, and leave collection validity unset after reset until the next check.
35
+ - Improve inferred form-value types, nullable array values, nested form collection types, and JSON serialization return types.
36
+ - Serialize arrays and nested objects as JSON in `FormData`; omit `null`/`undefined`; preserve `Blob`/`File` values; recursively serialize nested JavaScript `Date` values to ISO 8601 strings in JSON output.
37
+ - Rewrite the README to document supported APIs, validation lifecycle, collection options, error mapping, serialization, development commands, and the interactive demo.
38
+
39
+ ### Fixed
40
+
41
+ - Make string validation deterministic when patterns contain global or sticky regular-expression flags.
42
+ - Reject blank and non-finite values in `NumberType`.
43
+ - Reject numeric decimal values with excess precision instead of silently rounding them; correctly handle `decimalPlaces: 0`.
44
+ - Treat whitespace-only strings as empty and keep constructor defaults untouched.
45
+ - Correct conditional-required validation after bulk form assignment.
46
+ - Refresh array validation after adding items/forms and avoid invalid negative, fractional, or out-of-range removal indices.
47
+ - Fix `ErrorsSchema.forArray()` to honor custom index extractors, apply item-schema mappings and transformers, and support bracket, dotted, and custom index notation.
48
+ - Invoke an `ErrorsSchema` fallback handler only once when it declines an error.
49
+ - Correct regression coverage for a date-time boundary test and add tests for reset state, nested error clearing, assignment batching, nullable arrays, Date serialization, and Blob/File handling.
50
+
51
+ ### Security and maintenance
52
+
53
+ - Support both array and keyed-object npm pack JSON manifests in the package-content check; require English/Russian package documentation.
54
+
55
+ - Add `npm audit --audit-level=moderate` to CI and update vulnerable transitive dependency versions using reviewed overrides. The final verified workflow reports zero known vulnerabilities from npm audit; the previous lockfile scan also reported zero.
56
+ - Verify lint, tests, ESM/CJS build, declaration generation, source type-checking, demo type-checking/build, and npm package contents in CI.
57
+
58
+ ### Compatibility notes
59
+
60
+ - Built-in library validation messages and their language have not been changed in this release candidate. Localization and any structured error-code contract are deferred to a separate coordinated task.
61
+ - PlayLease-specific integration work is explicitly out of scope for this branch.
62
+ - This changelog describes the release candidate in branch `v2.1.0`; npm publication and the GitHub release are still maintainer actions.
63
+
64
+ ## [2.0.5] - 2026-07-22
65
+
66
+ ### Added
67
+
68
+ - `ErrorsSchema` class for flexible server error parsing and mapping
69
+ - Static error mapping with `staticKey()` for exact key matching
70
+ - Dynamic error mapping with `dynamicKey()` supporting regex patterns and priority
71
+ - `fallback()` handler for unmatched error keys
72
+ - `transformValue()` for normalizing error messages (array to string, removing prefixes, etc.)
73
+ - `parseErrors()` method returning flat `Record<string, string>`
74
+ - `parseErrorsDetailed()` method returning `ParsedError` objects with metadata (sourceKey, matchedBy)
75
+ - `nest()` method for creating prefixed schemas for nested forms
76
+ - `clone()` and `merge()` methods for schema composition and reuse
77
+ - `ErrorsSchema.fromObject()` factory for quick mapping from plain objects
78
+ - `ErrorsSchema.forArray()` factory for array field error patterns
79
+ - Predefined schemas: `DefaultErrorSchema`, `LaravelErrorSchema`, `GraphQLErrorSchema`
80
+ - Priority system for dynamic rules to control matching order
81
+ - Value transformers chain for sequential error message normalization
82
+ - Support for nested error objects with recursive parsing
83
+ - Pydantic-style error format support out of the box
84
+
85
+ ### Changed
86
+
87
+ - `Form.errors` setter now uses `ErrorsSchema` for intelligent error mapping
88
+ - `Form.errorsShema` property added for per-form error schema configuration
89
+ - `Form.applyErrorToField()` now supports nested field paths (e.g., `accounts.0.email`)
90
+ - `Form.applyNestedError()` handles `ArrayFormField` recursively with proper error context
91
+ - `Form.allErrors` getter now recursively collects errors from nested `ArrayFormField`
92
+ - `Form.reset()` now properly clears all field errors and global errors
93
+ - Error clearing logic improved: setting empty errors object clears all previous errors
94
+ - Global errors are now properly scoped to their target form instance
95
+ - `DefaultErrorsSchema` uses `fallback((key) => key)` for backward compatibility
96
+
97
+ ### Fixed
98
+
99
+ - Fixed nested error propagation for `ArrayFormField` with out-of-range indices
100
+ - Fixed error context when applying errors to fields inside nested forms
101
+ - Fixed `allErrors` not including errors from nested forms in `ArrayFormField`
102
+ - Fixed global errors not being properly cleared when setting new errors
103
+ - Fixed null/undefined error values causing unexpected behavior
104
+ - Fixed error mapping for array fields (ArrayField) with index-based keys
105
+
106
+ ## [2.0.0 - 2.0.4] - 2026-05-29
107
+
108
+ ### Added
109
+
110
+ - Complete TypeScript rewrite with full type inference
111
+ - Plugin system with MaskPlugin, FieldPlugin, and DecoratorPlugin
112
+ - ArrayField for dynamic field arrays
113
+ - ArrayFormField for nested form arrays
114
+ - New field types: DecimalType, DateLuxonType, BooleanType
115
+ - Optional Luxon integration via `adaptform/luxon` subpath export
116
+ - Input mask support with flexible configuration
117
+ - Conditional required fields based on form state
118
+ - Custom validation messages for all field types
119
+ - Global error handling for server-side errors
120
+ - Form serialization (`toJSON()`, `toFormData()`)
121
+ - Tree-shakeable exports for smaller bundles
122
+ - ESM and CJS module support
123
+ - Full TypeScript declarations with proper types
124
+
125
+ ### Changed
126
+
127
+ - **Complete API redesign** - new class-based architecture
128
+ - Field creation now uses `new Field(TypeClass, defaultValue, options)` pattern
129
+ - Form validation now requires explicit field declarations in class body
130
+ - Plugin system replaces old middleware approach
131
+ - Error handling unified across all field types
132
+ - Validation methods now return string arrays instead of boolean
133
+ - Options interface restructured for better type inference
134
+
135
+ ### Breaking Changes
136
+
137
+ - **Full rewrite from v1.x** - no backward compatibility
138
+ - Form must extend base `Form` class with field declarations
139
+ - Field constructors require TypeClass as first argument
140
+ - `validate()` now returns `string[]` instead of `boolean`
141
+ - Plugin API completely redesigned
142
+ - Import paths changed for tree-shaking support
143
+ - Luxon date type moved to separate entry point `adaptform/luxon`
144
+
145
+ ### Removed
146
+
147
+ - Legacy function-based API
148
+ - Old validation middleware system
149
+ - Global configuration singleton
150
+ - Automatic Luxon dependency (now optional)
151
+
152
+ [2.0.4]: https://github.com/ArhiMEN/adaptform/releases/tag/v2.0.4
@@ -0,0 +1,152 @@
1
+ # История изменений
2
+
3
+ [English](CHANGELOG.md) · [Русский](CHANGELOG.ru.md)
4
+
5
+ Здесь описаны все значимые изменения AdaptForm. Раздел `2.1.0` подготовлен к выпуску, но остаётся неопубликованным до публикации сопровождающим проекта.
6
+
7
+ **[Интерактивное демо](https://arhimen.github.io/AdaptForm/?lang=ru)** · [Исходный код демо](https://github.com/ArhiMEN/AdaptForm/tree/master/demo) · [Документация](https://github.com/ArhiMEN/AdaptForm/blob/master/README.ru.md)
8
+
9
+ ## [2.1.0] — Не выпущено
10
+
11
+ ### Добавлено
12
+
13
+ - Подготовлена управляемая публикация в npm после успешного CI для `master` с версией из `package.json` и авторизацией через Trusted Publisher либо секрет репозитория; включение ожидает настройки авторизации.
14
+
15
+ - Локализация демо на английский и русский с сохранением выбранного языка и ссылками на документацию соответствующего языка; введённые значения и состояние валидации сохраняются.
16
+ - Полные русские версии документации, истории изменений, плана выпуска, журнала статуса, инструкций репозитория и сведений о лицензии рядом с английскими оригиналами.
17
+
18
+ - Интерактивное демо в браузере: валидация полей, условная обязательность, состояния полей, массивы, вложенные формы, серверные ошибки, сериализация и маски ввода.
19
+ - Workflow GitHub Actions для сборки и публикации демо в GitHub Pages из `v2.1.0` и `master`.
20
+ - Отдельные команды проверки типов и производственной сборки демо, выполняемые в CI.
21
+ - Автоматическая проверка состава npm-пакета: обязательные ESM, CommonJS и декларации TypeScript включены, исходный код разработки и тесты исключены.
22
+ - Экспорт `ErrorsSchema` из публичной точки входа пакета.
23
+ - Вывод типов `Form.fieldsValue` из объявленных свойств `Field`, `ArrayField` и `ArrayFormField`.
24
+
25
+ ### Изменено
26
+
27
+ - ESLint настроен для TypeScript-кода библиотеки, тестов и демо; lint и аудит зависимостей выполняются в CI на Node.js 22.
28
+ - Обновлены Vitest, Vite, ESLint и инструменты lint для TypeScript; закреплены исправленные транзитивные зависимости и согласован lockfile.
29
+ - Абсолютный путь в псевдониме Vitest заменён переносимым путём относительно проекта.
30
+ - Значения непосредственных полей присваиваются до проверки формы, чтобы условные правила видели полное состояние без двойного запуска валидаторов этих полей.
31
+ - Добавлены `Form.setFields(data, validate?)` и `Field.setRawValue(value, validate?)` для управляемого присваивания с необязательной отложенной валидацией.
32
+ - Уточнён сброс: значения по умолчанию восстанавливаются без вызова пользовательских валидаторов, ошибки очищаются, корректность не определена до следующей проверки.
33
+ - При назначении нового ответа ошибок предыдущие серверные ошибки очищаются рекурсивно.
34
+ - Коллекции проверяются после изменения, чтение `ArrayFormField.isValid` не вызывает скрытую повторную валидацию, некорректные индексы удаления игнорируются, после сброса корректность ожидает новой проверки.
35
+ - Улучшены выведенные типы значений формы, nullable-значения массивов, типы коллекций вложенных форм и результаты JSON-сериализации.
36
+ - Массивы и вложенные объекты кодируются в JSON в `FormData`; `null`/`undefined` пропускаются; `Blob`/`File` сохраняются; вложенные JavaScript `Date` рекурсивно преобразуются в ISO 8601 в JSON.
37
+ - README переписан для описания API, жизненного цикла валидации, параметров коллекций, сопоставления ошибок, сериализации, команд разработки и интерактивного демо.
38
+
39
+ ### Исправлено
40
+
41
+ - Проверка строк стала детерминированной для регулярных выражений с глобальным или липким флагом.
42
+ - `NumberType` отклоняет пустые и неконечные значения.
43
+ - Десятичные числа с избыточной точностью отклоняются без скрытого округления; `decimalPlaces: 0` обрабатывается корректно.
44
+ - Строки только из пробелов считаются пустыми; значения по умолчанию конструктора сохраняют состояние «не изменено».
45
+ - Исправлена условная обязательность после массового присваивания полей формы.
46
+ - Валидация массива обновляется после добавления элементов/форм; отрицательные, дробные и выходящие за границы индексы удаления игнорируются.
47
+ - `ErrorsSchema.forArray()` учитывает пользовательский извлекатель индекса, правила и преобразования схемы элемента, поддерживает скобочную, точечную и пользовательскую запись индекса.
48
+ - Обработчик fallback в `ErrorsSchema` вызывается только один раз, если он отклоняет ошибку.
49
+ - Исправлен тест граничного времени; добавлены проверки сброса, очистки вложенных ошибок, группового присваивания, nullable-массивов, сериализации Date и обработки Blob/File.
50
+
51
+ ### Безопасность и сопровождение
52
+
53
+ - Проверка состава пакета поддерживает JSON-манифесты npm pack в виде массива и объекта с ключами; документация пакета обязательна на английском и русском.
54
+
55
+ - В CI добавлен `npm audit --audit-level=moderate`; уязвимые транзитивные зависимости обновлены проверенными overrides. Последний проверенный workflow сообщает о нуле известных уязвимостей в npm audit; предыдущая проверка lockfile также сообщила о нуле.
56
+ - В CI проверяются lint, тесты, сборка ESM/CJS, декларации, типы библиотеки, типы и сборка демо, состав npm-пакета.
57
+
58
+ ### Совместимость
59
+
60
+ - Встроенные сообщения валидации библиотеки и их язык в этом кандидате не изменены. Их локализация и контракт структурированных кодов ошибок отложены до отдельной согласованной задачи.
61
+ - Интеграция с PlayLease явно исключена из области этой ветки.
62
+ - Эта история описывает кандидата в ветке `v2.1.0`; публикация npm-пакета и выпуск на GitHub остаются действиями сопровождающего проекта.
63
+
64
+ ## [2.0.5] — 2026-07-22
65
+
66
+ ### Добавлено
67
+
68
+ - Класс `ErrorsSchema` для гибкого разбора и сопоставления серверных ошибок
69
+ - Статическое сопоставление точных ключей через `staticKey()`
70
+ - Динамическое сопоставление через `dynamicKey()` с регулярными выражениями и приоритетом
71
+ - Обработчик `fallback()` для ключей без соответствия
72
+ - `transformValue()` для нормализации сообщений (массив в строку, удаление префиксов и т. п.)
73
+ - Метод `parseErrors()`, возвращающий плоский `Record<string, string>`
74
+ - Метод `parseErrorsDetailed()`, возвращающий объекты `ParsedError` с метаданными (sourceKey, matchedBy)
75
+ - Метод `nest()` для схем с префиксами вложенных форм
76
+ - Методы `clone()` и `merge()` для композиции и повторного использования схем
77
+ - Фабрика `ErrorsSchema.fromObject()` для быстрого сопоставления из обычного объекта
78
+ - Фабрика `ErrorsSchema.forArray()` для шаблонов ошибок массивов полей
79
+ - Готовые схемы: `DefaultErrorSchema`, `LaravelErrorSchema`, `GraphQLErrorSchema`
80
+ - Система приоритетов динамических правил для управления порядком сопоставления
81
+ - Цепочка преобразователей значений для последовательной нормализации сообщений
82
+ - Рекурсивный разбор вложенных объектов ошибок
83
+ - Встроенная поддержка ошибок в формате Pydantic
84
+
85
+ ### Изменено
86
+
87
+ - Сеттер `Form.errors` использует `ErrorsSchema` для сопоставления ошибок
88
+ - Добавлено свойство `Form.errorsShema` для настройки схемы отдельной формы
89
+ - `Form.applyErrorToField()` поддерживает вложенные пути (например, `accounts.0.email`)
90
+ - `Form.applyNestedError()` рекурсивно обрабатывает `ArrayFormField` с правильным контекстом
91
+ - Геттер `Form.allErrors` рекурсивно собирает ошибки вложенных `ArrayFormField`
92
+ - `Form.reset()` очищает ошибки всех полей и общие ошибки
93
+ - Пустой объект ошибок очищает все ранее применённые ошибки
94
+ - Общие ошибки привязаны к соответствующему экземпляру формы
95
+ - `DefaultErrorsSchema` использует `fallback((key) => key)` для обратной совместимости
96
+
97
+ ### Исправлено
98
+
99
+ - Передача вложенных ошибок `ArrayFormField` при индексах за границами массива
100
+ - Контекст ошибок при назначении полям вложенных форм
101
+ - Отсутствие ошибок вложенных форм `ArrayFormField` в `allErrors`
102
+ - Неполная очистка общих ошибок при назначении новых
103
+ - Неожиданное поведение при значениях ошибок null/undefined
104
+ - Сопоставление ошибок массивов полей (ArrayField) по индексным ключам
105
+
106
+ ## [2.0.0 - 2.0.4] — 2026-05-29
107
+
108
+ ### Добавлено
109
+
110
+ - Полная переработка на TypeScript с выводом типов
111
+ - Система плагинов MaskPlugin, FieldPlugin и DecoratorPlugin
112
+ - ArrayField для динамических массивов полей
113
+ - ArrayFormField для массивов вложенных форм
114
+ - Новые типы: DecimalType, DateLuxonType, BooleanType
115
+ - Необязательная интеграция Luxon через экспорт `adaptform/luxon`
116
+ - Маски ввода с гибкой настройкой
117
+ - Условная обязательность полей в зависимости от состояния формы
118
+ - Пользовательские сообщения валидации для всех типов полей
119
+ - Общие ошибки для ответов сервера
120
+ - Сериализация форм (`toJSON()`, `toFormData()`)
121
+ - Экспорты с поддержкой tree shaking для уменьшения сборок
122
+ - Поддержка ESM и CJS
123
+ - Полные декларации TypeScript с корректными типами
124
+
125
+ ### Изменено
126
+
127
+ - **Полная переработка API** — новая архитектура на основе классов
128
+ - Поля создаются через `new Field(TypeClass, defaultValue, options)`
129
+ - Валидация требует явных объявлений полей в теле класса
130
+ - Система плагинов заменяет прежний механизм middleware
131
+ - Обработка ошибок унифицирована для всех типов полей
132
+ - Методы валидации возвращают массивы строк вместо boolean
133
+ - Интерфейс параметров перестроен для улучшения вывода типов
134
+
135
+ ### Несовместимые изменения
136
+
137
+ - **Полная переработка относительно v1.x** — обратная совместимость отсутствует
138
+ - Форма должна наследовать базовый класс `Form` и объявлять поля
139
+ - Конструктор поля требует TypeClass первым аргументом
140
+ - `validate()` возвращает `string[]` вместо `boolean`
141
+ - API плагинов полностью переработан
142
+ - Пути импорта изменены для поддержки tree shaking
143
+ - Тип даты Luxon вынесен в отдельную точку входа `adaptform/luxon`
144
+
145
+ ### Удалено
146
+
147
+ - Прежний API на основе функций
148
+ - Старый механизм middleware для валидации
149
+ - Глобальная конфигурация singleton
150
+ - Автоматическая зависимость от Luxon (теперь необязательна)
151
+
152
+ [2.0.4]: https://github.com/ArhiMEN/adaptform/releases/tag/v2.0.4
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 ArhiMEN (Stanislav Orlov)
3
+ Copyright (c) 2025 Stanislav Orlov (ArhiMEN)
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
22
+
23
+ [English](LICENSE.md) · [Русский](LICENSE.ru.md)
package/LICENSE.ru.md ADDED
@@ -0,0 +1,25 @@
1
+ # Лицензия MIT
2
+
3
+ Copyright (c) 2025 Stanislav Orlov (ArhiMEN)
4
+
5
+ Настоящим бесплатно предоставляется разрешение любому лицу, получившему копию
6
+ данного программного обеспечения и соответствующей документации (далее «ПО»),
7
+ использовать ПО без ограничений, включая права на использование, копирование,
8
+ изменение, объединение, публикацию, распространение, сублицензирование и/или
9
+ продажу копий ПО, а также предоставлять такие права лицам, которым передаётся
10
+ ПО, при соблюдении следующих условий:
11
+
12
+ Указанное выше уведомление об авторских правах и данное уведомление о разрешении
13
+ должны включаться во все копии или существенные части ПО.
14
+
15
+ ПО ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ
16
+ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ПРОДАЖИ, СООТВЕТСТВИЯ
17
+ ОПРЕДЕЛЁННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ
18
+ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ЛЮБЫМ ТРЕБОВАНИЯМ, УЩЕРБУ
19
+ ИЛИ ИНОЙ ОТВЕТСТВЕННОСТИ, ВОЗНИКАЮЩИМ В СИЛУ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫМ
20
+ ОБРАЗОМ В СВЯЗИ С ПО, ЕГО ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С НИМ.
21
+
22
+ Это справочный русский перевод. Условия лицензии определяются английским
23
+ оригиналом [LICENSE.md](LICENSE.md).
24
+
25
+ [English](LICENSE.md) · [Русский](LICENSE.ru.md)