adaptform 2.0.5 → 2.2.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 +151 -2
- package/CHANGELOG.ru.md +200 -0
- package/LICENSE.md +3 -1
- package/LICENSE.ru.md +25 -0
- package/README.md +299 -297
- package/README.ru.md +422 -0
- package/dist/Form-uHUaTUZS.d.cts +387 -0
- package/dist/Form-uHUaTUZS.d.ts +387 -0
- package/dist/index.cjs +864 -283
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -6
- package/dist/index.d.ts +5 -6
- package/dist/index.mjs +863 -284
- package/dist/index.mjs.map +1 -1
- package/dist/luxon.d.cts +1 -1
- package/dist/luxon.d.ts +1 -1
- package/package.json +28 -9
- package/dist/Form-Be3I6LX0.d.cts +0 -293
- package/dist/Form-Be3I6LX0.d.ts +0 -293
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,155 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[English](CHANGELOG.md) · [Русский](CHANGELOG.ru.md)
|
|
4
|
+
|
|
5
|
+
All notable changes to AdaptForm are documented here. Version `2.1.0` was published to npm on 2026-10-14.
|
|
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.2.0] - Unreleased (source prepared)
|
|
10
|
+
|
|
11
|
+
### Added — headless form state foundation
|
|
12
|
+
|
|
13
|
+
- **HF-005:** Specify the field/form lifecycle, cleaned baselines, touched-vs-dirty semantics, snapshots, synchronous batches and compatibility rules in English and Russian. ([state contract](docs/ai/HEADLESS_STATE_CONTRACT.md))
|
|
14
|
+
- **HF-006:** Track cleaned initial values with `Field.isDirty` and `commitBaseline()`, including semantic comparisons of Dates, optional Luxon values, plugin-cleaned values and supported nested structures.
|
|
15
|
+
- **HF-007:** Expose derived `isDirty` and baseline commits on `Form`, `ArrayField` and `ArrayFormField`, including collection membership, order and nested values.
|
|
16
|
+
- **HF-008:** Add `subscribe(listener)`, idempotent unsubscribe, stable immutable `getSnapshot()` and publicly exported `SnapshotValue`, `NodeSnapshot`, `FieldSnapshot`, `FormSnapshot`, `ArrayFieldSnapshot`, `ArrayFormSnapshot` types; no required UI framework or runtime dependencies.
|
|
17
|
+
- **HF-009:** Add synchronous nested `Form.batch(callback)` with coalesced notifications, deferred automatic validation using final parent context and deterministic exception finalization. Completed writes are **not rolled back**.
|
|
18
|
+
- **HF-010:** Propagate changes from children, nested forms and collections to parents; reconcile subscriptions when nodes are removed or replaced and release ownership links when observers leave. ([PR #16](https://github.com/ArhiMEN/AdaptForm/pull/16))
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- `ArrayField.remove()/clear()` and `ArrayFormField.remove()/clear()` now defer automatic validation inside `Form.batch()`, while retaining synchronous checks outside a batch and immediate explicit `checkValid()`. Added 34 specific regressions.
|
|
23
|
+
- `Form.allErrors` copies child error arrays rather than mutating or freezing live arrays when global errors and immutable snapshots are combined.
|
|
24
|
+
|
|
25
|
+
### Compatibility and constraints
|
|
26
|
+
|
|
27
|
+
- Existing class-based APIs, synchronous validation outside batches, `isTouched`, `isValid`, `reset()` behavior (including existing collection membership), serialization and the optional `adaptform/luxon` entry point are preserved.
|
|
28
|
+
- `commitBaseline()` changes the dirty-comparison reference, **not** the target of `reset()`; after committing a different baseline, reset can leave `isDirty=true`.
|
|
29
|
+
- Snapshots are detached immutable data descriptions, not original mutable objects; custom instances may be opaque. Direct in-place changes to exposed legacy arrays/options and arbitrary Form-property replacement are not automatically observed.
|
|
30
|
+
- No `reinitialize()`, HF-004 collection-reset redesign, HF-011+ dependency graph, async validation, submission lifecycle, UI adapter or performance benchmark is included.
|
|
31
|
+
|
|
32
|
+
### Verification and release status
|
|
33
|
+
|
|
34
|
+
- Accepted integration PR [#16](https://github.com/ArhiMEN/AdaptForm/pull/16) passed **563 tests in 27 files**, lint, source/demo type-checks, package/demo builds and dependency audit (0 known vulnerabilities). Independent review and [documentation sync PR #17](https://github.com/ArhiMEN/AdaptForm/pull/17) were merged. The 2.2.0 release candidate requires its **own** successful CI.
|
|
35
|
+
- The separate `tsconfig.test.json` check still has **54 existing diagnostics** and is not reported as passing; an older mapped-type `TS2589` reproduces on 2.1.1 as well. No new diagnostics were established in HF-005–HF-010.
|
|
36
|
+
- **Not published.** The source/manifest is being prepared as `2.2.0`; do not interpret this entry or a GitHub merge as npm publication, a tag or a GitHub Release. The last independently verified npm `latest` was `2.1.0`.
|
|
37
|
+
|
|
38
|
+
## [2.1.1] - Unreleased (prepared)
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- **HF-002:** Defer `ArrayField` collection validation during `Form.setFields(data, false)`; with enabled validation, check the final collection once after all form values are assigned, using the parent form as context. Avoid validation against a transient empty array, while preserving the public `itemsValue` setter and its immediate validation of the completed replacement. ([PR #10](https://github.com/ArhiMEN/AdaptForm/pull/10))
|
|
43
|
+
- **HF-003:** Reject incomplete decimal strings such as `"123."`, `"0."` and `"-123."` on explicit validation, including with `gt`/`ge`/`lt`/`le` bounds. Preserve the editable input, comma normalization, existing format-error messages and complete-number precision checks. ([PR #12](https://github.com/ArhiMEN/AdaptForm/pull/12))
|
|
44
|
+
|
|
45
|
+
### Tests and verification
|
|
46
|
+
|
|
47
|
+
- Add the HF-001 lifecycle characterization baseline and update its expectations after the two targeted fixes. ([PR #8](https://github.com/ArhiMEN/AdaptForm/pull/8))
|
|
48
|
+
- The accepted HF-003 branch passed **477 tests in 21 files**, lint, source type-check, package build, package-content verification and npm audit (0 reported vulnerabilities). The 2.1.1 release candidate must pass its own CI before publication.
|
|
49
|
+
|
|
50
|
+
### Compatibility and release status
|
|
51
|
+
|
|
52
|
+
- **Intentional behavior change:** trailing-decimal values may still be entered and serialized, but no longer pass `Field.checkAndSetValid()` or `Form.checkValid()`. Applications must validate before submitting; `toJSON()` itself does not validate.
|
|
53
|
+
- Public types, `rawValue`/`valueClear` representations, serialization shapes and the optional Luxon entry point are unchanged. No new runtime dependencies.
|
|
54
|
+
- The separate test type-check `tsconfig.test.json` has **54 existing diagnostics** unchanged by HF-002/HF-003; it is not part of required CI. These are tracked as technical debt, not represented as passing.
|
|
55
|
+
- **Release not yet published.** Version `2.1.1` is being prepared; do not infer npm publication, a GitHub release or a tag from this entry.
|
|
56
|
+
|
|
57
|
+
## [2.1.0] - 2026-10-14
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
|
|
61
|
+
- 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.
|
|
62
|
+
|
|
63
|
+
- Add English/Russian demo localization with persistent language selection and language-specific documentation links, preserving entered values and validation state.
|
|
64
|
+
- Add complete Russian companion documentation, changelog, release tracking, repository instructions, and license information alongside the English originals.
|
|
65
|
+
|
|
66
|
+
- Add a browser-based interactive playground covering field validation, conditional requirements, field state, arrays, nested forms, server-error handling, serialization, and input masks.
|
|
67
|
+
- Add a GitHub Actions workflow to build and deploy the playground to GitHub Pages from `v2.1.0` and `master`.
|
|
68
|
+
- Add dedicated demo type-checking and production-build commands, and run both as part of CI.
|
|
69
|
+
- 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.
|
|
70
|
+
- Export `ErrorsSchema` from the public package entry point.
|
|
71
|
+
- Infer `Form.fieldsValue` from declared `Field`, `ArrayField`, and `ArrayFormField` properties.
|
|
72
|
+
|
|
73
|
+
### Changed
|
|
74
|
+
|
|
75
|
+
- Configure ESLint for TypeScript source, tests, and demo code; run linting and dependency audits in CI on Node.js 22.
|
|
76
|
+
- Upgrade Vitest, Vite, ESLint, and TypeScript lint tooling; pin patched transitive dependency versions and align the lockfile.
|
|
77
|
+
- Replace the machine-specific absolute Vitest alias with a portable project-relative path.
|
|
78
|
+
- 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.
|
|
79
|
+
- Add `Form.setFields(data, validate?)` and `Field.setRawValue(value, validate?)` for controlled assignment with optional deferred validation.
|
|
80
|
+
- Make reset behavior explicit: field defaults are restored without running custom validators, errors are cleared, and validity remains unset until validation runs again.
|
|
81
|
+
- Clear stale server errors recursively when a new error payload is assigned.
|
|
82
|
+
- 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.
|
|
83
|
+
- Improve inferred form-value types, nullable array values, nested form collection types, and JSON serialization return types.
|
|
84
|
+
- 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.
|
|
85
|
+
- Rewrite the README to document supported APIs, validation lifecycle, collection options, error mapping, serialization, development commands, and the interactive demo.
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
|
|
89
|
+
- Make string validation deterministic when patterns contain global or sticky regular-expression flags.
|
|
90
|
+
- Reject blank and non-finite values in `NumberType`.
|
|
91
|
+
- Reject numeric decimal values with excess precision instead of silently rounding them; correctly handle `decimalPlaces: 0`.
|
|
92
|
+
- Treat whitespace-only strings as empty and keep constructor defaults untouched.
|
|
93
|
+
- Correct conditional-required validation after bulk form assignment.
|
|
94
|
+
- Refresh array validation after adding items/forms and avoid invalid negative, fractional, or out-of-range removal indices.
|
|
95
|
+
- Fix `ErrorsSchema.forArray()` to honor custom index extractors, apply item-schema mappings and transformers, and support bracket, dotted, and custom index notation.
|
|
96
|
+
- Invoke an `ErrorsSchema` fallback handler only once when it declines an error.
|
|
97
|
+
- 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.
|
|
98
|
+
|
|
99
|
+
### Security and maintenance
|
|
100
|
+
|
|
101
|
+
- Support both array and keyed-object npm pack JSON manifests in the package-content check; require English/Russian package documentation.
|
|
102
|
+
|
|
103
|
+
- 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.
|
|
104
|
+
- Verify lint, tests, ESM/CJS build, declaration generation, source type-checking, demo type-checking/build, and npm package contents in CI.
|
|
105
|
+
|
|
106
|
+
### Compatibility notes
|
|
107
|
+
|
|
108
|
+
- Built-in library validation messages and their language have not been changed in this release. Localization and any structured error-code contract are deferred to a separate coordinated task.
|
|
109
|
+
- PlayLease-specific integration work is explicitly out of scope for this branch.
|
|
110
|
+
- Version `2.1.0` was published manually to npm. No GitHub release or release tag has been created.
|
|
111
|
+
|
|
112
|
+
## [2.0.5] - 2026-07-22
|
|
113
|
+
|
|
114
|
+
### Added
|
|
115
|
+
|
|
116
|
+
- `ErrorsSchema` class for flexible server error parsing and mapping
|
|
117
|
+
- Static error mapping with `staticKey()` for exact key matching
|
|
118
|
+
- Dynamic error mapping with `dynamicKey()` supporting regex patterns and priority
|
|
119
|
+
- `fallback()` handler for unmatched error keys
|
|
120
|
+
- `transformValue()` for normalizing error messages (array to string, removing prefixes, etc.)
|
|
121
|
+
- `parseErrors()` method returning flat `Record<string, string>`
|
|
122
|
+
- `parseErrorsDetailed()` method returning `ParsedError` objects with metadata (sourceKey, matchedBy)
|
|
123
|
+
- `nest()` method for creating prefixed schemas for nested forms
|
|
124
|
+
- `clone()` and `merge()` methods for schema composition and reuse
|
|
125
|
+
- `ErrorsSchema.fromObject()` factory for quick mapping from plain objects
|
|
126
|
+
- `ErrorsSchema.forArray()` factory for array field error patterns
|
|
127
|
+
- Predefined schemas: `DefaultErrorSchema`, `LaravelErrorSchema`, `GraphQLErrorSchema`
|
|
128
|
+
- Priority system for dynamic rules to control matching order
|
|
129
|
+
- Value transformers chain for sequential error message normalization
|
|
130
|
+
- Support for nested error objects with recursive parsing
|
|
131
|
+
- Pydantic-style error format support out of the box
|
|
132
|
+
|
|
133
|
+
### Changed
|
|
134
|
+
|
|
135
|
+
- `Form.errors` setter now uses `ErrorsSchema` for intelligent error mapping
|
|
136
|
+
- `Form.errorsShema` property added for per-form error schema configuration
|
|
137
|
+
- `Form.applyErrorToField()` now supports nested field paths (e.g., `accounts.0.email`)
|
|
138
|
+
- `Form.applyNestedError()` handles `ArrayFormField` recursively with proper error context
|
|
139
|
+
- `Form.allErrors` getter now recursively collects errors from nested `ArrayFormField`
|
|
140
|
+
- `Form.reset()` now properly clears all field errors and global errors
|
|
141
|
+
- Error clearing logic improved: setting empty errors object clears all previous errors
|
|
142
|
+
- Global errors are now properly scoped to their target form instance
|
|
143
|
+
- `DefaultErrorsSchema` uses `fallback((key) => key)` for backward compatibility
|
|
144
|
+
|
|
145
|
+
### Fixed
|
|
146
|
+
|
|
147
|
+
- Fixed nested error propagation for `ArrayFormField` with out-of-range indices
|
|
148
|
+
- Fixed error context when applying errors to fields inside nested forms
|
|
149
|
+
- Fixed `allErrors` not including errors from nested forms in `ArrayFormField`
|
|
150
|
+
- Fixed global errors not being properly cleared when setting new errors
|
|
151
|
+
- Fixed null/undefined error values causing unexpected behavior
|
|
152
|
+
- Fixed error mapping for array fields (ArrayField) with index-based keys
|
|
4
153
|
|
|
5
154
|
## [2.0.0 - 2.0.4] - 2026-05-29
|
|
6
155
|
|
|
@@ -48,4 +197,4 @@ All notable changes to this project will be documented in this file.
|
|
|
48
197
|
- Global configuration singleton
|
|
49
198
|
- Automatic Luxon dependency (now optional)
|
|
50
199
|
|
|
51
|
-
[2.0.4]: https://github.com/ArhiMEN/adaptform/releases/tag/v2.0.4
|
|
200
|
+
[2.0.4]: https://github.com/ArhiMEN/adaptform/releases/tag/v2.0.4
|
package/CHANGELOG.ru.md
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# История изменений
|
|
2
|
+
|
|
3
|
+
[English](CHANGELOG.md) · [Русский](CHANGELOG.ru.md)
|
|
4
|
+
|
|
5
|
+
Здесь описаны все значимые изменения AdaptForm. Версия `2.1.0` опубликована в npm 2026-10-14.
|
|
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.2.0] — Не опубликована (исходники подготовлены)
|
|
10
|
+
|
|
11
|
+
### Добавлено — фундамент headless-состояний
|
|
12
|
+
|
|
13
|
+
- **HF-005:** Спецификация жизненного цикла полей и форм, baseline очищенных значений, touched/dirty, snapshots, синхронных batch и совместимости на EN/RU. ([контракт](docs/ai/HEADLESS_STATE_CONTRACT.ru.md))
|
|
14
|
+
- **HF-006:** `Field.isDirty` и `commitBaseline()` с семантическим сравнением Date, необязательного Luxon, данных после плагинов и поддерживаемых вложенных структур.
|
|
15
|
+
- **HF-007:** Производное `isDirty` и фиксация baseline у `Form`, `ArrayField`, `ArrayFormField`: учитываются состав, порядок коллекций и вложенные значения.
|
|
16
|
+
- **HF-008:** `subscribe(listener)`, идемпотентная отписка, стабильный неизменяемый `getSnapshot()` и публичные типы `SnapshotValue`, `NodeSnapshot`, `FieldSnapshot`, `FormSnapshot`, `ArrayFieldSnapshot`, `ArrayFormSnapshot`. Новых обязательных runtime/UI-зависимостей нет.
|
|
17
|
+
- **HF-009:** Синхронный вложенный `Form.batch(callback)` с объединёнными уведомлениями, отложенной автоматической валидацией по итоговым данным и корректным завершением при исключении. Уже выполненные изменения **не откатываются**.
|
|
18
|
+
- **HF-010:** Передача изменений от потомков и коллекций родителю, обновление связей при удалении/замене и очистка владения при отписке. ([PR #16](https://github.com/ArhiMEN/AdaptForm/pull/16))
|
|
19
|
+
|
|
20
|
+
### Исправлено
|
|
21
|
+
|
|
22
|
+
- `ArrayField.remove()/clear()` и `ArrayFormField.remove()/clear()` откладывают автоматическую проверку внутри `Form.batch()`, но проверяют синхронно вне batch; явные `checkValid()` остаются немедленными. Добавлено 34 целевых регрессии.
|
|
23
|
+
- `Form.allErrors` копирует массивы ошибок потомков, исключая мутацию и заморозку живых массивов при совмещении глобальных ошибок и snapshots.
|
|
24
|
+
|
|
25
|
+
### Совместимость и ограничения
|
|
26
|
+
|
|
27
|
+
- Сохранены прежние class-based API, синхронные проверки вне batch, `isTouched`, `isValid`, поведение `reset()` (включая состав коллекций), сериализация и необязательный `adaptform/luxon`.
|
|
28
|
+
- `commitBaseline()` меняет точку сравнения dirty, **не** цель `reset()`. После фиксации другого baseline сброс может оставить `isDirty=true`.
|
|
29
|
+
- Snapshots — независимые неизменяемые представления, а не исходные изменяемые объекты; пользовательские экземпляры классов могут быть непрозрачными. Прямые мутации прежних массивов/options и произвольная замена свойств Form не перехватываются автоматически.
|
|
30
|
+
- Нет `reinitialize()`, изменения reset коллекций (HF-004), графа зависимостей (HF-011+), асинхронных валидаторов, submit lifecycle, UI-адаптеров или бенчмарков.
|
|
31
|
+
|
|
32
|
+
### Проверки и выпуск
|
|
33
|
+
|
|
34
|
+
- Принятый [PR #16](https://github.com/ArhiMEN/AdaptForm/pull/16) прошёл **563 теста в 27 файлах**, lint, проверку типов исходников/демо, сборки библиотеки/демо и аудит (0 известных уязвимостей). Независимое ревью выполнено, [PR #17 с документацией](https://github.com/ArhiMEN/AdaptForm/pull/17) объединён. Для кандидата 2.2.0 требуется **собственный** успешный CI.
|
|
35
|
+
- Отдельная проверка `tsconfig.test.json` сохраняет **54 прежние диагностики** и не объявляется пройденной; старый `TS2589` mapped type воспроизводится также на 2.1.1. Новых диагностик в HF-005–HF-010 не установлено.
|
|
36
|
+
- **Не опубликована.** В исходниках готовится `2.2.0`, но запись changelog или merge в GitHub не равны публикации npm, тегу или GitHub Release. Последняя отдельно проверенная npm-версия `latest` — `2.1.0`.
|
|
37
|
+
|
|
38
|
+
## [2.1.1] — Не опубликована (подготовка)
|
|
39
|
+
|
|
40
|
+
### Исправлено
|
|
41
|
+
|
|
42
|
+
- **HF-002:** Проверка коллекции `ArrayField` откладывается при `Form.setFields(data, false)`. При включённой валидации завершённая коллекция проверяется один раз после присваивания всех полей, с контекстом родительской формы. Промежуточный пустой массив больше не проверяется; публичный setter `itemsValue` сохранён и проверяет итоговую замену немедленно. ([PR #10](https://github.com/ArhiMEN/AdaptForm/pull/10))
|
|
43
|
+
- **HF-003:** Незавершённые десятичные значения, например `"123."`, `"0."` и `"-123."`, отклоняются при явной проверке, в том числе при ограничениях `gt`/`ge`/`lt`/`le`. Ввод остаётся редактируемым; нормализация запятой, существующие сообщения об ошибках формата и точность завершённых чисел сохранены. ([PR #12](https://github.com/ArhiMEN/AdaptForm/pull/12))
|
|
44
|
+
|
|
45
|
+
### Тесты и проверки
|
|
46
|
+
|
|
47
|
+
- Добавлены characterization-тесты жизненного цикла HF-001 и обновлены их ожидания после двух исправлений. ([PR #8](https://github.com/ArhiMEN/AdaptForm/pull/8))
|
|
48
|
+
- В принятой ветке HF-003 прошли **477 тестов в 21 файле**, lint, типы исходного кода, сборка, проверка пакета и npm audit (0 известных уязвимостей). Кандидат 2.1.1 должен пройти собственный CI до публикации.
|
|
49
|
+
|
|
50
|
+
### Совместимость и статус
|
|
51
|
+
|
|
52
|
+
- **Намеренное изменение поведения:** строки с завершающим десятичным разделителем можно редактировать и сериализовать, но они больше не проходят `Field.checkAndSetValid()` и `Form.checkValid()`. Перед отправкой приложение должно проверить форму; `toJSON()` не запускает проверку.
|
|
53
|
+
- Публичные типы, представления `rawValue`/`valueClear`, формат сериализации и необязательная точка входа Luxon не изменены. Новых обязательных зависимостей нет.
|
|
54
|
+
- Отдельная типизация тестов `tsconfig.test.json` сохраняет **54 ранее существовавшие диагностики** после HF-002/HF-003; она не является обязательным этапом CI и не объявляется успешной.
|
|
55
|
+
- **Версия ещё не опубликована.** `2.1.1` только готовится: эта запись не означает публикацию в npm, создание GitHub Release или тега.
|
|
56
|
+
|
|
57
|
+
## [2.1.0] — 2026-10-14
|
|
58
|
+
|
|
59
|
+
### Добавлено
|
|
60
|
+
|
|
61
|
+
- Подготовлена управляемая публикация в npm после успешного CI для `master` с версией из `package.json` и авторизацией через Trusted Publisher либо секрет репозитория; включение ожидает настройки авторизации.
|
|
62
|
+
|
|
63
|
+
- Локализация демо на английский и русский с сохранением выбранного языка и ссылками на документацию соответствующего языка; введённые значения и состояние валидации сохраняются.
|
|
64
|
+
- Полные русские версии документации, истории изменений, плана выпуска, журнала статуса, инструкций репозитория и сведений о лицензии рядом с английскими оригиналами.
|
|
65
|
+
|
|
66
|
+
- Интерактивное демо в браузере: валидация полей, условная обязательность, состояния полей, массивы, вложенные формы, серверные ошибки, сериализация и маски ввода.
|
|
67
|
+
- Workflow GitHub Actions для сборки и публикации демо в GitHub Pages из `v2.1.0` и `master`.
|
|
68
|
+
- Отдельные команды проверки типов и производственной сборки демо, выполняемые в CI.
|
|
69
|
+
- Автоматическая проверка состава npm-пакета: обязательные ESM, CommonJS и декларации TypeScript включены, исходный код разработки и тесты исключены.
|
|
70
|
+
- Экспорт `ErrorsSchema` из публичной точки входа пакета.
|
|
71
|
+
- Вывод типов `Form.fieldsValue` из объявленных свойств `Field`, `ArrayField` и `ArrayFormField`.
|
|
72
|
+
|
|
73
|
+
### Изменено
|
|
74
|
+
|
|
75
|
+
- ESLint настроен для TypeScript-кода библиотеки, тестов и демо; lint и аудит зависимостей выполняются в CI на Node.js 22.
|
|
76
|
+
- Обновлены Vitest, Vite, ESLint и инструменты lint для TypeScript; закреплены исправленные транзитивные зависимости и согласован lockfile.
|
|
77
|
+
- Абсолютный путь в псевдониме Vitest заменён переносимым путём относительно проекта.
|
|
78
|
+
- Значения непосредственных полей присваиваются до проверки формы, чтобы условные правила видели полное состояние без двойного запуска валидаторов этих полей.
|
|
79
|
+
- Добавлены `Form.setFields(data, validate?)` и `Field.setRawValue(value, validate?)` для управляемого присваивания с необязательной отложенной валидацией.
|
|
80
|
+
- Уточнён сброс: значения по умолчанию восстанавливаются без вызова пользовательских валидаторов, ошибки очищаются, корректность не определена до следующей проверки.
|
|
81
|
+
- При назначении нового ответа ошибок предыдущие серверные ошибки очищаются рекурсивно.
|
|
82
|
+
- Коллекции проверяются после изменения, чтение `ArrayFormField.isValid` не вызывает скрытую повторную валидацию, некорректные индексы удаления игнорируются, после сброса корректность ожидает новой проверки.
|
|
83
|
+
- Улучшены выведенные типы значений формы, nullable-значения массивов, типы коллекций вложенных форм и результаты JSON-сериализации.
|
|
84
|
+
- Массивы и вложенные объекты кодируются в JSON в `FormData`; `null`/`undefined` пропускаются; `Blob`/`File` сохраняются; вложенные JavaScript `Date` рекурсивно преобразуются в ISO 8601 в JSON.
|
|
85
|
+
- README переписан для описания API, жизненного цикла валидации, параметров коллекций, сопоставления ошибок, сериализации, команд разработки и интерактивного демо.
|
|
86
|
+
|
|
87
|
+
### Исправлено
|
|
88
|
+
|
|
89
|
+
- Проверка строк стала детерминированной для регулярных выражений с глобальным или липким флагом.
|
|
90
|
+
- `NumberType` отклоняет пустые и неконечные значения.
|
|
91
|
+
- Десятичные числа с избыточной точностью отклоняются без скрытого округления; `decimalPlaces: 0` обрабатывается корректно.
|
|
92
|
+
- Строки только из пробелов считаются пустыми; значения по умолчанию конструктора сохраняют состояние «не изменено».
|
|
93
|
+
- Исправлена условная обязательность после массового присваивания полей формы.
|
|
94
|
+
- Валидация массива обновляется после добавления элементов/форм; отрицательные, дробные и выходящие за границы индексы удаления игнорируются.
|
|
95
|
+
- `ErrorsSchema.forArray()` учитывает пользовательский извлекатель индекса, правила и преобразования схемы элемента, поддерживает скобочную, точечную и пользовательскую запись индекса.
|
|
96
|
+
- Обработчик fallback в `ErrorsSchema` вызывается только один раз, если он отклоняет ошибку.
|
|
97
|
+
- Исправлен тест граничного времени; добавлены проверки сброса, очистки вложенных ошибок, группового присваивания, nullable-массивов, сериализации Date и обработки Blob/File.
|
|
98
|
+
|
|
99
|
+
### Безопасность и сопровождение
|
|
100
|
+
|
|
101
|
+
- Проверка состава пакета поддерживает JSON-манифесты npm pack в виде массива и объекта с ключами; документация пакета обязательна на английском и русском.
|
|
102
|
+
|
|
103
|
+
- В CI добавлен `npm audit --audit-level=moderate`; уязвимые транзитивные зависимости обновлены проверенными overrides. Последний проверенный workflow сообщает о нуле известных уязвимостей в npm audit; предыдущая проверка lockfile также сообщила о нуле.
|
|
104
|
+
- В CI проверяются lint, тесты, сборка ESM/CJS, декларации, типы библиотеки, типы и сборка демо, состав npm-пакета.
|
|
105
|
+
|
|
106
|
+
### Совместимость
|
|
107
|
+
|
|
108
|
+
- Встроенные сообщения валидации библиотеки и их язык в этом выпуске не изменены. Их локализация и контракт структурированных кодов ошибок отложены до отдельной согласованной задачи.
|
|
109
|
+
- Интеграция с PlayLease явно исключена из области этой ветки.
|
|
110
|
+
- Версия `2.1.0` опубликована в npm вручную. Релиз и тег GitHub не создавались.
|
|
111
|
+
|
|
112
|
+
## [2.0.5] — 2026-07-22
|
|
113
|
+
|
|
114
|
+
### Добавлено
|
|
115
|
+
|
|
116
|
+
- Класс `ErrorsSchema` для гибкого разбора и сопоставления серверных ошибок
|
|
117
|
+
- Статическое сопоставление точных ключей через `staticKey()`
|
|
118
|
+
- Динамическое сопоставление через `dynamicKey()` с регулярными выражениями и приоритетом
|
|
119
|
+
- Обработчик `fallback()` для ключей без соответствия
|
|
120
|
+
- `transformValue()` для нормализации сообщений (массив в строку, удаление префиксов и т. п.)
|
|
121
|
+
- Метод `parseErrors()`, возвращающий плоский `Record<string, string>`
|
|
122
|
+
- Метод `parseErrorsDetailed()`, возвращающий объекты `ParsedError` с метаданными (sourceKey, matchedBy)
|
|
123
|
+
- Метод `nest()` для схем с префиксами вложенных форм
|
|
124
|
+
- Методы `clone()` и `merge()` для композиции и повторного использования схем
|
|
125
|
+
- Фабрика `ErrorsSchema.fromObject()` для быстрого сопоставления из обычного объекта
|
|
126
|
+
- Фабрика `ErrorsSchema.forArray()` для шаблонов ошибок массивов полей
|
|
127
|
+
- Готовые схемы: `DefaultErrorSchema`, `LaravelErrorSchema`, `GraphQLErrorSchema`
|
|
128
|
+
- Система приоритетов динамических правил для управления порядком сопоставления
|
|
129
|
+
- Цепочка преобразователей значений для последовательной нормализации сообщений
|
|
130
|
+
- Рекурсивный разбор вложенных объектов ошибок
|
|
131
|
+
- Встроенная поддержка ошибок в формате Pydantic
|
|
132
|
+
|
|
133
|
+
### Изменено
|
|
134
|
+
|
|
135
|
+
- Сеттер `Form.errors` использует `ErrorsSchema` для сопоставления ошибок
|
|
136
|
+
- Добавлено свойство `Form.errorsShema` для настройки схемы отдельной формы
|
|
137
|
+
- `Form.applyErrorToField()` поддерживает вложенные пути (например, `accounts.0.email`)
|
|
138
|
+
- `Form.applyNestedError()` рекурсивно обрабатывает `ArrayFormField` с правильным контекстом
|
|
139
|
+
- Геттер `Form.allErrors` рекурсивно собирает ошибки вложенных `ArrayFormField`
|
|
140
|
+
- `Form.reset()` очищает ошибки всех полей и общие ошибки
|
|
141
|
+
- Пустой объект ошибок очищает все ранее применённые ошибки
|
|
142
|
+
- Общие ошибки привязаны к соответствующему экземпляру формы
|
|
143
|
+
- `DefaultErrorsSchema` использует `fallback((key) => key)` для обратной совместимости
|
|
144
|
+
|
|
145
|
+
### Исправлено
|
|
146
|
+
|
|
147
|
+
- Передача вложенных ошибок `ArrayFormField` при индексах за границами массива
|
|
148
|
+
- Контекст ошибок при назначении полям вложенных форм
|
|
149
|
+
- Отсутствие ошибок вложенных форм `ArrayFormField` в `allErrors`
|
|
150
|
+
- Неполная очистка общих ошибок при назначении новых
|
|
151
|
+
- Неожиданное поведение при значениях ошибок null/undefined
|
|
152
|
+
- Сопоставление ошибок массивов полей (ArrayField) по индексным ключам
|
|
153
|
+
|
|
154
|
+
## [2.0.0 - 2.0.4] — 2026-05-29
|
|
155
|
+
|
|
156
|
+
### Добавлено
|
|
157
|
+
|
|
158
|
+
- Полная переработка на TypeScript с выводом типов
|
|
159
|
+
- Система плагинов MaskPlugin, FieldPlugin и DecoratorPlugin
|
|
160
|
+
- ArrayField для динамических массивов полей
|
|
161
|
+
- ArrayFormField для массивов вложенных форм
|
|
162
|
+
- Новые типы: DecimalType, DateLuxonType, BooleanType
|
|
163
|
+
- Необязательная интеграция Luxon через экспорт `adaptform/luxon`
|
|
164
|
+
- Маски ввода с гибкой настройкой
|
|
165
|
+
- Условная обязательность полей в зависимости от состояния формы
|
|
166
|
+
- Пользовательские сообщения валидации для всех типов полей
|
|
167
|
+
- Общие ошибки для ответов сервера
|
|
168
|
+
- Сериализация форм (`toJSON()`, `toFormData()`)
|
|
169
|
+
- Экспорты с поддержкой tree shaking для уменьшения сборок
|
|
170
|
+
- Поддержка ESM и CJS
|
|
171
|
+
- Полные декларации TypeScript с корректными типами
|
|
172
|
+
|
|
173
|
+
### Изменено
|
|
174
|
+
|
|
175
|
+
- **Полная переработка API** — новая архитектура на основе классов
|
|
176
|
+
- Поля создаются через `new Field(TypeClass, defaultValue, options)`
|
|
177
|
+
- Валидация требует явных объявлений полей в теле класса
|
|
178
|
+
- Система плагинов заменяет прежний механизм middleware
|
|
179
|
+
- Обработка ошибок унифицирована для всех типов полей
|
|
180
|
+
- Методы валидации возвращают массивы строк вместо boolean
|
|
181
|
+
- Интерфейс параметров перестроен для улучшения вывода типов
|
|
182
|
+
|
|
183
|
+
### Несовместимые изменения
|
|
184
|
+
|
|
185
|
+
- **Полная переработка относительно v1.x** — обратная совместимость отсутствует
|
|
186
|
+
- Форма должна наследовать базовый класс `Form` и объявлять поля
|
|
187
|
+
- Конструктор поля требует TypeClass первым аргументом
|
|
188
|
+
- `validate()` возвращает `string[]` вместо `boolean`
|
|
189
|
+
- API плагинов полностью переработан
|
|
190
|
+
- Пути импорта изменены для поддержки tree shaking
|
|
191
|
+
- Тип даты Luxon вынесен в отдельную точку входа `adaptform/luxon`
|
|
192
|
+
|
|
193
|
+
### Удалено
|
|
194
|
+
|
|
195
|
+
- Прежний API на основе функций
|
|
196
|
+
- Старый механизм middleware для валидации
|
|
197
|
+
- Глобальная конфигурация singleton
|
|
198
|
+
- Автоматическая зависимость от Luxon (теперь необязательна)
|
|
199
|
+
|
|
200
|
+
[2.0.4]: https://github.com/ArhiMEN/adaptform/releases/tag/v2.0.4
|
package/LICENSE.md
CHANGED
|
@@ -18,4 +18,6 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
18
18
|
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
|
-
SOFTWARE.
|
|
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)
|