{"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":["/**\r\n * Merges two arrays element by element using the `mergeIfObject` logic.\r\n *\r\n * The resulting array will have the same length as the `next` array.\r\n * For each index `i`, the element in the resulting array is determined by:\r\n * `mergeIfObject(prev[i], next[i])`.\r\n * If `prev` is shorter than `next`, `prev[i]` will be `undefined` for the out-of-bounds indices.\r\n *\r\n * @template {any[]} T The array type being merged.\r\n * @param {T} prev The previous array.\r\n * @param {T} next The next array.\r\n * @returns {T} A new array containing the merged elements.\r\n * @example\r\n * const prev = [1, { id: 1, name: \"A\" }, [10],        \"extraPrev\"];\r\n * const next = [2, { id: 1, status: \"B\" }, [20, 21],  missing  , { id: 2 }];\r\n *\r\n * mergeArray(prev, next);\r\n * // Result approx:\r\n * // [\r\n * //   2,                               // Primitive replaced\r\n * //   { id: 1, name: \"A\", status: \"B\" }, // Objects shallow-merged\r\n * //   [20, 21],                          // Arrays replaced (via mergeIfObject -> mergeArray)\r\n * //   undefined,                         // Primitive replaced by missing item in sparse 'next' array\r\n * //   { id: 2 }                          // Added from 'next' (prev[4] was undefined)\r\n * // ]\r\n */\r\nexport function mergeArray<T extends any[]>(prev: T, next: T): T {\r\n  return next.map((item, index): T[number] =>\r\n    mergeIfObject<T[number]>(prev[index], item),\r\n  ) as T;\r\n}\r\n\r\n/**\r\n * Merges two values (`prev`, `next`), prioritizing `next` in most cases.\r\n *\r\n * Behavior:\r\n * - If both `prev` and `next` are non-null, non-array objects, it performs a **shallow merge**\r\n * (`{ ...prev, ...next }`), where properties from `next` overwrite those in `prev`.\r\n * - If both `prev` and `next` are arrays, it delegates to `mergeArray` for element-wise merging.\r\n * - In all other scenarios (type mismatch, primitives, null involved, array mixed with object),\r\n * it simply returns the `next` value.\r\n *\r\n * @template T The type of the values being merged.\r\n * @param {T | undefined} prev The previous value (can be undefined if accessed out of array bounds).\r\n * @param {T} next The next value.\r\n * @returns {T} The merged result based on the rules above.\r\n */\r\nexport function mergeIfObject<T>(prev: T, next: T): T {\r\n  if (typeof prev !== typeof next) return next;\r\n  if (typeof prev !== 'object' || typeof next !== 'object') return next;\r\n  if (prev === null || next === null) return next;\r\n  if (Array.isArray(prev) && Array.isArray(next)) return mergeArray(prev, next);\r\n  if (Array.isArray(prev) || Array.isArray(next)) return next;\r\n\r\n  return { ...prev, ...next };\r\n}\r\n\r\n/**\r\n * Generates a unique ID using crypto.randomUUID if available,\r\n * otherwise falls back to a non-secure random string.\r\n * @returns {string}\r\n */\r\nexport function generateID() {\r\n  if (globalThis.crypto?.randomUUID) {\r\n    return globalThis.crypto.randomUUID();\r\n  }\r\n  return Math.random().toString(36).substring(2);\r\n}\r\n","import {\r\n  computed,\r\n  isSignal,\r\n  signal,\r\n  untracked,\r\n  type CreateSignalOptions,\r\n  type Signal,\r\n  type ValueEqualityFn,\r\n  type WritableSignal,\r\n} from '@angular/core';\r\nimport { type DerivedSignal } from '@mmstack/primitives';\r\nimport { generateID } from './util';\r\n\r\n/**\r\n * Represents the type of a form control.\r\n * - `control`: A single form control (e.g., an input field).\r\n * - `array`: An array of form controls (like Angular's `FormArray`).\r\n * - `group`: A group of form controls (like Angular's `FormGroup`).\r\n */\r\nexport type ControlType = 'control' | 'array' | 'group';\r\n\r\n/**\r\n * Represents a reactive form control.  It holds the value, validation status, and other\r\n * metadata for a form field.  This is the core building block for creating reactive forms\r\n * with signals.\r\n *\r\n * @typeParam T - The type of the form control's value.\r\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`.\r\n * @typeParam TControlType - The type of the control ('control', 'array', or 'group'). Defaults to 'control'.\r\n * @typeParam TPartialValue -  The type of the partial value, used for patching.\r\n */\r\nexport type FormControlSignal<\r\n  T,\r\n  TParent = undefined,\r\n  TControlType extends ControlType = 'control',\r\n  TPartialValue = T | undefined,\r\n> = {\r\n  /** A unique identifier for the control. Used for tracking in `@for` loops. */\r\n  id: string;\r\n  /** The main value signal for the control. */\r\n  value: WritableSignal<T>;\r\n  /** A signal indicating whether the control's value has been changed. */\r\n  dirty: Signal<boolean>;\r\n  /** A signal indicating whether the control has been interacted with (e.g., blurred). */\r\n  touched: Signal<boolean>;\r\n  /** A signal containing the current validation error message (empty string if valid). */\r\n  error: Signal<string>;\r\n  /** A signal indicating whether the control is pending */\r\n  pending: Signal<boolean>;\r\n  /** A signal indicating whether the control is disabled. */\r\n  /** A signal indicating whether the control is in a valid state (without errors & not pending) */\r\n  valid: Signal<boolean>;\r\n  disabled: Signal<boolean>;\r\n  /** A signal indicating whether the control is read-only. */\r\n  readonly: Signal<boolean>;\r\n  /** A signal indicating whether the control is required. */\r\n  required: Signal<boolean>;\r\n  /** A signal containing the label for the control. */\r\n  label: Signal<string>;\r\n  /** A signal containing the hint text for the control. */\r\n  hint: Signal<string>;\r\n  /** Marks the control as touched. */\r\n  markAsTouched: () => void;\r\n  /** Marks the control and all its child controls (if any) as touched. */\r\n  markAllAsTouched: () => void;\r\n  /** Marks the control as pristine (not touched). */\r\n  markAsPristine: () => void;\r\n  /** Marks the control and all its child controls (if any) as pristine. */\r\n  markAllAsPristine: () => void;\r\n  /**\r\n   * Resets the control to a new value and sets a new initial value. This is intended for\r\n   * scenarios where the underlying data is updated externally (e.g., data coming from\r\n   * the server).  If the control is not dirty, the value is updated. If the control *is*\r\n   * dirty, the value is *not* updated (preserving user changes).\r\n   */\r\n  reconcile: (newValue: T) => void;\r\n  /**\r\n   * Similar to `reconcile`, but forces the update even if the control is dirty.\r\n   */\r\n  forceReconcile: (newValue: T) => void;\r\n  /** Resets the control's value to its initial value. */\r\n  reset: () => void;\r\n  /** Resets the control's value and initial value. */\r\n  resetWithInitial: (initial: T) => void;\r\n  /**\r\n   * The derivation function used to create this control if it's part of a `formGroup` or `formArray`.\r\n   * @internal\r\n   */\r\n  from?: DerivedSignal<TParent, T>['from'];\r\n  /** The equality function used to compare values. Defaults to `Object.is`. */\r\n  equal: (a: T, b: T) => boolean;\r\n  /** The type of the control ('control', 'array', or 'group'). */\r\n  controlType: TControlType;\r\n  /**\r\n   * A signal representing the partial value of the control, suitable for patching data on a server.\r\n   * It contains the changed value if `dirty` is `true`.\r\n   */\r\n  partialValue: Signal<TPartialValue>;\r\n};\r\n\r\nexport type CreateFormControlOptions<\r\n  T,\r\n  TControlType extends ControlType = ControlType,\r\n> = CreateSignalOptions<T> & {\r\n  validator?: () => (value: T) => string;\r\n  onTouched?: () => void;\r\n  disable?: () => boolean;\r\n  readonly?: () => boolean;\r\n  required?: () => boolean;\r\n  label?: () => string;\r\n  id?: () => string;\r\n  hint?: () => string;\r\n  dirtyEquality?: ValueEqualityFn<T>;\r\n  onReset?: () => void;\r\n  controlType?: TControlType;\r\n  overrideValidation?: () => string;\r\n  pending?: () => boolean;\r\n};\r\n\r\n/**\r\n * Creates a `FormControlSignal`, a reactive form control that holds a value and tracks its\r\n * validity, dirty state, touched state, and other metadata.\r\n *\r\n * @typeParam T - The type of the form control's value.\r\n * @typeParam TParent - The type of the parent form control's value (if this control is part of a group or array).\r\n * @typeParam TControlType - The type of the control. Defaults to `'control'`.\r\n * @typeParam TPartialValue - The type of value when patching\r\n * @param initial - The initial value of the control, or a `DerivedSignal` if this control is part of a `formGroup` or `formArray`.\r\n * @param options - Optional configuration options for the control.\r\n * @returns A `FormControlSignal` instance.\r\n *\r\n * @example\r\n * // Create a simple form control:\r\n * const name = formControl('Initial Name');\r\n *\r\n * // Create a form control with validation:\r\n * const age = formControl(0, {\r\n *   validator: () => (value) => value >= 18 ? '' : 'Must be at least 18',\r\n * });\r\n *\r\n * // Create a derived form control (equivalent to the above, but more explicit):\r\n *  const user = signal({ name: 'John Doe', age: 30 });\r\n *  const name = formControl(derived(user, {\r\n *    from: (u) => u.name,\r\n *    onChange: (newName) => user.update(u => ({...u, name: newName}))\r\n *  }));\r\n *\r\n * // Create a form group with nested controls:\r\n * const user = signal({ name: 'John Doe', age: 30 });\r\n * const form = formGroup(user, {\r\n *  name: formControl(derived(user, 'name')),\r\n *  age: formControl(derived(user, 'age')),\r\n * })\r\n */\r\nexport function formControl<\r\n  T,\r\n  TParent = undefined,\r\n  TControlType extends ControlType = 'control',\r\n  TPartialValue = T | undefined,\r\n>(\r\n  initial: DerivedSignal<TParent, T> | T,\r\n  opt?: CreateFormControlOptions<T, TControlType>,\r\n): FormControlSignal<T, TParent, TControlType, TPartialValue> {\r\n  const value = isSignal(initial) ? initial : signal(initial, opt);\r\n  const initialValue = signal(untracked(value));\r\n  const eq = opt?.equal ?? Object.is;\r\n\r\n  const dirtyEq = opt?.dirtyEquality ?? eq;\r\n\r\n  const disabled = computed(() => opt?.disable?.() ?? false);\r\n  const readonly = computed(() => opt?.readonly?.() ?? false);\r\n\r\n  const dirty = computed(() => !dirtyEq(value(), initialValue()));\r\n\r\n  const touched = signal(false);\r\n\r\n  const validator = computed(() => opt?.validator?.() ?? (() => ''));\r\n\r\n  const error = computed(() => {\r\n    if (opt?.overrideValidation) return opt.overrideValidation();\r\n    if (disabled() || readonly()) return '';\r\n    return validator()(value());\r\n  });\r\n\r\n  const markAsTouched = () => {\r\n    touched.set(true);\r\n    opt?.onTouched?.();\r\n  };\r\n  const markAllAsTouched = markAsTouched;\r\n\r\n  const markAsPristine = () => touched.set(false);\r\n  const markAllAsPristine = markAsPristine;\r\n\r\n  const label = computed(() => opt?.label?.() ?? '');\r\n\r\n  const partialValue = computed(() => (dirty() ? value() : undefined));\r\n\r\n  const internalReconcile = (newValue: T, force = false) => {\r\n    const isDirty = untracked(dirty);\r\n\r\n    if (!isDirty || force) {\r\n      // very dangerous use of untracked here, don't do this everywhere :)\r\n      // thanks to  u/synalx for the idea to use untracked here\r\n\r\n      untracked(() => {\r\n        initialValue.set(newValue);\r\n        value.set(newValue);\r\n      });\r\n    }\r\n  };\r\n\r\n  const pending = computed(() => opt?.pending?.() ?? false);\r\n\r\n  return {\r\n    id: opt?.id?.() ?? generateID(),\r\n    value,\r\n    dirty,\r\n    touched,\r\n    error,\r\n    label,\r\n    required: computed(() => opt?.required?.() ?? false),\r\n    disabled,\r\n    readonly,\r\n    pending,\r\n    valid: computed(() => !pending() && !error()),\r\n    hint: computed(() => opt?.hint?.() ?? ''),\r\n    markAsTouched,\r\n    markAllAsTouched,\r\n    markAsPristine,\r\n    markAllAsPristine,\r\n    from: (isSignal(initial) ? initial.from : undefined) as FormControlSignal<\r\n      T,\r\n      TParent,\r\n      TControlType\r\n    >['from'],\r\n    reconcile: (newValue: T) => internalReconcile(newValue),\r\n    forceReconcile: (newValue: T) => internalReconcile(newValue, true),\r\n    reset: () => {\r\n      opt?.onReset?.();\r\n      value.set(untracked(initialValue));\r\n    },\r\n    resetWithInitial: (initial: T) => {\r\n      opt?.onReset?.();\r\n      initialValue.set(initial);\r\n      value.set(initial);\r\n    },\r\n    equal: eq,\r\n    controlType: (opt?.controlType ?? 'control') as TControlType,\r\n    partialValue: partialValue as Signal<TPartialValue>,\r\n  };\r\n}\r\n","import {\r\n  computed,\r\n  linkedSignal,\r\n  untracked,\r\n  type Signal,\r\n  type WritableSignal,\r\n} from '@angular/core';\r\nimport { derived, type DerivedSignal } from '@mmstack/primitives';\r\nimport {\r\n  formControl,\r\n  type CreateFormControlOptions,\r\n  type FormControlSignal,\r\n} from './form-control';\r\nimport { type SignalValue } from './signal-value.type';\r\nimport { mergeArray } from './util';\r\n\r\nexport type FormArraySignal<\r\n  T,\r\n  TIndividualState extends FormControlSignal<\r\n    T,\r\n    any,\r\n    any,\r\n    any\r\n  > = FormControlSignal<T, any, any, any>,\r\n  TParent = undefined,\r\n> = FormControlSignal<\r\n  T[],\r\n  TParent,\r\n  'array',\r\n  | Exclude<SignalValue<TIndividualState['partialValue']>, null | undefined>[]\r\n  | undefined\r\n> & {\r\n  ownError: Signal<string>;\r\n  children: Signal<TIndividualState[]>;\r\n  push: (value: T) => void; // add new control with value\r\n  remove: (index: number) => void; // remove at index\r\n  min: Signal<number>; // for display purposes\r\n  max: Signal<number>; // for display purposes\r\n  canAdd: Signal<boolean>; // disable add button if false\r\n  canRemove: Signal<boolean>; // disable remove buttons if false\r\n};\r\n\r\nexport type CreateFormArraySignalOptions<\r\n  T,\r\n  TIndividualState extends FormControlSignal<T, any, any, any>,\r\n> = Omit<CreateFormControlOptions<T[]>, 'equal'> & {\r\n  min?: () => number;\r\n  max?: () => number;\r\n  equal?: (a: T, b: T) => boolean;\r\n  toPartialValue?: (\r\n    v: T,\r\n  ) => Exclude<SignalValue<TIndividualState['partialValue']>, null | undefined>;\r\n};\r\n\r\nfunction createReconcileChildren<\r\n  T,\r\n  TIndividualState extends FormControlSignal<T, any, any, any>,\r\n>(\r\n  factory: (val: DerivedSignal<T[], T>, idx: number) => TIndividualState,\r\n  opt: { equal: (a: T, b: T) => boolean },\r\n) {\r\n  return (\r\n    length: number,\r\n    source: WritableSignal<T[]>,\r\n    prev?: TIndividualState[],\r\n  ): TIndividualState[] => {\r\n    if (!prev) {\r\n      const nextControls = [];\r\n\r\n      for (let i = 0; i < length; i++) {\r\n        nextControls.push(\r\n          factory(derived(source, i, { equal: opt?.equal }), i),\r\n        );\r\n      }\r\n\r\n      return nextControls;\r\n    }\r\n\r\n    if (length === prev.length) return prev;\r\n\r\n    const next = [...prev];\r\n\r\n    if (length < prev.length) {\r\n      next.splice(length);\r\n    } else if (length > prev.length) {\r\n      for (let i = prev.length; i < length; i++) {\r\n        next.push(factory(derived(source, i, { equal: opt?.equal }), i));\r\n      }\r\n    }\r\n\r\n    return next;\r\n  };\r\n}\r\n\r\nexport function formArray<\r\n  T,\r\n  TIndividualState extends FormControlSignal<\r\n    T,\r\n    any,\r\n    any,\r\n    any\r\n  > = FormControlSignal<T, any, any, any>,\r\n  TParent = undefined,\r\n>(\r\n  initial: T[] | DerivedSignal<TParent, T[]>,\r\n  factory: (val: DerivedSignal<T[], T>, idx: number) => TIndividualState,\r\n  opt?: CreateFormArraySignalOptions<T, TIndividualState>,\r\n): FormArraySignal<T, TIndividualState, TParent> {\r\n  const eq = opt?.equal ?? Object.is;\r\n\r\n  const arrayEqual = (a: T[], b: T[]) => {\r\n    if (a.length !== b.length) return false;\r\n    if (!a.length) return true;\r\n\r\n    return a.every((v, i) => eq(v, b[i]));\r\n  };\r\n\r\n  const min = computed(() => opt?.min?.() ?? 0);\r\n  const max = computed(() => opt?.max?.() ?? Number.MAX_SAFE_INTEGER);\r\n\r\n  const arrayOptions: CreateFormControlOptions<T[], 'array'> = {\r\n    ...opt,\r\n    equal: arrayEqual,\r\n    dirtyEquality: (a, b) => a.length === b.length,\r\n    controlType: 'array',\r\n  };\r\n\r\n  const ctrl = formControl<T[], TParent, 'array'>(\r\n    initial,\r\n    arrayOptions,\r\n  ) satisfies FormControlSignal<T[], TParent, 'array'>;\r\n\r\n  const length = computed(() => ctrl.value().length);\r\n\r\n  const reconcileChildren = createReconcileChildren<T, TIndividualState>(\r\n    factory,\r\n    { equal: eq },\r\n  );\r\n\r\n  // linkedSignal used to re-use previous value so that only length changes are affected and existing controls are kept, but updated\r\n  const children = linkedSignal<number, TIndividualState[]>({\r\n    source: () => length(),\r\n    computation: (len, prev) => reconcileChildren(len, ctrl.value, prev?.value),\r\n  });\r\n\r\n  const ownError = computed(() => ctrl.error());\r\n\r\n  const error = computed((): string => {\r\n    const own = ownError();\r\n    if (own) return own;\r\n    if (!children().length) return '';\r\n    return children()\r\n      .map((c, idx) => (c.error() ? `${idx}: ${c.error()}` : ''))\r\n      .filter(Boolean)\r\n      .join('\\n');\r\n  });\r\n\r\n  const dirty = computed(() => {\r\n    if (ctrl.dirty()) return true;\r\n    if (!children().length) return false;\r\n    return children().some((c) => c.dirty());\r\n  });\r\n\r\n  const markAllAsTouched = () => {\r\n    ctrl.markAllAsTouched();\r\n    for (const c of untracked(children)) {\r\n      c.markAllAsTouched();\r\n    }\r\n  };\r\n  const markAllAsPristine = () => {\r\n    ctrl.markAllAsPristine();\r\n    for (const c of untracked(children)) {\r\n      c.markAllAsPristine();\r\n    }\r\n  };\r\n\r\n  const toPartialValue = opt?.toPartialValue ?? ((v: T) => v);\r\n  const partialValue = computed(() => {\r\n    if (!dirty()) return undefined;\r\n    return children().map((c) => {\r\n      const pv = c.partialValue();\r\n      if (pv) return pv;\r\n      if (c.controlType === 'control') return undefined;\r\n\r\n      // return full value for  child objects/arrays as this cannot be partially patched without idx\r\n      return toPartialValue(c.value());\r\n    });\r\n  });\r\n\r\n  const touched = computed(\r\n    () =>\r\n      ctrl.touched() ||\r\n      !!(children().length && children().some((c) => c.touched())),\r\n  );\r\n\r\n  const reconcile = (newValue: T[]) => {\r\n    const ctrls = untracked(children);\r\n\r\n    for (let i = 0; i < newValue.length; i++) {\r\n      ctrls.at(i)?.reconcile(newValue[i]); // reconcile existing controls that are relevant addition/removal will be handled after ctrl.reconcile through linkedSignal\r\n    }\r\n\r\n    ctrl.reconcile(mergeArray(newValue, untracked(ctrl.value)));\r\n  };\r\n\r\n  const forceReconcile = (newValue: T[]) => {\r\n    const ctrls = untracked(children);\r\n\r\n    for (let i = 0; i < newValue.length; i++) {\r\n      ctrls.at(i)?.forceReconcile(newValue[i]);\r\n    }\r\n\r\n    ctrl.forceReconcile(newValue);\r\n  };\r\n\r\n  const childrenValid = computed(() => {\r\n    if (!children().length) return true;\r\n    return children().every((d) => d.valid());\r\n  });\r\n\r\n  const childrenPending = computed(\r\n    () => !!children().length && children().some((d) => d.pending()),\r\n  );\r\n\r\n  return {\r\n    ...ctrl,\r\n    ownError,\r\n    error,\r\n    valid: computed(() => ctrl.valid() && childrenValid()),\r\n    pending: computed(() => ctrl.pending() || childrenPending()),\r\n    touched,\r\n    children,\r\n    dirty,\r\n    markAllAsTouched,\r\n    markAllAsPristine,\r\n    min,\r\n    max,\r\n    partialValue,\r\n    canAdd: computed(\r\n      () => !ctrl.disabled() && !ctrl.readonly() && length() < max(),\r\n    ),\r\n    canRemove: computed(\r\n      () => !ctrl.disabled() && !ctrl.readonly() && length() > min(),\r\n    ),\r\n    reconcile,\r\n    forceReconcile,\r\n    reset: () => {\r\n      for (const c of untracked(children)) {\r\n        c.reset();\r\n      }\r\n      ctrl.reset();\r\n    },\r\n    resetWithInitial: (initial: T[]) => {\r\n      const ctrls = untracked(children);\r\n      for (let i = 0; i < initial.length; i++) {\r\n        ctrls.at(i)?.resetWithInitial(initial[i]);\r\n      }\r\n      ctrl.resetWithInitial(initial);\r\n    },\r\n    push: (next) => ctrl.value.update((cur) => [...cur, next]),\r\n    remove: (idx) =>\r\n      ctrl.value.update((cur) => cur.filter((_, i) => i !== idx)),\r\n  };\r\n}\r\n","import {\r\n  computed,\r\n  isSignal,\r\n  signal,\r\n  untracked,\r\n  type Signal,\r\n  type WritableSignal,\r\n} from '@angular/core';\r\nimport {\r\n  isDerivation,\r\n  toFakeSignalDerivation,\r\n  type DerivedSignal,\r\n} from '@mmstack/primitives';\r\nimport {\r\n  formControl,\r\n  type CreateFormControlOptions,\r\n  type FormControlSignal,\r\n} from './form-control';\r\nimport { type SignalValue } from './signal-value.type';\r\nimport { mergeIfObject } from './util';\r\n\r\ntype AnyObject = Record<PropertyKey, any>;\r\n\r\n/**\r\n * Extracts the partial value types from a record of `FormControlSignal` instances.\r\n * This is used to construct the `partialValue` type for `FormGroupSignal`.\r\n * @internal\r\n */\r\ntype DerivationPartialValues<\r\n  TDerivations extends Record<string, FormControlSignal<any, any, any, any>>,\r\n> = {\r\n  [K in keyof TDerivations]: Exclude<\r\n    SignalValue<TDerivations[K]['partialValue']>,\r\n    undefined\r\n  >;\r\n};\r\n\r\n/**\r\n * Represents a group of form controls, similar to Angular's `FormGroup`.  It aggregates\r\n * the values and states of its child controls into a single object.\r\n *\r\n * @typeParam T - The type of the form group's value (an object).\r\n * @typeParam TDerivations - A record where keys are the names of the child controls and values are the `FormControlSignal` instances.\r\n * @typeParam TParent - The type of the parent form control's value (if this group is nested).\r\n */\r\nexport type FormGroupSignal<\r\n  T,\r\n  TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\r\n  TParent = undefined,\r\n> = FormControlSignal<\r\n  T,\r\n  TParent,\r\n  'group',\r\n  Partial<DerivationPartialValues<TDerivations>>\r\n> & {\r\n  /**\r\n   * A signal that holds a record of the child form controls.  The keys are the names\r\n   * of the controls, and the values are the `FormControlSignal` instances.\r\n   */\r\n  children: Signal<TDerivations>;\r\n  /**\r\n   * A signal that holds the validation error message of the group itself (excluding child errors).\r\n   */\r\n  ownError: Signal<string>;\r\n};\r\n\r\n/**\r\n * Options for creating a `FormGroupSignal`.  Extends `CreateFormControlOptions`.\r\n */\r\nexport type CreateFormGroupOptions<\r\n  T,\r\n  TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\r\n> = CreateFormControlOptions<T, 'group'> & {\r\n  /**\r\n   * An optional function to create a base object for the `partialValue` signal.\r\n   * This can be used to pre-populate the partial value with default values or\r\n   * to perform custom logic before merging in the partial values from child controls.\r\n   */\r\n  createBasePartialValue?: (\r\n    value: T,\r\n  ) => Partial<DerivationPartialValues<TDerivations>>;\r\n};\r\n\r\n/**\r\n * Creates a `FormGroupSignal`, which aggregates a set of child form controls into a single object.\r\n *\r\n * @typeParam T - The type of the form group's value (an object).\r\n * @typeParam TDerivations -  A record where keys are the names of the child controls and values are the `FormControlSignal` instances.\r\n * @typeParam TParent - The type of the parent form control's value (if this group is nested within another group or array).\r\n * @param initial - The initial value of the form group (or a `WritableSignal` or `DerivedSignal` if the group is nested).\r\n * @param providedChildren - An object containing the child `FormControlSignal` instances, or a function that returns such an object.\r\n *                        Using a function allows for dynamic creation of child controls (e.g., in response to changes in other signals).\r\n * @param options - Optional configuration options for the form group.\r\n * @returns A `FormGroupSignal` instance.\r\n *\r\n * @example\r\n * // Create a simple form group:\r\n *  const user = signal({ name: 'John Doe', age: 30 });\r\n *  const form = formGroup(user, {\r\n *  name: formControl(derived(user, 'name')),\r\n *  age: formControl(derived(user, 'age')),\r\n *  })\r\n *\r\n * // Create a nested form group:\r\n *  const user = signal({ name: 'John', age: 30, address: {street: \"Some street\"} });\r\n *\r\n * const address = derived(user, 'address');\r\n * const userForm = formGroup(user, {\r\n *   name: formControl(derived(user, 'name')),\r\n *   age: formControl(derived(user, 'age')),\r\n *   address: formGroup(address, {\r\n *       street: formControl(derived(address, (address) => address.street), {\r\n *           validator: () => (value) => value ? \"\" : \"required!\"\r\n *       }) // you can create deeply nested structures.\r\n *   })\r\n * });\r\n *\r\n * // Create a form group with dynamically created children replaced rare FormRecord requirements.\r\n * const showAddress = signal(false);\r\n * type Characteristic = {\r\n *  valueType: 'string';\r\n *  value: string;\r\n * } | {\r\n *  valueType: 'number';\r\n *  value: number;\r\n * }\r\n * const char = signal<Characteristic>({ valueType: 'string', value: '' });\r\n * const charForm = formGroup(char, () => {\r\n *  if (char().valueType === 'string) return createStringControl(char);\r\n *  return createNumberControl(char);\r\n * });\r\n *\r\n */\r\nexport function formGroup<\r\n  T,\r\n  TDerivations extends Record<string, FormControlSignal<any, T, any, any>>,\r\n  TParent = undefined,\r\n>(\r\n  initial: DerivedSignal<TParent, T> | T | WritableSignal<T>,\r\n  providedChildren: (() => TDerivations) | TDerivations,\r\n  opt?: CreateFormGroupOptions<T, TDerivations>,\r\n): FormGroupSignal<T, TDerivations, TParent> {\r\n  const valueSignal = isSignal(initial) ? initial : signal(initial);\r\n  // we fake a derivation if not present, so that .from is present on the signal\r\n  const value = isDerivation<TParent, T>(valueSignal)\r\n    ? valueSignal\r\n    : toFakeSignalDerivation<TParent, T>(valueSignal);\r\n\r\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.\r\n  const children =\r\n    typeof providedChildren === 'function'\r\n      ? computed(() => providedChildren())\r\n      : computed(() => providedChildren);\r\n\r\n  // array allows for easier handling\r\n  const derivationsArray = computed(() => Object.values(children()));\r\n\r\n  const childrenDirty = computed(\r\n    () =>\r\n      !!derivationsArray().length && derivationsArray().some((d) => d.dirty()),\r\n  );\r\n\r\n  // by default dont compare object references, just use childrenDirtySignal\r\n  const baseDirtyEq = opt?.dirtyEquality ?? opt?.equal ?? (() => true);\r\n\r\n  // function which calls a signal becomes a signal\r\n  const dirtyEquality = (a: T, b: T) => {\r\n    return baseDirtyEq(a, b) && !childrenDirty();\r\n  };\r\n\r\n  // group control\r\n  const ctrl = formControl<T, TParent, 'group'>(value, {\r\n    ...opt,\r\n    dirtyEquality,\r\n    controlType: 'group',\r\n    readonly: () => {\r\n      // readonly if is readonly or all children are readonly\r\n      if (opt?.readonly?.()) return true;\r\n      return (\r\n        !!derivationsArray().length &&\r\n        derivationsArray().every((d) => d.readonly())\r\n      );\r\n    },\r\n    disable: () => {\r\n      if (opt?.disable?.()) return true;\r\n      return (\r\n        !!derivationsArray().length &&\r\n        derivationsArray().every((d) => d.disabled())\r\n      );\r\n    },\r\n  }) satisfies FormControlSignal<T, TParent, 'group'>;\r\n\r\n  const childrenTouched = computed(\r\n    () =>\r\n      !!derivationsArray().length &&\r\n      derivationsArray().some((d) => d.touched()),\r\n  );\r\n\r\n  const touched = computed(() => ctrl.touched() || childrenTouched());\r\n\r\n  const childError = computed(() => {\r\n    if (!derivationsArray().length) return '';\r\n    return derivationsArray()\r\n      .map((d) => (d.error() ? `${d.label()}: ${d.error()}` : ''))\r\n      .filter(Boolean)\r\n      .join('\\n');\r\n  });\r\n\r\n  const error = computed(() => {\r\n    const ownError = ctrl.error();\r\n    if (ownError) return ownError;\r\n    return childError() ? 'INVALID' : '';\r\n  });\r\n\r\n  const markAllAsTouched = () => {\r\n    ctrl.markAllAsTouched();\r\n    for (const ctrl of untracked(derivationsArray)) {\r\n      ctrl.markAllAsTouched();\r\n    }\r\n  };\r\n\r\n  const markAllAsPristine = () => {\r\n    ctrl.markAllAsPristine();\r\n    for (const ctrl of untracked(derivationsArray)) {\r\n      ctrl.markAllAsPristine();\r\n    }\r\n  };\r\n\r\n  const reconcile = (newValue: T) => {\r\n    // set the children values based on the derivation of the new value\r\n    for (const ctrl of untracked(derivationsArray)) {\r\n      const from = ctrl.from;\r\n      if (!from) continue;\r\n      ctrl.reconcile(from(newValue));\r\n    }\r\n    ctrl.reconcile(mergeIfObject(newValue, untracked(value)));\r\n  };\r\n\r\n  const forceReconcile = (newValue: T) => {\r\n    for (const ctrl of untracked(derivationsArray)) {\r\n      const from = ctrl.from;\r\n      if (!from) continue;\r\n      ctrl.forceReconcile(from(newValue));\r\n    }\r\n    ctrl.forceReconcile(newValue);\r\n  };\r\n\r\n  const createBaseValueFn = opt?.createBasePartialValue;\r\n\r\n  const basePartialValue: Signal<\r\n    Partial<DerivationPartialValues<TDerivations>>\r\n  > = createBaseValueFn\r\n    ? computed(() => createBaseValueFn(ctrl.value()))\r\n    : computed(() => ({}));\r\n\r\n  const partialValue = computed(() => {\r\n    const obj: Partial<DerivationPartialValues<TDerivations>> = {\r\n      ...basePartialValue(),\r\n    };\r\n\r\n    if (!ctrl.dirty()) return obj;\r\n\r\n    for (const [key, ctrl] of Object.entries(children())) {\r\n      const pv = ctrl.partialValue();\r\n\r\n      if (pv === undefined) continue;\r\n      (obj as AnyObject)[key] = pv;\r\n    }\r\n\r\n    return obj;\r\n  });\r\n\r\n  const childrenValid = computed(() => {\r\n    if (!derivationsArray().length) return true;\r\n    return derivationsArray().every((d) => d.valid());\r\n  });\r\n\r\n  const childrenPending = computed(\r\n    () =>\r\n      !!derivationsArray().length &&\r\n      derivationsArray().some((d) => d.pending()),\r\n  );\r\n\r\n  return {\r\n    ...ctrl,\r\n    children,\r\n    partialValue,\r\n    reconcile,\r\n    forceReconcile,\r\n    ownError: ctrl.error,\r\n    touched,\r\n    error,\r\n    valid: computed(() => ctrl.valid() && childrenValid()),\r\n    pending: computed(() => ctrl.pending() || childrenPending()),\r\n    markAllAsPristine,\r\n    markAllAsTouched,\r\n    reset: () => {\r\n      for (const ctrl of untracked(derivationsArray)) {\r\n        ctrl.reset();\r\n      }\r\n      ctrl.reset();\r\n    },\r\n    resetWithInitial: (initial: T) => {\r\n      for (const ctrl of untracked(derivationsArray)) {\r\n        const from = ctrl.from;\r\n        if (from) ctrl.resetWithInitial(from(initial));\r\n        else ctrl.reset();\r\n      }\r\n      ctrl.resetWithInitial(initial);\r\n    },\r\n  };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}