@reformer/core 10.2.0 → 11.0.0-beta.10
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/README.md +90 -68
- package/dist/behaviors-value-D05z3my6.js +109 -0
- package/dist/behaviors.d.ts +1 -1
- package/dist/behaviors.js +376 -211
- package/dist/create-model-DPSG3I0O.js +30 -0
- package/dist/date-utils-90-qZbse.js +43 -0
- package/dist/en-HP8XEych.js +44 -0
- package/dist/form/aggregate-signals.d.ts +21 -63
- package/dist/form/behaviors/collections.d.ts +84 -0
- package/dist/form/behaviors/context.d.ts +56 -0
- package/dist/form/behaviors/index.d.ts +30 -0
- package/dist/form/behaviors/internals.d.ts +41 -0
- package/dist/form/{behaviors-node.d.ts → behaviors/node.d.ts} +28 -5
- package/dist/form/behaviors/operators.d.ts +59 -0
- package/dist/form/behaviors/schema-operators.d.ts +83 -0
- package/dist/form/behaviors/types.d.ts +37 -0
- package/dist/form/create-form.d.ts +59 -70
- package/dist/form/flow/flow.d.ts +87 -0
- package/dist/form/form-bundle.d.ts +153 -0
- package/dist/form/form-level.d.ts +121 -0
- package/dist/form/form-proxy-builder.d.ts +6 -22
- package/dist/form/index.d.ts +23 -27
- package/dist/form/nodes/form-array-node.d.ts +100 -0
- package/dist/form/nodes/form-control-node.d.ts +73 -0
- package/dist/form/nodes/form-group-node.d.ts +66 -0
- package/dist/form/nodes/node-kind.d.ts +29 -0
- package/dist/form/nodes/state/availability.d.ts +6 -0
- package/dist/form/nodes/state/component.d.ts +6 -0
- package/dist/form/nodes/state/index.d.ts +12 -0
- package/dist/form/nodes/state/interaction.d.ts +13 -0
- package/dist/form/nodes/state/issues.d.ts +9 -0
- package/dist/form/nodes/state/pending.d.ts +6 -0
- package/dist/form/schema/compile.d.ts +59 -0
- package/dist/form/schema/compiled.d.ts +143 -0
- package/dist/form/schema/row-key.d.ts +11 -0
- package/dist/form/schema-controller.d.ts +159 -0
- package/dist/form/schema-subtree.d.ts +28 -0
- package/dist/form/signal-node-registry.d.ts +27 -22
- package/dist/form/submission.d.ts +93 -0
- package/dist/form/type-guards.d.ts +14 -73
- package/dist/form/types/contracts.d.ts +21 -91
- package/dist/form/types/field-config.d.ts +27 -0
- package/dist/form/types/index.d.ts +5 -91
- package/dist/form/types/nodes.d.ts +159 -0
- package/dist/form/types/schema-node.d.ts +148 -50
- package/dist/form/types/validation-schema.d.ts +24 -41
- package/dist/form/validation/context.d.ts +67 -0
- package/dist/form/validation/index.d.ts +24 -28
- package/dist/form/validation/operators.d.ts +101 -0
- package/dist/form/validation/run.d.ts +120 -0
- package/dist/form/validation/strategy.d.ts +89 -0
- package/dist/form/validation/types.d.ts +83 -0
- package/dist/form/validators/date-utils.d.ts +42 -0
- package/dist/form/validators/email.d.ts +23 -0
- package/dist/form/{validation/validators → validators}/file-type.d.ts +10 -10
- package/dist/form/{validation/validators → validators}/file-utils.d.ts +3 -2
- package/dist/form/validators/future-date.d.ts +23 -0
- package/dist/form/{validation/validators → validators}/index.d.ts +7 -4
- package/dist/form/validators/integer.d.ts +22 -0
- package/dist/form/validators/is-date.d.ts +24 -0
- package/dist/form/validators/is-number.d.ts +25 -0
- package/dist/form/validators/max-age.d.ts +28 -0
- package/dist/form/validators/max-date.d.ts +25 -0
- package/dist/form/{validation/validators → validators}/max-file-size.d.ts +10 -10
- package/dist/form/validators/max-files.d.ts +26 -0
- package/dist/form/validators/max-length.d.ts +33 -0
- package/dist/form/validators/max-total-file-size.d.ts +26 -0
- package/dist/form/validators/max.d.ts +26 -0
- package/dist/form/validators/min-age.d.ts +27 -0
- package/dist/form/validators/min-date.d.ts +25 -0
- package/dist/form/{validation/validators → validators}/min-file-size.d.ts +10 -10
- package/dist/form/validators/min-files.d.ts +27 -0
- package/dist/form/validators/min-length.d.ts +33 -0
- package/dist/form/validators/min.d.ts +26 -0
- package/dist/form/validators/multiple-of.d.ts +25 -0
- package/dist/form/validators/non-negative.d.ts +22 -0
- package/dist/form/validators/non-zero.d.ts +22 -0
- package/dist/form/validators/past-date.d.ts +23 -0
- package/dist/form/validators/pattern.d.ts +26 -0
- package/dist/form/{validation/validators → validators}/phone.d.ts +11 -11
- package/dist/form/validators/required.d.ts +29 -0
- package/dist/form/validators/url.d.ts +45 -0
- package/dist/form/validators/validation-issue.d.ts +8 -0
- package/dist/i18n/descriptor.d.ts +54 -0
- package/dist/i18n/en.json.d.ts +49 -0
- package/dist/i18n/loader.d.ts +71 -0
- package/dist/i18n/locale-store.d.ts +46 -0
- package/dist/i18n/locale.d.ts +90 -0
- package/dist/i18n/message-format.d.ts +136 -0
- package/dist/i18n/resolve-localized.d.ts +17 -0
- package/dist/i18n/ru.json.d.ts +49 -0
- package/dist/i18n/translator.d.ts +61 -0
- package/dist/i18n/validation-message.d.ts +53 -0
- package/dist/i18n.d.ts +26 -0
- package/dist/i18n.js +86 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.js +932 -2779
- package/dist/loader-BWkigpVe.js +52 -0
- package/dist/locale/en.d.ts +2 -0
- package/dist/locale/en.js +5 -0
- package/dist/locale/en.json +45 -0
- package/dist/locale/index.d.ts +18 -0
- package/dist/locale/ru.d.ts +2 -0
- package/dist/locale/ru.js +44 -0
- package/dist/locale/ru.json +45 -0
- package/dist/locale-CG54AU2Q.js +219 -0
- package/dist/locale.d.ts +2 -0
- package/dist/locale.js +9 -0
- package/dist/{state → model}/behaviors-value.d.ts +24 -6
- package/dist/{state/form-model.d.ts → model/create-model.d.ts} +18 -4
- package/dist/{state → model}/derived-registry.d.ts +1 -1
- package/dist/model/index.d.ts +42 -0
- package/dist/model/model-nodes.d.ts +190 -0
- package/dist/model/model-signals-proxy.d.ts +63 -0
- package/dist/model/model-value-proxy.d.ts +84 -0
- package/dist/{state → model}/safe-effect.d.ts +50 -2
- package/dist/model/types.d.ts +239 -0
- package/dist/model.d.ts +2 -0
- package/dist/model.js +27 -0
- package/dist/node-kind-C-r6ZMdo.js +15 -0
- package/dist/platforms/react/field-binding/field-adapter.d.ts +87 -0
- package/dist/platforms/react/field-binding/field-handle.d.ts +53 -0
- package/dist/platforms/react/form-bundle-context.d.ts +27 -0
- package/dist/{form → platforms/react}/hooks/types.d.ts +60 -38
- package/dist/platforms/react/hooks/use-form-bundle.d.ts +41 -0
- package/dist/platforms/react/hooks/use-form-flow.d.ts +40 -0
- package/dist/{form → platforms/react}/hooks/use-form-validation.d.ts +13 -7
- package/dist/{form → platforms/react}/hooks/useArrayLength.d.ts +6 -6
- package/dist/{form → platforms/react}/hooks/useFormControl.d.ts +7 -9
- package/dist/{form → platforms/react}/hooks/useFormControlValue.d.ts +18 -18
- package/dist/{form → platforms/react}/hooks/useSignalSubscription.d.ts +9 -1
- package/dist/platforms/react/i18n/context.d.ts +18 -0
- package/dist/platforms/react/i18n/hooks.d.ts +65 -0
- package/dist/platforms/react/i18n/provider.d.ts +59 -0
- package/dist/platforms/react/index.d.ts +30 -0
- package/dist/react.d.ts +22 -0
- package/dist/react.js +505 -0
- package/dist/runtime-token.d.ts +22 -0
- package/dist/safe-effect-BazLOv1g.js +669 -0
- package/dist/schema-controller-CpiO2JoK.js +143 -0
- package/dist/signals.d.ts +15 -9
- package/dist/signals.js +11 -6
- package/dist/strategy-DzvnsWLh.js +375 -0
- package/dist/type-guards-D-N_5Ddh.js +19 -0
- package/dist/validation-issue-B9mjI8jz.js +7 -0
- package/dist/validation-message-Ced9MGxs.js +194 -0
- package/dist/validation.d.ts +1 -1
- package/dist/validation.js +11 -165
- package/dist/validators/email.d.ts +1 -1
- package/dist/validators/email.js +5 -8
- package/dist/validators/future-date.d.ts +1 -1
- package/dist/validators/future-date.js +10 -13
- package/dist/validators/integer.d.ts +1 -1
- package/dist/validators/integer.js +4 -7
- package/dist/validators/is-date.d.ts +1 -1
- package/dist/validators/is-date.js +5 -8
- package/dist/validators/is-number.d.ts +1 -1
- package/dist/validators/is-number.js +4 -7
- package/dist/validators/max-age.d.ts +1 -1
- package/dist/validators/max-age.js +8 -12
- package/dist/validators/max-date.d.ts +1 -1
- package/dist/validators/max-date.js +10 -13
- package/dist/validators/max-length.d.ts +1 -1
- package/dist/validators/max-length.js +7 -10
- package/dist/validators/max.d.ts +1 -1
- package/dist/validators/max.js +4 -7
- package/dist/validators/min-age.d.ts +1 -1
- package/dist/validators/min-age.js +10 -11
- package/dist/validators/min-date.d.ts +1 -1
- package/dist/validators/min-date.js +8 -11
- package/dist/validators/min-length.d.ts +1 -1
- package/dist/validators/min-length.js +4 -7
- package/dist/validators/min.d.ts +1 -1
- package/dist/validators/min.js +4 -7
- package/dist/validators/multiple-of.d.ts +1 -1
- package/dist/validators/multiple-of.js +11 -10
- package/dist/validators/non-negative.d.ts +1 -1
- package/dist/validators/non-negative.js +2 -5
- package/dist/validators/non-zero.d.ts +1 -1
- package/dist/validators/non-zero.js +4 -7
- package/dist/validators/past-date.d.ts +1 -1
- package/dist/validators/past-date.js +10 -13
- package/dist/validators/pattern.d.ts +1 -1
- package/dist/validators/pattern.js +5 -8
- package/dist/validators/phone.d.ts +1 -1
- package/dist/validators/phone.js +10 -11
- package/dist/validators/required.d.ts +1 -1
- package/dist/validators/required.js +4 -7
- package/dist/validators/url.d.ts +1 -1
- package/dist/validators/url.js +48 -17
- package/dist/validators.d.ts +1 -5
- package/dist/validators.js +98 -154
- package/docs/llms/01-api-reference.md +89 -0
- package/docs/llms/02-quick-start.md +181 -0
- package/docs/llms/03-api-signatures.md +494 -0
- package/docs/llms/04-common-patterns.md +204 -0
- package/docs/llms/05-common-mistakes.md +192 -0
- package/docs/llms/06-troubleshooting.md +16 -0
- package/docs/llms/07-complete-import.md +130 -0
- package/docs/llms/08-form-types.md +54 -0
- package/docs/llms/09-formschema.md +191 -0
- package/docs/llms/10-arrays.md +241 -0
- package/docs/llms/11-async-watchfield.md +53 -0
- package/docs/llms/12-array-cleanup.md +31 -0
- package/docs/llms/13-multi-step.md +162 -0
- package/docs/llms/14-extended-mistakes.md +101 -0
- package/docs/llms/15-project-structure.md +279 -0
- package/docs/llms/16-ui-components.md +229 -0
- package/docs/llms/17-nonexistent-api.md +278 -0
- package/docs/llms/18-conditional-fields.md +222 -0
- package/docs/llms/19-reading-values.md +100 -0
- package/docs/llms/20-compute-vs-watch.md +153 -0
- package/docs/llms/21-array-operations.md +163 -0
- package/docs/llms/22-cycle-detection.md +86 -0
- package/docs/llms/23-copy-from.md +141 -0
- package/docs/llms/24-sync-fields.md +115 -0
- package/docs/llms/25-reset-when.md +122 -0
- package/docs/llms/26-transform-value.md +136 -0
- package/docs/llms/27-revalidate-when.md +133 -0
- package/docs/llms/28-submit-and-reset.md +409 -0
- package/docs/llms/29-async-preload.md +203 -0
- package/docs/llms/30-type-safety-recipes.md +213 -0
- package/docs/llms/31-async-validator-debounce.md +178 -0
- package/docs/llms/32-async-options-loading.md +108 -0
- package/docs/llms/33-validation-strategy.md +305 -0
- package/docs/llms/34-i18n.md +298 -0
- package/docs/llms/35-unified-contract.md +309 -0
- package/docs/llms/36-issue-messages.md +284 -0
- package/docs/llms/37-compiled-schema.md +332 -0
- package/docs/llms/38-form-flow.md +396 -0
- package/llms-index.json +1 -0
- package/llms.txt +10014 -3826
- package/package.json +77 -15
- package/dist/behaviors-node-DGEFMTQu.js +0 -18
- package/dist/behaviors-value-C7dSEhCc.js +0 -134
- package/dist/date-utils-dTT_x_Be.js +0 -31
- package/dist/derived-registry-CluZCQ7U.js +0 -16
- package/dist/form/behaviors.d.ts +0 -133
- package/dist/form/error-handler.d.ts +0 -166
- package/dist/form/factories/index.d.ts +0 -6
- package/dist/form/factories/node-factory.d.ts +0 -188
- package/dist/form/form-submitter.d.ts +0 -125
- package/dist/form/nodes/array-node.d.ts +0 -360
- package/dist/form/nodes/field-node.d.ts +0 -294
- package/dist/form/nodes/form-node.d.ts +0 -340
- package/dist/form/nodes/group-node.d.ts +0 -288
- package/dist/form/nodes/model-array-node.d.ts +0 -121
- package/dist/form/status-machine.d.ts +0 -153
- package/dist/form/types/deep-schema.d.ts +0 -116
- package/dist/form/types/form-proxy.d.ts +0 -141
- package/dist/form/unique-id.d.ts +0 -53
- package/dist/form/validation/validators/date-utils.d.ts +0 -30
- package/dist/form/validation/validators/email.d.ts +0 -23
- package/dist/form/validation/validators/future-date.d.ts +0 -23
- package/dist/form/validation/validators/integer.d.ts +0 -22
- package/dist/form/validation/validators/is-date.d.ts +0 -23
- package/dist/form/validation/validators/is-number.d.ts +0 -24
- package/dist/form/validation/validators/max-age.d.ts +0 -25
- package/dist/form/validation/validators/max-date.d.ts +0 -25
- package/dist/form/validation/validators/max-files.d.ts +0 -26
- package/dist/form/validation/validators/max-length.d.ts +0 -27
- package/dist/form/validation/validators/max-total-file-size.d.ts +0 -26
- package/dist/form/validation/validators/max.d.ts +0 -25
- package/dist/form/validation/validators/min-age.d.ts +0 -25
- package/dist/form/validation/validators/min-date.d.ts +0 -25
- package/dist/form/validation/validators/min-files.d.ts +0 -26
- package/dist/form/validation/validators/min-length.d.ts +0 -27
- package/dist/form/validation/validators/min.d.ts +0 -25
- package/dist/form/validation/validators/multiple-of.d.ts +0 -24
- package/dist/form/validation/validators/non-negative.d.ts +0 -22
- package/dist/form/validation/validators/non-zero.d.ts +0 -22
- package/dist/form/validation/validators/past-date.d.ts +0 -23
- package/dist/form/validation/validators/pattern.d.ts +0 -33
- package/dist/form/validation/validators/required.d.ts +0 -32
- package/dist/form/validation/validators/url.d.ts +0 -43
- package/dist/form/validation-schema.d.ts +0 -106
- package/dist/form/validation-strategy.d.ts +0 -55
- package/dist/form/validators.d.ts +0 -6
- package/dist/form-model-DYCzGGKF.js +0 -286
- package/dist/state/index.d.ts +0 -31
- package/dist/state/subscription-manager.d.ts +0 -180
- package/dist/state/types.d.ts +0 -144
- package/dist/state.d.ts +0 -2
- package/dist/state.js +0 -21
- package/dist/subscription-manager-705bls97.js +0 -171
package/dist/state/index.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `@reformer/core/state` — низкоуровневый реактивный **state-субстрат** (M1) и barrel модуля `state`.
|
|
3
|
-
*
|
|
4
|
-
* Это «прокси-объект с сигналами» и инструментарий для построения доменных модулей поверх него
|
|
5
|
-
* (form, table, …). Модуль СТРОГО реактивный: НИЧЕГО связанного с формами/валидацией/схемами здесь
|
|
6
|
-
* нет — только модель, value-операции, producer-флаг и утилиты субстрата. Граница state⇏form
|
|
7
|
-
* зафиксирована ESLint-правилом (`no-restricted-imports` на `src/state/**`).
|
|
8
|
-
*
|
|
9
|
-
* Реактивный рантайм (`signal/computed/effect/…`) живёт в отдельном subpath `@reformer/core/signals`
|
|
10
|
-
* (единый владелец `@preact/signals-core`) — импортируй его оттуда; здесь он НЕ реэкспортируется,
|
|
11
|
-
* чтобы зонтичный barrel `.` не разрастался рантаймом.
|
|
12
|
-
*
|
|
13
|
-
* Состав (реэкспорты — из тех же файлов, что использует зонтик `.`, поэтому `.` и `/state` — один
|
|
14
|
-
* module-инстанс: общий `derived`-WeakMap, единая идентичность `Signal`):
|
|
15
|
-
* - **модель** — `createModel` + типы `FormModel`/`ModelArray`/… + `PathAwareSignal`;
|
|
16
|
-
* - **value-операции** (реактивные правила) — `computeFrom`/`copyFrom`/`watchField`/`transformValue`/
|
|
17
|
-
* `resetWhen`/`syncFields`/`revalidateWhen`;
|
|
18
|
-
* - **producer-owned флаг** — `markDerived`/`isDerived`/`unmarkDerived`;
|
|
19
|
-
* - **утилиты субстрата** — `runOutsideEffect`/`safeCallback`/`safeDebouncedCallback`,
|
|
20
|
-
* `SubscriptionManager`.
|
|
21
|
-
*
|
|
22
|
-
* @group State
|
|
23
|
-
* @module state
|
|
24
|
-
*/
|
|
25
|
-
export { createModel } from './form-model';
|
|
26
|
-
export type { FormModel, ModelArray, ModelObject, ModelValue, ModelSignals, ModelApi, PathAwareSignal, } from './types';
|
|
27
|
-
export { computeFrom, copyFrom, watchField, transformValue, resetWhen, syncFields, revalidateWhen, } from './behaviors-value';
|
|
28
|
-
export type { BehaviorCleanup } from './behaviors-value';
|
|
29
|
-
export { markDerived, isDerived, unmarkDerived } from './derived-registry';
|
|
30
|
-
export { runOutsideEffect, safeCallback, safeDebouncedCallback } from './safe-effect';
|
|
31
|
-
export { SubscriptionManager } from './subscription-manager';
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Менеджер подписок для FormNode
|
|
3
|
-
*
|
|
4
|
-
* Централизует управление effect-подписками в узлах формы,
|
|
5
|
-
* предотвращает утечки памяти и упрощает отладку.
|
|
6
|
-
*
|
|
7
|
-
* Каждая подписка имеет уникальный ключ, что позволяет:
|
|
8
|
-
* - Отписываться от конкретной подписки по ключу
|
|
9
|
-
* - Автоматически заменять существующие подписки
|
|
10
|
-
* - Отслеживать количество активных подписок (для отладки)
|
|
11
|
-
*
|
|
12
|
-
* @internal
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* class FieldNode {
|
|
17
|
-
* private subscriptions = new SubscriptionManager();
|
|
18
|
-
*
|
|
19
|
-
* watch(callback: Function) {
|
|
20
|
-
* const dispose = effect(() => callback(this.value.value));
|
|
21
|
-
* return this.subscriptions.add('watch', dispose);
|
|
22
|
-
* }
|
|
23
|
-
*
|
|
24
|
-
* dispose() {
|
|
25
|
-
* this.subscriptions.clear();
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare class SubscriptionManager {
|
|
31
|
-
/**
|
|
32
|
-
* Хранилище подписок
|
|
33
|
-
* Ключ: уникальный идентификатор подписки
|
|
34
|
-
* Значение: функция отписки (dispose)
|
|
35
|
-
*/
|
|
36
|
-
private subscriptions;
|
|
37
|
-
/**
|
|
38
|
-
* Добавляет подписку
|
|
39
|
-
*
|
|
40
|
-
* Если подписка с таким ключом уже существует, отписывается от неё
|
|
41
|
-
* и заменяет новой. Это предотвращает утечки памяти при повторной
|
|
42
|
-
* регистрации подписки с тем же ключом.
|
|
43
|
-
*
|
|
44
|
-
* @param key Уникальный ключ подписки
|
|
45
|
-
* @param dispose Функция отписки (обычно возвращаемая из effect())
|
|
46
|
-
* @returns Функция для отписки от этой конкретной подписки
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```typescript
|
|
50
|
-
* const manager = new SubscriptionManager();
|
|
51
|
-
*
|
|
52
|
-
* // Добавление подписки
|
|
53
|
-
* const unsubscribe = manager.add('mySubscription', () => {
|
|
54
|
-
* console.log('Disposing subscription');
|
|
55
|
-
* });
|
|
56
|
-
*
|
|
57
|
-
* // Отписка через возвращаемую функцию
|
|
58
|
-
* unsubscribe();
|
|
59
|
-
*
|
|
60
|
-
* // Или через manager.remove()
|
|
61
|
-
* manager.add('anotherSub', disposeFn);
|
|
62
|
-
* manager.remove('anotherSub');
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
add(key: string, dispose: () => void): () => void;
|
|
66
|
-
/**
|
|
67
|
-
* Удаляет подписку по ключу
|
|
68
|
-
*
|
|
69
|
-
* Вызывает функцию отписки и удаляет подписку из хранилища.
|
|
70
|
-
* Если подписка с таким ключом не найдена, ничего не делает.
|
|
71
|
-
*
|
|
72
|
-
* @param key Ключ подписки
|
|
73
|
-
* @returns true, если подписка была удалена, false если не найдена
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* ```typescript
|
|
77
|
-
* const manager = new SubscriptionManager();
|
|
78
|
-
* manager.add('mySub', disposeFn);
|
|
79
|
-
*
|
|
80
|
-
* // Удаление подписки
|
|
81
|
-
* const removed = manager.remove('mySub'); // true
|
|
82
|
-
*
|
|
83
|
-
* // Попытка удалить несуществующую подписку
|
|
84
|
-
* const removed2 = manager.remove('nonExistent'); // false
|
|
85
|
-
* ```
|
|
86
|
-
*/
|
|
87
|
-
remove(key: string): boolean;
|
|
88
|
-
/**
|
|
89
|
-
* Очищает все подписки
|
|
90
|
-
*
|
|
91
|
-
* Вызывает функции отписки для всех активных подписок
|
|
92
|
-
* и очищает хранилище. Обычно используется при dispose узла формы.
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* ```typescript
|
|
96
|
-
* class FieldNode {
|
|
97
|
-
* private subscriptions = new SubscriptionManager();
|
|
98
|
-
*
|
|
99
|
-
* dispose() {
|
|
100
|
-
* // Отписываемся от всех effect
|
|
101
|
-
* this.subscriptions.clear();
|
|
102
|
-
* }
|
|
103
|
-
* }
|
|
104
|
-
* ```
|
|
105
|
-
*/
|
|
106
|
-
clear(): void;
|
|
107
|
-
/**
|
|
108
|
-
* Возвращает количество активных подписок
|
|
109
|
-
*
|
|
110
|
-
* Полезно для отладки утечек памяти. Если количество подписок
|
|
111
|
-
* растет без ограничений, это может указывать на то, что
|
|
112
|
-
* компоненты не отписываются должным образом.
|
|
113
|
-
*
|
|
114
|
-
* @returns Количество активных подписок
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* ```typescript
|
|
118
|
-
* const manager = new SubscriptionManager();
|
|
119
|
-
* console.log(manager.size()); // 0
|
|
120
|
-
*
|
|
121
|
-
* manager.add('sub1', disposeFn1);
|
|
122
|
-
* manager.add('sub2', disposeFn2);
|
|
123
|
-
* console.log(manager.size()); // 2
|
|
124
|
-
*
|
|
125
|
-
* manager.clear();
|
|
126
|
-
* console.log(manager.size()); // 0
|
|
127
|
-
* ```
|
|
128
|
-
*/
|
|
129
|
-
size(): number;
|
|
130
|
-
/**
|
|
131
|
-
* Проверяет, есть ли подписка с данным ключом
|
|
132
|
-
*
|
|
133
|
-
* @param key Ключ подписки
|
|
134
|
-
* @returns true, если подписка существует
|
|
135
|
-
*
|
|
136
|
-
* @example
|
|
137
|
-
* ```typescript
|
|
138
|
-
* const manager = new SubscriptionManager();
|
|
139
|
-
* manager.add('mySub', disposeFn);
|
|
140
|
-
*
|
|
141
|
-
* console.log(manager.has('mySub')); // true
|
|
142
|
-
* console.log(manager.has('nonExistent')); // false
|
|
143
|
-
* ```
|
|
144
|
-
*/
|
|
145
|
-
has(key: string): boolean;
|
|
146
|
-
/**
|
|
147
|
-
* Возвращает список всех ключей активных подписок
|
|
148
|
-
*
|
|
149
|
-
* Полезно для отладки: можно увидеть, какие подписки активны.
|
|
150
|
-
*
|
|
151
|
-
* @returns Массив ключей всех активных подписок
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* ```typescript
|
|
155
|
-
* const manager = new SubscriptionManager();
|
|
156
|
-
* manager.add('watch-value', disposeFn1);
|
|
157
|
-
* manager.add('watch-errors', disposeFn2);
|
|
158
|
-
*
|
|
159
|
-
* console.log(manager.getKeys()); // ['watch-value', 'watch-errors']
|
|
160
|
-
* ```
|
|
161
|
-
*/
|
|
162
|
-
getKeys(): string[];
|
|
163
|
-
/**
|
|
164
|
-
* Отписывается от всех подписок (алиас для clear())
|
|
165
|
-
*
|
|
166
|
-
* Используется при dispose() узла формы для совместимости с ожидаемым API.
|
|
167
|
-
*
|
|
168
|
-
* @example
|
|
169
|
-
* ```typescript
|
|
170
|
-
* class FieldNode {
|
|
171
|
-
* private subscriptions = new SubscriptionManager();
|
|
172
|
-
*
|
|
173
|
-
* dispose() {
|
|
174
|
-
* this.subscriptions.dispose();
|
|
175
|
-
* }
|
|
176
|
-
* }
|
|
177
|
-
* ```
|
|
178
|
-
*/
|
|
179
|
-
dispose(): void;
|
|
180
|
-
}
|
package/dist/state/types.d.ts
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { Signal } from '@preact/signals-core';
|
|
2
|
-
/**
|
|
3
|
-
* Сигнал, который знает свой путь в модели (`'personalData.lastName'`).
|
|
4
|
-
* Используется как «ручка поля»: и привязка value в схеме, и идентичность для testId/devtools.
|
|
5
|
-
*
|
|
6
|
-
* @group Model
|
|
7
|
-
*/
|
|
8
|
-
export type PathAwareSignal<T> = Signal<T> & {
|
|
9
|
-
/** Путь поля в модели (dot-нотация). На элементах массива включает индекс. */
|
|
10
|
-
readonly __path: string;
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* Спец-объекты, которые трактуются как листья (не разворачиваются в под-модель).
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
|
-
type Opaque = Date | File | Blob;
|
|
17
|
-
/**
|
|
18
|
-
* Фасад элемента массива при обходе (`at`/`map`/`forEach`): массив → {@link ModelArray},
|
|
19
|
-
* Opaque (Date/File/Blob) и примитив → значение, объект → под-модель {@link FormModel}.
|
|
20
|
-
* Зеркалит листовой/объектный сплит {@link ModelValue} (но объект → под-модель с API),
|
|
21
|
-
* чтобы `files: File[]`/`dates: Date[]`/вложенные массивы не мис-типизировались как `FormModel`.
|
|
22
|
-
* @internal
|
|
23
|
-
*/
|
|
24
|
-
type ModelArrayItem<U> = NonNullable<U> extends ReadonlyArray<infer E> ? ModelArray<E> : NonNullable<U> extends Opaque ? U : NonNullable<U> extends object ? FormModel<NonNullable<U>> : U;
|
|
25
|
-
/**
|
|
26
|
-
* Значение поля в value-доступе модели:
|
|
27
|
-
* - массив → {@link ModelArray}
|
|
28
|
-
* - спец-объект (Date/File/Blob) → как есть
|
|
29
|
-
* - объект → под-модель {@link FormModel} (value-доступ + `.$`-сигналы + API get/set/patch/…);
|
|
30
|
-
* промоутится рантаймом (`makeFormModel`); сигналы идентичны `model.$.<path>`
|
|
31
|
-
* - примитив → значение
|
|
32
|
-
*
|
|
33
|
-
* @group Model
|
|
34
|
-
*/
|
|
35
|
-
export type ModelValue<V> = NonNullable<V> extends ReadonlyArray<infer U> ? ModelArray<U> : NonNullable<V> extends Opaque ? V : NonNullable<V> extends object ? FormModel<NonNullable<V>> : V;
|
|
36
|
-
/**
|
|
37
|
-
* Карта value-полей объекта (value-половина {@link FormModel}): поля доступны как обычные свойства
|
|
38
|
-
* (чтение реактивно внутри `effect`/`computed`, запись — присваиванием). Вложенные объекты-поля
|
|
39
|
-
* резолвятся в под-модели {@link FormModel} (см. {@link ModelValue}), массивы — в {@link ModelArray}.
|
|
40
|
-
*
|
|
41
|
-
* @group Model
|
|
42
|
-
*/
|
|
43
|
-
export type ModelObject<T> = {
|
|
44
|
-
[K in keyof T]: ModelValue<T[K]>;
|
|
45
|
-
};
|
|
46
|
-
/**
|
|
47
|
-
* Реактивный массив модели. Мутации (`push`/`removeAt`/…) меняют длину реактивно;
|
|
48
|
-
* `map`/`forEach`/`at` отдают под-модель элемента ({@link FormModel}) для объектных элементов.
|
|
49
|
-
*
|
|
50
|
-
* @group Model
|
|
51
|
-
*/
|
|
52
|
-
export interface ModelArray<U> {
|
|
53
|
-
/**
|
|
54
|
-
* Путь массива в модели (dot-нотация). Предоставляется рантаймом (value-прокси) и требуется
|
|
55
|
-
* рендер-слою для резолва узла массива (напр. `ArrayRenderNode` в `@reformer/renderer-react`).
|
|
56
|
-
*/
|
|
57
|
-
readonly __path: string;
|
|
58
|
-
/** Реактивная длина. */
|
|
59
|
-
readonly length: number;
|
|
60
|
-
/** Добавить элемент в конец (значение элемента целиком). */
|
|
61
|
-
push(item: U): void;
|
|
62
|
-
/** Вставить элемент по индексу. */
|
|
63
|
-
insertAt(index: number, item: U): void;
|
|
64
|
-
/** Удалить элемент по индексу. */
|
|
65
|
-
removeAt(index: number): void;
|
|
66
|
-
/** Переместить элемент. */
|
|
67
|
-
move(from: number, to: number): void;
|
|
68
|
-
/** Поменять местами два элемента. */
|
|
69
|
-
swap(a: number, b: number): void;
|
|
70
|
-
/** Очистить массив. */
|
|
71
|
-
clear(): void;
|
|
72
|
-
/** Элемент по индексу: объект → под-модель, массив → {@link ModelArray}, лист → значение. */
|
|
73
|
-
at(index: number): NonNullable<U> extends object ? ModelArrayItem<U> : ModelArrayItem<U> | undefined;
|
|
74
|
-
/** Map по элементам (объект → {@link FormModel}, Opaque/примитив → значение, массив → {@link ModelArray}). */
|
|
75
|
-
map<R>(fn: (item: ModelArrayItem<U>, index: number) => R): R[];
|
|
76
|
-
/** Итерация по элементам (см. {@link ModelArrayItem}). */
|
|
77
|
-
forEach(fn: (item: ModelArrayItem<U>, index: number) => void): void;
|
|
78
|
-
/** Снимок массива значений (без подписки). */
|
|
79
|
-
toArray(): U[];
|
|
80
|
-
/** Индексный value-доступ. */
|
|
81
|
-
[index: number]: ModelValue<U>;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Дерево сигналов (escape-hatch `model.$`): листья → {@link PathAwareSignal},
|
|
85
|
-
* объекты → вложенное дерево, массивы → индексируемое дерево под-сигналов.
|
|
86
|
-
*
|
|
87
|
-
* @group Model
|
|
88
|
-
*/
|
|
89
|
-
export type ModelSignals<T> = {
|
|
90
|
-
[K in keyof T]: ModelSignalNode<T[K]>;
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Узел дерева сигналов `model.$`: массив → индексируемый узел под-сигналов, Opaque (Date/File/Blob)
|
|
94
|
-
* и примитив → {@link PathAwareSignal}, объект → вложенное дерево {@link ModelSignals}. Для примитивных
|
|
95
|
-
* и Opaque массивов элемент — сам сигнал листа (а не под-дерево), поэтому `model.$.tags[0]` — это
|
|
96
|
-
* `PathAwareSignal<string>`, а не `ModelSignals<never>`.
|
|
97
|
-
* @internal
|
|
98
|
-
*/
|
|
99
|
-
type ModelSignalNode<V> = NonNullable<V> extends ReadonlyArray<infer U> ? {
|
|
100
|
-
readonly length: number;
|
|
101
|
-
readonly [index: number]: ModelSignalNode<U>;
|
|
102
|
-
} : NonNullable<V> extends Opaque ? PathAwareSignal<V> : NonNullable<V> extends object ? ModelSignals<NonNullable<V>> : PathAwareSignal<V>;
|
|
103
|
-
/**
|
|
104
|
-
* API уровня модели (доступно на корне, под-моделях вложенных объектов-групп и элементов массива).
|
|
105
|
-
*
|
|
106
|
-
* ⚠️ Имена методов (`$`/`get`/`set`/`patch`/`isDirty`/`reset`/`signalAt`/`captureInitial`)
|
|
107
|
-
* зарезервированы: одноимённое поле формы их затеняет (редкий краевой случай).
|
|
108
|
-
*
|
|
109
|
-
* @group Model
|
|
110
|
-
*/
|
|
111
|
-
export interface ModelApi<T> {
|
|
112
|
-
/** Escape-hatch к сигналам: `model.$.loanType` → `PathAwareSignal<LoanType>`. */
|
|
113
|
-
readonly $: ModelSignals<T>;
|
|
114
|
-
/** Снимок значений (без подписки) — для submit. */
|
|
115
|
-
get(): T;
|
|
116
|
-
/**
|
|
117
|
-
* Полная установка значений: принимает объект целиком (все ключи `T`) и записывает их в модель.
|
|
118
|
-
* Производными полями (цели `compute`) владеет compute — их значения из payload игнорируются.
|
|
119
|
-
* Не меняет initial-снимок. Для частичного обновления (только переданные ключи) — {@link ModelApi.patch}.
|
|
120
|
-
*/
|
|
121
|
-
set(value: T): void;
|
|
122
|
-
/**
|
|
123
|
-
* Частичное слияние значений (load/patch с сервера): обновляет только переданные ключи,
|
|
124
|
-
* отсутствующие ключи НЕ трогаются. Не меняет initial-снимок.
|
|
125
|
-
*/
|
|
126
|
-
patch(value: Partial<T>): void;
|
|
127
|
-
/** Отличаются ли текущие значения от initial-снимка (value-diff). */
|
|
128
|
-
isDirty(): boolean;
|
|
129
|
-
/** Сбросить значения к initial-снимку. */
|
|
130
|
-
reset(): void;
|
|
131
|
-
/** Зафиксировать текущие значения как новый initial-снимок («точка отсчёта»). */
|
|
132
|
-
captureInitial(): void;
|
|
133
|
-
/** Резолв строкового пути в сигнал (для error-routing/мостов). */
|
|
134
|
-
signalAt(path: string): PathAwareSignal<unknown> | undefined;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* FormModel — под-модель объекта `T`: value-доступ ({@link ModelObject}) + `.$`-сигналы + {@link ModelApi}
|
|
138
|
-
* (get/set/patch/isDirty/reset/signalAt). Вложенные объекты-группы модели — тоже {@link FormModel}
|
|
139
|
-
* (доступны как `model.<group>`), поэтому `model.<group>.$.<field>` эквивалентно `model.$.<group>.<field>`.
|
|
140
|
-
*
|
|
141
|
-
* @group Model
|
|
142
|
-
*/
|
|
143
|
-
export type FormModel<T> = ModelObject<T> & ModelApi<T>;
|
|
144
|
-
export {};
|
package/dist/state.d.ts
DELETED
package/dist/state.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { c as s } from "./form-model-DYCzGGKF.js";
|
|
2
|
-
import { c as o, a as t, r as c, b as i, d as m, e as d, f, s as l, t as n, w as u } from "./behaviors-value-C7dSEhCc.js";
|
|
3
|
-
import { i as b, m as k, u as v } from "./derived-registry-CluZCQ7U.js";
|
|
4
|
-
import { S as D } from "./subscription-manager-705bls97.js";
|
|
5
|
-
export {
|
|
6
|
-
D as SubscriptionManager,
|
|
7
|
-
o as computeFrom,
|
|
8
|
-
t as copyFrom,
|
|
9
|
-
s as createModel,
|
|
10
|
-
b as isDerived,
|
|
11
|
-
k as markDerived,
|
|
12
|
-
c as resetWhen,
|
|
13
|
-
i as revalidateWhen,
|
|
14
|
-
m as runOutsideEffect,
|
|
15
|
-
d as safeCallback,
|
|
16
|
-
f as safeDebouncedCallback,
|
|
17
|
-
l as syncFields,
|
|
18
|
-
n as transformValue,
|
|
19
|
-
v as unmarkDerived,
|
|
20
|
-
u as watchField
|
|
21
|
-
};
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
class t {
|
|
2
|
-
/**
|
|
3
|
-
* Хранилище подписок
|
|
4
|
-
* Ключ: уникальный идентификатор подписки
|
|
5
|
-
* Значение: функция отписки (dispose)
|
|
6
|
-
*/
|
|
7
|
-
subscriptions = /* @__PURE__ */ new Map();
|
|
8
|
-
/**
|
|
9
|
-
* Добавляет подписку
|
|
10
|
-
*
|
|
11
|
-
* Если подписка с таким ключом уже существует, отписывается от неё
|
|
12
|
-
* и заменяет новой. Это предотвращает утечки памяти при повторной
|
|
13
|
-
* регистрации подписки с тем же ключом.
|
|
14
|
-
*
|
|
15
|
-
* @param key Уникальный ключ подписки
|
|
16
|
-
* @param dispose Функция отписки (обычно возвращаемая из effect())
|
|
17
|
-
* @returns Функция для отписки от этой конкретной подписки
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* const manager = new SubscriptionManager();
|
|
22
|
-
*
|
|
23
|
-
* // Добавление подписки
|
|
24
|
-
* const unsubscribe = manager.add('mySubscription', () => {
|
|
25
|
-
* console.log('Disposing subscription');
|
|
26
|
-
* });
|
|
27
|
-
*
|
|
28
|
-
* // Отписка через возвращаемую функцию
|
|
29
|
-
* unsubscribe();
|
|
30
|
-
*
|
|
31
|
-
* // Или через manager.remove()
|
|
32
|
-
* manager.add('anotherSub', disposeFn);
|
|
33
|
-
* manager.remove('anotherSub');
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
add(s, i) {
|
|
37
|
-
return this.subscriptions.has(s) && (process.env.NODE_ENV !== "production" && console.warn(`[SubscriptionManager] Subscription "${s}" already exists, replacing`), this.subscriptions.get(s)?.()), this.subscriptions.set(s, i), () => this.remove(s);
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Удаляет подписку по ключу
|
|
41
|
-
*
|
|
42
|
-
* Вызывает функцию отписки и удаляет подписку из хранилища.
|
|
43
|
-
* Если подписка с таким ключом не найдена, ничего не делает.
|
|
44
|
-
*
|
|
45
|
-
* @param key Ключ подписки
|
|
46
|
-
* @returns true, если подписка была удалена, false если не найдена
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```typescript
|
|
50
|
-
* const manager = new SubscriptionManager();
|
|
51
|
-
* manager.add('mySub', disposeFn);
|
|
52
|
-
*
|
|
53
|
-
* // Удаление подписки
|
|
54
|
-
* const removed = manager.remove('mySub'); // true
|
|
55
|
-
*
|
|
56
|
-
* // Попытка удалить несуществующую подписку
|
|
57
|
-
* const removed2 = manager.remove('nonExistent'); // false
|
|
58
|
-
* ```
|
|
59
|
-
*/
|
|
60
|
-
remove(s) {
|
|
61
|
-
const i = this.subscriptions.get(s);
|
|
62
|
-
return i ? (i(), this.subscriptions.delete(s), !0) : !1;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Очищает все подписки
|
|
66
|
-
*
|
|
67
|
-
* Вызывает функции отписки для всех активных подписок
|
|
68
|
-
* и очищает хранилище. Обычно используется при dispose узла формы.
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* ```typescript
|
|
72
|
-
* class FieldNode {
|
|
73
|
-
* private subscriptions = new SubscriptionManager();
|
|
74
|
-
*
|
|
75
|
-
* dispose() {
|
|
76
|
-
* // Отписываемся от всех effect
|
|
77
|
-
* this.subscriptions.clear();
|
|
78
|
-
* }
|
|
79
|
-
* }
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
clear() {
|
|
83
|
-
this.subscriptions.forEach((s) => {
|
|
84
|
-
s();
|
|
85
|
-
}), this.subscriptions.clear();
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Возвращает количество активных подписок
|
|
89
|
-
*
|
|
90
|
-
* Полезно для отладки утечек памяти. Если количество подписок
|
|
91
|
-
* растет без ограничений, это может указывать на то, что
|
|
92
|
-
* компоненты не отписываются должным образом.
|
|
93
|
-
*
|
|
94
|
-
* @returns Количество активных подписок
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* ```typescript
|
|
98
|
-
* const manager = new SubscriptionManager();
|
|
99
|
-
* console.log(manager.size()); // 0
|
|
100
|
-
*
|
|
101
|
-
* manager.add('sub1', disposeFn1);
|
|
102
|
-
* manager.add('sub2', disposeFn2);
|
|
103
|
-
* console.log(manager.size()); // 2
|
|
104
|
-
*
|
|
105
|
-
* manager.clear();
|
|
106
|
-
* console.log(manager.size()); // 0
|
|
107
|
-
* ```
|
|
108
|
-
*/
|
|
109
|
-
size() {
|
|
110
|
-
return this.subscriptions.size;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Проверяет, есть ли подписка с данным ключом
|
|
114
|
-
*
|
|
115
|
-
* @param key Ключ подписки
|
|
116
|
-
* @returns true, если подписка существует
|
|
117
|
-
*
|
|
118
|
-
* @example
|
|
119
|
-
* ```typescript
|
|
120
|
-
* const manager = new SubscriptionManager();
|
|
121
|
-
* manager.add('mySub', disposeFn);
|
|
122
|
-
*
|
|
123
|
-
* console.log(manager.has('mySub')); // true
|
|
124
|
-
* console.log(manager.has('nonExistent')); // false
|
|
125
|
-
* ```
|
|
126
|
-
*/
|
|
127
|
-
has(s) {
|
|
128
|
-
return this.subscriptions.has(s);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Возвращает список всех ключей активных подписок
|
|
132
|
-
*
|
|
133
|
-
* Полезно для отладки: можно увидеть, какие подписки активны.
|
|
134
|
-
*
|
|
135
|
-
* @returns Массив ключей всех активных подписок
|
|
136
|
-
*
|
|
137
|
-
* @example
|
|
138
|
-
* ```typescript
|
|
139
|
-
* const manager = new SubscriptionManager();
|
|
140
|
-
* manager.add('watch-value', disposeFn1);
|
|
141
|
-
* manager.add('watch-errors', disposeFn2);
|
|
142
|
-
*
|
|
143
|
-
* console.log(manager.getKeys()); // ['watch-value', 'watch-errors']
|
|
144
|
-
* ```
|
|
145
|
-
*/
|
|
146
|
-
getKeys() {
|
|
147
|
-
return Array.from(this.subscriptions.keys());
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Отписывается от всех подписок (алиас для clear())
|
|
151
|
-
*
|
|
152
|
-
* Используется при dispose() узла формы для совместимости с ожидаемым API.
|
|
153
|
-
*
|
|
154
|
-
* @example
|
|
155
|
-
* ```typescript
|
|
156
|
-
* class FieldNode {
|
|
157
|
-
* private subscriptions = new SubscriptionManager();
|
|
158
|
-
*
|
|
159
|
-
* dispose() {
|
|
160
|
-
* this.subscriptions.dispose();
|
|
161
|
-
* }
|
|
162
|
-
* }
|
|
163
|
-
* ```
|
|
164
|
-
*/
|
|
165
|
-
dispose() {
|
|
166
|
-
this.clear();
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
export {
|
|
170
|
-
t as S
|
|
171
|
-
};
|