@reformer/core 11.0.0-beta.6 → 11.0.0-beta.8

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.
Files changed (113) hide show
  1. package/README.md +7 -3
  2. package/dist/behaviors.js +216 -179
  3. package/dist/create-model-BBRHhHwK.js +30 -0
  4. package/dist/en-CjAqn7h0.js +41 -0
  5. package/dist/form/behaviors/collections.d.ts +14 -1
  6. package/dist/form/behaviors/context.d.ts +18 -2
  7. package/dist/form/behaviors/index.d.ts +3 -1
  8. package/dist/form/behaviors/internals.d.ts +9 -1
  9. package/dist/form/behaviors/schema-operators.d.ts +76 -0
  10. package/dist/form/behaviors/types.d.ts +15 -3
  11. package/dist/form/create-core-form.d.ts +5 -3
  12. package/dist/form/create-form.d.ts +28 -53
  13. package/dist/form/form-bundle.d.ts +136 -0
  14. package/dist/form/index.d.ts +6 -1
  15. package/dist/form/nodes/field-node.d.ts +2 -2
  16. package/dist/form/nodes/group-node.d.ts +1 -1
  17. package/dist/form/nodes/model-array-node.d.ts +10 -5
  18. package/dist/form/schema-controller.d.ts +137 -0
  19. package/dist/form/schema-subtree.d.ts +28 -0
  20. package/dist/form/signal-node-registry.d.ts +22 -16
  21. package/dist/form/types/contracts.d.ts +6 -0
  22. package/dist/form/types/deep-schema.d.ts +2 -2
  23. package/dist/form/types/form-proxy.d.ts +1 -1
  24. package/dist/form/types/schema-node.d.ts +37 -12
  25. package/dist/form/types/validation-schema.d.ts +13 -1
  26. package/dist/form/validation/context.d.ts +6 -1
  27. package/dist/form/validation/index.d.ts +1 -1
  28. package/dist/form/validation/operators.d.ts +74 -7
  29. package/dist/form/validation/types.d.ts +2 -1
  30. package/dist/form/validators/validation-error.d.ts +8 -0
  31. package/dist/i18n/descriptor.d.ts +54 -0
  32. package/dist/i18n/en.json.d.ts +45 -0
  33. package/dist/i18n/loader.d.ts +71 -0
  34. package/dist/i18n/locale-store.d.ts +39 -0
  35. package/dist/i18n/locale.d.ts +90 -0
  36. package/dist/i18n/message-format.d.ts +116 -0
  37. package/dist/i18n/resolve-localized.d.ts +17 -0
  38. package/dist/i18n/ru.json.d.ts +45 -0
  39. package/dist/i18n/translator.d.ts +50 -0
  40. package/dist/i18n/validation-message.d.ts +18 -0
  41. package/dist/i18n.d.ts +31 -0
  42. package/dist/i18n.js +303 -0
  43. package/dist/index-BrNkQj1y.js +105 -0
  44. package/dist/index.js +737 -743
  45. package/dist/loader-Dv_Hl7JC.js +216 -0
  46. package/dist/locale/en.d.ts +2 -0
  47. package/dist/locale/en.js +5 -0
  48. package/dist/locale/en.json +42 -0
  49. package/dist/locale/index.d.ts +18 -0
  50. package/dist/locale/ru.d.ts +2 -0
  51. package/dist/locale/ru.js +41 -0
  52. package/dist/locale/ru.json +42 -0
  53. package/dist/locale.d.ts +2 -0
  54. package/dist/locale.js +9 -0
  55. package/dist/model/create-model.d.ts +17 -3
  56. package/dist/model/index.d.ts +8 -3
  57. package/dist/model/model-nodes.d.ts +67 -4
  58. package/dist/model/model-signals-proxy.d.ts +33 -1
  59. package/dist/model/model-value-proxy.d.ts +76 -0
  60. package/dist/model/types.d.ts +26 -9
  61. package/dist/model-value-proxy-caTmAiUd.js +419 -0
  62. package/dist/model.js +21 -17
  63. package/dist/node-BeV_lV5i.js +100 -0
  64. package/dist/platforms/react/form-bundle-context.d.ts +27 -0
  65. package/dist/platforms/react/hooks/types.d.ts +6 -3
  66. package/dist/platforms/react/hooks/useFormControlValue.d.ts +2 -1
  67. package/dist/platforms/react/i18n/context.d.ts +13 -0
  68. package/dist/platforms/react/i18n/hooks.d.ts +59 -0
  69. package/dist/platforms/react/i18n/provider.d.ts +52 -0
  70. package/dist/platforms/react/index.d.ts +1 -0
  71. package/dist/strategy-DgzELWno.js +204 -0
  72. package/dist/validation-error-B-U3RsV0.js +11 -0
  73. package/dist/validation.js +7 -6
  74. package/dist/validators/email.js +5 -8
  75. package/dist/validators/future-date.js +8 -11
  76. package/dist/validators/integer.js +4 -7
  77. package/dist/validators/is-date.js +5 -8
  78. package/dist/validators/is-number.js +4 -7
  79. package/dist/validators/max-age.js +8 -11
  80. package/dist/validators/max-date.js +8 -11
  81. package/dist/validators/max-length.js +5 -8
  82. package/dist/validators/max.js +4 -7
  83. package/dist/validators/min-age.js +8 -11
  84. package/dist/validators/min-date.js +8 -11
  85. package/dist/validators/min-length.js +5 -8
  86. package/dist/validators/min.js +4 -7
  87. package/dist/validators/multiple-of.js +5 -8
  88. package/dist/validators/non-negative.js +4 -7
  89. package/dist/validators/non-zero.js +4 -7
  90. package/dist/validators/past-date.js +8 -11
  91. package/dist/validators/pattern.js +5 -8
  92. package/dist/validators/phone.js +6 -9
  93. package/dist/validators/required.js +4 -7
  94. package/dist/validators/url.js +9 -14
  95. package/dist/validators.js +84 -106
  96. package/docs/llms/03-api-signatures.md +10 -4
  97. package/docs/llms/09-formschema.md +5 -5
  98. package/docs/llms/10-arrays.md +52 -3
  99. package/docs/llms/16-ui-components.md +2 -2
  100. package/docs/llms/18-conditional-fields.md +1 -1
  101. package/docs/llms/21-array-operations.md +26 -0
  102. package/docs/llms/28-submit-and-reset.md +3 -3
  103. package/docs/llms/29-async-preload.md +4 -4
  104. package/docs/llms/33-validation-strategy.md +2 -2
  105. package/docs/llms/34-i18n.md +272 -0
  106. package/docs/llms/35-unified-contract.md +246 -0
  107. package/llms-index.json +1 -1
  108. package/llms.txt +2746 -229
  109. package/package.json +22 -3
  110. package/dist/create-model-Dxh9cfLp.js +0 -97
  111. package/dist/model-signals-proxy-mV3WGdlO.js +0 -233
  112. package/dist/node-DGEFMTQu.js +0 -18
  113. package/dist/strategy-DA3JwxsR.js +0 -170
