@mmstack/form-core 21.0.2 → 22.0.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.
@@ -108,21 +108,28 @@ function generateID() {
108
108
  */
109
109
  function formControl(initial, opt) {
110
110
  const value = isSignal(initial) ? initial : signal(initial, opt);
111
- const initialValue = signal(untracked(value), ...(ngDevMode ? [{ debugName: "initialValue" }] : /* istanbul ignore next */ []));
111
+ const initialValue = signal(untracked(value), /* @ts-ignore */
112
+ ...(ngDevMode ? [{ debugName: "initialValue" }] : /* istanbul ignore next */ []));
112
113
  const eq = opt?.equal ?? Object.is;
113
114
  const dirtyEq = opt?.dirtyEquality ?? eq;
114
- const disabled = computed(() => opt?.disable?.() ?? false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
115
- const readonly = computed(() => opt?.readonly?.() ?? false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
116
- const dirty = computed(() => !dirtyEq(value(), initialValue()), ...(ngDevMode ? [{ debugName: "dirty" }] : /* istanbul ignore next */ []));
117
- const touched = signal(false, ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
118
- const validator = computed(() => opt?.validator?.() ?? (() => ''), ...(ngDevMode ? [{ debugName: "validator" }] : /* istanbul ignore next */ []));
115
+ const disabled = computed(() => opt?.disable?.() ?? false, /* @ts-ignore */
116
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
117
+ const readonly = computed(() => opt?.readonly?.() ?? false, /* @ts-ignore */
118
+ ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
119
+ const dirty = computed(() => !dirtyEq(value(), initialValue()), /* @ts-ignore */
120
+ ...(ngDevMode ? [{ debugName: "dirty" }] : /* istanbul ignore next */ []));
121
+ const touched = signal(false, /* @ts-ignore */
122
+ ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
123
+ const validator = computed(() => opt?.validator?.() ?? (() => ''), /* @ts-ignore */
124
+ ...(ngDevMode ? [{ debugName: "validator" }] : /* istanbul ignore next */ []));
119
125
  const error = computed(() => {
120
126
  if (opt?.overrideValidation)
121
127
  return opt.overrideValidation();
122
128
  if (disabled() || readonly())
123
129
  return '';
124
130
  return validator()(value());
125
- }, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
131
+ }, /* @ts-ignore */
132
+ ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
126
133
  const markAsTouched = () => {
127
134
  touched.set(true);
128
135
  opt?.onTouched?.();
@@ -130,8 +137,10 @@ function formControl(initial, opt) {
130
137
  const markAllAsTouched = markAsTouched;
131
138
  const markAsPristine = () => touched.set(false);
132
139
  const markAllAsPristine = markAsPristine;
133
- const label = computed(() => opt?.label?.() ?? '', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
134
- const partialValue = computed(() => (dirty() ? value() : undefined), ...(ngDevMode ? [{ debugName: "partialValue" }] : /* istanbul ignore next */ []));
140
+ const label = computed(() => opt?.label?.() ?? '', /* @ts-ignore */
141
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
142
+ const partialValue = computed(() => (dirty() ? value() : undefined), /* @ts-ignore */
143
+ ...(ngDevMode ? [{ debugName: "partialValue" }] : /* istanbul ignore next */ []));
135
144
  const internalReconcile = (newValue, force = false) => {
136
145
  const isDirty = untracked(dirty);
137
146
  if (!isDirty || force) {
@@ -143,7 +152,8 @@ function formControl(initial, opt) {
143
152
  });
144
153
  }
145
154
  };
146
- const pending = computed(() => opt?.pending?.() ?? false, ...(ngDevMode ? [{ debugName: "pending" }] : /* istanbul ignore next */ []));
155
+ const pending = computed(() => opt?.pending?.() ?? false, /* @ts-ignore */
156
+ ...(ngDevMode ? [{ debugName: "pending" }] : /* istanbul ignore next */ []));
147
157
  return {
148
158
  id: opt?.id?.() ?? generateID(),
149
159
  value,
@@ -211,8 +221,10 @@ function formArray(initial, factory, opt) {
211
221
  return true;
212
222
  return a.every((v, i) => eq(v, b[i]));
213
223
  };
214
- const min = computed(() => opt?.min?.() ?? 0, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
215
- const max = computed(() => opt?.max?.() ?? Number.MAX_SAFE_INTEGER, ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
224
+ const min = computed(() => opt?.min?.() ?? 0, /* @ts-ignore */
225
+ ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
226
+ const max = computed(() => opt?.max?.() ?? Number.MAX_SAFE_INTEGER, /* @ts-ignore */
227
+ ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
216
228
  const arrayOptions = {
217
229
  ...opt,
218
230
  equal: arrayEqual,
@@ -220,12 +232,14 @@ function formArray(initial, factory, opt) {
220
232
  controlType: 'array',
221
233
  };
222
234
  const ctrl = formControl(initial, arrayOptions);
223
- const length = computed(() => ctrl.value().length, ...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
235
+ const length = computed(() => ctrl.value().length, /* @ts-ignore */
236
+ ...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
224
237
  const reconcileChildren = createReconcileChildren(factory, { equal: eq });
225
238
  // linkedSignal used to re-use previous value so that only length changes are affected and existing controls are kept, but updated
226
239
  const children = linkedSignal({ ...(ngDevMode ? { debugName: "children" } : /* istanbul ignore next */ {}), source: () => length(),
227
240
  computation: (len, prev) => reconcileChildren(len, ctrl.value, prev?.value) });
228
- const ownError = computed(() => ctrl.error(), ...(ngDevMode ? [{ debugName: "ownError" }] : /* istanbul ignore next */ []));
241
+ const ownError = computed(() => ctrl.error(), /* @ts-ignore */
242
+ ...(ngDevMode ? [{ debugName: "ownError" }] : /* istanbul ignore next */ []));
229
243
  const error = computed(() => {
230
244
  const own = ownError();
231
245
  if (own)
@@ -236,14 +250,16 @@ function formArray(initial, factory, opt) {
236
250
  .map((c, idx) => (c.error() ? `${idx}: ${c.error()}` : ''))
237
251
  .filter(Boolean)
238
252
  .join('\n');
239
- }, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
253
+ }, /* @ts-ignore */
254
+ ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
240
255
  const dirty = computed(() => {
241
256
  if (ctrl.dirty())
242
257
  return true;
243
258
  if (!children().length)
244
259
  return false;
245
260
  return children().some((c) => c.dirty());
246
- }, ...(ngDevMode ? [{ debugName: "dirty" }] : /* istanbul ignore next */ []));
261
+ }, /* @ts-ignore */
262
+ ...(ngDevMode ? [{ debugName: "dirty" }] : /* istanbul ignore next */ []));
247
263
  const markAllAsTouched = () => {
248
264
  ctrl.markAllAsTouched();
249
265
  for (const c of untracked(children)) {
@@ -269,9 +285,11 @@ function formArray(initial, factory, opt) {
269
285
  // return full value for child objects/arrays as this cannot be partially patched without idx
270
286
  return toPartialValue(c.value());
271
287
  });
272
- }, ...(ngDevMode ? [{ debugName: "partialValue" }] : /* istanbul ignore next */ []));
288
+ }, /* @ts-ignore */
289
+ ...(ngDevMode ? [{ debugName: "partialValue" }] : /* istanbul ignore next */ []));
273
290
  const touched = computed(() => ctrl.touched() ||
274
- !!(children().length && children().some((c) => c.touched())), ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
291
+ !!(children().length && children().some((c) => c.touched())), /* @ts-ignore */
292
+ ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
275
293
  const reconcile = (newValue) => {
276
294
  const ctrls = untracked(children);
277
295
  for (let i = 0; i < newValue.length; i++) {
@@ -290,8 +308,10 @@ function formArray(initial, factory, opt) {
290
308
  if (!children().length)
291
309
  return true;
292
310
  return children().every((d) => d.valid());
293
- }, ...(ngDevMode ? [{ debugName: "childrenValid" }] : /* istanbul ignore next */ []));
294
- const childrenPending = computed(() => !!children().length && children().some((d) => d.pending()), ...(ngDevMode ? [{ debugName: "childrenPending" }] : /* istanbul ignore next */ []));
311
+ }, /* @ts-ignore */
312
+ ...(ngDevMode ? [{ debugName: "childrenValid" }] : /* istanbul ignore next */ []));
313
+ const childrenPending = computed(() => !!children().length && children().some((d) => d.pending()), /* @ts-ignore */
314
+ ...(ngDevMode ? [{ debugName: "childrenPending" }] : /* istanbul ignore next */ []));
295
315
  return {
296
316
  ...ctrl,
297
317
  ownError,
@@ -389,8 +409,10 @@ function formGroup(initial, providedChildren, opt) {
389
409
  ? computed(() => providedChildren())
390
410
  : computed(() => providedChildren);
391
411
  // array allows for easier handling
392
- const derivationsArray = computed(() => Object.values(children()), ...(ngDevMode ? [{ debugName: "derivationsArray" }] : /* istanbul ignore next */ []));
393
- const childrenDirty = computed(() => !!derivationsArray().length && derivationsArray().some((d) => d.dirty()), ...(ngDevMode ? [{ debugName: "childrenDirty" }] : /* istanbul ignore next */ []));
412
+ const derivationsArray = computed(() => Object.values(children()), /* @ts-ignore */
413
+ ...(ngDevMode ? [{ debugName: "derivationsArray" }] : /* istanbul ignore next */ []));
414
+ const childrenDirty = computed(() => !!derivationsArray().length && derivationsArray().some((d) => d.dirty()), /* @ts-ignore */
415
+ ...(ngDevMode ? [{ debugName: "childrenDirty" }] : /* istanbul ignore next */ []));
394
416
  // by default dont compare object references, just use childrenDirtySignal
395
417
  const baseDirtyEq = opt?.dirtyEquality ?? opt?.equal ?? (() => true);
396
418
  // function which calls a signal becomes a signal
@@ -417,8 +439,10 @@ function formGroup(initial, providedChildren, opt) {
417
439
  },
418
440
  });
419
441
  const childrenTouched = computed(() => !!derivationsArray().length &&
420
- derivationsArray().some((d) => d.touched()), ...(ngDevMode ? [{ debugName: "childrenTouched" }] : /* istanbul ignore next */ []));
421
- const touched = computed(() => ctrl.touched() || childrenTouched(), ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
442
+ derivationsArray().some((d) => d.touched()), /* @ts-ignore */
443
+ ...(ngDevMode ? [{ debugName: "childrenTouched" }] : /* istanbul ignore next */ []));
444
+ const touched = computed(() => ctrl.touched() || childrenTouched(), /* @ts-ignore */
445
+ ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
422
446
  const childError = computed(() => {
423
447
  if (!derivationsArray().length)
424
448
  return '';
@@ -426,13 +450,15 @@ function formGroup(initial, providedChildren, opt) {
426
450
  .map((d) => (d.error() ? `${d.label()}: ${d.error()}` : ''))
427
451
  .filter(Boolean)
428
452
  .join('\n');
429
- }, ...(ngDevMode ? [{ debugName: "childError" }] : /* istanbul ignore next */ []));
453
+ }, /* @ts-ignore */
454
+ ...(ngDevMode ? [{ debugName: "childError" }] : /* istanbul ignore next */ []));
430
455
  const error = computed(() => {
431
456
  const ownError = ctrl.error();
432
457
  if (ownError)
433
458
  return ownError;
434
459
  return childError() ? 'INVALID' : '';
435
- }, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
460
+ }, /* @ts-ignore */
461
+ ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
436
462
  const markAllAsTouched = () => {
437
463
  ctrl.markAllAsTouched();
438
464
  for (const ctrl of untracked(derivationsArray)) {
@@ -481,14 +507,17 @@ function formGroup(initial, providedChildren, opt) {
481
507
  obj[key] = pv;
482
508
  }
483
509
  return obj;
484
- }, ...(ngDevMode ? [{ debugName: "partialValue" }] : /* istanbul ignore next */ []));
510
+ }, /* @ts-ignore */
511
+ ...(ngDevMode ? [{ debugName: "partialValue" }] : /* istanbul ignore next */ []));
485
512
  const childrenValid = computed(() => {
486
513
  if (!derivationsArray().length)
487
514
  return true;
488
515
  return derivationsArray().every((d) => d.valid());
489
- }, ...(ngDevMode ? [{ debugName: "childrenValid" }] : /* istanbul ignore next */ []));
516
+ }, /* @ts-ignore */
517
+ ...(ngDevMode ? [{ debugName: "childrenValid" }] : /* istanbul ignore next */ []));
490
518
  const childrenPending = computed(() => !!derivationsArray().length &&
491
- derivationsArray().some((d) => d.pending()), ...(ngDevMode ? [{ debugName: "childrenPending" }] : /* istanbul ignore next */ []));
519
+ derivationsArray().some((d) => d.pending()), /* @ts-ignore */
520
+ ...(ngDevMode ? [{ debugName: "childrenPending" }] : /* istanbul ignore next */ []));
492
521
  return {
493
522
  ...ctrl,
494
523
  children,
@@ -1 +1 @@
1
- {"version":3,"file":"mmstack-form-core.mjs","sources":["../../../../../packages/form/core/src/lib/util.ts","../../../../../packages/form/core/src/lib/form-control.ts","../../../../../packages/form/core/src/lib/form-array.ts","../../../../../packages/form/core/src/lib/form-group.ts","../../../../../packages/form/core/src/mmstack-form-core.ts"],"sourcesContent":["/**\n * Merges two arrays element by element using the `mergeIfObject` logic.\n *\n * The resulting array will have the same length as the `next` array.\n * For each index `i`, the element in the resulting array is determined by:\n * `mergeIfObject(prev[i], next[i])`.\n * If `prev` is shorter than `next`, `prev[i]` will be `undefined` for the out-of-bounds indices.\n *\n * @template {any[]} T The array type being merged.\n * @param {T} prev The previous array.\n * @param {T} next The next array.\n * @returns {T} A new array containing the merged elements.\n * @example\n * const prev = [1, { id: 1, name: \"A\" }, [10], \"extraPrev\"];\n * const next = [2, { id: 1, status: \"B\" }, [20, 21], missing , { id: 2 }];\n *\n * mergeArray(prev, next);\n * // Result approx:\n * // [\n * // 2, // Primitive replaced\n * // { id: 1, name: \"A\", status: \"B\" }, // Objects shallow-merged\n * // [20, 21], // Arrays replaced (via mergeIfObject -> mergeArray)\n * // undefined, // Primitive replaced by missing item in sparse 'next' array\n * // { id: 2 } // Added from 'next' (prev[4] was undefined)\n * // ]\n */\nexport function mergeArray<T extends any[]>(prev: T, next: T): T {\n return next.map((item, index): T[number] =>\n mergeIfObject<T[number]>(prev[index], item),\n ) as T;\n}\n\n/**\n * Merges two values (`prev`, `next`), prioritizing `next` in most cases.\n *\n * Behavior:\n * - If both `prev` and `next` are non-null, non-array objects, it performs a **shallow merge**\n * (`{ ...prev, ...next }`), where properties from `next` overwrite those in `prev`.\n * - If both `prev` and `next` are arrays, it delegates to `mergeArray` for element-wise merging.\n * - In all other scenarios (type mismatch, primitives, null involved, array mixed with object),\n * it simply returns the `next` value.\n *\n * @template T The type of the values being merged.\n * @param {T | undefined} prev The previous value (can be undefined if accessed out of array bounds).\n * @param {T} next The next value.\n * @returns {T} The merged result based on the rules above.\n */\nexport function mergeIfObject<T>(prev: T, next: T): T {\n if (typeof prev !== typeof next) return next;\n if (typeof prev !== 'object' || typeof next !== 'object') return next;\n if (prev === null || next === null) return next;\n if (Array.isArray(prev) && Array.isArray(next)) return mergeArray(prev, next);\n if (Array.isArray(prev) || Array.isArray(next)) return next;\n\n return { ...prev, ...next };\n}\n\n/**\n * Generates a unique ID using crypto.randomUUID if available,\n * otherwise falls back to a non-secure random string.\n * @returns {string}\n */\nexport function generateID() {\n if (globalThis.crypto?.randomUUID) {\n return globalThis.crypto.randomUUID();\n }\n return Math.random().toString(36).substring(2);\n}\n","import {\n computed,\n isSignal,\n signal,\n untracked,\n type CreateSignalOptions,\n type Signal,\n type ValueEqualityFn,\n type WritableSignal,\n} from '@angular/core';\nimport { type DerivedSignal } from '@mmstack/primitives';\nimport { generateID } from './util';\n\n/**\n * Represents the type of a form control.\n * - `control`: A single form control (e.g., an input field).\n * - `array`: An array of form controls (like Angular's `FormArray`).\n * - `group`: A group of form controls (like Angular's `FormGroup`).\n */\nexport type ControlType = 'control' | 'array' | 'group';\n\n/**\n * Represents a reactive form control. It holds the value, validation status, and other\n * metadata for a form field. This is the core building block for creating reactive forms\n * with signals.\n *\n * @typeParam T - The type of the form control's value.\n * @typeParam TParent - The type of the parent form control's value (if this control is part of a group or array). Defaults to `undefined`.\n * @typeParam TControlType - The type of the control ('control', 'array', or 'group'). Defaults to 'control'.\n * @typeParam TPartialValue - The type of the partial value, used for patching.\n */\nexport type FormControlSignal<\n T,\n TParent = undefined,\n TControlType extends ControlType = 'control',\n TPartialValue = T | undefined,\n> = {\n /** A unique identifier for the control. Used for tracking in `@for` loops. */\n id: string;\n /** The main value signal for the control. */\n value: WritableSignal<T>;\n /** A signal indicating whether the control's value has been changed. */\n dirty: Signal<boolean>;\n /** A signal indicating whether the control has been interacted with (e.g., blurred). */\n touched: Signal<boolean>;\n /** A signal containing the current validation error message (empty string if valid). */\n error: Signal<string>;\n /** A signal indicating whether the control is pending */\n pending: Signal<boolean>;\n /** A signal indicating whether the control is disabled. */\n /** A signal indicating whether the control is in a valid state (without errors & not pending) */\n valid: Signal<boolean>;\n disabled: Signal<boolean>;\n /** A signal indicating whether the control is read-only. */\n readonly: Signal<boolean>;\n /** A signal indicating whether the control is required. */\n required: Signal<boolean>;\n /** A signal containing the label for the control. */\n label: Signal<string>;\n /** A signal containing the hint text for the control. */\n hint: Signal<string>;\n /** Marks the control as touched. */\n markAsTouched: () => void;\n /** Marks the control and all its child controls (if any) as touched. */\n markAllAsTouched: () => void;\n /** Marks the control as pristine (not touched). */\n markAsPristine: () => void;\n /** Marks the control and all its child controls (if any) as pristine. */\n markAllAsPristine: () => void;\n /**\n * Resets the control to a new value and sets a new initial value. This is intended for\n * scenarios where the underlying data is updated externally (e.g., data coming from\n * the server). If the control is not dirty, the value is updated. If the control *is*\n * dirty, the value is *not* updated (preserving user changes).\n */\n reconcile: (newValue: T) => void;\n /**\n * Similar to `reconcile`, but forces the update even if the control is dirty.\n */\n forceReconcile: (newValue: T) => void;\n /** Resets the control's value to its initial value. */\n reset: () => void;\n /** Resets the control's value and initial value. */\n resetWithInitial: (initial: T) => void;\n /**\n * The derivation function used to create this control if it's part of a `formGroup` or `formArray`.\n * @internal\n */\n from?: DerivedSignal<TParent, T>['from'];\n /** The equality function used to compare values. Defaults to `Object.is`. */\n equal: (a: T, b: T) => boolean;\n /** The type of the control ('control', 'array', or 'group'). */\n controlType: TControlType;\n /**\n * A signal representing the partial value of the control, suitable for patching data on a server.\n * It contains the changed value if `dirty` is `true`.\n */\n partialValue: Signal<TPartialValue>;\n};\n\nexport type CreateFormControlOptions<\n T,\n TControlType extends ControlType = ControlType,\n> = CreateSignalOptions<T> & {\n validator?: () => (value: T) => string;\n onTouched?: () => void;\n disable?: () => boolean;\n readonly?: () => boolean;\n required?: () => boolean;\n label?: () => string;\n id?: () => string;\n hint?: () => string;\n dirtyEquality?: ValueEqualityFn<T>;\n onReset?: () => void;\n controlType?: TControlType;\n overrideValidation?: () => string;\n pending?: () => boolean;\n};\n\n/**\n * Creates a `FormControlSignal`, a reactive form control that holds a value and tracks its\n * validity, dirty state, touched state, and other metadata.\n *\n * @typeParam T - The type of the form control's value.\n * @typeParam TParent - The type of the parent form control's value (if this control is part of a group or array).\n * @typeParam TControlType - The type of the control. Defaults to `'control'`.\n * @typeParam TPartialValue - The type of value when patching\n * @param initial - The initial value of the control, or a `DerivedSignal` if this control is part of a `formGroup` or `formArray`.\n * @param options - Optional configuration options for the control.\n * @returns A `FormControlSignal` instance.\n *\n * @example\n * // Create a simple form control:\n * const name = formControl('Initial Name');\n *\n * // Create a form control with validation:\n * const age = formControl(0, {\n * validator: () => (value) => value >= 18 ? '' : 'Must be at least 18',\n * });\n *\n * // Create a derived form control (equivalent to the above, but more explicit):\n * const user = signal({ name: 'John Doe', age: 30 });\n * const name = formControl(derived(user, {\n * from: (u) => u.name,\n * onChange: (newName) => user.update(u => ({...u, name: newName}))\n * }));\n *\n * // Create a form group with nested controls:\n * const user = signal({ name: 'John Doe', age: 30 });\n * const form = formGroup(user, {\n * name: formControl(derived(user, 'name')),\n * age: formControl(derived(user, 'age')),\n * })\n */\nexport function formControl<\n T,\n TParent = undefined,\n TControlType extends ControlType = 'control',\n TPartialValue = T | undefined,\n>(\n initial: DerivedSignal<TParent, T> | T,\n opt?: CreateFormControlOptions<T, TControlType>,\n): FormControlSignal<T, TParent, TControlType, TPartialValue> {\n const value = isSignal(initial) ? initial : signal(initial, opt);\n const initialValue = signal(untracked(value));\n const eq = opt?.equal ?? Object.is;\n\n const dirtyEq = opt?.dirtyEquality ?? eq;\n\n const disabled = computed(() => opt?.disable?.() ?? false);\n const readonly = computed(() => opt?.readonly?.() ?? false);\n\n const dirty = computed(() => !dirtyEq(value(), initialValue()));\n\n const touched = signal(false);\n\n const validator = computed(() => opt?.validator?.() ?? (() => ''));\n\n const error = computed(() => {\n if (opt?.overrideValidation) return opt.overrideValidation();\n if (disabled() || readonly()) return '';\n return validator()(value());\n });\n\n const markAsTouched = () => {\n touched.set(true);\n opt?.onTouched?.();\n };\n const markAllAsTouched = markAsTouched;\n\n const markAsPristine = () => touched.set(false);\n const markAllAsPristine = markAsPristine;\n\n const label = computed(() => opt?.label?.() ?? '');\n\n const partialValue = computed(() => (dirty() ? value() : undefined));\n\n const internalReconcile = (newValue: T, force = false) => {\n const isDirty = untracked(dirty);\n\n if (!isDirty || force) {\n // very dangerous use of untracked here, don't do this everywhere :)\n // thanks to u/synalx for the idea to use untracked here\n\n untracked(() => {\n initialValue.set(newValue);\n value.set(newValue);\n });\n }\n };\n\n const pending = computed(() => opt?.pending?.() ?? false);\n\n return {\n id: opt?.id?.() ?? generateID(),\n value,\n dirty,\n touched,\n error,\n label,\n required: computed(() => opt?.required?.() ?? false),\n disabled,\n readonly,\n pending,\n valid: computed(() => !pending() && !error()),\n hint: computed(() => opt?.hint?.() ?? ''),\n markAsTouched,\n markAllAsTouched,\n markAsPristine,\n markAllAsPristine,\n from: (isSignal(initial) ? initial.from : undefined) as FormControlSignal<\n T,\n TParent,\n TControlType\n >['from'],\n reconcile: (newValue: T) => internalReconcile(newValue),\n forceReconcile: (newValue: T) => internalReconcile(newValue, true),\n reset: () => {\n opt?.onReset?.();\n value.set(untracked(initialValue));\n },\n resetWithInitial: (initial: T) => {\n opt?.onReset?.();\n initialValue.set(initial);\n value.set(initial);\n },\n equal: eq,\n controlType: (opt?.controlType ?? 'control') as TControlType,\n partialValue: partialValue as Signal<TPartialValue>,\n };\n}\n","import {\n computed,\n linkedSignal,\n untracked,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport { derived, type DerivedSignal } from '@mmstack/primitives';\nimport {\n formControl,\n type CreateFormControlOptions,\n type FormControlSignal,\n} from './form-control';\nimport { type SignalValue } from './signal-value.type';\nimport { mergeArray } from './util';\n\nexport type FormArraySignal<\n T,\n TIndividualState extends FormControlSignal<\n T,\n any,\n any,\n any\n > = FormControlSignal<T, any, any, any>,\n TParent = undefined,\n> = FormControlSignal<\n T[],\n TParent,\n 'array',\n | Exclude<SignalValue<TIndividualState['partialValue']>, null | undefined>[]\n | undefined\n> & {\n ownError: Signal<string>;\n children: Signal<TIndividualState[]>;\n push: (value: T) => void; // add new control with value\n remove: (index: number) => void; // remove at index\n min: Signal<number>; // for display purposes\n max: Signal<number>; // for display purposes\n canAdd: Signal<boolean>; // disable add button if false\n canRemove: Signal<boolean>; // disable remove buttons if false\n};\n\nexport type CreateFormArraySignalOptions<\n T,\n TIndividualState extends FormControlSignal<T, any, any, any>,\n> = Omit<CreateFormControlOptions<T[]>, 'equal'> & {\n min?: () => number;\n max?: () => number;\n equal?: (a: T, b: T) => boolean;\n toPartialValue?: (\n v: T,\n ) => Exclude<SignalValue<TIndividualState['partialValue']>, null | undefined>;\n};\n\nfunction createReconcileChildren<\n T,\n TIndividualState extends FormControlSignal<T, any, any, any>,\n>(\n factory: (val: DerivedSignal<T[], T>, idx: number) => TIndividualState,\n opt: { equal: (a: T, b: T) => boolean },\n) {\n return (\n length: number,\n source: WritableSignal<T[]>,\n prev?: TIndividualState[],\n ): TIndividualState[] => {\n if (!prev) {\n const nextControls = [];\n\n for (let i = 0; i < length; i++) {\n nextControls.push(\n factory(derived(source, i, { equal: opt?.equal }), i),\n );\n }\n\n return nextControls;\n }\n\n if (length === prev.length) return prev;\n\n const next = [...prev];\n\n if (length < prev.length) {\n next.splice(length);\n } else if (length > prev.length) {\n for (let i = prev.length; i < length; i++) {\n next.push(factory(derived(source, i, { equal: opt?.equal }), i));\n }\n }\n\n return next;\n };\n}\n\nexport function formArray<\n T,\n TIndividualState extends FormControlSignal<\n T,\n any,\n any,\n any\n > = FormControlSignal<T, any, any, any>,\n TParent = undefined,\n>(\n initial: T[] | DerivedSignal<TParent, T[]>,\n factory: (val: DerivedSignal<T[], T>, idx: number) => TIndividualState,\n opt?: CreateFormArraySignalOptions<T, TIndividualState>,\n): FormArraySignal<T, TIndividualState, TParent> {\n const eq = opt?.equal ?? Object.is;\n\n const arrayEqual = (a: T[], b: T[]) => {\n if (a.length !== b.length) return false;\n if (!a.length) return true;\n\n return a.every((v, i) => eq(v, b[i]));\n };\n\n const min = computed(() => opt?.min?.() ?? 0);\n const max = computed(() => opt?.max?.() ?? Number.MAX_SAFE_INTEGER);\n\n const arrayOptions: CreateFormControlOptions<T[], 'array'> = {\n ...opt,\n equal: arrayEqual,\n dirtyEquality: (a, b) => a.length === b.length,\n controlType: 'array',\n };\n\n const ctrl = formControl<T[], TParent, 'array'>(\n initial,\n arrayOptions,\n ) satisfies FormControlSignal<T[], TParent, 'array'>;\n\n const length = computed(() => ctrl.value().length);\n\n const reconcileChildren = createReconcileChildren<T, TIndividualState>(\n factory,\n { equal: eq },\n );\n\n // linkedSignal used to re-use previous value so that only length changes are affected and existing controls are kept, but updated\n const children = linkedSignal<number, TIndividualState[]>({\n source: () => length(),\n computation: (len, prev) => reconcileChildren(len, ctrl.value, prev?.value),\n });\n\n const ownError = computed(() => ctrl.error());\n\n const error = computed((): string => {\n const own = ownError();\n if (own) return own;\n if (!children().length) return '';\n return children()\n .map((c, idx) => (c.error() ? `${idx}: ${c.error()}` : ''))\n .filter(Boolean)\n .join('\\n');\n });\n\n const dirty = computed(() => {\n if (ctrl.dirty()) return true;\n if (!children().length) return false;\n return children().some((c) => c.dirty());\n });\n\n const markAllAsTouched = () => {\n ctrl.markAllAsTouched();\n for (const c of untracked(children)) {\n c.markAllAsTouched();\n }\n };\n const markAllAsPristine = () => {\n ctrl.markAllAsPristine();\n for (const c of untracked(children)) {\n c.markAllAsPristine();\n }\n };\n\n const toPartialValue = opt?.toPartialValue ?? ((v: T) => v);\n const partialValue = computed(() => {\n if (!dirty()) return undefined;\n return children().map((c) => {\n const pv = c.partialValue();\n if (pv) return pv;\n if (c.controlType === 'control') return undefined;\n\n // return full value for child objects/arrays as this cannot be partially patched without idx\n return toPartialValue(c.value());\n });\n });\n\n const touched = computed(\n () =>\n ctrl.touched() ||\n !!(children().length && children().some((c) => c.touched())),\n );\n\n const reconcile = (newValue: T[]) => {\n const ctrls = untracked(children);\n\n for (let i = 0; i < newValue.length; i++) {\n ctrls.at(i)?.reconcile(newValue[i]); // reconcile existing controls that are relevant addition/removal will be handled after ctrl.reconcile through linkedSignal\n }\n\n ctrl.reconcile(mergeArray(newValue, untracked(ctrl.value)));\n };\n\n const forceReconcile = (newValue: T[]) => {\n const ctrls = untracked(children);\n\n for (let i = 0; i < newValue.length; i++) {\n ctrls.at(i)?.forceReconcile(newValue[i]);\n }\n\n ctrl.forceReconcile(newValue);\n };\n\n const childrenValid = computed(() => {\n if (!children().length) return true;\n return children().every((d) => d.valid());\n });\n\n const childrenPending = computed(\n () => !!children().length && children().some((d) => d.pending()),\n );\n\n return {\n ...ctrl,\n ownError,\n error,\n valid: computed(() => ctrl.valid() && childrenValid()),\n pending: computed(() => ctrl.pending() || childrenPending()),\n touched,\n children,\n dirty,\n markAllAsTouched,\n markAllAsPristine,\n min,\n max,\n partialValue,\n canAdd: computed(\n () => !ctrl.disabled() && !ctrl.readonly() && length() < max(),\n ),\n canRemove: computed(\n () => !ctrl.disabled() && !ctrl.readonly() && length() > min(),\n ),\n reconcile,\n forceReconcile,\n reset: () => {\n for (const c of untracked(children)) {\n c.reset();\n }\n ctrl.reset();\n },\n resetWithInitial: (initial: T[]) => {\n const ctrls = untracked(children);\n for (let i = 0; i < initial.length; i++) {\n ctrls.at(i)?.resetWithInitial(initial[i]);\n }\n ctrl.resetWithInitial(initial);\n },\n push: (next) => ctrl.value.update((cur) => [...cur, next]),\n remove: (idx) =>\n ctrl.value.update((cur) => cur.filter((_, i) => i !== idx)),\n };\n}\n","import {\n computed,\n isSignal,\n signal,\n untracked,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport {\n isDerivation,\n toFakeSignalDerivation,\n type DerivedSignal,\n} from '@mmstack/primitives';\nimport {\n formControl,\n type CreateFormControlOptions,\n type FormControlSignal,\n} from './form-control';\nimport { type SignalValue } from './signal-value.type';\nimport { mergeIfObject } from './util';\n\n/**\n * Extracts the partial value types from a record of `FormControlSignal` instances.\n * This is used to construct the `partialValue` type for `FormGroupSignal`.\n * @internal\n */\ntype DerivationPartialValues<\n TDerivations extends Record<string, FormControlSignal<any, any, any, any>>,\n> = {\n [K in keyof TDerivations]: Exclude<\n SignalValue<TDerivations[K]['partialValue']>,\n undefined\n >;\n};\n\n/**\n * Represents a group of form controls, similar to Angular's `FormGroup`. It aggregates\n * the values and states of its child controls into a single object.\n *\n * @typeParam T - The type of the form group's value (an object).\n * @typeParam TDerivations - A record where keys are the names of the child controls and values are the `FormControlSignal` instances.\n * @typeParam TParent - The type of the parent form control's value (if this group is nested).\n */\nexport type FormGroupSignal<\n T,\n TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\n TParent = undefined,\n> = FormControlSignal<\n T,\n TParent,\n 'group',\n Partial<DerivationPartialValues<TDerivations>>\n> & {\n /**\n * A signal that holds a record of the child form controls. The keys are the names\n * of the controls, and the values are the `FormControlSignal` instances.\n */\n children: Signal<TDerivations>;\n /**\n * A signal that holds the validation error message of the group itself (excluding child errors).\n */\n ownError: Signal<string>;\n};\n\n/**\n * Options for creating a `FormGroupSignal`. Extends `CreateFormControlOptions`.\n */\nexport type CreateFormGroupOptions<\n T,\n TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\n> = CreateFormControlOptions<T, 'group'> & {\n /**\n * An optional function to create a base object for the `partialValue` signal.\n * This can be used to pre-populate the partial value with default values or\n * to perform custom logic before merging in the partial values from child controls.\n */\n createBasePartialValue?: (\n value: T,\n ) => Partial<DerivationPartialValues<TDerivations>>;\n};\n\n/**\n * Creates a `FormGroupSignal`, which aggregates a set of child form controls into a single object.\n *\n * @typeParam T - The type of the form group's value (an object).\n * @typeParam TDerivations - A record where keys are the names of the child controls and values are the `FormControlSignal` instances.\n * @typeParam TParent - The type of the parent form control's value (if this group is nested within another group or array).\n * @param initial - The initial value of the form group (or a `WritableSignal` or `DerivedSignal` if the group is nested).\n * @param providedChildren - An object containing the child `FormControlSignal` instances, or a function that returns such an object.\n * Using a function allows for dynamic creation of child controls (e.g., in response to changes in other signals).\n * @param options - Optional configuration options for the form group.\n * @returns A `FormGroupSignal` instance.\n *\n * @example\n * // Create a simple form group:\n * const user = signal({ name: 'John Doe', age: 30 });\n * const form = formGroup(user, {\n * name: formControl(derived(user, 'name')),\n * age: formControl(derived(user, 'age')),\n * })\n *\n * // Create a nested form group:\n * const user = signal({ name: 'John', age: 30, address: {street: \"Some street\"} });\n *\n * const address = derived(user, 'address');\n * const userForm = formGroup(user, {\n * name: formControl(derived(user, 'name')),\n * age: formControl(derived(user, 'age')),\n * address: formGroup(address, {\n * street: formControl(derived(address, (address) => address.street), {\n * validator: () => (value) => value ? \"\" : \"required!\"\n * }) // you can create deeply nested structures.\n * })\n * });\n *\n * // Create a form group with dynamically created children replaced rare FormRecord requirements.\n * const showAddress = signal(false);\n * type Characteristic = {\n * valueType: 'string';\n * value: string;\n * } | {\n * valueType: 'number';\n * value: number;\n * }\n * const char = signal<Characteristic>({ valueType: 'string', value: '' });\n * const charForm = formGroup(char, () => {\n * if (char().valueType === 'string) return createStringControl(char);\n * return createNumberControl(char);\n * });\n *\n */\nexport function formGroup<\n T,\n TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\n TParent = undefined,\n>(\n initial: DerivedSignal<TParent, T> | T | WritableSignal<T>,\n providedChildren: (() => TDerivations) | TDerivations,\n opt?: CreateFormGroupOptions<T, TDerivations>,\n): FormGroupSignal<T, TDerivations, TParent> {\n const valueSignal = isSignal(initial) ? initial : signal(initial);\n // we fake a derivation if not present, so that .from is present on the signal\n const value = isDerivation<TParent, T>(valueSignal)\n ? valueSignal\n : toFakeSignalDerivation<TParent, T>(valueSignal);\n\n // we allow for a function/signal to be passed, this case should only be used if the child controls change dependent upon something, say if a formControl is flipped into a formGroup.\n const children =\n typeof providedChildren === 'function'\n ? computed(() => providedChildren())\n : computed(() => providedChildren);\n\n // array allows for easier handling\n const derivationsArray = computed(() => Object.values(children()));\n\n const childrenDirty = computed(\n () =>\n !!derivationsArray().length && derivationsArray().some((d) => d.dirty()),\n );\n\n // by default dont compare object references, just use childrenDirtySignal\n const baseDirtyEq = opt?.dirtyEquality ?? opt?.equal ?? (() => true);\n\n // function which calls a signal becomes a signal\n const dirtyEquality = (a: T, b: T) => {\n return baseDirtyEq(a, b) && !childrenDirty();\n };\n\n // group control\n const ctrl = formControl<T, TParent, 'group'>(value, {\n ...opt,\n dirtyEquality,\n controlType: 'group',\n readonly: () => {\n // readonly if is readonly or all children are readonly\n if (opt?.readonly?.()) return true;\n return (\n !!derivationsArray().length &&\n derivationsArray().every((d) => d.readonly())\n );\n },\n disable: () => {\n if (opt?.disable?.()) return true;\n return (\n !!derivationsArray().length &&\n derivationsArray().every((d) => d.disabled())\n );\n },\n }) satisfies FormControlSignal<T, TParent, 'group'>;\n\n const childrenTouched = computed(\n () =>\n !!derivationsArray().length &&\n derivationsArray().some((d) => d.touched()),\n );\n\n const touched = computed(() => ctrl.touched() || childrenTouched());\n\n const childError = computed(() => {\n if (!derivationsArray().length) return '';\n return derivationsArray()\n .map((d) => (d.error() ? `${d.label()}: ${d.error()}` : ''))\n .filter(Boolean)\n .join('\\n');\n });\n\n const error = computed(() => {\n const ownError = ctrl.error();\n if (ownError) return ownError;\n return childError() ? 'INVALID' : '';\n });\n\n const markAllAsTouched = () => {\n ctrl.markAllAsTouched();\n for (const ctrl of untracked(derivationsArray)) {\n ctrl.markAllAsTouched();\n }\n };\n\n const markAllAsPristine = () => {\n ctrl.markAllAsPristine();\n for (const ctrl of untracked(derivationsArray)) {\n ctrl.markAllAsPristine();\n }\n };\n\n const reconcile = (newValue: T) => {\n // set the children values based on the derivation of the new value\n for (const ctrl of untracked(derivationsArray)) {\n const from = ctrl.from;\n if (!from) continue;\n ctrl.reconcile(from(newValue));\n }\n ctrl.reconcile(mergeIfObject(newValue, untracked(value)));\n };\n\n const forceReconcile = (newValue: T) => {\n for (const ctrl of untracked(derivationsArray)) {\n const from = ctrl.from;\n if (!from) continue;\n ctrl.forceReconcile(from(newValue));\n }\n ctrl.forceReconcile(newValue);\n };\n\n const createBaseValueFn = opt?.createBasePartialValue;\n\n const basePartialValue: Signal<\n Partial<DerivationPartialValues<TDerivations>>\n > = createBaseValueFn\n ? computed(() => createBaseValueFn(ctrl.value()))\n : computed(() => ({}));\n\n const partialValue = computed(() => {\n const obj: Partial<DerivationPartialValues<TDerivations>> = {\n ...basePartialValue(),\n };\n\n if (!ctrl.dirty()) return obj;\n\n for (const [key, ctrl] of Object.entries(children())) {\n const pv = ctrl.partialValue();\n\n if (pv === undefined) continue;\n (obj as Record<PropertyKey, any>)[key] = pv;\n }\n\n return obj;\n });\n\n const childrenValid = computed(() => {\n if (!derivationsArray().length) return true;\n return derivationsArray().every((d) => d.valid());\n });\n\n const childrenPending = computed(\n () =>\n !!derivationsArray().length &&\n derivationsArray().some((d) => d.pending()),\n );\n\n return {\n ...ctrl,\n children,\n partialValue,\n reconcile,\n forceReconcile,\n ownError: ctrl.error,\n touched,\n error,\n valid: computed(() => ctrl.valid() && childrenValid()),\n pending: computed(() => ctrl.pending() || childrenPending()),\n markAllAsPristine,\n markAllAsTouched,\n reset: () => {\n for (const ctrl of untracked(derivationsArray)) {\n ctrl.reset();\n }\n ctrl.reset();\n },\n resetWithInitial: (initial: T) => {\n for (const ctrl of untracked(derivationsArray)) {\n const from = ctrl.from;\n if (from) ctrl.resetWithInitial(from(initial));\n else ctrl.reset();\n }\n ctrl.resetWithInitial(initial);\n },\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mmstack-form-core.mjs","sources":["../../../../../packages/form/core/src/lib/util.ts","../../../../../packages/form/core/src/lib/form-control.ts","../../../../../packages/form/core/src/lib/form-array.ts","../../../../../packages/form/core/src/lib/form-group.ts","../../../../../packages/form/core/src/mmstack-form-core.ts"],"sourcesContent":["/**\n * Merges two arrays element by element using the `mergeIfObject` logic.\n *\n * The resulting array will have the same length as the `next` array.\n * For each index `i`, the element in the resulting array is determined by:\n * `mergeIfObject(prev[i], next[i])`.\n * If `prev` is shorter than `next`, `prev[i]` will be `undefined` for the out-of-bounds indices.\n *\n * @template {any[]} T The array type being merged.\n * @param {T} prev The previous array.\n * @param {T} next The next array.\n * @returns {T} A new array containing the merged elements.\n * @example\n * const prev = [1, { id: 1, name: \"A\" }, [10], \"extraPrev\"];\n * const next = [2, { id: 1, status: \"B\" }, [20, 21], missing , { id: 2 }];\n *\n * mergeArray(prev, next);\n * // Result approx:\n * // [\n * // 2, // Primitive replaced\n * // { id: 1, name: \"A\", status: \"B\" }, // Objects shallow-merged\n * // [20, 21], // Arrays replaced (via mergeIfObject -> mergeArray)\n * // undefined, // Primitive replaced by missing item in sparse 'next' array\n * // { id: 2 } // Added from 'next' (prev[4] was undefined)\n * // ]\n */\nexport function mergeArray<T extends any[]>(prev: T, next: T): T {\n return next.map((item, index): T[number] =>\n mergeIfObject<T[number]>(prev[index], item),\n ) as T;\n}\n\n/**\n * Merges two values (`prev`, `next`), prioritizing `next` in most cases.\n *\n * Behavior:\n * - If both `prev` and `next` are non-null, non-array objects, it performs a **shallow merge**\n * (`{ ...prev, ...next }`), where properties from `next` overwrite those in `prev`.\n * - If both `prev` and `next` are arrays, it delegates to `mergeArray` for element-wise merging.\n * - In all other scenarios (type mismatch, primitives, null involved, array mixed with object),\n * it simply returns the `next` value.\n *\n * @template T The type of the values being merged.\n * @param {T | undefined} prev The previous value (can be undefined if accessed out of array bounds).\n * @param {T} next The next value.\n * @returns {T} The merged result based on the rules above.\n */\nexport function mergeIfObject<T>(prev: T, next: T): T {\n if (typeof prev !== typeof next) return next;\n if (typeof prev !== 'object' || typeof next !== 'object') return next;\n if (prev === null || next === null) return next;\n if (Array.isArray(prev) && Array.isArray(next)) return mergeArray(prev, next);\n if (Array.isArray(prev) || Array.isArray(next)) return next;\n\n return { ...prev, ...next };\n}\n\n/**\n * Generates a unique ID using crypto.randomUUID if available,\n * otherwise falls back to a non-secure random string.\n * @returns {string}\n */\nexport function generateID() {\n if (globalThis.crypto?.randomUUID) {\n return globalThis.crypto.randomUUID();\n }\n return Math.random().toString(36).substring(2);\n}\n","import {\n computed,\n isSignal,\n signal,\n untracked,\n type CreateSignalOptions,\n type Signal,\n type ValueEqualityFn,\n type WritableSignal,\n} from '@angular/core';\nimport { type DerivedSignal } from '@mmstack/primitives';\nimport { generateID } from './util';\n\n/**\n * Represents the type of a form control.\n * - `control`: A single form control (e.g., an input field).\n * - `array`: An array of form controls (like Angular's `FormArray`).\n * - `group`: A group of form controls (like Angular's `FormGroup`).\n */\nexport type ControlType = 'control' | 'array' | 'group';\n\n/**\n * Represents a reactive form control. It holds the value, validation status, and other\n * metadata for a form field. This is the core building block for creating reactive forms\n * with signals.\n *\n * @typeParam T - The type of the form control's value.\n * @typeParam TParent - The type of the parent form control's value (if this control is part of a group or array). Defaults to `undefined`.\n * @typeParam TControlType - The type of the control ('control', 'array', or 'group'). Defaults to 'control'.\n * @typeParam TPartialValue - The type of the partial value, used for patching.\n */\nexport type FormControlSignal<\n T,\n TParent = undefined,\n TControlType extends ControlType = 'control',\n TPartialValue = T | undefined,\n> = {\n /** A unique identifier for the control. Used for tracking in `@for` loops. */\n id: string;\n /** The main value signal for the control. */\n value: WritableSignal<T>;\n /** A signal indicating whether the control's value has been changed. */\n dirty: Signal<boolean>;\n /** A signal indicating whether the control has been interacted with (e.g., blurred). */\n touched: Signal<boolean>;\n /** A signal containing the current validation error message (empty string if valid). */\n error: Signal<string>;\n /** A signal indicating whether the control is pending */\n pending: Signal<boolean>;\n /** A signal indicating whether the control is disabled. */\n /** A signal indicating whether the control is in a valid state (without errors & not pending) */\n valid: Signal<boolean>;\n disabled: Signal<boolean>;\n /** A signal indicating whether the control is read-only. */\n readonly: Signal<boolean>;\n /** A signal indicating whether the control is required. */\n required: Signal<boolean>;\n /** A signal containing the label for the control. */\n label: Signal<string>;\n /** A signal containing the hint text for the control. */\n hint: Signal<string>;\n /** Marks the control as touched. */\n markAsTouched: () => void;\n /** Marks the control and all its child controls (if any) as touched. */\n markAllAsTouched: () => void;\n /** Marks the control as pristine (not touched). */\n markAsPristine: () => void;\n /** Marks the control and all its child controls (if any) as pristine. */\n markAllAsPristine: () => void;\n /**\n * Resets the control to a new value and sets a new initial value. This is intended for\n * scenarios where the underlying data is updated externally (e.g., data coming from\n * the server). If the control is not dirty, the value is updated. If the control *is*\n * dirty, the value is *not* updated (preserving user changes).\n */\n reconcile: (newValue: T) => void;\n /**\n * Similar to `reconcile`, but forces the update even if the control is dirty.\n */\n forceReconcile: (newValue: T) => void;\n /** Resets the control's value to its initial value. */\n reset: () => void;\n /** Resets the control's value and initial value. */\n resetWithInitial: (initial: T) => void;\n /**\n * The derivation function used to create this control if it's part of a `formGroup` or `formArray`.\n * @internal\n */\n from?: DerivedSignal<TParent, T>['from'];\n /** The equality function used to compare values. Defaults to `Object.is`. */\n equal: (a: T, b: T) => boolean;\n /** The type of the control ('control', 'array', or 'group'). */\n controlType: TControlType;\n /**\n * A signal representing the partial value of the control, suitable for patching data on a server.\n * It contains the changed value if `dirty` is `true`.\n */\n partialValue: Signal<TPartialValue>;\n};\n\nexport type CreateFormControlOptions<\n T,\n TControlType extends ControlType = ControlType,\n> = CreateSignalOptions<T> & {\n validator?: () => (value: T) => string;\n onTouched?: () => void;\n disable?: () => boolean;\n readonly?: () => boolean;\n required?: () => boolean;\n label?: () => string;\n id?: () => string;\n hint?: () => string;\n dirtyEquality?: ValueEqualityFn<T>;\n onReset?: () => void;\n controlType?: TControlType;\n overrideValidation?: () => string;\n pending?: () => boolean;\n};\n\n/**\n * Creates a `FormControlSignal`, a reactive form control that holds a value and tracks its\n * validity, dirty state, touched state, and other metadata.\n *\n * @typeParam T - The type of the form control's value.\n * @typeParam TParent - The type of the parent form control's value (if this control is part of a group or array).\n * @typeParam TControlType - The type of the control. Defaults to `'control'`.\n * @typeParam TPartialValue - The type of value when patching\n * @param initial - The initial value of the control, or a `DerivedSignal` if this control is part of a `formGroup` or `formArray`.\n * @param options - Optional configuration options for the control.\n * @returns A `FormControlSignal` instance.\n *\n * @example\n * // Create a simple form control:\n * const name = formControl('Initial Name');\n *\n * // Create a form control with validation:\n * const age = formControl(0, {\n * validator: () => (value) => value >= 18 ? '' : 'Must be at least 18',\n * });\n *\n * // Create a derived form control (equivalent to the above, but more explicit):\n * const user = signal({ name: 'John Doe', age: 30 });\n * const name = formControl(derived(user, {\n * from: (u) => u.name,\n * onChange: (newName) => user.update(u => ({...u, name: newName}))\n * }));\n *\n * // Create a form group with nested controls:\n * const user = signal({ name: 'John Doe', age: 30 });\n * const form = formGroup(user, {\n * name: formControl(derived(user, 'name')),\n * age: formControl(derived(user, 'age')),\n * })\n */\nexport function formControl<\n T,\n TParent = undefined,\n TControlType extends ControlType = 'control',\n TPartialValue = T | undefined,\n>(\n initial: DerivedSignal<TParent, T> | T,\n opt?: CreateFormControlOptions<T, TControlType>,\n): FormControlSignal<T, TParent, TControlType, TPartialValue> {\n const value = isSignal(initial) ? initial : signal(initial, opt);\n const initialValue = signal(untracked(value));\n const eq = opt?.equal ?? Object.is;\n\n const dirtyEq = opt?.dirtyEquality ?? eq;\n\n const disabled = computed(() => opt?.disable?.() ?? false);\n const readonly = computed(() => opt?.readonly?.() ?? false);\n\n const dirty = computed(() => !dirtyEq(value(), initialValue()));\n\n const touched = signal(false);\n\n const validator = computed(() => opt?.validator?.() ?? (() => ''));\n\n const error = computed(() => {\n if (opt?.overrideValidation) return opt.overrideValidation();\n if (disabled() || readonly()) return '';\n return validator()(value());\n });\n\n const markAsTouched = () => {\n touched.set(true);\n opt?.onTouched?.();\n };\n const markAllAsTouched = markAsTouched;\n\n const markAsPristine = () => touched.set(false);\n const markAllAsPristine = markAsPristine;\n\n const label = computed(() => opt?.label?.() ?? '');\n\n const partialValue = computed(() => (dirty() ? value() : undefined));\n\n const internalReconcile = (newValue: T, force = false) => {\n const isDirty = untracked(dirty);\n\n if (!isDirty || force) {\n // very dangerous use of untracked here, don't do this everywhere :)\n // thanks to u/synalx for the idea to use untracked here\n\n untracked(() => {\n initialValue.set(newValue);\n value.set(newValue);\n });\n }\n };\n\n const pending = computed(() => opt?.pending?.() ?? false);\n\n return {\n id: opt?.id?.() ?? generateID(),\n value,\n dirty,\n touched,\n error,\n label,\n required: computed(() => opt?.required?.() ?? false),\n disabled,\n readonly,\n pending,\n valid: computed(() => !pending() && !error()),\n hint: computed(() => opt?.hint?.() ?? ''),\n markAsTouched,\n markAllAsTouched,\n markAsPristine,\n markAllAsPristine,\n from: (isSignal(initial) ? initial.from : undefined) as FormControlSignal<\n T,\n TParent,\n TControlType\n >['from'],\n reconcile: (newValue: T) => internalReconcile(newValue),\n forceReconcile: (newValue: T) => internalReconcile(newValue, true),\n reset: () => {\n opt?.onReset?.();\n value.set(untracked(initialValue));\n },\n resetWithInitial: (initial: T) => {\n opt?.onReset?.();\n initialValue.set(initial);\n value.set(initial);\n },\n equal: eq,\n controlType: (opt?.controlType ?? 'control') as TControlType,\n partialValue: partialValue as Signal<TPartialValue>,\n };\n}\n","import {\n computed,\n linkedSignal,\n untracked,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport { derived, type DerivedSignal } from '@mmstack/primitives';\nimport {\n formControl,\n type CreateFormControlOptions,\n type FormControlSignal,\n} from './form-control';\nimport { type SignalValue } from './signal-value.type';\nimport { mergeArray } from './util';\n\nexport type FormArraySignal<\n T,\n TIndividualState extends FormControlSignal<\n T,\n any,\n any,\n any\n > = FormControlSignal<T, any, any, any>,\n TParent = undefined,\n> = FormControlSignal<\n T[],\n TParent,\n 'array',\n | Exclude<SignalValue<TIndividualState['partialValue']>, null | undefined>[]\n | undefined\n> & {\n ownError: Signal<string>;\n children: Signal<TIndividualState[]>;\n push: (value: T) => void; // add new control with value\n remove: (index: number) => void; // remove at index\n min: Signal<number>; // for display purposes\n max: Signal<number>; // for display purposes\n canAdd: Signal<boolean>; // disable add button if false\n canRemove: Signal<boolean>; // disable remove buttons if false\n};\n\nexport type CreateFormArraySignalOptions<\n T,\n TIndividualState extends FormControlSignal<T, any, any, any>,\n> = Omit<CreateFormControlOptions<T[]>, 'equal'> & {\n min?: () => number;\n max?: () => number;\n equal?: (a: T, b: T) => boolean;\n toPartialValue?: (\n v: T,\n ) => Exclude<SignalValue<TIndividualState['partialValue']>, null | undefined>;\n};\n\nfunction createReconcileChildren<\n T,\n TIndividualState extends FormControlSignal<T, any, any, any>,\n>(\n factory: (val: DerivedSignal<T[], T>, idx: number) => TIndividualState,\n opt: { equal: (a: T, b: T) => boolean },\n) {\n return (\n length: number,\n source: WritableSignal<T[]>,\n prev?: TIndividualState[],\n ): TIndividualState[] => {\n if (!prev) {\n const nextControls = [];\n\n for (let i = 0; i < length; i++) {\n nextControls.push(\n factory(derived(source, i, { equal: opt?.equal }), i),\n );\n }\n\n return nextControls;\n }\n\n if (length === prev.length) return prev;\n\n const next = [...prev];\n\n if (length < prev.length) {\n next.splice(length);\n } else if (length > prev.length) {\n for (let i = prev.length; i < length; i++) {\n next.push(factory(derived(source, i, { equal: opt?.equal }), i));\n }\n }\n\n return next;\n };\n}\n\nexport function formArray<\n T,\n TIndividualState extends FormControlSignal<\n T,\n any,\n any,\n any\n > = FormControlSignal<T, any, any, any>,\n TParent = undefined,\n>(\n initial: T[] | DerivedSignal<TParent, T[]>,\n factory: (val: DerivedSignal<T[], T>, idx: number) => TIndividualState,\n opt?: CreateFormArraySignalOptions<T, TIndividualState>,\n): FormArraySignal<T, TIndividualState, TParent> {\n const eq = opt?.equal ?? Object.is;\n\n const arrayEqual = (a: T[], b: T[]) => {\n if (a.length !== b.length) return false;\n if (!a.length) return true;\n\n return a.every((v, i) => eq(v, b[i]));\n };\n\n const min = computed(() => opt?.min?.() ?? 0);\n const max = computed(() => opt?.max?.() ?? Number.MAX_SAFE_INTEGER);\n\n const arrayOptions: CreateFormControlOptions<T[], 'array'> = {\n ...opt,\n equal: arrayEqual,\n dirtyEquality: (a, b) => a.length === b.length,\n controlType: 'array',\n };\n\n const ctrl = formControl<T[], TParent, 'array'>(\n initial,\n arrayOptions,\n ) satisfies FormControlSignal<T[], TParent, 'array'>;\n\n const length = computed(() => ctrl.value().length);\n\n const reconcileChildren = createReconcileChildren<T, TIndividualState>(\n factory,\n { equal: eq },\n );\n\n // linkedSignal used to re-use previous value so that only length changes are affected and existing controls are kept, but updated\n const children = linkedSignal<number, TIndividualState[]>({\n source: () => length(),\n computation: (len, prev) => reconcileChildren(len, ctrl.value, prev?.value),\n });\n\n const ownError = computed(() => ctrl.error());\n\n const error = computed((): string => {\n const own = ownError();\n if (own) return own;\n if (!children().length) return '';\n return children()\n .map((c, idx) => (c.error() ? `${idx}: ${c.error()}` : ''))\n .filter(Boolean)\n .join('\\n');\n });\n\n const dirty = computed(() => {\n if (ctrl.dirty()) return true;\n if (!children().length) return false;\n return children().some((c) => c.dirty());\n });\n\n const markAllAsTouched = () => {\n ctrl.markAllAsTouched();\n for (const c of untracked(children)) {\n c.markAllAsTouched();\n }\n };\n const markAllAsPristine = () => {\n ctrl.markAllAsPristine();\n for (const c of untracked(children)) {\n c.markAllAsPristine();\n }\n };\n\n const toPartialValue = opt?.toPartialValue ?? ((v: T) => v);\n const partialValue = computed(() => {\n if (!dirty()) return undefined;\n return children().map((c) => {\n const pv = c.partialValue();\n if (pv) return pv;\n if (c.controlType === 'control') return undefined;\n\n // return full value for child objects/arrays as this cannot be partially patched without idx\n return toPartialValue(c.value());\n });\n });\n\n const touched = computed(\n () =>\n ctrl.touched() ||\n !!(children().length && children().some((c) => c.touched())),\n );\n\n const reconcile = (newValue: T[]) => {\n const ctrls = untracked(children);\n\n for (let i = 0; i < newValue.length; i++) {\n ctrls.at(i)?.reconcile(newValue[i]); // reconcile existing controls that are relevant addition/removal will be handled after ctrl.reconcile through linkedSignal\n }\n\n ctrl.reconcile(mergeArray(newValue, untracked(ctrl.value)));\n };\n\n const forceReconcile = (newValue: T[]) => {\n const ctrls = untracked(children);\n\n for (let i = 0; i < newValue.length; i++) {\n ctrls.at(i)?.forceReconcile(newValue[i]);\n }\n\n ctrl.forceReconcile(newValue);\n };\n\n const childrenValid = computed(() => {\n if (!children().length) return true;\n return children().every((d) => d.valid());\n });\n\n const childrenPending = computed(\n () => !!children().length && children().some((d) => d.pending()),\n );\n\n return {\n ...ctrl,\n ownError,\n error,\n valid: computed(() => ctrl.valid() && childrenValid()),\n pending: computed(() => ctrl.pending() || childrenPending()),\n touched,\n children,\n dirty,\n markAllAsTouched,\n markAllAsPristine,\n min,\n max,\n partialValue,\n canAdd: computed(\n () => !ctrl.disabled() && !ctrl.readonly() && length() < max(),\n ),\n canRemove: computed(\n () => !ctrl.disabled() && !ctrl.readonly() && length() > min(),\n ),\n reconcile,\n forceReconcile,\n reset: () => {\n for (const c of untracked(children)) {\n c.reset();\n }\n ctrl.reset();\n },\n resetWithInitial: (initial: T[]) => {\n const ctrls = untracked(children);\n for (let i = 0; i < initial.length; i++) {\n ctrls.at(i)?.resetWithInitial(initial[i]);\n }\n ctrl.resetWithInitial(initial);\n },\n push: (next) => ctrl.value.update((cur) => [...cur, next]),\n remove: (idx) =>\n ctrl.value.update((cur) => cur.filter((_, i) => i !== idx)),\n };\n}\n","import {\n computed,\n isSignal,\n signal,\n untracked,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport {\n isDerivation,\n toFakeSignalDerivation,\n type DerivedSignal,\n} from '@mmstack/primitives';\nimport {\n formControl,\n type CreateFormControlOptions,\n type FormControlSignal,\n} from './form-control';\nimport { type SignalValue } from './signal-value.type';\nimport { mergeIfObject } from './util';\n\n/**\n * Extracts the partial value types from a record of `FormControlSignal` instances.\n * This is used to construct the `partialValue` type for `FormGroupSignal`.\n * @internal\n */\ntype DerivationPartialValues<\n TDerivations extends Record<string, FormControlSignal<any, any, any, any>>,\n> = {\n [K in keyof TDerivations]: Exclude<\n SignalValue<TDerivations[K]['partialValue']>,\n undefined\n >;\n};\n\n/**\n * Represents a group of form controls, similar to Angular's `FormGroup`. It aggregates\n * the values and states of its child controls into a single object.\n *\n * @typeParam T - The type of the form group's value (an object).\n * @typeParam TDerivations - A record where keys are the names of the child controls and values are the `FormControlSignal` instances.\n * @typeParam TParent - The type of the parent form control's value (if this group is nested).\n */\nexport type FormGroupSignal<\n T,\n TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\n TParent = undefined,\n> = FormControlSignal<\n T,\n TParent,\n 'group',\n Partial<DerivationPartialValues<TDerivations>>\n> & {\n /**\n * A signal that holds a record of the child form controls. The keys are the names\n * of the controls, and the values are the `FormControlSignal` instances.\n */\n children: Signal<TDerivations>;\n /**\n * A signal that holds the validation error message of the group itself (excluding child errors).\n */\n ownError: Signal<string>;\n};\n\n/**\n * Options for creating a `FormGroupSignal`. Extends `CreateFormControlOptions`.\n */\nexport type CreateFormGroupOptions<\n T,\n TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\n> = CreateFormControlOptions<T, 'group'> & {\n /**\n * An optional function to create a base object for the `partialValue` signal.\n * This can be used to pre-populate the partial value with default values or\n * to perform custom logic before merging in the partial values from child controls.\n */\n createBasePartialValue?: (\n value: T,\n ) => Partial<DerivationPartialValues<TDerivations>>;\n};\n\n/**\n * Creates a `FormGroupSignal`, which aggregates a set of child form controls into a single object.\n *\n * @typeParam T - The type of the form group's value (an object).\n * @typeParam TDerivations - A record where keys are the names of the child controls and values are the `FormControlSignal` instances.\n * @typeParam TParent - The type of the parent form control's value (if this group is nested within another group or array).\n * @param initial - The initial value of the form group (or a `WritableSignal` or `DerivedSignal` if the group is nested).\n * @param providedChildren - An object containing the child `FormControlSignal` instances, or a function that returns such an object.\n * Using a function allows for dynamic creation of child controls (e.g., in response to changes in other signals).\n * @param options - Optional configuration options for the form group.\n * @returns A `FormGroupSignal` instance.\n *\n * @example\n * // Create a simple form group:\n * const user = signal({ name: 'John Doe', age: 30 });\n * const form = formGroup(user, {\n * name: formControl(derived(user, 'name')),\n * age: formControl(derived(user, 'age')),\n * })\n *\n * // Create a nested form group:\n * const user = signal({ name: 'John', age: 30, address: {street: \"Some street\"} });\n *\n * const address = derived(user, 'address');\n * const userForm = formGroup(user, {\n * name: formControl(derived(user, 'name')),\n * age: formControl(derived(user, 'age')),\n * address: formGroup(address, {\n * street: formControl(derived(address, (address) => address.street), {\n * validator: () => (value) => value ? \"\" : \"required!\"\n * }) // you can create deeply nested structures.\n * })\n * });\n *\n * // Create a form group with dynamically created children replaced rare FormRecord requirements.\n * const showAddress = signal(false);\n * type Characteristic = {\n * valueType: 'string';\n * value: string;\n * } | {\n * valueType: 'number';\n * value: number;\n * }\n * const char = signal<Characteristic>({ valueType: 'string', value: '' });\n * const charForm = formGroup(char, () => {\n * if (char().valueType === 'string) return createStringControl(char);\n * return createNumberControl(char);\n * });\n *\n */\nexport function formGroup<\n T,\n TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\n TParent = undefined,\n>(\n initial: DerivedSignal<TParent, T> | T | WritableSignal<T>,\n providedChildren: (() => TDerivations) | TDerivations,\n opt?: CreateFormGroupOptions<T, TDerivations>,\n): FormGroupSignal<T, TDerivations, TParent> {\n const valueSignal = isSignal(initial) ? initial : signal(initial);\n // we fake a derivation if not present, so that .from is present on the signal\n const value = isDerivation<TParent, T>(valueSignal)\n ? valueSignal\n : toFakeSignalDerivation<TParent, T>(valueSignal);\n\n // we allow for a function/signal to be passed, this case should only be used if the child controls change dependent upon something, say if a formControl is flipped into a formGroup.\n const children =\n typeof providedChildren === 'function'\n ? computed(() => providedChildren())\n : computed(() => providedChildren);\n\n // array allows for easier handling\n const derivationsArray = computed(() => Object.values(children()));\n\n const childrenDirty = computed(\n () =>\n !!derivationsArray().length && derivationsArray().some((d) => d.dirty()),\n );\n\n // by default dont compare object references, just use childrenDirtySignal\n const baseDirtyEq = opt?.dirtyEquality ?? opt?.equal ?? (() => true);\n\n // function which calls a signal becomes a signal\n const dirtyEquality = (a: T, b: T) => {\n return baseDirtyEq(a, b) && !childrenDirty();\n };\n\n // group control\n const ctrl = formControl<T, TParent, 'group'>(value, {\n ...opt,\n dirtyEquality,\n controlType: 'group',\n readonly: () => {\n // readonly if is readonly or all children are readonly\n if (opt?.readonly?.()) return true;\n return (\n !!derivationsArray().length &&\n derivationsArray().every((d) => d.readonly())\n );\n },\n disable: () => {\n if (opt?.disable?.()) return true;\n return (\n !!derivationsArray().length &&\n derivationsArray().every((d) => d.disabled())\n );\n },\n }) satisfies FormControlSignal<T, TParent, 'group'>;\n\n const childrenTouched = computed(\n () =>\n !!derivationsArray().length &&\n derivationsArray().some((d) => d.touched()),\n );\n\n const touched = computed(() => ctrl.touched() || childrenTouched());\n\n const childError = computed(() => {\n if (!derivationsArray().length) return '';\n return derivationsArray()\n .map((d) => (d.error() ? `${d.label()}: ${d.error()}` : ''))\n .filter(Boolean)\n .join('\\n');\n });\n\n const error = computed(() => {\n const ownError = ctrl.error();\n if (ownError) return ownError;\n return childError() ? 'INVALID' : '';\n });\n\n const markAllAsTouched = () => {\n ctrl.markAllAsTouched();\n for (const ctrl of untracked(derivationsArray)) {\n ctrl.markAllAsTouched();\n }\n };\n\n const markAllAsPristine = () => {\n ctrl.markAllAsPristine();\n for (const ctrl of untracked(derivationsArray)) {\n ctrl.markAllAsPristine();\n }\n };\n\n const reconcile = (newValue: T) => {\n // set the children values based on the derivation of the new value\n for (const ctrl of untracked(derivationsArray)) {\n const from = ctrl.from;\n if (!from) continue;\n ctrl.reconcile(from(newValue));\n }\n ctrl.reconcile(mergeIfObject(newValue, untracked(value)));\n };\n\n const forceReconcile = (newValue: T) => {\n for (const ctrl of untracked(derivationsArray)) {\n const from = ctrl.from;\n if (!from) continue;\n ctrl.forceReconcile(from(newValue));\n }\n ctrl.forceReconcile(newValue);\n };\n\n const createBaseValueFn = opt?.createBasePartialValue;\n\n const basePartialValue: Signal<\n Partial<DerivationPartialValues<TDerivations>>\n > = createBaseValueFn\n ? computed(() => createBaseValueFn(ctrl.value()))\n : computed(() => ({}));\n\n const partialValue = computed(() => {\n const obj: Partial<DerivationPartialValues<TDerivations>> = {\n ...basePartialValue(),\n };\n\n if (!ctrl.dirty()) return obj;\n\n for (const [key, ctrl] of Object.entries(children())) {\n const pv = ctrl.partialValue();\n\n if (pv === undefined) continue;\n (obj as Record<PropertyKey, any>)[key] = pv;\n }\n\n return obj;\n });\n\n const childrenValid = computed(() => {\n if (!derivationsArray().length) return true;\n return derivationsArray().every((d) => d.valid());\n });\n\n const childrenPending = computed(\n () =>\n !!derivationsArray().length &&\n derivationsArray().some((d) => d.pending()),\n );\n\n return {\n ...ctrl,\n children,\n partialValue,\n reconcile,\n forceReconcile,\n ownError: ctrl.error,\n touched,\n error,\n valid: computed(() => ctrl.valid() && childrenValid()),\n pending: computed(() => ctrl.pending() || childrenPending()),\n markAllAsPristine,\n markAllAsTouched,\n reset: () => {\n for (const ctrl of untracked(derivationsArray)) {\n ctrl.reset();\n }\n ctrl.reset();\n },\n resetWithInitial: (initial: T) => {\n for (const ctrl of untracked(derivationsArray)) {\n const from = ctrl.from;\n if (from) ctrl.resetWithInitial(from(initial));\n else ctrl.reset();\n }\n ctrl.resetWithInitial(initial);\n },\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmstack/form-core",
3
- "version": "21.0.2",
3
+ "version": "22.0.0",
4
4
  "keywords": [
5
5
  "angular",
6
6
  "signals",
@@ -20,11 +20,11 @@
20
20
  },
21
21
  "homepage": "https://github.com/mihajm/mmstack/blob/master/packages/form/core",
22
22
  "dependencies": {
23
- "@mmstack/primitives": "^21.0.0",
23
+ "@mmstack/primitives": "^22.0.0",
24
24
  "tslib": "^2.3.0"
25
25
  },
26
26
  "peerDependencies": {
27
- "@angular/core": ">=21 <22"
27
+ "@angular/core": ">=22 <23"
28
28
  },
29
29
  "sideEffects": false,
30
30
  "module": "fesm2022/mmstack-form-core.mjs",