@@ -1,3 +1,79 @@
1
1
  import { GroupNode } from './model-nodes';
2
+ import { FormModel, ModelArray } from './types';
2
3
  export declare const rootByFacade: WeakMap<object, GroupNode>;
3
4
  export declare function makeFormModel(group: GroupNode): any;
5
+ /**
6
+ * Value-фасад для ручки {@link modelOf}: массив → {@link ModelArray}, объект → под-модель
7
+ * {@link FormModel}.
8
+ *
9
+ * @group Model
10
+ */
11
+ export type ModelOf<V> = NonNullable<V> extends ReadonlyArray<infer U> ? ModelArray<U> : FormModel<NonNullable<V>>;
12
+ /**
13
+ * Value-фасад по ручке дерева `model.$`: группа → под-модель {@link FormModel}, массив →
14
+ * {@link ModelArray}. Обратная операция к `model.$`: `modelOf(model.$.address) === model.address`.
15
+ *
16
+ * Ручка находит фасад по ИДЕНТИЧНОСТИ, а не по пути. Путь для этого не годится: он абсолютный
17
+ * (`items.0.phones`) и меняется при перестановке строк, а области поведения и формы строк
18
+ * вложенные — поиск по пути от под-модели строки ничего не находит.
19
+ *
20
+ * Лист ручкой контейнера не является — функция бросает. В частности, группа или массив,
21
+ * созданные из начального `null`, в модели — лист: вид узла фиксируется при создании.
22
+ *
23
+ * @typeParam V - Значение, которое хранит ручка (выводится из `peek()`).
24
+ * @param handle - Узел-группа или узел-массив дерева `model.$`.
25
+ * @returns Под-модель группы либо фасад массива.
26
+ * @throws TypeError если `handle` — лист или не ручка модели.
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const model = createModel({ address: { city: '' }, phones: [{ number: '' }] });
31
+ *
32
+ * modelOf(model.$.address).city = 'Казань'; // под-модель: чтение, запись, get/set/patch
33
+ * modelOf(model.$.phones).push({ number: '+7' }); // фасад массива: мутации и обход
34
+ * modelOf(model.$.phones[0]).number; // строка массива — тоже группа
35
+ * ```
36
+ *
37
+ * @group Model
38
+ */
39
+ export declare function modelOf<V extends object | null | undefined>(handle: {
40
+ peek(): V;
41
+ }): ModelOf<V>;
42
+ /**
43
+ * Ручка `$` по value-фасаду: под-модель → её `model.$`, фасад массива → узел-массив дерева `$`.
44
+ * Для всего остального — `undefined`.
45
+ *
46
+ * @internal
47
+ */
48
+ export declare function signalsOf(facade: unknown): object | undefined;
49
+ /**
50
+ * Ручка массива по привязке: сама ручка `model.$.<массив>` либо value-фасад `model.<массив>`.
51
+ * Для всего остального — `undefined`.
52
+ *
53
+ * @internal
54
+ */
55
+ export declare function arrayHandleOf(binding: unknown): object | undefined;
56
+ /**
57
+ * Ручка группы по привязке: `model.$.<группа>` либо под-модель `model.<группа>`. Для всего
58
+ * остального — `undefined`.
59
+ *
60
+ * @internal
61
+ */
62
+ export declare function groupHandleOf(binding: unknown): object | undefined;
63
+ /**
64
+ * Запасной шаблон нового элемента массива — `initialValue` узла-массива схемы. Действует, только
65
+ * если модель своего шаблона не объявила (`arrayOf`): так живут формы, чья модель строится из
66
+ * данных без кода.
67
+ *
68
+ * @internal
69
+ */
70
+ export declare function provideArrayBlank(handle: unknown, initialValue: unknown): void;
71
+ /**
72
+ * Value-фасад модели (под-модель или фасад массива), а не обычный объект?
73
+ *
74
+ * Обходчикам чужих деревьев (схема формы) в фасад спускаться нельзя: чтение его ключей — это
75
+ * реактивное чтение значений модели.
76
+ *
77
+ * @internal
78
+ */
79
+ export declare function isModelFacade(value: unknown): boolean;
@@ -57,10 +57,13 @@ export interface ModelArray<U> {
57
57
  readonly __path: string;
58
58
  /** Реактивная длина. */
59
59
  readonly length: number;
60
- /** Добавить элемент в конец (значение элемента целиком). */
61
- push(item: U): void;
62
- /** Вставить элемент по индексу. */
63
- insertAt(index: number, item: U): void;
60
+ /**
61
+ * Добавить элемент в конец (значение элемента целиком). Без значения — элемент по шаблону
62
+ * массива (`arrayOf(blank)` в модели); шаблона нет — ошибка.
63
+ */
64
+ push(item?: U): void;
65
+ /** Вставить элемент по индексу. Без значения — элемент по шаблону, как у {@link push}. */
66
+ insertAt(index: number, item?: U): void;
64
67
  /** Удалить элемент по индексу. */
65
68
  removeAt(index: number): void;
66
69
  /** Переместить элемент. */
@@ -108,12 +111,23 @@ type ContainerSignal<T, TKeys extends PropertyKey> = Omit<ReadonlySignal<T>, TKe
108
111
  export type ModelGroupSignals<T> = ModelSignals<T> & ContainerSignal<T, keyof T>;
109
112
  /**
110
113
  * Узел-массив дерева `model.$`: индексируемый доступ к под-сигналам элементов, реактивная `length`
111
- * и {@link ReadonlySignal} значения массива целиком (реагирует и на правку элемента, и на изменение
112
- * состава — push/removeAt/move).
114
+ * и сигнал значения массива целиком (реагирует и на правку элемента, и на изменение состава —
115
+ * push/removeAt/move).
116
+ *
117
+ * В отличие от группы, узел ЗАПИСЫВАЕМ: `model.$.tags.value = ['a']` заменяет массив целиком. Это
118
+ * делает его {@link PathAwareSignal} — к нему привязывают поле (`{ value: model.$.tags, component }`),
119
+ * правило (`validate(model.$.tags, …)`) и поведение, как к листу. Так массив служит ОДНИМ значением
120
+ * поля: мультивыбор, теги, список файлов.
121
+ *
122
+ * `V` — объявленный тип поля, включая `null`/`undefined`: поле `string[] | null` с начальным `null`
123
+ * в рантайме — лист с тем же `.value`/`peek`/`subscribe`, поэтому общая часть честна для обоих
124
+ * случаев. `length` и индексы есть только у настоящего узла-массива (начальное значение — массив).
113
125
  *
114
126
  * @group Model
115
127
  */
116
- export type ModelArraySignals<U, V> = ContainerSignal<V, 'length'> & {
128
+ export type ModelArraySignals<U, V> = Signal<V> & {
129
+ /** Путь массива в модели (dot-нотация). */
130
+ readonly __path: string;
117
131
  readonly length: number;
118
132
  readonly [index: number]: ModelSignalNode<U>;
119
133
  };
@@ -124,7 +138,7 @@ export type ModelArraySignals<U, V> = ContainerSignal<V, 'length'> & {
124
138
  * `PathAwareSignal<string>`, а не `ModelGroupSignals<never>`.
125
139
  * @internal
126
140
  */
127
- type ModelSignalNode<V> = NonNullable<V> extends ReadonlyArray<infer U> ? ModelArraySignals<U, NonNullable<V>> : NonNullable<V> extends Opaque ? PathAwareSignal<V> : NonNullable<V> extends object ? ModelGroupSignals<NonNullable<V>> : PathAwareSignal<V>;
141
+ type ModelSignalNode<V> = NonNullable<V> extends ReadonlyArray<infer U> ? ModelArraySignals<U, V> : NonNullable<V> extends Opaque ? PathAwareSignal<V> : NonNullable<V> extends object ? ModelGroupSignals<NonNullable<V>> : PathAwareSignal<V>;
128
142
  /**
129
143
  * API уровня модели (доступно на корне, под-моделях вложенных объектов-групп и элементов массива).
130
144
  *
@@ -158,7 +172,10 @@ export interface ModelApi<T> {
158
172
  reset(): void;
159
173
  /** Зафиксировать текущие значения как новый initial-снимок («точка отсчёта»). */
160
174
  captureInitial(): void;
161
- /** Резолв строкового пути в сигнал (для error-routing/мостов). */
175
+ /**
176
+ * Резолв строкового пути в сигнал (для error-routing/мостов): лист либо массив целиком
177
+ * (ручка значения массива — см. {@link ModelArraySignals}). Для пути группы — `undefined`.
178
+ */
162
179
  signalAt(path: string): PathAwareSignal<unknown> | undefined;
163
180
  }
164
181
  /**
@@ -0,0 +1,419 @@
1
+ import { batch as A, signal as x, Signal as I, computed as F } from "@preact/signals-core";
2
+ const u = /* @__PURE__ */ new WeakMap();
3
+ function z(e) {
4
+ u.set(e, (u.get(e) ?? 0) + 1);
5
+ }
6
+ function Q(e) {
7
+ const t = u.get(e);
8
+ t !== void 0 && (t <= 1 ? u.delete(e) : u.set(e, t - 1));
9
+ }
10
+ function T(e) {
11
+ return u.has(e);
12
+ }
13
+ const d = (e) => !(e === null || typeof e != "object" || Array.isArray(e) || e instanceof Date || typeof Blob < "u" && e instanceof Blob || typeof File < "u" && e instanceof File), h = (e, t) => e === "" ? String(t) : `${e}.${t}`, v = (e) => /^\d+$/.test(e), c = (e) => {
14
+ if (Array.isArray(e)) return e.map(c);
15
+ if (d(e)) {
16
+ const t = {};
17
+ for (const r of Object.keys(e)) t[r] = c(e[r]);
18
+ return t;
19
+ }
20
+ return e;
21
+ }, g = (e, t) => {
22
+ if (e === t) return !0;
23
+ if (Array.isArray(e) && Array.isArray(t))
24
+ return e.length !== t.length ? !1 : e.every((r, i) => g(r, t[i]));
25
+ if (d(e) && d(t)) {
26
+ const r = Object.keys(e), i = Object.keys(t);
27
+ return r.length !== i.length ? !1 : r.every((n) => g(e[n], t[n]));
28
+ }
29
+ return !1;
30
+ }, M = Symbol.for("@reformer/core:arrayBlank"), _ = (e) => Array.isArray(e) ? e[M] : void 0, W = (e, t) => d(e) ? e[t] : void 0;
31
+ function U(e, t = []) {
32
+ const r = [...t];
33
+ return Object.defineProperty(r, M, { value: e }), r;
34
+ }
35
+ class C {
36
+ constructor(t, r) {
37
+ this.path = r;
38
+ const i = x(t);
39
+ i.__path = r, this.signal = i, this.initial = c(t);
40
+ }
41
+ kind = "leaf";
42
+ signal;
43
+ initial;
44
+ rebase(t) {
45
+ this.path = t, this.signal.__path = t;
46
+ }
47
+ /** Реактивное чтение (внутри effect/computed создаёт зависимость). */
48
+ read() {
49
+ return this.signal.value;
50
+ }
51
+ /** Нереактивный снимок. */
52
+ peek() {
53
+ return this.signal.peek();
54
+ }
55
+ set(t) {
56
+ this.signal.value = t;
57
+ }
58
+ resetToInitial() {
59
+ this.signal.value = c(this.initial);
60
+ }
61
+ captureInitial() {
62
+ this.initial = c(this.signal.peek());
63
+ }
64
+ dirty() {
65
+ return !g(this.signal.peek(), this.initial);
66
+ }
67
+ }
68
+ class K {
69
+ /**
70
+ * @param shape Образец той же группы из шаблона родительского массива: из него вложенные
71
+ * массивы берут шаблоны, если значение пришло обычными данными (см. {@link ArrayNode}).
72
+ */
73
+ constructor(t, r, i) {
74
+ this.path = r;
75
+ for (const n of Object.keys(t)) {
76
+ const s = i && (() => W(i(), n));
77
+ this.children.set(n, E(t[n], h(r, n), s));
78
+ }
79
+ }
80
+ kind = "group";
81
+ children = /* @__PURE__ */ new Map();
82
+ rebase(t) {
83
+ this.path = t;
84
+ for (const [r, i] of this.children) i.rebase(h(t, r));
85
+ }
86
+ /** Реактивное чтение поддерева (внутри effect/computed подписывает на все листья группы). */
87
+ read() {
88
+ const t = {};
89
+ for (const [r, i] of this.children) t[r] = i.read();
90
+ return t;
91
+ }
92
+ peek() {
93
+ const t = {};
94
+ for (const [r, i] of this.children) t[r] = i.peek();
95
+ return t;
96
+ }
97
+ set(t) {
98
+ if (t == null || typeof t != "object") return;
99
+ const r = t;
100
+ A(() => {
101
+ for (const [i, n] of this.children)
102
+ i in r && (n.kind === "leaf" && T(n.signal) || n.set(r[i]));
103
+ });
104
+ }
105
+ resetToInitial() {
106
+ A(() => {
107
+ for (const t of this.children.values()) t.resetToInitial();
108
+ });
109
+ }
110
+ captureInitial() {
111
+ for (const t of this.children.values()) t.captureInitial();
112
+ }
113
+ dirty() {
114
+ for (const t of this.children.values()) if (t.dirty()) return !0;
115
+ return !1;
116
+ }
117
+ }
118
+ class G {
119
+ /** @param shape Образец того же массива из шаблона родителя (см. {@link GroupNode}). */
120
+ constructor(t, r, i) {
121
+ this.path = r, this.shape = i, this.blank = _(t), this.items = x(t.map((n, s) => this.build(n, s))), this.initial = c(t);
122
+ }
123
+ kind = "array";
124
+ items;
125
+ initial;
126
+ // Шаблон нового элемента (`arrayOf`). Принадлежит узлу, а не значению: `set`/`reset` заменяют
127
+ // элементы, узел остаётся — и шаблон с ним.
128
+ blank;
129
+ // Запасной шаблон — `initialValue` узла-массива схемы.
130
+ fallback;
131
+ // Образец элемента — один вызов шаблона. Нужен только ради вложенных шаблонов: элемент из
132
+ // обычных данных (`set` с сервера, `push(значение)`) метку `arrayOf` на своих массивах не несёт.
133
+ sample;
134
+ /** Шаблон по старшинству: свой (`arrayOf`) → из шаблона родителя → из схемы. */
135
+ template() {
136
+ return this.blank ??= _(this.shape?.()), this.blank ?? this.fallback;
137
+ }
138
+ // Образец читается лениво — лишний вызов шаблона случается, только когда вложенному массиву
139
+ // элемента из обычных данных понадобился свой шаблон.
140
+ itemShape = () => {
141
+ if (!this.sample) {
142
+ const t = this.template();
143
+ if (!t) return;
144
+ this.sample = { value: t() };
145
+ }
146
+ return this.sample.value;
147
+ };
148
+ build(t, r) {
149
+ return E(t, h(this.path, r), this.itemShape);
150
+ }
151
+ /** Значение нового элемента: переданное либо из шаблона. */
152
+ fresh(t) {
153
+ if (t !== void 0) return t;
154
+ const r = this.template();
155
+ if (!r)
156
+ throw new Error(
157
+ `[@reformer/core] ${this.path || "массив"}: добавление элемента без значения, а шаблона у массива нет. Объявите его в модели — \`arrayOf(() => ({ … }))\` — либо передайте значение: \`push(значение)\`.`
158
+ );
159
+ return r();
160
+ }
161
+ /** Шаблон из схемы (`initialValue` узла-массива) — запасной: шаблон модели главнее. */
162
+ provideBlank(t) {
163
+ this.fallback ??= t;
164
+ }
165
+ rebase(t) {
166
+ this.path = t, this.items.peek().forEach((r, i) => r.rebase(h(t, i)));
167
+ }
168
+ reindex() {
169
+ this.items.peek().forEach((t, r) => t.rebase(h(this.path, r)));
170
+ }
171
+ push(t) {
172
+ const r = this.items.peek();
173
+ this.items.value = [...r, this.build(this.fresh(t), r.length)];
174
+ }
175
+ insertAt(t, r) {
176
+ const i = [...this.items.peek()];
177
+ i.splice(t, 0, this.build(this.fresh(r), t)), this.items.value = i, this.reindex();
178
+ }
179
+ removeAt(t) {
180
+ const r = [...this.items.peek()];
181
+ r.splice(t, 1), this.items.value = r, this.reindex();
182
+ }
183
+ move(t, r) {
184
+ const i = [...this.items.peek()], [n] = i.splice(t, 1);
185
+ n && i.splice(r, 0, n), this.items.value = i, this.reindex();
186
+ }
187
+ swap(t, r) {
188
+ const i = [...this.items.peek()];
189
+ t < 0 || r < 0 || t >= i.length || r >= i.length || t === r || ([i[t], i[r]] = [i[r], i[t]], this.items.value = i, this.reindex());
190
+ }
191
+ clear() {
192
+ this.items.value = [];
193
+ }
194
+ /**
195
+ * Реактивное чтение массива. Читаем `items.value` (а не `.peek()`) — внутри effect/computed это
196
+ * подписка на СОСТАВ массива, поэтому push/removeAt/move ретригерят наравне с правкой элемента.
197
+ */
198
+ read() {
199
+ return this.items.value.map((t) => t.read());
200
+ }
201
+ peek() {
202
+ return this.items.peek().map((t) => t.peek());
203
+ }
204
+ set(t) {
205
+ const r = Array.isArray(t) ? t : [];
206
+ this.items.value = r.map((i, n) => this.build(i, n));
207
+ }
208
+ resetToInitial() {
209
+ this.set(c(this.initial));
210
+ }
211
+ captureInitial() {
212
+ this.initial = c(this.peek());
213
+ }
214
+ dirty() {
215
+ return !g(this.peek(), this.initial);
216
+ }
217
+ }
218
+ function E(e, t, r) {
219
+ return Array.isArray(e) ? new G(e, t, r) : d(e) ? new K(e, t, r) : new C(e, t);
220
+ }
221
+ const H = (e) => typeof e == "function" ? e : () => c(e), O = /* @__PURE__ */ new WeakMap(), N = /* @__PURE__ */ new WeakMap();
222
+ function L(e) {
223
+ const t = F(() => e.read());
224
+ return {
225
+ get value() {
226
+ return t.value;
227
+ },
228
+ peek: () => t.peek(),
229
+ subscribe: (r) => t.subscribe(r),
230
+ valueOf: () => t.value,
231
+ toString: () => String(t.value),
232
+ toJSON: () => t.value,
233
+ brand: t.brand
234
+ };
235
+ }
236
+ function p(e) {
237
+ if (e.kind === "leaf") return e.signal;
238
+ const t = O.get(e);
239
+ if (t) return t;
240
+ const r = L(e), i = e.kind === "group", n = (l) => i ? e.children.get(l) : v(l) ? e.items.value[Number(l)] : void 0, s = i ? {} : {
241
+ get length() {
242
+ return e.items.value.length;
243
+ }
244
+ }, o = new Proxy(s, {
245
+ get: (l, a, k) => {
246
+ if (a === "__path") return e.path;
247
+ if (a === "__kind") return e.kind;
248
+ if (typeof a != "string") return Reflect.get(r, a, r);
249
+ const m = n(a);
250
+ return m ? p(m) : !i && Reflect.has(l, a) ? Reflect.get(l, a, k) : Reflect.get(r, a, r);
251
+ },
252
+ set: (l, a, k) => {
253
+ if (!i && a === "value")
254
+ return e.set(k), !0;
255
+ const m = e.path === "" ? "model.$" : `model.$.${e.path}`;
256
+ throw new TypeError(
257
+ `[@reformer/core] ${m}: запись в «${String(a)}» ` + (i ? "узла-группы невозможна — группа читается целиком, а пишется по полям (model.$.<поле>.value) либо через model.patch(...)" : "узла-массива невозможна — массив заменяется целиком через .value, а элемент правится своим сигналом (model.$.<массив>[i].value)")
258
+ );
259
+ },
260
+ has: (l, a) => typeof a == "string" && (n(a) !== void 0 || !i && Reflect.has(l, a)),
261
+ ownKeys: () => i ? [...e.children.keys()] : Reflect.ownKeys(s),
262
+ getOwnPropertyDescriptor: (l, a) => typeof a == "string" && n(a) ? { enumerable: !0, configurable: !0 } : i ? void 0 : Reflect.getOwnPropertyDescriptor(l, a)
263
+ });
264
+ return O.set(e, o), N.set(o, e), o;
265
+ }
266
+ function P(e) {
267
+ if (!(e == null || typeof e != "object"))
268
+ return N.get(e);
269
+ }
270
+ function V(e) {
271
+ if (e == null || typeof e != "object") return !1;
272
+ const t = e.__kind;
273
+ return t === "group" || t === "array";
274
+ }
275
+ function y(e) {
276
+ return e == null || typeof e != "object" ? !1 : e.__kind === "array";
277
+ }
278
+ function X(e) {
279
+ return e instanceof I || y(e);
280
+ }
281
+ function q(e, t) {
282
+ if (!t) return;
283
+ let r = e;
284
+ for (const i of t.split(".")) {
285
+ if (!r) return;
286
+ if (r.kind === "group") r = r.children.get(i);
287
+ else if (r.kind === "array") r = r.items.peek()[Number(i)];
288
+ else return;
289
+ }
290
+ if (r)
291
+ return r.kind === "leaf" ? r.signal : r.kind === "array" ? p(r) : void 0;
292
+ }
293
+ function f(e) {
294
+ if (e)
295
+ return e.kind === "group" ? B(e) : e.kind === "array" ? R(e) : e.read();
296
+ }
297
+ const S = /* @__PURE__ */ new WeakMap(), b = /* @__PURE__ */ new WeakMap();
298
+ function R(e) {
299
+ const t = S.get(e);
300
+ if (t) return t;
301
+ const r = {
302
+ get length() {
303
+ return e.items.value.length;
304
+ },
305
+ push: (n) => e.push(n),
306
+ insertAt: (n, s) => e.insertAt(n, s),
307
+ removeAt: (n) => e.removeAt(n),
308
+ move: (n, s) => e.move(n, s),
309
+ swap: (n, s) => e.swap(n, s),
310
+ clear: () => e.clear(),
311
+ at: (n) => f(e.items.value[n]),
312
+ map: (n) => e.items.value.map((s, o) => n(f(s), o)),
313
+ forEach: (n) => e.items.value.forEach((s, o) => n(f(s), o)),
314
+ toArray: () => e.peek(),
315
+ [Symbol.iterator]: function* () {
316
+ const n = e.items.value;
317
+ for (let s = 0; s < n.length; s++) yield f(n[s]);
318
+ }
319
+ }, i = new Proxy(r, {
320
+ get: (n, s, o) => s === "__path" ? e.path : typeof s == "string" && v(s) ? f(e.items.value[Number(s)]) : Reflect.get(n, s, o),
321
+ has: (n, s) => typeof s == "string" && v(s) ? Number(s) < e.items.value.length : Reflect.has(n, s)
322
+ });
323
+ return S.set(e, i), b.set(i, e), i;
324
+ }
325
+ const $ = /* @__PURE__ */ new Set([
326
+ "$",
327
+ "get",
328
+ "set",
329
+ "patch",
330
+ "isDirty",
331
+ "reset",
332
+ "captureInitial",
333
+ "signalAt"
334
+ ]), j = /* @__PURE__ */ new WeakMap(), w = /* @__PURE__ */ new WeakMap();
335
+ function B(e) {
336
+ const t = j.get(e);
337
+ if (t) return t;
338
+ const r = {
339
+ $: p(e),
340
+ get: () => e.peek(),
341
+ set: (n) => e.set(n),
342
+ patch: (n) => e.set(n),
343
+ isDirty: () => e.dirty(),
344
+ reset: () => e.resetToInitial(),
345
+ captureInitial: () => e.captureInitial(),
346
+ signalAt: (n) => q(e, n)
347
+ }, i = new Proxy(
348
+ {},
349
+ {
350
+ get: (n, s) => {
351
+ if (s === "__path") return e.path;
352
+ if (typeof s != "string") return;
353
+ const o = e.children.get(s);
354
+ if (o) return f(o);
355
+ if ($.has(s)) return r[s];
356
+ },
357
+ set: (n, s, o) => {
358
+ if (typeof s != "string") return !1;
359
+ const l = e.children.get(s);
360
+ return l ? (l.set(o), !0) : !1;
361
+ },
362
+ has: (n, s) => typeof s == "string" && (e.children.has(s) || $.has(s)),
363
+ ownKeys: () => [...e.children.keys()],
364
+ getOwnPropertyDescriptor: (n, s) => typeof s == "string" && e.children.has(s) ? { enumerable: !0, configurable: !0 } : void 0
365
+ }
366
+ );
367
+ return j.set(e, i), w.set(i, e), i;
368
+ }
369
+ function Y(e) {
370
+ const t = P(e);
371
+ if (!t) {
372
+ const r = e?.__path, i = typeof r == "string" && r !== "" ? ` «${r}»` : "";
373
+ throw new TypeError(
374
+ e instanceof I ? `[@reformer/core] modelOf: ручка${i} — лист, у него нет под-модели. Группа или массив, созданные из начального null, в модели тоже лист: задайте начальное значение объектом или массивом.` : "[@reformer/core] modelOf: ожидалась ручка группы или массива из дерева model.$ (например, model.$.address или model.$.items)."
375
+ );
376
+ }
377
+ return t.kind === "group" ? B(t) : R(t);
378
+ }
379
+ function D(e) {
380
+ if (e == null || typeof e != "object") return;
381
+ const t = b.get(e);
382
+ if (t) return p(t);
383
+ const r = w.get(e);
384
+ return r ? p(r) : void 0;
385
+ }
386
+ function Z(e) {
387
+ if (y(e)) return e;
388
+ const t = D(e);
389
+ return y(t) ? t : void 0;
390
+ }
391
+ function ee(e) {
392
+ const t = V(e) ? e : D(e);
393
+ return t !== void 0 && !y(t) ? t : void 0;
394
+ }
395
+ function te(e, t) {
396
+ const r = P(e);
397
+ r?.kind === "array" && r.provideBlank(H(t));
398
+ }
399
+ function re(e) {
400
+ return e == null || typeof e != "object" ? !1 : b.has(e) || w.has(e);
401
+ }
402
+ export {
403
+ K as G,
404
+ U as a,
405
+ X as b,
406
+ z as c,
407
+ T as d,
408
+ B as e,
409
+ re as f,
410
+ ee as g,
411
+ Z as h,
412
+ V as i,
413
+ y as j,
414
+ Y as m,
415
+ te as p,
416
+ w as r,
417
+ p as s,
418
+ Q as u
419
+ };
package/dist/model.js CHANGED
@@ -1,21 +1,25 @@
1
- import { c as s, e as r } from "./create-model-Dxh9cfLp.js";
2
- import { a as i, i as t, m as c, u as l } from "./model-signals-proxy-mV3WGdlO.js";
3
- import { c as n, a as f, r as m, b as u, d as p, e as b, f as h, s as k, t as v, w as D } from "./behaviors-value-C7dSEhCc.js";
1
+ import { c as s, e as r, a as l } from "./create-model-BBRHhHwK.js";
2
+ import { a as o, d as c, i as d, b as n, c as t, m as f, u as m } from "./model-value-proxy-caTmAiUd.js";
3
+ import { c as b, a as h, r as p, b as g, d as k, e as v, f as D, s as F, t as S, w as x } from "./behaviors-value-C7dSEhCc.js";
4
4
  export {
5
- n as computeFrom,
6
- f as copyFrom,
5
+ o as arrayOf,
6
+ b as computeFrom,
7
+ h as copyFrom,
7
8
  s as createModel,
8
9
  r as eachLeafSignal,
9
- i as isDerived,
10
- t as isModelContainerSignal,
11
- c as markDerived,
12
- m as resetWhen,
13
- u as revalidateWhen,
14
- p as runOutsideEffect,
15
- b as safeCallback,
16
- h as safeDebouncedCallback,
17
- k as syncFields,
18
- v as transformValue,
19
- l as unmarkDerived,
20
- D as watchField
10
+ l as eachValueSignal,
11
+ c as isDerived,
12
+ d as isModelContainerSignal,
13
+ n as isValueSignal,
14
+ t as markDerived,
15
+ f as modelOf,
16
+ p as resetWhen,
17
+ g as revalidateWhen,
18
+ k as runOutsideEffect,
19
+ v as safeCallback,
20
+ D as safeDebouncedCallback,
21
+ F as syncFields,
22
+ S as transformValue,
23
+ m as unmarkDerived,
24
+ x as watchField
21
25
  };